Short answer: Odoo Shopify connectors break when the SKU map, the stock figure, or the webhook idempotency key is wrong, so orders, customers, and inventory drift apart. Fix that map on staging, then replay missed orders and republish free quantity from the selling warehouse only.
10-step fix checklist for a broken Odoo Shopify sync
Direct answer: Repair the connector on a staging copy: lock the SKU map and the external ids first, then replay orders and republish free stock. Leave the production queue off until the staging matrix passes, including a second delivery of each webhook.
- Copy production to a neutralized staging database and stop the connector write jobs so a test order cannot land in production.
- Export failed jobs and the last 7 days of Shopify webhook deliveries. List every paid order id that is missing from sale.order.
- Decide the system of record: Odoo owns available stock, invoices, and refunds; Shopify owns checkout.
- Map each Shopify variant to one product.product. Give it one internal reference (default_code) and one barcode, and stop if either value is shared.
- Store the Shopify order id on sale.order, the customer id on res.partner, and the variant id on product.product. A second create with the same id must do nothing.
- Pick one tax owner before replay. Map Shopify tax lines to Odoo taxes, or let the fiscal position recalculate, and do not run both.
- Publish free_qty for the selling warehouse only. Do not send qty_available, and do not add warehouses that the Shopify location does not sell.
- Replay missed paid orders from the Admin API. Leave draft and unpaid checkouts out of Odoo.
- Create the fulfillment only when stock.picking is done, and send the carrier plus the tracking number. Post each refund as a credit note (account.move with move_type out_refund) keyed by the Shopify refund id.
- Run the staging matrix, deliver every webhook a second time, then enable the production queue and watch the dead-letter list through the next business day.
What makes an Odoo Shopify rescue fail?
Direct answer: The rescue fails when orders are replayed before the SKU map is unique, or when both systems calculate tax and stock. Fix the map, the quantity you publish, and the idempotency key before you touch historical orders.
- Replaying history in production while two variants still share a SKU.
- Publishing on-hand quantity, which lets Shopify sell units Odoo has already reserved.
- Calculating tax in Shopify and again with an Odoo fiscal position on the same imported order.
- Recording the Shopify payout deposit as the customer payment, so fees disappear and the invoice residual is wrong.
- Sending tracking while the picking is still waiting, or retrying an HTTP 429 with the same payload immediately.
Which Odoo versions does a Shopify connector survive?
Direct answer: Odoo 16, 17, and 18 do not include a Shopify connector, so the app or custom module is pinned to one series. Plan a full staging retest before every major upgrade, including a move to Odoo 19.
Odoo 16, 17, and 18 do not ship a Shopify connector in Community or Enterprise. The integration is an Apps-store module, an iPaaS flow, or a private addon, and it is pinned to one Odoo series. Odoo 17 changed stock reservation, so a connector written for 16 can publish the wrong quantity after the upgrade. Shopify Admin API versions expire on a schedule, so pin the version in the connector instead of calling whatever the shop returns as latest. Run the staging matrix on a copy before you move the database to 17, 18, or 19.
Which Odoo Shopify integration approach should you plan for?
Direct answer: These figures are planning estimates, not client statistics, for a connector app, a third-party or iPaaS tool, and a custom API module. Odoo 16–18 does not ship a Shopify connector, so the first row is an app you install, not a module that comes with Odoo.
Planning estimates, not client statistics. Custom monthly cost is 8–20 hours at $175–$250/hr. App and platform fees are licenses, not labor.
| Approach | Setup time | Monthly cost range | Maintenance load | Upgrade risk |
| Shopify connector app from the Odoo Apps store | 1–3 weeks | $0–$300 app fee | 2–6 hrs/mo | High: often no branch for the next Odoo series |
| Third-party app or iPaaS | 2–6 weeks | $300–$2,000 platform | 4–10 hrs/mo | Medium: field maps break when models change |
| Custom API module | 4–10 weeks | $1,400–$5,000 | 8–20 hrs/mo | Medium: you port the module you own |
Odoo Shopify failure teardown
Direct answer: These repair times are planning estimates for one senior engineer on staging, not measured client statistics. Start with the SKU map and the order id; tax, payouts, and warehouse mapping take longer because finance and locations have to agree.
Planning estimates, not client statistics. Time to fix is staging time for one senior engineer, not a measured client average.
| Symptom | Root cause | Fix | Time to fix |
| Orders not importing | Missed orders/paid webhook, or the line SKU is not on product.product | Replay from the Admin API after the SKU map exists. Store the Shopify order id on sale.order | 2–8 hours |
| Duplicate customers or partners | Guest checkout creates a new res.partner. Email match is off | Upsert on the normalized email and the Shopify customer id. Delivery addresses stay child contacts | 4–12 hours |
| Inventory not syncing, or oversell | qty_available is published, or every warehouse is summed | Publish free_qty for the selling location only | 4–16 hours |
| Tax or price mismatch | Shopify and Odoo both calculate tax, or the pricelist ignores the discount | One tax owner. Map the discount to an order line | 1–3 days |
| Payment or refund reconciliation | The payout deposit is booked as the invoice payment. The refund is not a credit note | One payment per Shopify transaction. Refund as a credit note (move_type out_refund). Reconcile the payout in the bank | 1–3 days |
| Variant or SKU mapping | Two variants share default_code, or the barcode is blank | One internal reference and one barcode per product.product | 4–12 hours |
| Webhook or API rate limits | Retries with no backoff hit HTTP 429 on the Admin API | Queue with exponential backoff and a dead-letter row | 1–2 days |
| Multi-warehouse or location mapping | Every Odoo warehouse is summed into one Shopify location | Map each Shopify location to one warehouse or stock location | 1–3 days |
| Fulfillment or tracking not pushing | Tracking is sent before the picking is done, or the carrier name is one Shopify rejects | Send carrier and tracking on stock.picking when state is done | 4–12 hours |
Staging test matrix before go-live
Direct answer: Run every row on a neutralized staging database, then deliver the same webhook a second time. A pass on the first try is not enough if the duplicate still creates another sales order or partner.
Test fixtures for a staging copy. Pass each row, then deliver the same webhook again. These numbers are not client statistics.
| Case | Fixture | Pass when |
| Paid order | 1 line, qty 2, $40 goods, $3.20 tax | One sale.order. Tax matches the owner you chose |
| Replay | Same Shopify order id delivered twice | Still one sales order |
| Customer | Two checkouts, one email | One res.partner |
| Stock figure | On hand 10, reserved 4 | Shopify available quantity is 6 |
| Second warehouse | Location A free 8, location B free 5. Shopify maps to A | Shopify shows 8 |
| Variant map | 3 Shopify variants, 3 SKUs | 3 product.product rows and no blank line |
| Partial refund | $15 of a $40 order | One credit note for $15 |
| Fulfillment | Picking validated, tracking 1Z999 | Shopify fulfillment has 1Z999. Nothing was sent while the picking was waiting |
| Rate limit | 100 inventory writes in 5 seconds, above the REST Admin API limit of 2 requests per second | Shopify returns HTTP 429, the queue backs off and drains, and no quant is duplicated |
| Unmapped SKU | Order line SKU missing in Odoo | Row stays in the dead-letter queue. No half-posted sale.order |
When should you hire an Odoo Shopify integration consultant?
Direct answer: Hire an Odoo Shopify integration consultant on a flat monthly plan when the connector is already wrong: Core is $5,000/mo for up to 15 Odoo users, Growth is $8,500/mo for 16–50, and Scale is $14,000/mo for 51–150, compared with typical hourly partners at $175–$250/hr. First response is within 1 hour during Pacific Time business hours, small requests are delivered within 24 hours Monday to Friday, medium requests in 3 days, and large requests in 7–30 days by scope; a 24/7 emergency line is answered by a senior engineer, the Rescue & Run guarantee is the top ten roadmap issues in 30 days or the next month is free, and cancellation is risk-free for 30 days.
If the work involves custom modules, an upgrade, a storefront or warehouse integration, or a production outage, a focused engagement is usually faster than recruiting. See the related service.
See our industry practice
Related Odoo guides
More answers in the Integrations cluster and nearby topics:
Commercial pages