Odoo + Shopify integration

Connect Odoo and Shopify so store orders become Odoo sales orders, Odoo stock and prices update Shopify, and tracking numbers, refunds and payouts land where they belong. AIONDATA builds the sync around your Odoo hosting, warehouses and accounting rules, with reconciliation and alerts.

California-based leadership · Serving US and international teams

Odoo
AIONDATAsync · MCP · rules
Shopify
Products and variantsPricesStock by locationOrdersCustomers and addressesFulfillment and trackingRefunds and returnsPayouts and fees
Illustrative integration flow

Your integration, scoped before we build

  • Object and field mapping for your workflows
  • Sync timing, error handling and reconciliation
  • Written scope, timeline and support options

How Odoo and Shopify work together

Odoo Shopify integration connects your storefront to Odoo sales, inventory and accounting. Shopify orders, refunds and payouts arrive in Odoo with the right customer, taxes and discounts, and Odoo sends back free-to-use stock per location and tracking numbers. On Odoo.sh or on-premise the sync can run as a module inside Odoo; on Odoo Online it runs outside Odoo through the external API. We build on the Shopify GraphQL Admin API and webhooks, and on Odoo’s JSON-2 or XML-RPC API.

Plan your Odoo + Shopify implementation

These decisions shape the scope, cost and acceptance tests. The flows below describe possible implementation behavior, not a preinstalled connector or a guarantee for every product edition.

Confirm hosting, plan and version

Tell us whether Odoo runs on Odoo Online, Odoo.sh or your own servers, and which version and plan. On Odoo Online the sync runs outside Odoo and needs the Custom plan for API access. Your Shopify plan matters too, because it sets the API rate limit.

Decide who owns each record

Usually Odoo owns products, prices and stock, and Shopify owns orders, customers and refunds. Agree how SKUs match (Shopify variant SKU to Odoo Internal Reference), which Odoo warehouse feeds each Shopify location, and how much stock to hold back as a buffer.

Set the order and accounting rules

Decide when an order enters Odoo (created or paid), how guest checkouts and B2B companies map to contacts, how discounts, shipping and taxes post, and whether Odoo invoices each order or books Shopify payouts as totals.

Agree acceptance tests and support

Write the test cases before the build, including duplicate webhooks, partial shipments and refunds after fulfillment. Confirm monitoring, who receives alerts, the daily reconciliation report and who clears held records.

Data flows

What moves between Odoo and Shopify

  1. 01Products and variantsOdoo ShopifyOdoo products and variants create or update Shopify products, with SKU from the Internal Reference, barcode, weight and Odoo attributes mapped to Shopify options.
  2. 02PricesOdoo ShopifyThe Odoo pricelist you choose sets Shopify variant prices. B2B price lists and catalogs are mapped separately when your Shopify plan supports B2B.
  3. 03Stock by locationOdoo ShopifyFree-to-use quantity per Odoo warehouse sets the available quantity at the matching Shopify location, less any safety buffer.
  4. 04OrdersShopify OdooShopify orders create Odoo sales orders with lines, discounts, shipping and taxes. The order name goes in Customer Reference and the Shopify order ID is stored to block duplicates.
  5. 05Customers and addressesShopify OdooShopify customers match Odoo contacts by stored Shopify ID, then email. Billing and shipping addresses become invoice and delivery addresses under the contact.
  6. 06Fulfillment and trackingOdoo ShopifyA validated Odoo delivery creates a Shopify fulfillment with carrier and tracking number, so Shopify can notify the customer.
  7. 07Refunds and returnsShopify OdooShopify refunds create Odoo credit notes and, when items come back, return transfers, so revenue and stock stay correct.
  8. 08Payouts and feesShopify OdooShopify Payments payouts and their balance transactions become Odoo bank entries with fees split out, ready to reconcile.

Field mapping

Odoo and Shopify field mapping

The records, match keys and triggers most implementations start from. Your scope confirms each row against your editions, custom fields and business rules.

