Store Platforms

Odoo Shopify Integration Service: What Gets Synced and Where It Breaks

Odoo Shopify integration service guide: who owns inventory and orders, Shopify API limits, webhook pitfalls, and what to ask before you hire.

Long Nguyen Avatar

Long Nguyen

Fullstack Developer · AI Engineer · Researcher

• • 6 min read •

What an Odoo Shopify integration service actually covers

An Odoo Shopify integration service connects your Shopify storefront to Odoo so that orders, stock, customers, shipments and refunds move between the two without someone re-typing them. The sync itself is the easy part. The real work is deciding which system owns each piece of data, and what happens when the two disagree.

This is the data map we start from on every project. Directions and owners vary by business, but every row needs an explicit answer before any code is written.

Data Usual direction Owner What breaks first
Products and prices Odoo to Shopify (or the reverse if merchandising lives in Shopify) One system only Variants, missing or duplicate SKUs
Inventory Odoo to Shopify Odoo Reservations, multiple locations
Orders Shopify to Odoo Shopify until fulfilled Order edits and cancellations after import
Customers Shopify to Odoo Shopify for web accounts Guest checkouts creating duplicate partners
Fulfillment and tracking Odoo to Shopify Odoo warehouse Partial shipments
Refunds and returns Shopify to Odoo (credit notes) Shopify Restock decisions, tax reversal
Payments and payouts Gateway to Odoo accounting Payment gateway Fees and batched payouts that do not match orders

Decide the source of truth first

Two-way sync on the same field is where most integrations rot. If both Odoo and Shopify can edit a product title, one of them will eventually overwrite the other at the wrong moment. The rule that holds up: every field has exactly one writer, and the other side treats it as read-only.

For most stores that means Odoo owns stock, cost, and fulfillment status, while Shopify owns the web order, the checkout customer, and the payment capture. Product content is the real judgment call: if your team writes descriptions and images in Shopify, let Shopify own them and import into Odoo only what operations needs (SKU, barcode, weight, cost).

Ready-made connector or custom integration?

Odoo documents its own Shopify connector for recent versions, and marketplaces list several third-party ones. Before assuming any of them fits, check its scope against your Odoo edition and version, because coverage differs between connectors and between releases. A pre-built connector is usually the right call when your flows are standard. Custom work earns its cost when they are not.

Situation Pre-built connector Custom integration
One Shopify store, one warehouse, standard taxes Usually enough Overkill
Several stores or several stock locations Check mapping limits carefully Often needed
Bundles, kits, or made-to-order products Rarely handled cleanly Often needed
B2B pricing, wholesale or custom tax rules Depends on the module Often needed
Self-hosted Odoo Community Verify the connector supports your edition Fits well, using Odoo's external API
Heavy order volume or large catalogs Test against Shopify limits first Designed around them

If your case sits in the right-hand column, a scoped build is cheaper than fighting a connector. That is the work behind our Odoo development and integration service: a sync designed around your products, warehouses and accounting rules instead of a generic mapping.

Shopify API limits that shape the design

Shopify throttles API calls, and the limits decide how you design catalog and order sync. For the GraphQL Admin API, Shopify's rate limit documentation sets a restore rate per plan and caps any single query at 1,000 cost points.

Shopify plan GraphQL restore rate
Standard 100 points per second
Advanced 200 points per second
Shopify Plus 1,000 points per second
Commerce Components 2,000 points per second

Two design consequences follow. First, a full catalog push on a Standard plan is a slow, paced job, not a burst, so initial imports need batching and resumable cursors. Second, the same page documents the REST Admin API as a request bucket that drains at two requests per second, and Shopify lists REST as legacy. New integrations should be built on GraphQL.

Webhooks are not enough: add reconciliation

Webhooks tell Odoo an order was created or paid in near real time. Shopify's own webhook guidance says an app should not rely on webhooks alone: delivery is not guaranteed, events can arrive out of order, and duplicates happen. The documented fixes are to dedupe on the webhook id header, order events by their timestamp, and run a background job that re-queries recently updated objects.

In practice that gives three layers: verify the signature, process each webhook id once, and run a scheduled reconciliation that asks Shopify for orders updated since the last successful run. The first two look like this:

import base64, hashlib, hmac

def verify_shopify_webhook(raw_body: bytes, hmac_header: str, app_secret: str) -> bool:
    digest = hmac.new(app_secret.encode('utf-8'), raw_body, hashlib.sha256).digest()
    expected = base64.b64encode(digest).decode('utf-8')
    return hmac.compare_digest(expected, hmac_header)

def should_process(webhook_id: str, seen_ids: set) -> bool:
    # In production keep ids in a database table with a unique constraint.
    if webhook_id in seen_ids:
        return False
    seen_ids.add(webhook_id)
    return True

