Odoo ↔ Shopify troubleshooting · Updated 2026
Odoo–Shopify sync not working?
Diagnose it in ten minutes.
Sync failures almost never announce themselves. Stock looks plausible, prices look plausible, and then a buyer orders something that shipped last week. This page is the diagnostic order we actually use — cheapest test first — plus the architectural reason drift keeps coming back after each manual fix.
Cancel anytime during the trial · No Shopify App Store install · No theme edits
Cause one
SKU mismatch — check this before anything else
Every connector matches records on some identity field, and for products that field is almost always the SKU. If Odoo has 'ABC-100 ' with a trailing space, or Shopify has 'abc-100' in lower case, or one system stores the internal reference while the other stores the barcode, the record simply never matches and the sync reports success while doing nothing.
Test it directly: export both product lists, normalise case and whitespace, and diff them. If the unmatched count is greater than zero, you have found your fault and no other test is needed yet.
- Trailing whitespace and case differences are the two most common forms
- Variant-level SKUs must match variant-level, not product-level
- Products created in Shopify after the initial import often have no Odoo counterpart at all
Cause two
The wrong warehouse is mapped to the wrong location
Odoo tracks stock per warehouse; Shopify tracks it per location. If the mapping is wrong — or if a second warehouse was added in Odoo after setup and never mapped — you will see stock that is consistently understated or overstated by a fixed amount rather than randomly wrong.
A constant offset is diagnostic. Random noise points to timing; a stable gap points to mapping.
Cause three
Stale credentials and missing scopes
Odoo API keys are revoked when the owning user is deactivated, and Shopify tokens lose effect if the app connection is removed. Both failures produce authentication errors that a poorly built connector swallows into a generic 'sync failed'.
Verify the Odoo side by authenticating against the XML-RPC common endpoint with the database name, login and API key; a returned user ID means the credential is good. Verify the Shopify side by confirming the token still carries read and write scopes for products, inventory levels, orders and customers.
Cause four
Rate limits that were retried into silence
Shopify's Admin API throttles, and a bulk catalogue update will hit that ceiling. A connector without exponential backoff will retry a few times, fail, and move on — leaving a partial write that looks like a data problem rather than a throughput problem.
The signature is scale-dependent failure: small updates always work, catalogue-wide updates always leave a tail of records behind.
Cause five
You built a one-way pipe and expected two-way behaviour
Shopify pushes events reliably over Admin API webhooks. Odoo only pushes if you are on Odoo 17 or later, where native outbound webhooks exist. On Odoo 16 and earlier the Odoo → Shopify direction has to be polled.
So if changes made in Shopify appear in Odoo instantly, but changes made in Odoo take minutes, nothing is broken. That is the architecture. Expecting sub-minute Odoo → Shopify updates on Odoo 16 without a custom module is expecting something the platform cannot do.
The permanent fix
Why drift returns, and what stops it
Manually re-syncing fixes today's symptom and leaves the cause in place. Sync stays correct only when three things exist together: a persistent mapping table so both systems agree on record identity, a retry queue with backoff so a transient failure is not a permanent gap, and a visible health surface so you see drift before your buyers do.
Hasil runs exactly that: entity mappings, a sync queue with backoff, and a health view showing queue depth, failure rate and last successful sync per object type. It connects through Shopify's official OAuth and Odoo's standard external API — no App Store install, no theme edits, no custom Odoo module. Raw payloads purge after 30 days, and the pipeline is stress-tested at 1,000 requests per hour.
- Entity mappings: identity agreed once, not guessed per run
- Idempotent writes: a replayed event cannot double-apply
- Queue depth and last-success per object type, visible at a glance
Free playbook
Get the Odoo–Shopify readiness checklist
The pre-flight list we run before connecting any store: SKU normalisation, warehouse mapping, scopes, and the fields that silently break sync.
FAQ
Odoo–Shopify sync failures — common questions
Why is my Odoo Shopify inventory sync not working?+
In roughly that order: SKU mismatch between the two systems, the wrong Odoo warehouse mapped to the Shopify location, a stale or revoked API credential, a silent rate-limit rejection that the connector retried and gave up on, or a one-directional setup where Odoo was never told about a Shopify-side change. Check SKUs first — it is the cause in most cases and the cheapest to rule out.
How do I check whether the connection itself is alive?+
Authenticate directly against Odoo's XML-RPC endpoint at /xmlrpc/2/common with your database name, login and API key. If that returns a user ID, the credential is valid and the fault is in mapping or scheduling, not authentication. On the Shopify side, confirm the Admin API token still has the read and write scopes for products, inventory and orders.
Why do stock levels drift even when sync 'works'?+
Because reads and writes are happening on different clocks. If Odoo is polled every ten minutes and Shopify pushes instantly, a sale and a stock adjustment inside the same window can be applied in the wrong order. The fix is idempotent writes plus a reconciliation pass that treats one system as authoritative per field, rather than letting last-write-wins decide.
Does Odoo 16 sync differently from Odoo 17?+
Yes, and it matters for diagnosis. Odoo 17 ships native outbound webhooks, so Odoo → Shopify can be push-based and near real-time. Odoo 16 has none, so that direction runs on a scheduled catalogue refresh. If you are on 16 and expecting instant Odoo → Shopify updates, nothing is broken — the architecture simply cannot do it without a custom module.
Is Zapier a reasonable fix for a broken sync?+
For low volume and one direction, it can be. It breaks down on bulk operations, on retry semantics, and on cost — task-based pricing punishes exactly the catalogue-wide updates that wholesale operations run. It also has no concept of an entity mapping table, so it cannot tell you which records are out of agreement.
How do I stop sync drift permanently?+
Three things: a persistent entity-mapping table so both systems agree on identity, a retry queue with backoff so transient failures do not become permanent gaps, and a health view showing queue depth and last successful sync per object type. Hasil runs all three, and stress-tests the pipeline at 1,000 requests per hour.
Keep reading
Free playbook · 1 email/month
Not ready for a trial? Take the playbook instead.
Stop re-syncing by hand every Monday.
14-day free trial. Entity mappings, retry queue, and a health view that shows drift before your buyers find it. No custom Odoo module required.
Start 14-day free trial