Naar de inhoud
SyncMyShop

WooCommerce en Odoo

WooCommerce Odoo koppeling

WooCommerce-orders staan als bevestigde verkooporder in Odoo, met dezelfde bedragen tot op de cent, kortingscodes en verzendkosten als eigen regels en de klant op het juiste factuur- en afleveradres. Artikelen, varianten, voorraad en trackingnummers komen uit Odoo terug. Gebouwd op jouw Odoo-versie en jouw plugins, en daarna door ons gedraaid en bewaakt.

Wat je tussen WooCommerce en Odoo koppelt

Odoo is bij deze combinatie het ERP: artikelen, varianten, voorraad, inkoop en facturen staan daar. WooCommerce levert de order en de nieuwe klant. Aan de WooCommerce-kant loopt alles over de REST API v3, aan de Odoo-kant over de JSON-2 API vanaf Odoo 19 of XML-RPC op oudere versies.

Stroom Richting WooCommerce Odoo
Orders naar Odoo GET /wc/v3/orders?dp=4 sale.order met order_line, daarna action_confirm
Klanten en adressen naar Odoo billing, shipping res.partner met contacten van type invoice en delivery
Artikelen en varianten naar WooCommerce products, variations product.template, product.product
Kenmerken naar WooCommerce products/attributes product.attribute
Voorraad naar WooCommerce stock_quantity free_qty, wijzigingen uit stock.quant
Annulering naar Odoo status cancelled action_cancel
Levering en tracking naar WooCommerce status completed, ordernotitie stock.picking, carrier_tracking_ref

Een WooCommerce-order heeft 8 statussen: pending, processing, on-hold, completed, cancelled, refunded, failed en trash. Een verkooporder in Odoo heeft er 4: draft, sent, sale en cancel. De koppeling zet een order pas door als hij in WooCommerce op processing staat, dus betaald. Een order op pending is een afgebroken checkout en hoort niet als offerte in Odoo. Hoe statussen tussen systemen worden vertaald staat in orderstatussen mappen.

Welk systeem is leidend, per gegeven

Gegeven Leidend Richting Gedrag
Artikelcode, naam, eenheid Odoo naar WooCommerce default_code wordt sku
Kenmerken en varianten Odoo naar WooCommerce alleen kenmerken die varianten maken
Productteksten, afbeeldingen, categorieën WooCommerce blijft in WooCommerce de koppeling schrijft er niet overheen
Voorraad Odoo, free_qty naar WooCommerce per variant, naar beneden afgerond
Order en bedragen WooCommerce naar Odoo één keer, client_order_ref als sleutel
Btw-tarief per regel WooCommerce naar Odoo als tax_ids via een tabel naar jouw btw-codes
Klant, adres, btw-nummer Odoo na aanmaken eerste keer uit WooCommerce wijzigingen naar de controlelijst
Factuur Odoo blijft in Odoo volgens invoice_policy per artikel

Wat WooCommerce en Odoo anders bewaren

Btw inclusief: per order tegenover per btw-code

WooCommerce legt op de order vast of de prijzen inclusief btw zijn ingevoerd, in prices_include_tax. In Odoo is dat een eigenschap van de btw-code: het veld Included in Price op account.tax, met als standaard de instelling van het bedrijf, en die staat bij een nieuw bedrijf op exclusief. Stuurt een koppeling de inclusieve prijs van een B2C-shop naar een exclusieve btw-code, dan rekent Odoo er nog eens 21% bovenop. Een order van € 248,04 wordt dan € 300,13.

De koppeling stuurt daarom de bedragen exclusief btw uit de WooCommerce-regel, subtotal en total, met de btw apart in subtotal_tax en total_tax, en kiest per tarief een exclusieve btw-code. Met dp=4 komen die bedragen in 4 decimalen, zodat er onderweg niets wordt afgerond. Zie bedragen en btw mappen.

