11 min read
Odoo ↔ Shopify Sync: Two-Way Integration Without the Pain
Odoo runs your operations. Shopify runs your storefront. Keeping them in sync is where most teams either over-build or under-build. Here's the middle path that actually holds up in production.
Decide your source of truth first
Before you sync a single SKU, answer one question: when product data disagrees, which system wins?
For most merchants, Odoo wins on products, prices, and inventory (because that's where operations happens), and Shopify wins on orders (because that's where customers create them). Pick this once. Write it down. Every conflict you'll ever hit is resolved by referring back to that rule.
The four sync flows you actually need
1. Products: Odoo → Shopify
New products and product updates flow from Odoo to Shopify. Map by SKU (not by name, not by ID). Sync title, description, images, variants, weight, barcode, and metafields. Skip Odoo-only fields like internal references and accounting categories.
2. Inventory: Odoo → Shopify (near real-time)
When stock changes in Odoo, Shopify should know within minutes — not next morning. Use Odoo webhooks, not polling. Subtract allocated quantity from forecast quantity to avoid overselling.
3. Prices: Odoo → Shopify
Standard price lists sync straight across. B2B price lists are trickier — you usually want them in your wholesale portal (Hasil Pricing) rather than in Shopify itself, so they don't leak to retail.
4. Orders: Shopify → Odoo
New Shopify orders create Odoo sales orders. Map customer by email, line items by SKU. Push fulfilment status back to Shopify when Odoo ships. This is the loop that closes the integration.
Where teams over-build
Two-way sync on customers. Don't. Customers should flow Shopify → Odoo, never back. Bi-directional customer sync is how you end up with duplicate contacts and broken emails.
Real-time everything. Inventory needs to be near real-time. Products can be every 10 minutes. Reports can be daily. Don't pay the complexity tax for sub-minute sync on things that don't need it.
Custom field mapping for every Odoo module. Start with the standard fields. Add custom mappings only when a real workflow demands it.
Handling conflicts
Three rules. One: source-of-truth wins, every time, no exceptions. Two: log every conflict with before/after values so you can audit later. Three: never silently drop data — push conflicts to a queue and surface them in a dashboard.
Hasil Sync ships exactly this pattern — Odoo as source of truth for catalogue, Shopify as source of truth for orders, conflict queue with full payload history, 30-day retention. If you're building your own integration, copy that contract.
Want this working on your store?
Hasil ships wholesale portals and Odoo ↔ Shopify sync. 14-day free trial.
Start free trial