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
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_idin Odoo 19tax_idswordt. - 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