Afronding per regel of per tarief

Ook met de juiste btw-code kunnen de totalen een cent verschillen. WooCommerce rondt btw standaard per regel af; de optie om op subtotaal af te ronden staat uit. Odoo rondt standaard per btw-tarief over de hele order af (Round per Tax). Drie regels van € 4,99, € 2,49 en € 7,99 inclusief 21%:

WooCommerce, per regel:  0,87 + 0,43 + 1,39          = 2,69 btw
Odoo, per tarief:        0,86603 + 0,43215 + 1,38669 = 2,68487 -> 2,68 btw
verschil                                              = 0,01

Een cent verschil tussen het WooCommerce-totaal en amount_total in Odoo blokkeert het automatisch afletteren van de betaling. Er zijn twee oplossingen: Odoo op Round per Line zetten, of WooCommerce laten afronden op subtotaal. Welke het wordt, bepaal je met je boekhouder. De koppeling vergelijkt na elke order de twee totalen en zet een afwijking op de controlelijst.

Kortingscodes en verzendkosten

Kortingen en verzendkosten van WooCommerce-order 10482 naar Odoo De SKU wordt via default_code een product_id. Het regelsubtotaal van 2049,60 voor 120 stuks wordt price_unit 17,08. De kortingscode van 50,00 zou als percentage 2,44 een regel van 1999,59 geven, een cent te weinig, en gaat daarom als eigen regel mee. De verzendkosten worden een regel met is_delivery. WooCommerce, order 10482 Odoo 19, sale.order line_items[0].sku TAS-200-ZW line_items[0].subtotal 2049.6000 120 stuks, excl. btw line_items[0].total 1999.6000 na de kortingscode coupon_lines[0] WELKOM50, 50.00 shipping_lines[0].total 6.9500 product_id 881 gezocht op default_code price_unit 17.08 discount 2.44 geeft 1.999,59: 1 cent te weinig kortingsregel price_unit -50.00 verzendregel 6.95, is_delivery opzoeken / 120 als % eigen regel
Kortingen en verzendkosten van één order en waar ze in Odoo landen. Een korting als percentage met 2 decimalen wijkt een cent af; een kortingsregel niet.

WooCommerce verdeelt een kortingscode over de regels: subtotal is het bedrag voor de korting, total het bedrag erna, en de code zelf staat in coupon_lines. Een orderregel in Odoo heeft voor korting alleen discount, een percentage met standaard 2 decimalen. Een vaste korting van € 50 op een regel van € 2.049,60 is 2,4395%, dat wordt 2,44%, en dat geeft € 1.999,59 in plaats van € 1.999,60. De koppeling zet de korting daarom als eigen regel met een negatief bedrag op een kortingsartikel.

Verzendkosten staan in WooCommerce in shipping_lines, los van de productregels. In Odoo is verzending een regel met een verzendartikel en is_delivery, uit de module Delivery. Toeslagen uit fee_lines, zoals een betaaltoeslag, worden een regel met een eigen artikel.

Variaties en varianten

In Odoo bepaalt elk kenmerk zelf of het varianten maakt, met Variant Creation: Instantly, Dynamically of Never. Instantly maakt alle combinaties direct aan als product.product. Bij Dynamically bestaat een variant pas als hij op een order staat, dus vindt de koppeling voor een nieuwe combinatie nog geen default_code. Never maakt geen variant: zo'n waarde, bijvoorbeeld een gravering, gaat als product_no_variant_attribute_value_ids op de orderregel. Alleen kenmerken op Instantly worden variaties in WooCommerce. Zie varianten.

Factuur- en afleveradres

