Naar de inhoud
SyncMyShop

Magento en SAP Business One

Magento SAP Business One koppeling

Elk SAP-magazijn wordt een bron in Magento, met een aantal waar de open weborders precies één keer af gaan. Prijslijsten worden klantgroepen met staffelprijzen, en orders, annuleringen en zendingen lopen tussen de twee zonder dat de een over de ander heen schrijft. Gebouwd op jouw SAP-inrichting en jouw Magento, en daarna door ons gedraaid en bewaakt.

Wat je tussen Magento en SAP Business One koppelt

Magento 2 geeft gegevens vrij via zijn REST API, SAP Business One via de Service Layer, de OData-API op poort 50000. SAP is leidend voor artikelen, voorraad per magazijn en prijzen, Magento voor de order.

Stroom Richting Magento 2 SAP Business One
Artikelen naar Magento POST /V1/products Items
Voorraad per magazijn naar Magento POST /V1/inventory/source-items ItemWarehouseInfoCollection
Prijslijsten en staffels naar Magento POST /V1/products/tier-prices PriceLists, SpecialPrices
Orders naar SAP GET /V1/orders op updated_at Orders met DocumentLines
Annuleringen naar SAP orderstatus canceled Orders({DocEntry})/Cancel
Zendingen naar Magento POST /V1/order/{id}/ship met tracks DeliveryNotes

Het increment_id van de Magento-order, zoals 000010482, gaat naar NumAtCard, het referentieveld van de klant. SAP geeft DocEntry en DocNum terug. De koppeling bewaart ze naast het entity_id van Magento, om later de annulering en de zending aan de juiste order te hangen. Hoe dit in een ERP-koppeling past staat op ERP koppeling met je webshop.

Welk systeem is leidend, per gegeven

Gegeven Leidend Richting Gedrag
ItemCode, omschrijving SAP naar Magento via de vertaaltabel naar de SKU
Attribuutset, configurable products, afbeeldingen Magento blijft in Magento de koppeling schrijft er niet overheen
Aantal per magazijn SAP naar de bron met dezelfde code InStock min toegezegd, plus eigen weborders
Verkoopbare voorraad Magento berekend in Magento bronnen min reserveringen
Prijslijst van de relatie SAP, PriceListNum naar Magento klantgroep met tier prices
Speciale prijzen per relatie SAP naar Magento eigen klantgroep, op begin- en einddatum
Order Magento tot de import, daarna SAP naar SAP één keer, increment_id als sleutel

Wat Magento en SAP Business One anders bewaren

Magazijnen tegenover bronnen

Voorraad per magazijn uit SAP Business One naar bronnen in Magento Artikel 10482-BL-M ligt in magazijn 01 met 20 stuks, waarvan 4 toegezegd, 3 daarvan aan weborders die Magento nog reserveert. De koppeling schrijft 20 min 4 plus 3 is 19 naar bron 01, en 6 naar bron 02. De showroom telt niet mee. Magento trekt zijn eigen 3 reserveringen af en toont 22. SAP, ItemWarehouseInfoCollection Magento, source-items 01 InStock 20 01 Committed 4 waarvan 3 uit Magento 02 InStock 6 02 Committed 0 SHOW InStock 3 showroom, telt niet mee source 01: quantity 19 Magento reserveert zelf 3 source 02: quantity 6 20 - 4 + 3 6 - 0 Verkoopbaar in Magento: 19 + 6 - 3 reserveringen = 22. Dat is gelijk aan wat SAP vrij heeft: (20 - 4) + 6 = 22.
SAP trekt een weborder af zodra hij als verkooporder staat, Magento houdt hem gereserveerd tot de zending. De koppeling telt de weborders die in beide staan één keer terug.

Per artikel en magazijn geeft SAP InStock (wat er ligt) en Committed (wat aan klanten is toegezegd). Een magazijn heeft een WarehouseCode van maximaal 8 tekens. Magento met Multi-Source Inventory heeft bronnen met een eigen source_code, en rekent de verkoopbare voorraad zelf uit: de bronnen opgeteld, min de reserveringen van orders die nog niet verzonden zijn.

Een weborder die als verkooporder in SAP staat, zit dus aan twee kanten: in Committed bij SAP en als reservering in Magento. Schrijft de koppeling InStock - Committed naar de bron, dan gaat die order er twee keer af. Hij schrijft daarom per magazijn InStock min Committed, plus de weborders die SAP al heeft toegezegd en Magento nog reserveert. In het voorbeeld: 20 - 4 + 3 = 19 voor bron 01. Magento rekent 19 + 6 - 3 = 22, gelijk aan de 22 die SAP vrij heeft. Zodra de levering in SAP is geboekt, boekt de koppeling eerst de zending in Magento en schrijft hij daarna de nieuwe aantallen. Zie voorraad over meerdere magazijnen.

