Odoo consultants for US manufacturers, distributors, and ecommerce brands

Integrations · Odoo guide

Why Odoo Shopify Connectors Break, and How to Fix the Sync

Why does an Odoo Shopify integration break, and how do you fix it?

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.

See also: How do I connect Odoo to Shopify?; Who can fix Odoo Shopify, BigCommerce, WooCommerce, or warehouse integrations?; How do I use the Odoo API to sync data with another system?; How do I set up multi-warehouse inventory in Odoo?.

The ERP Firm · Last updated October 30, 2026

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.

  1. Copy production to a neutralized staging database and stop the connector write jobs so a test order cannot land in production.
  2. Export failed jobs and the last 7 days of Shopify webhook deliveries. List every paid order id that is missing from sale.order.
  3. Decide the system of record: Odoo owns available stock, invoices, and refunds; Shopify owns checkout.
  4. 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.
  5. 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.
  6. Pick one tax owner before replay. Map Shopify tax lines to Odoo taxes, or let the fiscal position recalculate, and do not run both.
  7. 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.
  8. Replay missed paid orders from the Admin API. Leave draft and unpaid checkouts out of Odoo.
  9. 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.
  10. 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.

ApproachSetup timeMonthly cost rangeMaintenance loadUpgrade risk
Shopify connector app from the Odoo Apps store1–3 weeks$0–$300 app fee2–6 hrs/moHigh: often no branch for the next Odoo series
Third-party app or iPaaS2–6 weeks$300–$2,000 platform4–10 hrs/moMedium: field maps break when models change
Custom API module4–10 weeks$1,400–$5,0008–20 hrs/moMedium: 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.

SymptomRoot causeFixTime to fix
Orders not importingMissed orders/paid webhook, or the line SKU is not on product.productReplay from the Admin API after the SKU map exists. Store the Shopify order id on sale.order2–8 hours
Duplicate customers or partnersGuest checkout creates a new res.partner. Email match is offUpsert on the normalized email and the Shopify customer id. Delivery addresses stay child contacts4–12 hours
Inventory not syncing, or oversellqty_available is published, or every warehouse is summedPublish free_qty for the selling location only4–16 hours
Tax or price mismatchShopify and Odoo both calculate tax, or the pricelist ignores the discountOne tax owner. Map the discount to an order line1–3 days
Payment or refund reconciliationThe payout deposit is booked as the invoice payment. The refund is not a credit noteOne payment per Shopify transaction. Refund as a credit note (move_type out_refund). Reconcile the payout in the bank1–3 days
Variant or SKU mappingTwo variants share default_code, or the barcode is blankOne internal reference and one barcode per product.product4–12 hours
Webhook or API rate limitsRetries with no backoff hit HTTP 429 on the Admin APIQueue with exponential backoff and a dead-letter row1–2 days
Multi-warehouse or location mappingEvery Odoo warehouse is summed into one Shopify locationMap each Shopify location to one warehouse or stock location1–3 days
Fulfillment or tracking not pushingTracking is sent before the picking is done, or the carrier name is one Shopify rejectsSend carrier and tracking on stock.picking when state is done4–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.

CaseFixturePass when
Paid order1 line, qty 2, $40 goods, $3.20 taxOne sale.order. Tax matches the owner you chose
ReplaySame Shopify order id delivered twiceStill one sales order
CustomerTwo checkouts, one emailOne res.partner
Stock figureOn hand 10, reserved 4Shopify available quantity is 6
Second warehouseLocation A free 8, location B free 5. Shopify maps to AShopify shows 8
Variant map3 Shopify variants, 3 SKUs3 product.product rows and no blank line
Partial refund$15 of a $40 orderOne credit note for $15
FulfillmentPicking validated, tracking 1Z999Shopify fulfillment has 1Z999. Nothing was sent while the picking was waiting
Rate limit100 inventory writes in 5 seconds, above the REST Admin API limit of 2 requests per secondShopify returns HTTP 429, the queue backs off and drains, and no quant is duplicated
Unmapped SKUOrder line SKU missing in OdooRow 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

FAQ

Follow-up questions

Why are Shopify orders not importing into Odoo?
The orders/paid webhook was missed, the line SKU does not match a product, or the connector dropped the order as unpaid. Replay from the Admin API only after the SKU map and the Shopify order id are in place.
Why does Odoo create duplicate customers from Shopify?
Guest checkout and a loose name match create a new res.partner each time. Upsert on the normalized email and the Shopify customer id, and keep delivery addresses as child contacts.
Why does the inventory sync oversell?
The connector is publishing on-hand quantity (qty_available), or the sum of every warehouse. Publish free quantity (free_qty) for the Shopify location's warehouse only.
Should Shopify or Odoo calculate tax?
One of them, chosen before go-live. Map Shopify tax lines into Odoo, or let a fiscal position recalculate. Running both adds the tax twice.
Should you use a connector app, an iPaaS, or a custom module?
Use the planning estimates on this page. A connector app is the shortest setup, an iPaaS costs more each month, and a custom module costs more up front because you own the queue and the upgrade.
When should you call an Odoo Shopify integration consultant?
When paid orders, stock, or refunds are already wrong and the connector has no idempotency key. Rescue and Run is Core at $5,000/mo up to 15 Odoo users, Growth at $8,500/mo for 16–50, or Scale at $14,000/mo for 51–150.

Talk to us about your Odoo system

Bring your Odoo version, user count and the workflow that is causing problems.

Book a scoping call