Miko for Odoo
WooCommerce Connector for Odoo
WooCommerce and Odoo, kept in step.
WooCommerce runs on the merchant's own WordPress, which is the whole reason this connector is written the way it is. A hosted API does not hand you an HTML error page from a caching plugin, or a firewall answering instead of the API, or a site that is simply slow. This one expects all three and says which happened.
It keeps both sides in step on a schedule using the WooCommerce REST API v3, and stops rather than guessing wherever a guess would cost money.
What syncs, and which way
| Record | Direction | Notes |
|---|---|---|
| Orders | Woo → Odoo | Checked against the total WooCommerce actually charged |
| Products and variations | Both ways | Variations matched on exact option-set equality |
| Customers | Both ways | Guest checkouts become real contacts |
| Stock | Odoo → Woo | To one named location you choose |
| Order status | Odoo → Woo | Pushed back as the order progresses |
How it works
- Create the API credentials in your store. Read and write access to products, customers, orders and inventory.
- Add the store in Odoo and press Test Connection. It verifies the credentials, names the store back to you, and says exactly what to fix if anything is wrong.
- Import, then look at what arrived. Products, then customers, then orders. Nothing is confirmed or invoiced yet: those switches start off on purpose.
- Turn on the schedule and the write-back. Once you are happy with what came in, enable the scheduled sync, stock publishing and fulfilment individually.
WooCommerce needs permalinks set to anything other than Plain for the REST API to route correctly. It is the most common reason a first connection test fails.
What it will not do
- It never imports the same order twice, whatever happens mid-sync.
- It never invents a tax. Anything WooCommerce sends without an Odoo equivalent stops and asks.
- It never attaches a sale to a nearly-matching variation.
- It checks every imported order against the total WooCommerce actually charged, leaving anything that disagrees as a quotation with the difference spelled out.
Orders and products, as WooCommerce records them
- Variations come from a separate endpoint and are matched on exact option-set equality. A near match is reported and left unlinked.
- Attribute lines are only ever added, never removed, because removing one deletes variants that historical orders reference.
- Virtual products become Odoo services.
- Line discounts are kept as discounts rather than folded into the price.
- Shipping and fee lines are imported as their own lines.
- Pending and failed statuses are skipped by default: they are abandoned checkouts, not sales.
- Guest checkouts become real contacts built from the billing block.
When something fails, you are told what to fix
- Failed is transient: a dropped connection, a rate limit, a 502. It is retried automatically with exponential backoff.
- Needs attention means something has to change before it can work: a tax with no mapping, a product not in Odoo, a revoked key. These are never retried on a timer, because a timer cannot fix them, and each one carries the sentence saying what to do.
- Every job keeps the exact payload that caused it, so a retry replays the failure without asking the store for the data again.
- There is a Retry button on every job, and a dashboard filtered to what still needs a person.
Requirements
- Odoo 16, 17, 18 or 19, Community or Enterprise.
- The free E-Commerce Connector Engine.
- WooCommerce 3.5 or later, a consumer key with Read/Write permission, HTTPS, and permalinks set to anything other than Plain.
- Odoo Online cannot run third-party modules that contain Python, which is Odoo's rule rather than ours. Odoo.sh and self-hosted installs are both fine.
Questions
My connection test fails but the credentials are right.
Check permalinks first. WooCommerce needs them set to anything other than Plain for the REST API to route. After that, the usual causes are a caching plugin returning HTML or a firewall answering instead of the API, and the test names which it saw.
Are abandoned checkouts imported as orders?
No. Pending and failed statuses are skipped by default, because they are abandoned checkouts rather than sales.
What happens to guest checkouts?
They become real contacts, built from the billing block on the order.
Which Odoo versions are supported?
Every listed Odoo version is certified on each release by installing the module into a real Odoo image of that series and running the full test suite. A version is only listed once it passes.
Does it work on Odoo Online?
Odoo Online cannot run third-party modules that contain Python, which is Odoo's rule rather than ours. Odoo.sh and self-hosted installs are both fine.
How do I get help?
Email [email protected] with your Odoo version, the module version and what you did. If a sync job failed, the job record holds the exact payload and the error, which answers most questions immediately.
Other Miko apps for Odoo
Shopify Connector for OdooShopify and Odoo, in lockstep.Magento 2 Connector for OdooMagento 2 and Odoo, kept in step.E-Commerce Connector EngineThe engine, not the car.Catalog AuditFind what is broken before it costs you a sale.Email Validation & DuplicatesFind unusable contacts before they cost you an invoice.Margin ControlStop orders that lose money, on your own rules.
WooCommerce Connector for Odoo
Live on the Odoo App Store, published by Tripster Developers.
Get it on the Odoo App Store ↗
Live on the Odoo App Store, published by Tripster Developers.