WooCommerce en Business Central
WooCommerce Business Central koppeling
Orders uit WooCommerce staan als verkooporder in Business Central, met de juiste debiteur en btw die op de cent klopt. Artikelen, prijzen en voorraad komen uit Business Central terug, en de zending sluit de order in de webshop af. Gebouwd op jouw WooCommerce en jouw Business Central, en daarna door ons gedraaid en bewaakt.
Wat je tussen WooCommerce en Business Central koppelt
WooCommerce vangt de order en toont de catalogus. Business Central beheert artikelen, prijzen, voorraad en de boekhouding. De koppeling verbindt vijf stromen.
| Stroom | Richting | WooCommerce REST API v3 | Business Central API v2.0 |
|---|---|---|---|
| Orders | naar Business Central | GET /wc/v3/orders |
salesOrders met salesOrderLines |
| Klanten | naar Business Central | billing en shipping van de order |
customers |
| Artikelen en varianten | naar WooCommerce | /products en /products/<id>/variations |
items, itemVariants |
| Voorraad | naar WooCommerce | stock_quantity |
items.inventory min open orders |
| Zending en status | naar WooCommerce | status completed |
salesShipments |
Het ordernummer uit WooCommerce, het veld number, gaat naar externalDocumentNumber op de verkooporder in Business Central. Dat veld is 35 tekens lang en is de sleutel waarmee de koppeling een order herkent die hij al heeft aangeboden. De toegang tot WooCommerce loopt via een sleutelpaar dat je aanmaakt onder WooCommerce, Instellingen, Geavanceerd, REST API. Het geheime deel wordt één keer getoond.
Welk systeem is leidend, per gegeven
| Gegeven | Leidend | Richting | Gedrag |
|---|---|---|---|
| Artikelnummer en SKU | Business Central | naar WooCommerce | number plus variantcode wordt sku |
| Productteksten, afbeeldingen, categorieën | WooCommerce | blijft in WooCommerce | de koppeling schrijft er niet overheen |
| Prijs | Business Central, unitPrice |
naar WooCommerce | regular_price, als tekst |
| Voorraad | Business Central | naar WooCommerce | één geheel getal per product of variatie |
| Order | WooCommerce tot de import | naar Business Central | vanaf status processing |
| Debiteur | Business Central | match, anders aanmaken | op nummer, dan e-mail |
| Prijzen inclusief of exclusief btw | Business Central, per klant | bepaalt de orderregel | pricesIncludeTax is alleen-lezen |
| Orderstatus na levering | Business Central | naar WooCommerce | completed na de geboekte zending |
De btw-regel staat er apart in omdat hij in deze combinatie de meeste centverschillen geeft. WooCommerce zegt per order of prijzen inclusief btw zijn. In Business Central volgt dat uit de klant, en de order neemt het over.
Wat WooCommerce en Business Central anders bewaren
Btw inclusief of exclusief
Een webshop voor consumenten rekent inclusief btw: de order heeft prices_include_tax op true. Per orderregel levert WooCommerce total en total_tax apart, als tekst.
{
"number": "10482",
"status": "processing",
"customer_id": 0,
"prices_include_tax": true,
"billing": {
"company": "",
"email": "j.devries@example.nl",
"address_1": "Dorpsstraat 12 A",
"postcode": "1234 AB",
"country": "NL"
},
"line_items": [
{ "sku": "10482-BL-M", "quantity": 3, "total": "74.38", "total_tax": "15.62" }
]
}
De klant heeft 3 stuks van € 30,00 gekocht en € 90,00 betaald. Stuurt de koppeling de prijs exclusief btw op twee decimalen, dan wordt dat 74,38 gedeeld door 3 is € 24,79. Business Central rekent zelf: 3 keer 24,79 is 74,37, plus 21% is € 89,99. Eén cent verschil met de betaling, en het automatisch afletteren stopt op die order.
De oplossing zit in de klant. Een klant met prijzen inclusief btw krijgt € 30,00 als unitPrice en de order komt op € 90,00 uit. Het veld pricesIncludeTax op de verkooporder is alleen-lezen, dus de koppeling kiest bij het aanmaken het juiste klantsjabloon: particulieren inclusief, zakelijke klanten exclusief. WooCommerce heeft daarnaast een instelling om btw per subtotaal af te ronden in plaats van per regel. De koppeling leest die instelling uit, zodat beide kanten op dezelfde manier afronden. Meer hierover in bedragen en btw mappen.
Gastorders en debiteuren
Een WooCommerce-order zonder account heeft customer_id 0. Business Central boekt elke order op een klant met een nummer. De koppeling loopt daarom een vaste volgorde af: het klantnummer uit Business Central als dat bij het account is opgeslagen, dan het e-mailadres, en daarna pas een nieuwe klant.
Bij het aanmaken stuurt WooCommerce naam, bedrijf, adres en land als tweeletterige code. Business Central bewaart de naam in 100 tekens, addressLine1 in 100 en addressLine2 in 50. De boekingsgroepen stuurt WooCommerce niet mee en de customers-resource heeft er geen velden voor. Ze komen uit een sjabloon op de pagina API Setup. Hoe je voorkomt dat één bedrijf drie keer als debiteur ontstaat, staat in dubbele klanten en debiteuren.
Eén voorraadgetal
WooCommerce heeft in de kern één getal per product of variatie: stock_quantity, een geheel getal. Locaties kent het niet. Business Central heeft inventory: een decimaal getal over alle locaties samen, dat pas zakt als de levering is geboekt.
WooCommerce verlaagt zijn eigen getal zodra een order op processing of on-hold komt. Dat geeft een ander probleem dan bij een platform dat zelf reserveert. Business Central heeft 20 stuks. Een order van 4 komt binnen en WooCommerce toont 16. De levering is nog niet geboekt, dus inventory is nog 20. Schrijft de koppeling die 20 terug, dan staan er 4 te veel in de webshop. De koppeling schrijft daarom inventory min het openstaande aantal op verkooporders, quantity min shippedQuantity: 20 min 4 is 16.
Twee details daarbij. Kabel die per meter wordt verkocht heeft in Business Central een voorraad van 12,5. WooCommerce krijgt 12. En bij meer dan één locatie leg je vast welke locaties meetellen voor de webshop; het aantal per locatie komt uit een query die in Business Central als webservice is gepubliceerd.
Variabele producten
Een variabel product in WooCommerce heeft variaties, elk met een eigen sku, prijs en voorraad, onder /products/<id>/variations. Dat past op de itemVariants van Business Central, met één verschil: de variantcode is daar maximaal 10 tekens en heeft geen losse velden voor kleur en maat. De koppeling splitst BL-M in Blauw en M met een vertaaltabel. Een jas met 24 varianten is in WooCommerce 2 verzoeken: het product, en één batch met de 24 variaties. Een batch neemt standaard maximaal 100 objecten aan.
De technische werkelijkheid van deze combinatie
| Limiet | WooCommerce | Business Central online |
|---|---|---|
| Verzoeken | geen limiet gedocumenteerd op wc/v3 |
6.000 per 5 minuten per gebruiker, 5 tegelijk |
| Pagina | 10 standaard, 100 maximaal | maximaal 20.000 records |
| Bundelen | batch, 100 objecten | $batch, 100 bewerkingen |
| Webhook | uitgeschakeld na 5 mislukte afleveringen | verloopt na 3 dagen, 30 seconden vertraagd |
| Toegang | sleutelpaar, Basic Auth over HTTPS | OAuth 2.0 via Microsoft Entra |
De getallen zijn op 3 oktober 2026 nagelezen in de documentatie van WooCommerce en Microsoft.
De grens ligt bij je hosting. WooCommerce documenteert geen limiet op de REST API, dus de server bepaalt het tempo. 12.000 producten bijwerken in batches van 100 zijn 120 verzoeken. Duurt een batch op jouw hosting bijvoorbeeld 5 seconden, dan is dat 600 seconden: 10 minuten, waarin de winkel dezelfde database gebruikt. De koppeling stuurt daarom alleen gewijzigde voorraad en houdt de batches achter elkaar, niet naast elkaar.
Orders zijn voor Business Central weinig werk. Een order kost twee tot drie verzoeken: de klant zoeken, hem zo nodig aanmaken en de order met regels plaatsen. 400 orders per dag zijn 1.200 verzoeken, tegenover 6.000 per 5 minuten.
Permalinks. De REST API werkt alleen met nette permalinks. Zet iemand de permalinks in WordPress terug op de standaardinstelling, dan bestaat /wp-json/wc/v3/ niet meer en geeft elk verzoek een 404. De koppeling meldt dat direct, omdat het bij elke aanroep misgaat en niet bij één order.
Webhooks via wp-cron. WooCommerce levert webhooks op de achtergrond af via wp-cron, dat meeloopt met paginabezoeken. Op een rustige nacht kan een webhook dus later vertrekken dan de order is geplaatst. De controleronde met modified_after haalt die order hoe dan ook op. De koppeling controleert ook de status van de webhook zelf en zet hem na een storing weer aan.
Velden van plugins. Een btw-nummer, een afleverdatum of een pakketpunt staat in meta_data onder een sleutel die de plugin kiest. Na een update van die plugin kan de sleutel anders heten. De koppeling controleert bij elke order of de verwachte sleutels er zijn. De opzet van de API staat in WooCommerce REST API koppelen.
Wat een standaardkoppeling hier niet doet
Standaardkoppelingen en koppelplatformen voor dit paar documenteren hun eigen grenzen.
- Klantherkenning op e-mailadres. Een gast die met een ander adres bestelt wordt een nieuwe debiteur. Een match op bedrijfsnaam en postcode, of één vaste debiteur voor particulieren, zit er niet in.
- Boekingsgroepen als vaste waarde. De verplichte groepen worden als één standaardwaarde aan elke order toegevoegd. Particulier inclusief btw en zakelijk exclusief btw vragen twee sjablonen.
- Een vast tempo. Een gedocumenteerd tempo is 10 producten per 5 minuten. Voor 1.000 producten is dat 500 minuten, ruim 8 uur.
Een gebouwde koppeling legt deze punten vast op jouw inrichting: de matchvolgorde voor debiteuren, het sjabloon per klanttype en het tempo dat jouw hosting aankan.
Als het misgaat
| Wat er misgaat | Wat de koppeling doet | Wat je ziet |
|---|---|---|
| Webhook uitgeschakeld na 5 mislukte afleveringen | de controleronde haalt de orders op, de webhook gaat weer aan | een regel in het logboek |
| Permalinks op standaard, elk verzoek geeft 404 | alle stromen pauzeren | een melding met de oorzaak |
| Business Central antwoordt 429 | de order wacht in de wachtrij, nieuwe poging met een langere pauze | niets, tenzij het aanhoudt |
| Ordertotaal wijkt een cent af | de order wordt vastgehouden vóór het boeken | beide totalen naast elkaar |
| Orderregel met een SKU die Business Central niet kent | die order blijft staan, andere gaan door | de order en de SKU |
Sleutel in meta_data ontbreekt na een plugin-update |
de order gaat naar de controlelijst | de order en het ontbrekende veld |
Een order die blijft falen, bewaart de koppeling met de oorspronkelijke inhoud en biedt hij opnieuw aan zodra de oorzaak is opgelost. Het ordernummer in externalDocumentNumber voorkomt dat een herhaling een tweede verkooporder aanmaakt.
Voor livegang draait de koppeling als dry run: hij leest beide kanten en laat zien wat hij zou schrijven, zonder te schrijven. Wij hosten en bewaken de koppeling en passen hem aan als WooCommerce of Microsoft een interface wijzigt. De systeemkant staat op Business Central koppeling, de platformkant op WooCommerce koppeling, en alle stromen op koppelingen. Verwante combinaties: Magento Business Central koppeling en WooCommerce AFAS koppeling. Vertel welke WooCommerce-plugins en welke Business Central je draait.
Veelgestelde vragen
Welke versie van WooCommerce heb ik nodig?
De koppeling haalt gewijzigde orders op met de parameter modified_after, die sinds WooCommerce 5.8 bestaat. Of je orders in de oude tabellen of in HPOS staan maakt voor de REST API geen verschil; HPOS staat sinds WooCommerce 8.2 standaard aan bij nieuwe installaties. De huidige versie, 11.1.2, vraagt WordPress 7.0 en PHP 7.4 of hoger.
Is een webhook nodig, of kan het ook zonder?
Het kan zonder, maar met een webhook staat een order sneller in Business Central. WooCommerce verstuurt webhooks op de achtergrond via wp-cron en schakelt een webhook uit na 5 mislukte afleveringen achter elkaar. Daarom draait er altijd een controleronde naast die de orders ophaalt die sinds de vorige ronde zijn gewijzigd.
Wat gebeurt er met een bestelling van een gast?
Een gastorder heeft customer_id 0, dus er is geen account om op te matchen. De koppeling zoekt de klant in Business Central op e-mailadres en bij een bedrijfsnaam ook op naam en postcode. Vindt hij niets, dan maakt hij een klant aan of boekt hij op één vaste debiteur voor particulieren. Welke van de twee, leg je per klanttype vast.
Kunnen klantprijzen uit Business Central in WooCommerce staan?
Ja. Een WooCommerce-product heeft in de REST API twee prijsvelden: regular_price en sale_price. Een prijs per klant of klantgroep komt uit een B2B-plugin, en de koppeling schrijft in het datamodel van de plugin die jij gebruikt. De prijslijsten zelf komen uit Business Central via een gepubliceerde webservice.
Waar komt het trackingnummer terecht?
Geen van beide systemen heeft er een standaardveld voor in de API. De salesShipments-resource van Business Central levert geen trackingnummer; dat komt uit een pagina die als OData-webservice is gepubliceerd. Een WooCommerce-order heeft er ook geen veld voor: het nummer gaat naar de Shipment Tracking-extensie of naar een ordernotitie die de klant per e-mail krijgt.
Werkt het ook met Business Central on-premises?
Ja. On-premises staat de API standaard uit en zet de beheerder hem aan. Het adres bevat dan je eigen server, poort en serverinstance in plaats van api.businesscentral.dynamics.com. De limieten van Business Central online gelden daar niet; de grens is je eigen server.
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