WooCommerce bewaart billing en shipping als twee adresblokken op de order. Odoo werkt met één klant en contacten eronder, elk met een type: contact, invoice, delivery of other. Een verkooporder heeft partner_invoice_id en partner_shipping_id. Het afleveradres bepaalt in Odoo ook de fiscale positie, en die kan btw-codes vervangen, bijvoorbeeld bij levering naar het buitenland. De koppeling zet de afwijkende afleveradressen als delivery-contact onder de klant en controleert welke fiscale positie Odoo kiest. Hoe huisnummers worden gesplitst staat op Odoo koppeling.

De technische werkelijkheid van deze combinatie

Onderwerp WooCommerce Odoo
Limiet op verzoeken geen gedocumenteerd op wc/v3 geen gedocumenteerd
Schrijven in bulk batches van 100; variaties per hoofdproduct create met een lijst records
Transactie per verzoek elke aanroep een eigen transactie
Wijziging melden webhook, uit na meer dan 5 mislukte afleveringen automatiseringsregel met webhook, zonder herhaalpogingen
Toegang Consumer Key en Secret API-sleutel, maximaal 90 dagen voor een gewone gebruiker

Nagelezen op 3 oktober 2026 in de documentatie van Odoo en de WooCommerce REST API.

Voorraad naar variaties kost per hoofdproduct. WooCommerce schrijft variaties in batches per hoofdproduct: products/<id>/variations/batch. Een shop met 2.000 tassen in elk 6 kleuren heeft 12.000 variaties. Wijzigen er op een dag 900 voorraadstanden, verdeeld over 400 tassen, dan is dat aan de Odoo-kant 1 search_read op stock.quant met een limit van 1.000, en aan de WooCommerce-kant 400 verzoeken. Zouden het 900 enkelvoudige producten zijn, dan waren het er 9. De koppeling schrijft per ronde alleen de hoofdproducten met een gewijzigde variatie.

Voorraad als geheel getal. Odoo rekent in de eenheid van het artikel en geeft free_qty als decimaal getal; stock_quantity in WooCommerce is een geheel getal. 12,5 meter wordt 12 in de shop.

Twee aanroepen per order. create maakt een offerte, action_confirm een verkooporder, en elk is een eigen transactie. Faalt de bevestiging, dan staat er een offerte met het WooCommerce-nummer in client_order_ref. De koppeling zoekt bij elke nieuwe poging eerst op dat veld en bevestigt de bestaande offerte in plaats van een tweede aan te maken.

Wat een standaardkoppeling hier niet doet

Kant-en-klare koppelingen voor WooCommerce en Odoo zijn er in twee soorten, en elk heeft een grens die in de documentatie van Odoo staat:

  • Een module in Odoo. Odoo Online is volgens Odoo niet te combineren met eigen modules of modules uit de Apps Store. Een connectormodule werkt daar dus niet, en op Odoo.sh of een eigen server moet hij bij elke major versie mee, ook als een veld zoals tax_id in Odoo 19 tax_ids wordt.
  • Inloggen met gebruikersnaam en wachtwoord. Koppelplatformen vragen voor Odoo een gebruikersnaam, wachtwoord, URL en databasenaam: de inlog van XML-RPC. Die verdwijnt in Odoo 22 en op Odoo Online in versie 21.1. Op JSON-2 is het een API-sleutel die bij een gewone gebruiker na 90 dagen verloopt.
  • Een vaste veldenset. Btw-codes, fiscale posities, kortings- en verzendartikelen en de kenmerken van je varianten verschillen per database; een vaste mapping kent alleen de standaard.

Een gebouwde koppeling gebruikt de btw-codes, artikelen en kenmerken van jouw database, ververst de API-sleutel voor hij verloopt en controleert de totalen van elke order.

Als het misgaat

Wat er misgaat Wat de koppeling doet Wat je ziet
401 Invalid apikey van Odoo alle stromen pauzeren een melding dat de sleutel verlopen of ingetrokken is
action_confirm faalt offerte blijft staan, volgende poging bevestigt die de order en de fout van Odoo
Totaal wijkt af van WooCommerce order naar de controlelijst beide totalen en het verschil
SKU zonder product.product order vastgehouden, andere orders gaan door de order en de SKU
Annulering op een vergrendelde order geen wijziging in Odoo de order, ter controle
WooCommerce-webhook uitgeschakeld de controleronde haalt orders op met modified_after een regel in het logboek