Odoo and Shopify field mapping
SourceTargetMatch keyDirectionTriggerNotes
Odoo product.templateShopify ProductShopify product ID stored on the Odoo templateOdoo → ShopifyProduct change in Odoo (write_date), plus a nightly checkTitle, description, category and tags. Odoo attributes become Shopify options within the store’s option limit.
Odoo product.productShopify ProductVariantVariant SKU = Odoo Internal Reference (default_code)Odoo → ShopifyWith its productBarcode, weight and price. Up to 2,048 variants per product; blank or duplicate SKUs are held.
Odoo pricelist priceShopify variant price or B2B price listVariant SKU plus the pricelist mapped to each store or catalogOdoo → ShopifyOn price changeOne Odoo pricelist per Shopify store, market or catalog, in the same currency.
Odoo free-to-use quantity per warehouseShopify InventoryLevel (available) at a LocationShopify inventory item ID plus the location mapped to an Odoo warehouseOdoo → ShopifyOn stock moves, plus a scheduled full comparisonSent with inventorySetQuantities, the last known quantity for compare-and-swap, and an idempotency key. Shopify manages committed stock.
Shopify OrderOdoo sale.orderShopify order ID stored on the order; order name in Customer Reference (client_order_ref)Shopify → Odooorders/create or orders/paid webhookConfirmed per your rule. taxesIncluded decides tax-included pricing; totals are compared to the cent.
Shopify LineItemOdoo sale.order.lineSKU to product variant; Shopify line item ID storedShopify → OdooWith the orderQuantity, unit price, discount allocations and tax lines. Shipping lines become a delivery product line.
Shopify Customer and addressesOdoo res.partner with invoice and delivery contactsShopify customer ID, then emailShopify → OdooFirst order, then customers/update webhookGuest checkouts can map to one web-customer contact. B2B orders use the purchasing company.
Odoo stock.picking (validated delivery)Shopify Fulfillment on the FulfillmentOrderShopify fulfillment order ID stored on the pickingOdoo → ShopifyDelivery validated in OdooCarrier and Tracking Reference (carrier_tracking_ref). Partial deliveries fulfill only the shipped lines.
Shopify RefundOdoo credit note (account.move, out_refund) and return transferShopify refund ID stored on the credit noteShopify → Odoorefunds/create webhookRefunded lines, shipping and restocked quantities. Posted invoices are reversed, never edited.
Shopify Payments payout and balance transactionsOdoo bank statement lines and paymentsShopify payout IDShopify → OdooDaily, after each payoutGross amounts, fees and refunds split so the Odoo bank entry equals the deposit.

Download this mapping as a CSV worksheet · no email required

Editions and APIs

Odoo and Shopify: editions, hosting and APIs

The edition, hosting model and API on each side decide what the integration can do and how it is built.

Editions, hosting and APIs
Odoo OnlineNo custom or Odoo Apps Store modules, so the sync runs as an external service over the external API, which Odoo includes in its Custom plan. Test on a duplicate database: duplicates expire after 15 days and disable external actions by default.
Odoo.sh and on-premiseConnector modules can run inside Odoo. On Odoo.sh, third-party modules need a private GitHub repository, scheduled actions that keep timing out are disabled, and the queue_job module is listed as incompatible. Staging builds disable scheduled actions and remove marketplace seller accounts.
Odoo API by versionOdoo 19 and later: JSON-2 API with bearer API keys. Odoo 18 and earlier: XML-RPC or JSON-RPC. The older RPC endpoints are deprecated and scheduled for removal in Odoo 22 (fall 2028) and Odoo Online 21.1 (winter 2027).
Shopify Admin APIGraphQL Admin API; the REST Admin API has been legacy since October 1, 2024. A new version ships every quarter and each is supported for at least 12 months. Single-store custom apps are created in the Dev Dashboard; apps created in the admin before January 1, 2026 are still managed there.
Shopify rate limits by planGraphQL cost points per second: 100 on Standard, 200 on Advanced, 1,000 on Plus and 2,000 on Shopify for enterprise. A single query may cost at most 1,000 points, and Bulk Operations handle large exports without those limits. Stores past 500,000 variants can create at most 10,000 new variants a day, except on Plus.
Shopify data accessApps see the last 60 days of orders unless Shopify approves the read_all_orders scope, which matters for historical backfills. Customer names, emails and addresses are protected data: always available to Dev Dashboard custom apps, plan-dependent for admin-created apps, and reviewed for public apps.

Options, cost and timeline

Ways to deliver Odoo and Shopify integration

A prebuilt connector is sometimes enough. This comparison shows when each route fits, what it typically costs and how long it takes.