Artikelcodes van 20 tekens tegenover SKU's van 64

ItemCode is in SAP de sleutel van een artikel: uniek, verplicht, maximaal 20 tekens. Een Magento-SKU mag 64 tekens zijn. Varianten van een configurable product krijgen in Magento vaak een SKU die is samengesteld uit model, kleur en maat, zoals WERKJAS-PRO-BLAUW-XL: 20 tekens, net passend; met -XXL erachter niet meer. De koppeling houdt een vertaaltabel bij van SKU naar ItemCode. Het configurable product zelf heeft geen artikel in SAP; het bestaat alleen in Magento, met kleur en maat als attributen. Elk Magento-product heeft daarnaast een attribuutset nodig, en SAP kent die niet: de koppeling legt een tabel vast van artikelgroep in SAP naar attribuutset in Magento. Zie verplichte velden die de bron niet heeft.

Prijslijsten, speciale prijzen en klantgroepen

Een relatie in SAP hangt aan één prijslijst (PriceListNum). Een Magento-klant hangt aan één klantgroep (group_id). Die twee passen op elkaar: elke prijslijst wordt een klantgroep, en de prijzen worden tier prices met sku, customer_group, quantity en price.

Speciale prijzen per relatie passen er niet direct in, want Magento Open Source kent geen prijs per klant. Een relatie met speciale prijzen krijgt een eigen klantgroep, met de prijslijst als basis en de speciale prijzen en staffels erover. Een speciale prijs met een periode is lastiger: het special_price van Magento geldt voor iedereen in een store view, en de price_from moet later liggen dan het moment van schrijven. De koppeling zet een periodeprijs daarom als tier price voor de klantgroep van die relatie op de begindatum, en haalt hem weg op de einddatum.

Annuleren zonder over SAP heen te schrijven

Een verkooporder verwijderen kan in SAP Business One niet. Een annulering in Magento wordt in SAP een POST /Orders({DocEntry})/Cancel. Sinds 10.0 FP 2102 geeft de Service Layer bij orders een ETag. De koppeling stuurt die mee in If-Match:

POST /b1s/v2/Orders(4410)/Cancel HTTP/1.1
Cookie: B1SESSION=PTRzIjYK-weN6-1Lx1; ROUTEID=.node1
If-Match: W/"356A192B7913B04C54574D18C28D46E6395428AB"

