August 21, 2026
How to integrate Odoo with WooCommerce without duplicating products, orders or customers
Practical guide to integrating Odoo and WooCommerce: catalogue, inventory, customers, orders, invoicing and the errors that generate duplicates.

Odoo and WooCommerce are, each on its own, solid tools: Odoo as a flexible, modular ERP, WooCommerce as one of the most widely used ecommerce platforms on WordPress. The problem does not appear when choosing between one and the other, but when connecting them. It is common to end up with duplicate products, orders registered twice, or customers who exist with different data in each system.
This guide focuses exclusively on how to integrate Odoo with WooCommerce correctly: what to sync, in which direction, and which controls prevent the database from getting dirty as the months go by. If you are still weighing what each system covers on its own, start with the Odoo vs. WooCommerce comparison.
Quick summary
- Duplicates are not a sync problem: they are an identity problem. Without a shared key, no connector can know that two records are the same one.
- The direction of each flow has to be defined before configuring anything: Odoo owns catalogue and stock, WooCommerce originates the orders.
- Cleaning up existing duplicates before automating is cheaper than cleaning them up afterwards.
- Variant mapping is the point that generates the most phantom products in this integration.
Why duplicates appear when connecting Odoo with WooCommerce
The most frequent cause is that both systems are loaded or synced separately, without a shared unique identifier for each product, order or customer. If a product is created manually in WooCommerce and separately in Odoo, with no explicit link between both records, the later sync has no way of knowing it is the same product and creates a new one.
There is a second, subtler cause: bidirectional syncing with no precedence rules. When both systems can create and modify the same type of record, each interprets the other’s changes as new information. The result is cross overwrites and records that multiply.
What data to sync and in which direction
| Data | Source of truth | Direction | Identity key |
|---|---|---|---|
| Product catalogue | Odoo | Odoo → WooCommerce | SKU |
| Variants | Odoo | Odoo → WooCommerce | Variant SKU |
| Inventory | Odoo | Odoo → WooCommerce | SKU |
| Prices | Odoo | Odoo → WooCommerce | SKU + price list |
| Customers | Bidirectional with rules | WooCommerce → Odoo (creation), Odoo → WooCommerce (tax details) | Email or tax ID |
| Orders | WooCommerce | WooCommerce → Odoo | Order number |
| Order status | Odoo | Odoo → WooCommerce | Order number |
| Invoicing | Odoo | Odoo → WooCommerce | Order number |
The column that matters most is the last one. Every flow needs a stable key that makes it possible to answer, at any moment, whether the incoming record already exists on the other side.
How to avoid duplicates in practice
- Define Odoo as the source of truth for catalogue and stock, and have WooCommerce only reflect it. This eliminates cross overwrites of products at the root.
- Use the same SKU in both systems from the very first moment, with no exceptions, no trailing spaces and no capitalisation differences. It is the simplest rule and the one that prevents the most problems.
- Validate customers before creating them. Before creating a customer in Odoo, check by email or tax ID whether they already exist. Without that validation, every purchase by a returning customer can generate a new contact.
- Configure orders in a single logical direction. WooCommerce generates the order, Odoo processes it, and the status goes back to WooCommerce. Never the other way round.
- Use an idempotency key when creating orders. The WooCommerce order number has to be recorded in Odoo, so that a retry does not generate a second sales order.
- Clean up before automating. Review existing product and customer duplicates before switching the sync on. Automating on a dirty base multiplies the problem.
Common errors in this integration
Syncing the catalogue in both directions. Without defining which one owns it, each system overwrites the other. It is the most common error and the hardest to reverse, because by the time it is detected there are already hundreds of affected records.
Not mapping variants correctly. Odoo and WooCommerce model variants differently. If the relationship between parent product and variant is not mapped explicitly, phantom products or orphan variants appear with stock nobody can sell.
Syncing orders without validating payment status. It generates sales orders in Odoo before payment is confirmed, with the resulting cancellation and stock adjustment work.
Migrating customers without cleaning up. The old problem is dragged into the new integration and shows up amplified.
Syncing the whole catalogue on every run. With large catalogues, syncing every product on every cycle saturates both WooCommerce and the Odoo server. Syncing has to be incremental: only what changed since the last run.
Ignoring WordPress’s impact. WooCommerce runs on WordPress, and a badly sized sync can affect the site’s performance. It is advisable to schedule bulk loads outside peak traffic hours.
How to clean up existing duplicates before starting
A reasonable procedure, in order:
- Export the products from both systems and compare by SKU. Identify the ones that exist in one and not the other, and the ones with an empty or inconsistent SKU.
- Normalise the SKU format: uppercase, no spaces, no special characters, with a single documented criterion.
- Resolve product conflicts: decide which record survives and move the missing information over before deleting the other.
- Compare customers by email and by tax ID. Email duplicates are usually obvious; tax ID ones are not.
- Merge customers preserving the order history, not deleting it.
- Document the rules applied, because they are going to be exactly the same ones the integration needs to apply automatically.
This work is the least visible part of the project and usually the one that determines its outcome. If the starting point is spreadsheets and manual loads, it is also worth reviewing when a manual integration becomes an operational risk.
Frequently asked questions
Is it better to use an Odoo module or an external integration layer? A module can work well for a simple operation, with a single channel and no particular business logic. An external layer is justified when more systems are involved (marketplaces, POS, logistics), when monitoring and retries are needed, or when either of the two systems is expected to change in the future. In that scenario, an Odoo integration built on an iPaaS platform connects the ERP with all those channels without relying on a separate module for each one.
What happens with products that only exist in WooCommerce? It has to be decided explicitly before syncing: they are created in Odoo, ignored, or flagged for manual review. Leaving that decision undefined is what produces divergent catalogues over time.
How often should stock be synced? Stock justifies the highest frequency the operation tolerates, ideally by events instead of by intervals: when it changes in Odoo, it is updated in WooCommerce. Syncs every few hours are the ones that generate overselling at demand peaks.
How are returns handled in this integration? The return has to be registered in Odoo, trigger the credit note and send the status back to WooCommerce. Processing it only in WooCommerce leaves stock and accounting out of date.
Does the integration affect the site’s performance? It can, if large volumes are synced during high-traffic hours or if every operation queries Odoo in real time with no cache. With incremental syncing and proper scheduling, the impact is marginal.
Checklist to integrate Odoo with WooCommerce
- Is it defined which system is the source of truth for catalogue and stock?
- Do products share the same SKU in both systems, with a normalised format?
- Are variants mapped explicitly between both data models?
- Is there a validation that prevents creating duplicate customers?
- Is the WooCommerce order number recorded in Odoo to avoid duplicates on retries?
- Is syncing incremental and scheduled outside traffic peaks?
- Were existing duplicates cleaned up before automating?
You may also be interested in reading:
• “From CSV and Excel to real-time data: when a manual integration becomes an operational risk” • “Enterprise integration map: how to document systems, flows and owners before modernising your stack” With Weavee’s WooCommerce and ERP integration you sync Odoo and your store without catalogue, customer or order duplicates, with identity keys defined per flow and retry control from day one.