Delivery options, cost and timeline
ApproachTypical costTypical timeFits whenWatch for
Odoo Apps Store connectorOne-time license per Odoo major version. Many Shopify connectors for Odoo 19 list at a few hundred US dollars and some are free (Odoo Apps Store list prices, checked Sep 2026). Add setup time.Days to a few weeks to configure and testOdoo.sh or on-premise, one store, standard products, taxes and warehouses.Cannot be installed on Odoo Online. Must be bought again for each major version. Test duplicates, partial shipments and payouts before go-live.
iPaaS workflowPlatform subscription plus build time. Check the vendor’s current plan page for your volumes.A few weeks for standard flowsTeams that already run an iPaaS, with modest order volume and simple mappings.Odoo coverage varies by platform, and Odoo Online still needs the Custom plan for API access. Stock and duplicate logic still has to be designed.
Custom module inside OdooQuoted after a short discovery, plus porting effort at each Odoo major version.Usually a few weeks for a standard scope including testingOdoo.sh or on-premise teams that want the sync, its logs and its settings inside Odoo.Not possible on Odoo Online. Odoo.sh disables scheduled actions that keep timing out, so jobs run in small batches. The database cannot be upgraded until the module is ported.
Custom integration serviceQuoted after a short discovery of flows, stores, volumes and reconciliation needs.Usually a few weeks for a standard scope; typically two to three months for multi-store, multi-company or B2BOdoo Online, several stores or companies, B2B pricing, high volumes or finance-grade payout reconciliation.Needs a named owner for alerts and held records. We document the mappings and runbooks at handover.

Vendor prices are list prices from their public pages on the date shown; confirm current pricing with each vendor.

Multi-company and multi-warehouse setups

Map the structure before any data moves. Each Shopify store usually belongs to one Odoo company, and each Shopify location to one Odoo warehouse. Shopify order names such as #1001 are not unique across stores, so the integration keys orders on the Shopify order ID and the store.

Odoo shares new products and contacts across companies by default, while product cost is company-specific. Decide whether companies share one catalog, and restrict records with the Company field where they should not. On a Standard plan, turning on multi-company moves the database to Odoo’s Custom plan.

For stock, choose which warehouses feed each Shopify location and what buffer to hold back for fast sellers. If one store sells stock owned by another company, Odoo’s inter-company transactions can create the counterpart orders and bills.

  • One Odoo company, sales team and pricelist per store
  • A warehouse-to-location table, reviewed whenever either side adds a location
  • A safety buffer per location for fast-moving SKUs
  • Currency per store; Shopify reports each amount in shop and presentment currency

Failure and reconciliation playbook

Assume some events will be missed. Shopify says webhook delivery is not always guaranteed and recommends reconciliation jobs. A failing endpoint gets eight retries over four hours, and a subscription created through the Admin API is deleted after eight consecutive failures. On the Odoo side, the Send Webhook Notification action posts once and does not retry.

This playbook keeps both systems consistent and gives finance a daily report it can check.

  • Acknowledge each Shopify webhook at once, verify its HMAC signature, store it and process it from a queue.
  • Skip duplicate deliveries by X-Shopify-Webhook-Id, and never create a second order for a stored Shopify order ID.
  • Check webhook subscriptions daily and recreate any that Shopify removed.
  • Each night, list Shopify orders updated since the last run and confirm each has an Odoo order with the same total.
  • Compare Shopify available stock with Odoo free-to-use stock per location and log drift above an agreed threshold.
  • Hold records that fail validation, such as an unknown SKU or a missing tax mapping, with the error text, then replay them after the fix.
  • Alert a named owner when the queue grows or a job fails twice in a row.

Acceptance tests before go-live

We agree these cases in writing and run them on a Shopify development store against an Odoo staging branch or duplicate database. Each case has an expected result in both systems.

  • The same order webhook arrives twice: one Odoo order.
  • Discount code, tax-inclusive prices and free shipping: totals match to the cent.
  • Unknown SKU: order held with a clear error, released after the SKU is fixed.
  • Partial shipment: Shopify shows a fulfillment with tracking for the shipped lines only.
  • Refund after fulfillment with restock: credit note and return transfer in Odoo, stock back at the right location.
  • Stock changes in Odoo while an order is placed: stale update rejected and recalculated, no oversell.
  • Order canceled before shipment: Odoo order canceled and reservation released.
  • Payout with fees and a refund: Odoo bank entry equals the Shopify payout.
  • Odoo API key expired or revoked: sync pauses, alert sent, no data lost.

Outcomes

Why teams connect Odoo and Shopify

  • Orders reach Odoo through webhooks shortly after checkout, so picking starts without a manual import.
  • Shopify sells only what Odoo can ship, because each location’s stock comes from Odoo’s free-to-use quantity.
  • Customers get Shopify’s shipping emails as soon as the warehouse validates the delivery in Odoo.
  • Finance reconciles payouts, fees and refunds in Odoo against the orders they came from.

Odoo Shopify Integration FAQs