HTTP/1.1 412 Precondition Failed
{"error": {"code": "-2039", "message": "Another user or
  another operation modified data; ..."}}

Een 412 betekent dat iemand de order in SAP heeft gewijzigd sinds de koppeling hem las, bijvoorbeeld een deellevering die al is ingepakt. De koppeling annuleert dan niet, maar zet de order op de controlelijst.

De technische werkelijkheid van deze combinatie

Onderwerp Magento 2 SAP Business One, Service Layer
Limiet op verzoeken geen algemene limiet; de grens is je server geen gedocumenteerd; de grens is je server
Bundelen /async/bulk/V1, tot 5.000 regels $batch, change sets als geheel
Per pagina zonder pageSize alle resultaten 20 standaard, aan te passen per verzoek
Wijziging melden Open Source: pollen op updated_at webhooks vanaf 10.0 FP 2602, anders pollen
Toegang Integration, OAuth 1.0a sessie, verloopt na 30 minuten zonder aanroep

Nagelezen op 3 oktober 2026 in de documentatie van Adobe en de handleiding Working with SAP Business One Service Layer.

Voorraad doorgerekend. 3.000 SKU's in 2 magazijnen zijn 6.000 bronregels. Uit SAP is dat met $select op ItemCode en ItemWarehouseInfoCollection 3.000 / 500 = 6 pagina's. Naar Magento zijn het met de synchrone invoerlimiet van 20 regels 6.000 / 20 = 300 verzoeken, via het bulk-endpoint 2 verzoeken van maximaal 5.000. Na de eerste ronde gaan alleen gewijzigde regels mee.

Twee kanten zonder vaste limiet. Geen van beide API's heeft een gedocumenteerd aantal verzoeken per minuut. Allebei draaien ze op een server die ook je winkel of je administratie bedient. De koppeling leest SAP buiten de piekuren van je medewerkers en Magento buiten de piekuren van je winkel, en houdt één SAP-sessie vast in plaats van per aanroep in te loggen. Het bulk-endpoint van Magento hangt aan de consumer async.operations.all; draait die niet, dan blijven bewerkingen op status 4, Open, en ziet de koppeling dat bij de controle van de status. Je eigen aantallen reken je door met doorvoer berekenen.

Wat een standaardkoppeling hier niet doet

Standaardkoppelingen voor Magento 2 en SAP Business One beschrijven hun eigen grenzen. Bij een van die koppelingen stond:

  • Eén richting: orders van Magento naar SAP. Tweerichtingsverkeer alleen als maatwerk op aanvraag.
  • Producten en categorieën uit SAP via een cronjob, op een vast tijdstip in plaats van bij een wijziging.
  • Belastingvelden via een vaste mapping tussen Magento en SAP, ingesteld in de koppeling.

Een gebouwde koppeling schrijft de voorraad per magazijn naar de juiste bron, rekent speciale prijzen om naar klantgroepen en annuleert in SAP alleen als de order daar niet is gewijzigd.

Als het misgaat

Wat er misgaat Wat de koppeling doet Wat je ziet
SAP antwoordt 412, code -2039 annulering niet uitgevoerd de order en wat er in SAP is gewijzigd
SAP-sessie verlopen, 401 opnieuw inloggen, aanroep herhalen niets
SKU zonder ItemCode die order wacht, andere orders gaan door de order en de SKU
Magazijn zonder bron in Magento dat magazijn wordt overgeslagen de WarehouseCode
Bulkbewerking blijft op status 4 voorraadronde gemeld als niet verwerkt het aantal open bewerkingen
Magento ligt plat voor een upgrade wijzigingen uit SAP wachten in de wachtrij de lengte van de wachtrij

Voordat de koppeling een order schrijft, zoekt hij of er al een order met dezelfde NumAtCard bestaat, zodat een time-out halverwege geen tweede order oplevert. Een order die blijft falen wordt met de oorspronkelijke inhoud bewaard en gaat opnieuw mee zodra de oorzaak is opgelost. Voor livegang draait de koppeling als dry run: per SKU en per bron welk aantal en welke prijs er in Magento zou komen, en per order welke regels er in SAP zouden ontstaan, zonder iets te schrijven.

Wij hosten en bewaken de koppeling en passen hem aan als Adobe of SAP een interface wijzigt. De systeemkant staat op SAP Business One koppeling, de platformkant op Magento koppeling, en alle stromen op koppelingen. Verwante combinaties: WooCommerce SAP Business One koppeling en Shopify SAP Business One koppeling. Vertel welke Magento-versie en welke SAP-versie je draait.

Veelgestelde vragen

Werkt de koppeling met Magento Open Source en met Adobe Commerce?

Ja. De REST API voor producten, bronnen, prijzen, orders en zendingen is in beide dezelfde. Adobe I/O Events en Adobe Commerce Webhooks vragen Adobe Commerce 2.4.4 of hoger; op Open Source haalt de koppeling nieuwe orders op met een filter op updated_at. Shared catalogs voor prijzen per bedrijf zitten alleen in de B2B-modules van Adobe Commerce.

Welke SAP Business One-versie heb ik nodig?

Een versie met de Service Layer: op SAP HANA, of op Microsoft SQL Server vanaf 10.0 PL01. Annuleren met een ETag werkt vanaf 10.0 FP 2102, webhooks uit SAP vanaf 10.0 FP 2602. Op een oudere versie haalt de koppeling wijzigingen op met een filter op de wijzigingsdatum.

Mijn Magento-SKU's zijn langer dan 20 tekens. Is dat een probleem?

Nee, maar ze kunnen dan niet gelijk zijn aan de ItemCode, want die is in SAP maximaal 20 tekens. Een Magento-SKU mag 64 tekens lang zijn. De koppeling houdt een vertaaltabel bij van SKU naar ItemCode, en een SKU zonder artikel in SAP komt op de controlelijst.

Kunnen speciale prijzen per relatie uit SAP naar Magento?

Ja. Magento Open Source kent geen prijs per klant, wel per klantgroep. Een relatie met speciale prijzen krijgt een eigen klantgroep, met de speciale prijzen en staffels als tier prices. Op Adobe Commerce met de B2B-modules kan het ook via een shared catalog per bedrijf. Zie klantspecifieke prijzen.

Wat gebeurt er als een order in Magento wordt geannuleerd?

De koppeling annuleert de verkooporder in SAP met POST /Orders({DocEntry})/Cancel en stuurt de ETag mee die hij bij het aanmaken kreeg. Heeft iemand de order in SAP intussen gewijzigd, dan weigert SAP met 412 en code -2039. De koppeling annuleert dan niet blind, maar zet de order op de controlelijst.

Vertel wat je nodig hebt

Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.

  • Je weet de prijs en de doorlooptijd voordat je iets toezegt
  • Wij zoeken uit welke koppeling het werk uit handen neemt
  • Wij verzorgen de bouw, hosting, bewaking en het onderhoud
  • Je team krijgt minder overtypwerk en minder uitzoekwerk

Leveranciers, producten, orders per dag, een ruwe schatting is prima.

Of mail direct: carsten@syncmyshop.com