Odoo 16 ↔ Shopify integration · Updated 2026
Odoo 16 ↔ Shopify:
reliable sync, even without native webhooks.
Odoo 16 (October 2022) finished the OWL UI rewrite, but it does not ship native outbound webhooks — that feature only arrived in Odoo 17. That changes the shape of Odoo 16 ↔ Shopify sync, but it does not make it unreliable. Hasil Sync pairs Shopify's push webhooks with XML-RPC reads and a 10-minute catalogue refresh on the Odoo 16 side. No custom Odoo module, no Zapier, no Shopify App Store install. And when you're ready to move to Odoo 17, the sync carries over.
No credit card · No Shopify App Store install · No custom Odoo modules
The problem
Odoo 16's missing webhook story, named honestly
A good ERP ↔ storefront sync needs both systems to surface their changes. On Odoo 16 only one side can push: Shopify has had Admin API webhooks for years, but Odoo 16 has no native outbound webhook UI — that capability landed in Odoo 17. So any honest Odoo 16 connector has to acknowledge three things:
- Shopify → Odoo is real-time on Odoo 16, because Shopify pushes. Webhook in, Odoo write out, done in seconds.
- Odoo → Shopify cannot be real-time on Odoo 16 without inventing a custom Odoo module — Hasil refuses that route on principle. Instead it polls Odoo via XML-RPC on a 10-minute catalogue refresh cycle and pushes the deltas to Shopify.
- Odoo 16 is at or past official end-of-life. Many teams still can't upgrade on a moment's notice. That's normal — Hasil supports you on Odoo 16 today, and stays connected through the upgrade to Odoo 17 (which then unlocks push-based Odoo → Shopify) without forcing a rebuild.
The rest of this page is the actual mechanism, the trade-offs, and the upgrade path — no buzzwords.
Architecture
Shopify pushes. Odoo 16 is read on a refresh cycle.
The two halves of the sync have different shapes on Odoo 16. Shopify fires webhooks; Odoo 16 is polled on a 10-minute schedule via XML-RPC. Both halves are idempotent and survive retries.
┌────────────────┐ ┌──────────────────┐
│ Odoo 16 │ scheduled XML-RPC reads │ Shopify │
│ Community · │ ◀───── (every 10 min) ───── │ Admin API │
│ Enterprise · │ │ webhooks │
│ Odoo.sh │ ◀────── inbound writes ─────│ (token only) │
└───────┬────────┘ └────────▲─────────┘
│ │
│ scheduled reads (no native push│ (Shopify)
│ outbound webhooks on Odoo 16) │
▼ │
┌────────────────────────────────────────────────────────┴───────┐
│ Hasil Sync │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ entity_ │ │ sync_queue │ │ sync_health │ │
│ │ mappings │ │ (retry + │ │ (queue depth, │ │
│ │ (Odoo↔Shop) │ │ backoff) │ │ last-success/obj) │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│ Raw payloads auto-purge after 30 days · No funds ever touched │
└────────────────────────────────────────────────────────────────┘Asymmetric on purpose. Shopify pushes via Admin API webhooks (real-time). Odoo 16 is polled via XML-RPC on a 10-minute catalogue refresh cycle, because Odoo 16 has no native outbound webhooks. Tables shown (entity_mappings, sync_queue, sync_health) are the real backend tables Hasil Sync runs on.
How it works
5 steps to a live Odoo 16 ↔ Shopify sync.
- 1
Connect Shopify with an Admin API token
In Shopify Admin → Settings → Apps and sales channels → Develop apps, create a custom app and copy the Admin API access token. Paste it into Hasil. No Shopify App Store install, no Shopify Partner account, no theme edits.
- 2
Connect Odoo 16 with database URL + API key (XML-RPC)
Point Hasil at your Odoo 16 database URL and paste an Odoo user API key. Works on Community, Enterprise, and Odoo.sh. Hasil talks to Odoo 16 over its standard external API (XML-RPC / JSON-RPC) — no custom Odoo modules to install, no Odoo source modifications.
- 3
Enable Shopify Admin API webhooks (the push side)
Hasil registers the Shopify webhooks it needs (products, inventory_levels, orders, customers). Anything that changes in Shopify reaches Hasil in seconds — that direction is already push-based on Odoo 16, exactly like on Odoo 17.
- 4
Map your fields once
Choose which Odoo product field maps to Shopify SKU, how Odoo pricelists map to Shopify price lists, and which Odoo warehouses feed which Shopify locations. Defaults are pre-filled — most merchants accept them as-is and skip to step 5.
- 5
Odoo-side change detection — and watch sync_health
Because Odoo 16 doesn't ship native outbound webhooks (that arrived in Odoo 17), the Odoo→Shopify direction is driven by a 10-minute catalogue refresh: Hasil reads what changed via XML-RPC and writes the deltas to Shopify. Reliable, idempotent, and stress-tested at 1,000 requests per hour. The sync_health dashboard shows queue depth, failure rate, and last-successful-sync per object type so you see drift before your buyers do.
Compatibility
Odoo 16 — Community, Enterprise, Odoo.sh.
This page covers Odoo 16 specifically because its sync shape is different from Odoo 17's. Hasil Sync talks to Odoo 16 over the standard external API (XML-RPC / JSON-RPC) — no custom modules, no Odoo source patches, no special dependencies beyond the stock modules (Sales, Inventory, Contacts).
Odoo 16 Community
XML-RPC reads + catalogue refresh · stress-tested at 1,000 req/hr
Odoo 16 Enterprise
XML-RPC reads + catalogue refresh · stress-tested at 1,000 req/hr
Odoo 16 on Odoo.sh
XML-RPC reads + catalogue refresh · stress-tested at 1,000 req/hr
End-of-life note
Odoo 16 is at/past Odoo's official support window — upgrade path supported
Odoo 16 is at or past Odoo's official end-of-life. Many teams can't upgrade overnight — Hasil supports you on Odoo 16 today and stays connected through the upgrade. If you're already on Odoo 17, native outbound webhooks unlock a faster Odoo → Shopify direction — see /integrations/odoo-17-shopify.
Three design rules
Every plan, no exceptions.
Admin API token only
No Shopify App Store, no Partner account, no theme edits. You paste a token, we read what we need.
We never touch funds
Orders flow through Shopify's own checkout and Odoo's own invoicing. Hasil moves data, never money.
Minimal data, 30-day purge
Raw webhook payloads auto-delete after 30 days. We keep only the durable mappings and queue state the sync needs.
Free playbook
Stuck on Odoo 16 a while longer? Take the playbook.
Free Shopify B2B Pricing Playbook — pricing models, inventory rules, and the exact draft-order flow Hasil uses. 18 pages, no fluff.
FAQ
Odoo 16 ↔ Shopify integration — common questions
Does Odoo 16 support native outbound webhooks?+
No. Native outbound webhooks are an Odoo 17 feature — they don't exist in Odoo 16 or earlier. For Odoo 16, Hasil Sync uses the standard external API (XML-RPC / JSON-RPC) for reads plus a 10-minute catalogue refresh to detect changes on the Odoo side. The Shopify side still pushes events to Hasil over Admin API webhooks, exactly as it does on Odoo 17.
How does Odoo 16 ↔ Shopify sync actually work without webhooks?+
Two halves with different shapes. Shopify → Odoo is push-based: Shopify Admin API webhooks fire on product, inventory, order, and customer changes, Hasil receives them and writes to Odoo 16 immediately. Odoo → Shopify is scheduled: every 10 minutes Hasil refreshes the catalogue, reads what changed via XML-RPC, and pushes the deltas to Shopify. Both halves are idempotent and survive retries — it's reliable, just not push-instant on the Odoo side.
Is Odoo 16 ↔ Shopify sync slower than Odoo 17?+
Honestly, in one direction yes. On Odoo 17, Odoo → Shopify is seconds because Odoo 17 fires native outbound webhooks the moment a record changes. On Odoo 16, that direction runs on the 10-minute catalogue refresh cycle, so worst case a stock or price change reaches Shopify within minutes rather than seconds. Shopify → Odoo is push-based and effectively real-time on both versions. If sub-minute Odoo → Shopify sync is critical for your operation, upgrading to Odoo 17 is the real fix.
Should I upgrade from Odoo 16 to Odoo 17 or 18?+
If you can, yes — Odoo 16 is at or past Odoo's official end-of-life window, which means no more official security patches. Beyond security, Odoo 17 adds the native outbound webhooks that make Odoo → Shopify sync push-based. Hasil supports you on Odoo 16 today and stays connected through the upgrade — your sync configuration, field mappings, and entity_mappings carry over so the cut-over to Odoo 17 doesn't break the integration.
Does Odoo 16 need a custom module for Hasil?+
No. Everything runs over Odoo 16's standard external API (XML-RPC / JSON-RPC) plus Shopify Admin API webhooks. No custom Odoo modules, no Odoo source patches, no special dependencies beyond the stock modules (Sales, Inventory, Contacts). That's also why upgrading Odoo 16 → 17 later won't force you to rebuild the integration.
Which Odoo 16 editions does Hasil Sync work with?+
Odoo 16 Community, Odoo 16 Enterprise, and Odoo 16 on Odoo.sh — all stress-tested at 1,000 requests per hour. The Odoo-side mechanism (XML-RPC reads + catalogue refresh) is identical across the three editions.
Does Hasil touch my funds or theme?+
No to both. Hasil connects to Shopify with an Admin API token only — no theme edits, no Shopify App Store install. Orders flow through Shopify's own checkout (or as Shopify draft orders for B2B); Odoo handles invoicing as usual. Hasil moves data, never money.
How long does setup take on Odoo 16?+
Roughly 10–20 minutes once both API credentials are in hand: a few minutes to paste the Shopify Admin API token, similar for Odoo 16 (database URL + API key), and the rest reviewing field mapping defaults. The first full catalogue sync runs in the background and finishes in minutes to hours depending on catalogue size.
Free playbook · 1 email/month
Not ready for a trial? Take the playbook instead.
Odoo 16 and Shopify, in agreement — without inventing a custom module.
14-day free trial. No credit card. No Shopify App Store, no custom Odoo modules. Stay on Odoo 16 as long as you need to — and when you upgrade to Odoo 17, the sync carries over.
Start 14-day free trial