WooCommerce en SAP Business One
WooCommerce SAP Business One koppeling
Webshoporders uit WooCommerce staan als verkooporder in SAP Business One, ook gastbestellingen zonder klantnummer. Voorraad uit de magazijnen die je kiest en prijzen uit je prijslijsten gaan terug naar WooCommerce. Gebouwd op jouw SAP-inrichting en jouw plugins, en daarna door ons gedraaid en bewaakt.
Wat je tussen WooCommerce en SAP Business One koppelt
WooCommerce geeft gegevens vrij via de REST API v3, SAP Business One via de Service Layer, de OData-API op poort 50000. SAP is leidend voor artikelen, voorraad en prijzen, WooCommerce voor de order.
| Stroom | Richting | WooCommerce | SAP Business One |
|---|---|---|---|
| Orders | naar SAP | /wc/v3/orders, webhook order.created |
Orders met DocumentLines |
| Klanten | naar SAP | billing, customer_id |
BusinessPartners |
| Artikelen | naar WooCommerce | sku, name, regular_price |
Items |
| Voorraad | naar WooCommerce | stock_quantity |
ItemWarehouseInfoCollection |
| Leveringen | naar WooCommerce | orderstatus completed |
DeliveryNotes |
| Annuleringen | naar SAP | orderstatus cancelled |
Orders({DocEntry})/Cancel |
Een order gaat naar SAP als hij in WooCommerce op processing staat. Het WooCommerce-nummer gaat in NumAtCard, het referentieveld van de klant, en SAP geeft DocEntry en DocNum terug. De koppeling bewaart alle drie. Hoe dit past in een koppeling met een ERP staat op ERP koppeling met je webshop.
Welk systeem is leidend, per gegeven
| Gegeven | Leidend | Richting | Gedrag |
|---|---|---|---|
| Order en regels | WooCommerce | naar SAP | één keer, NumAtCard als sleutel |
Relatie en CardCode |
SAP | match, anders aanmaken | e-mailadres, dan FederalTaxID |
ItemCode, omschrijving |
SAP | naar WooCommerce | sku is de ItemCode of via een vertaaltabel |
| Productteksten, afbeeldingen, categorieën | WooCommerce | blijft in WooCommerce | de koppeling schrijft er niet overheen |
| Voorraad | SAP, per magazijn | naar WooCommerce | som van de gekozen magazijnen |
| Basisprijs | SAP, één prijslijst | naar WooCommerce | regular_price |
| Btw-groep | SAP | controle per regel | afwijking naar de controlelijst |
Wat WooCommerce en SAP Business One anders bewaren
Gastorders tegenover een verplichte CardCode
Een order in SAP Business One hangt altijd aan een relatie: CardCode is verplicht, maximaal 15 tekens. WooCommerce staat bestellen zonder account toe, en dan heeft de order customer_id 0. De koppeling zoekt daarom eerst op e-mailadres (EmailAddress in SAP) en bij een zakelijke klant op btw-nummer, dat in SAP in FederalTaxID staat, 32 tekens. Vindt hij niets, dan gebeurt een van twee dingen, die je vooraf kiest: een nieuwe relatie, of de order op een vaste verzamelrelatie met het adres op de order zelf.
Een nieuwe relatie en de order gaan in één change set van de Service Layer. SAP voert zo'n change set als geheel uit of helemaal niet. Mislukt de order, dan staat er dus ook geen losse relatie zonder order in SAP. Zie dubbele klanten en debiteuren.
Het adres op de order
WooCommerce levert address_1 en address_2 als vrije regels, zonder huisnummerveld. Het adres op een SAP-order kent wel losse velden: ShipToStreet, ShipToStreetNo, ShipToZipCode en ShipToCountry. Op de adressen van een relatie documenteert SAP het veld StreetNo daarentegen als "For Brazil only". De koppeling splitst daarom op het huisnummer voor het orderadres, en houdt bij een nieuwe relatie de vorm aan die je bestaande relaties al hebben. Zie adresvelden mappen.
Voorraad: meerdere magazijnen, één geheel getal
Per artikel en magazijn geeft SAP InStock, Committed en Ordered, als decimaal getal. WooCommerce heeft één stock_quantity per product of variatie, een geheel getal, zonder magazijn. De koppeling telt per artikel de magazijnen op die meedoen en trekt daar het toegezegde aantal af:
| Magazijn | InStock |
Committed |
Telt mee |
|---|---|---|---|
| 01 Hoofdmagazijn | 20 | 4 | ja |
| 02 Buitenlocatie | 7,5 | 0 | ja |
| SHOW Showroom | 3 | 0 | nee |
(20 - 4) + 7,5 = 23,5. Dat wordt naar beneden afgerond op 23, omdat WooCommerce geen halve stuks kent. De showroom blijft buiten de som. Welke magazijnen meetellen leg je per koppeling vast.
Prijzen per relatie
Een relatie in SAP hangt aan één prijslijst (PriceListNum), en daarbovenop kunnen speciale prijzen per artikel en relatie staan, met perioden en staffels. De REST API van WooCommerce kent alleen regular_price en sale_price per product: een prijs per klant bestaat er niet. De basisprijs uit één SAP-prijslijst gaat naar regular_price. Klantprijzen lopen via een B2B-plugin, en de koppeling schrijft naar de velden van die plugin. Zie klantspecifieke prijzen.
De technische werkelijkheid van deze combinatie
| Onderwerp | WooCommerce | SAP Business One, Service Layer |
|---|---|---|
| Limiet op verzoeken | geen gedocumenteerd op wc/v3 |
geen gedocumenteerd; de grens is je server |
| Per pagina | 10 standaard, maximaal 100 | 20 standaard, aan te passen per verzoek |
| Bundelen | batch van maximaal 100 | $batch, change sets als geheel |
| Wijziging melden | webhook via WP-Cron, uit na 5 mislukte afleveringen | webhooks vanaf 10.0 FP 2602, anders pollen |
| Toegang | sleutelpaar, secret één keer getoond | sessie, verloopt na 30 minuten zonder aanroep |
Nagelezen op 3 oktober 2026 in de documentatie van WooCommerce en de handleiding Working with SAP Business One Service Layer.
Artikelen doorgerekend. 6.000 artikelen uit SAP lezen is bij de standaardpagina van 20 records 6.000 / 20 = 300 aanroepen. Met Prefer: odata.maxpagesize=500 zijn het er 12. Naar WooCommerce zijn 6.000 voorraadgetallen 6.000 / 100 = 60 batchverzoeken. Na de eerste ronde gaan alleen gewijzigde artikelen mee. Je eigen aantallen reken je door met doorvoer berekenen.
Twee kanten die elk iets laten liggen. WooCommerce verstuurt webhooks via WP-Cron, dat alleen draait als er een pagina wordt geladen, en schakelt een webhook uit na 5 mislukte afleveringen op rij. SAP houdt een sessie 30 minuten vast; daarna geeft de volgende aanroep 401. De koppeling logt dan opnieuw in en herhaalt de aanroep, en haalt naast de webhooks elk kwartier orders op met modified_after, zodat een order die geen webhook kreeg toch aankomt.
Wat een standaardkoppeling hier niet doet
Plugins die WooCommerce aan SAP Business One koppelen, beschrijven hun eigen grenzen. Bij een plugin in de WordPress-pluginbibliotheek stond:
- De SKU moet gelijk zijn aan de
ItemCode. Een product met een andere SKU wordt niet gekoppeld. - Eén prijslijst voor de hele winkel. Prijzen per relatie of per klantgroep vallen erbuiten.
- Voorraad als som van de gekozen magazijnen, als één getal per SKU.
- Producten moeten al in WooCommerce bestaan; aanmaken vanuit SAP en orders naar SAP zitten pas in de betaalde versie.
- Elk uur op zijn snelst in de gratis versie, via WP-Cron.
Een gebouwde koppeling legt per magazijn, per prijslijst en per soort klant vast wat er gebeurt, en schrijft orders, relaties en annuleringen naar SAP.
Als het misgaat
| Wat er misgaat | Wat de koppeling doet | Wat je ziet |
|---|---|---|
SAP antwoordt 401, sessie verlopen |
opnieuw inloggen, aanroep herhalen | niets |
| SAP is onbereikbaar | orders wachten in de wachtrij | de lengte van de wachtrij |
ItemCode bestaat niet |
die order wacht, andere orders gaan door | de order en de SKU |
| Nieuwe relatie of order geweigerd | de change set wordt teruggedraaid | de melding van SAP bij de order |
| Webhook in WooCommerce uitgeschakeld | de controleronde haalt de orders op | een regel in het logboek |
| Annulering op een geleverde order | niet uitgevoerd | de order, voor een creditnota |
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 order welke relatie, welke regels en welke btw-groep er in SAP zouden ontstaan, zonder iets aan te maken.
Wij hosten en bewaken de koppeling en passen hem aan als SAP of WooCommerce iets wijzigt. De systeemkant staat op SAP Business One koppeling, de platformkant op WooCommerce koppeling, en alle stromen op koppelingen. Verwante combinaties: Shopify SAP Business One koppeling en Magento SAP Business One koppeling. Vertel welke SAP-versie en welke B2B-plugin je gebruikt.
Veelgestelde vragen
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. Webhooks uit SAP vragen 10.0 FP 2602; op een oudere versie haalt de koppeling wijzigingen op met een filter op de wijzigingsdatum. Een installatie op SQL Server van voor 10.0 PL01 heeft alleen de DI API, die op een Windows-machine naast SAP draait.
Wat gebeurt er met gastbestellingen?
Een gastbestelling heeft in WooCommerce customer_id 0. De koppeling zoekt een relatie op e-mailadres en bij een zakelijke klant op btw-nummer (FederalTaxID). Vindt hij niets, dan maakt hij een nieuwe relatie aan of boekt hij op een vaste verzamelrelatie met het adres op de order zelf. Welke van de twee leg je vooraf vast.
Kunnen klantprijzen uit SAP naar WooCommerce?
Niet via de REST API van WooCommerce alleen: die kent geen prijs per klant. Klantprijzen in WooCommerce lopen via een B2B-plugin, en de koppeling schrijft dan naar de velden van die plugin. De speciale prijzen per relatie uit SAP, met hun perioden en staffels, worden omgezet naar wat die plugin aankan. Zie klantspecifieke prijzen.
Moet de SKU in WooCommerce gelijk zijn aan de artikelcode in SAP?
Het is het eenvoudigst, maar het hoeft niet. ItemCode in SAP is maximaal 20 tekens en uniek. Een WooCommerce-SKU mag langer zijn, en een product mag zonder SKU bestaan. Wijken ze af, dan houdt de koppeling een vertaaltabel bij; een product zonder SKU of zonder artikel in SAP komt op de controlelijst.
Kan een order in SAP worden verwijderd als hij in WooCommerce wordt geannuleerd?
Nee. Een verkooporder verwijderen kan in SAP Business One niet; de Service Layer antwoordt dan met 400 en code -5006. De koppeling annuleert de order met POST /Orders({DocEntry})/Cancel. Is de order in SAP al geleverd, dan komt hij op de controlelijst, want dan is er een creditnota nodig.
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