Een order die blijft falen bewaart de koppeling met de oorspronkelijke inhoud, en hij biedt hem opnieuw aan zodra de oorzaak is opgelost. Voor livegang draait hij als dry run: je ziet per order welke klant, regels, btw-codes en totalen er in Odoo zouden ontstaan, zonder dat er iets wordt aangemaakt.

Wij hosten en bewaken de koppeling en passen hem aan bij een upgrade van Odoo of WooCommerce. De systeemkant staat op Odoo koppeling, de platformkant op WooCommerce koppeling, en alle stromen op koppelingen. Verwante combinaties: WooCommerce Business Central koppeling, WooCommerce AFAS koppeling en WooCommerce Exact Online koppeling. Vertel welke Odoo-versie en welke plugins je shop gebruikt.

Veelgestelde vragen

Gebruikt de koppeling een WooCommerce-module uit de Odoo Apps Store?

Nee. De koppeling draait buiten Odoo en praat met de externe API, net als met de REST API van WooCommerce. Modules uit de Odoo Apps Store werken volgens Odoo niet op Odoo Online, en een module moet bij elke major versie mee. Een koppeling buiten Odoo werkt op Odoo Online, Odoo.sh en een eigen server. Wel geldt voor alle drie dat de externe API alleen op het Custom-plan beschikbaar is.

Komen WooCommerce-variaties als varianten in Odoo?

Andersom: Odoo is meestal leidend voor artikelen, en elke product.product wordt een variatie in WooCommerce met dezelfde SKU. Kenmerken met variantcreatie Never worden in Odoo geen variant, dus ook geen variatie; die gaan als productoptie mee. Een kenmerk op Dynamically maakt de variant pas aan als hij verkocht wordt, en die moet de koppeling dan eerst zelf aanmaken.

Hoe gaat een kortingscode uit WooCommerce naar Odoo?

Als een eigen orderregel met een negatief bedrag op een kortingsartikel, met de code uit coupon_lines in de omschrijving. Het kortingsveld op een orderregel in Odoo is een percentage met standaard 2 decimalen, en een vast bedrag als percentage geeft afrondingsverschillen. Met een eigen regel klopt het totaal en zie je in Odoo welke code gebruikt is.

Maakt Odoo de factuur, of WooCommerce?

Odoo. WooCommerce heeft zelf geen factuur, tenzij een plugin er een maakt. In Odoo bepaalt de factuurregel per artikel, invoice_policy, of er gefactureerd wordt op bestelde of op geleverde aantallen. Bij geleverde aantallen ontstaat de factuur pas na de levering. Gebruik je in WooCommerce een factuurplugin, dan spreken we af welk van de twee nummers de klant ziet.

Wat gebeurt er als een order in WooCommerce wordt geannuleerd die al in Odoo staat?

De koppeling roept action_cancel aan op de verkooporder, die ook conceptfacturen annuleert. Een vergrendelde order weigert Odoo te annuleren; dat gebeurt als je Odoo bevestigde orders laat vergrendelen. Is de levering al verwerkt of de factuur geboekt, dan wordt het een retour of creditnota, en zet de koppeling de order op de controlelijst in plaats van iets terug te draaien.

Gaan gastbestellingen als losse klant naar Odoo?

Een gastbestelling heeft in WooCommerce customer_id 0. De koppeling zoekt de klant in Odoo op btw-nummer en e-mailadres en maakt alleen een nieuwe res.partner als beide niets opleveren. Een afwijkend afleveradres komt als contact van het type Delivery onder die klant, zodat het bij de volgende order wordt herkend. Zie dubbele klanten en debiteuren.

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