Should we use an Odoo Apps Store connector or a custom integration?

Try a connector first if Odoo runs on Odoo.sh or on-premise and your flows are standard: one store, one or two warehouses and simple taxes. Many listings for Odoo 19 cost a few hundred US dollars, sold per major version. Choose a custom integration on Odoo Online, where Apps Store modules cannot be installed, or when you run several stores or companies, need B2B pricing, or need a reconciliation report finance can sign off.

Does this work with Odoo Online?

Yes, as an integration service that runs outside Odoo. Odoo Online cannot run custom modules or Odoo Apps Store modules, and Odoo includes external API access only in its Custom plan. The service receives Shopify webhooks, calls Odoo’s JSON-2 API (XML-RPC before version 19) and runs scheduled checks, so nothing is installed in Odoo.

How close to real time is the sync?

Orders are pushed by Shopify webhooks and normally reach Odoo within seconds to a few minutes; stock flows back on stock moves or a short schedule. Shopify expects a response within five seconds, retries a failed delivery eight times over four hours and does not guarantee the order of events. We queue each webhook, answer at once, and process events by their timestamps.

How do you keep Shopify stock accurate?

We send Odoo’s free-to-use quantity, which is on-hand stock minus reservations, to Shopify’s available state at the matching location. Between checkout and import, Shopify has already moved sold units to committed. Each update carries the last quantity we read, a compare-and-swap check Shopify supports, so a push based on stale numbers fails and is recalculated instead of reselling those units. An idempotency key stops retries from applying twice.

How are SKUs, variants and kits matched?

Each Shopify variant SKU matches one Odoo variant’s Internal Reference, and both IDs are stored after the first match. Missing or duplicate SKUs stop that product with a clear error instead of guessing. Odoo attributes map to Shopify options, which Shopify caps per store, and a Shopify product holds up to 2,048 variants. Kits need a rule: sell the kit in Shopify and let an Odoo Kit bill of materials pick the components, or sync the components.

How are taxes, discounts and shipping handled?

Shopify calculates tax at checkout, while Odoo computes it from its own tax setup. We map each Shopify tax line to an Odoo tax, respect whether prices include tax, and compare the Odoo total with Shopify’s. Discounts come from each line’s discount allocations and shipping becomes a delivery line. Orders that differ by even a cent are held for review.

What happens with refunds, returns and cancellations?

A Shopify refund creates an Odoo credit note for the refunded lines and shipping, plus a return transfer when items come back to stock. An order canceled before shipment cancels the Odoo order and releases its reservation. Posted Odoo invoices are reversed with credit notes, never edited.

Can one Odoo database serve several Shopify stores or companies?

Yes. Each store maps to an Odoo company, sales team and warehouse. Shopify order names repeat across stores, so we key orders on the Shopify order ID plus the store. Turning on multi-company moves a Standard Odoo plan to Custom, products and contacts are shared across companies by default, and product cost is company-specific. Multi-store work typically takes two to three months rather than a few weeks.

Can AI agents work across Odoo and Shopify?

Yes. Odoo 20 includes an MCP server, and Shopify offers an Anthropic-verified Claude connector with tools such as list-orders and get-inventory-levels. Each covers one system. When an assistant must trace an order from checkout to delivery, AIONDATA can build an MCP server that reads both through the sync’s mappings, with write actions limited and approved by a person.

How long does an Odoo Shopify integration take?

Products, stock, orders, customers, fulfillment and refunds usually take a few weeks including testing on a Shopify development store and an Odoo staging branch or duplicate database. Several stores, multi-company rules, B2B pricing or payout reconciliation typically take two to three months. You get a written scope and timeline after a short discovery.

Ready to connect Odoo and Shopify?

Share your objects, volumes, and timing needs — we'll come back with a written scope.

Please share the systems and workflow—not credentials or customer records. We’ll confirm API access, scope and next steps.

NVIDIA Inception

NVIDIA Inception member

Part of NVIDIA’s program for startups building with AI and accelerated computing.

About the program
Pravin BansalSravan Modugula

Bay Area roots. Enterprise experience.

Pravin’s experience includes Google and SmartBear. Sravan previously held leadership roles at JPMorgan Chase and First Republic Bank.

Meet the founders

San Francisco Bay Area, California

9110 Alcosta Blvd Ste H345, San Ramon, CA 94583

US-led delivery, with engineering in India. Supporting US and international organizations.
Prefer email? info@aiondata.io

Let’s scope your integration.

Just your name and email to get started. Your details are handled under our Privacy Policy.