Verify against the raw request body, not a re-serialized JSON object, or the signature will not match. Reconciliation is what turns a sync that works in a demo into one that survives a weekend of dropped events.

Inventory sync: where overselling comes from

Overselling rarely comes from a broken sync. It comes from pushing the wrong number. Odoo distinguishes on-hand stock from stock reserved for other orders, so the quantity you publish to Shopify should be what is actually available to sell, minus a safety buffer if your fulfillment is slow.

  • Map locations explicitly. Each Odoo warehouse or stock location that sells online maps to one Shopify location. Unmapped locations silently drop out of availability.
  • Prefer absolute quantities over deltas. Pushing a full available quantity self-heals after a missed event. Pushing only differences drifts permanently when one update is lost.
  • Trigger on stock moves, not on a timer alone. Update when a move is validated, then let a periodic job correct any drift.
  • Handle the race. An order can land between the moment you read stock and the moment you write it. A short safety buffer on fast-moving items costs less than a cancelled order.

Orders, taxes, payments and refunds in Odoo

Importing an order as a sales order is straightforward. Making it reconcile in accounting is where integrations earn their fee.

  • Shipping and discounts need their own products or lines in Odoo, or invoice totals will not match what the customer paid.
  • Taxes should be mapped to Odoo tax records and fiscal positions per destination, not recomputed independently. Two systems calculating tax separately will disagree by cents, and accountants notice.
  • Payouts from your gateway arrive batched and net of fees. Reconcile against the payout, not against each order.
  • Refunds should create credit notes and make an explicit restock decision, because a refund does not always mean the item came back.
  • Order edits after import (address changes, cancellations, added items) need a defined rule: update the Odoo order until it is delivered, then require a manual adjustment.
  • Partial fulfillment in Odoo becomes multiple deliveries, and each one should push its own tracking number to Shopify.

SKU and variant mapping

Shopify variants correspond to product variants in Odoo, and the SKU, often with the barcode, is the join key. If SKUs are blank or duplicated on the Shopify side, no integration can match records reliably. Clean the SKUs before the first sync, not after. Bundles and kits need a decision up front: sell them as a single Shopify product that explodes into components in Odoo, or manage them as a kit product. Retrofitting that later means reworking historical orders.

Questions to ask an Odoo Shopify integration provider

  • Which system owns each field, and where is that written down?
  • What happens when a webhook is missed, duplicated, or arrives out of order?
  • How is the initial catalog and order history import paced against Shopify limits?
  • How are taxes, shipping, discounts and gateway payouts mapped to accounting?
  • How do refunds, cancellations and partial shipments flow back?
  • Who sees the failures? Is there a visible error queue with retry, not just logs?
  • Does it run on your Odoo edition and hosting, and who maintains it after an Odoo upgrade?

A provider who answers these specifically has built this before. One who answers with a feature list has not.

What drives scope and timeline

Cost and duration depend less on the number of fields than on the exceptions. The factors that move a project, in rough order of impact: multiple stores or stock locations, bundles and made-to-order items, B2B pricing, custom tax or invoicing rules, historical data to migrate, and your Odoo version and hosting. Pricing is quoted to scope, so describe those exceptions rather than asking for a flat rate.

If you want your own flows assessed, tell us about your Shopify and Odoo setup and we will scope the sync around it.

FAQ

Frequently asked questions

What does an Odoo Shopify integration service include?

It connects Shopify and Odoo so orders, customers, stock, shipments and refunds move automatically. A proper service also defines which system owns each field, handles missed or duplicate webhooks, and maps taxes, shipping and payouts into Odoo accounting.

Should I use a ready-made Odoo Shopify connector or a custom integration?

Use a pre-built connector if you have one store, one warehouse and standard taxes, and it supports your Odoo edition and version. Choose custom work for multiple stores or locations, bundles, B2B pricing, custom tax rules or high order volume.

Which system should own inventory, Odoo or Shopify?

Odoo, in most setups. It knows reservations, warehouses and incoming stock. Publish the available-to-sell quantity to Shopify, ideally as an absolute number with an optional safety buffer, so a missed update corrects itself on the next push.

Are Shopify webhooks reliable enough to sync orders to Odoo?

Not on their own. Shopify's documentation says delivery is not guaranteed and events can arrive out of order or twice. Verify the signature, process each webhook id once, and run a scheduled job that re-fetches recently updated orders.

Should a new Odoo Shopify integration use the REST or GraphQL Admin API?

GraphQL. Shopify lists the REST Admin API as legacy, and GraphQL gives per-plan cost-based limits you can design around, with a 1,000-point ceiling per query that requires splitting large requests.

Stay updated with Netalith

Get coding resources, product updates, and special offers directly in your inbox.