Odoo + Shopify Sync: Products, Orders, and Inventory
Shopify powers over 10% of all US eCommerce revenue. For businesses using Odoo 19 Enterprise as their operational backbone and Shopify as their customer-facing storefront, keeping both systems synchronized is non-negotiable — disconnected systems mean inventory errors, order processing delays, and accounting headaches.
This guide covers the complete Odoo-Shopify integration: architecture decisions, product catalog synchronization, real-time order import, bidirectional inventory management, Shopify Payments reconciliation, and multi-store management.
Key Takeaways
- Shopify's REST and GraphQL APIs both supported; GraphQL preferred for Shopify Plus
- Product sync is bidirectional: create in Odoo → publish to Shopify, or import from Shopify
- Inventory sync is event-driven: triggers on every stock movement in Odoo
- Orders webhook from Shopify to Odoo delivers near-instant order import (< 30 seconds)
- Shopify Payments reconciliation handles payouts, fees, and refunds automatically
- Multi-location inventory syncs to Shopify's multi-location feature
- Shopify Plus B2B (wholesale) catalogs link to Odoo's pricelists
- Returns flow from Shopify to Odoo RMA with automated stock adjustment
Integration Architecture
API approach:
The integration uses Shopify's REST Admin API for most operations and webhooks for event-driven updates:
- REST API: product CRUD, order read, inventory management
- GraphQL API: bulk operations (large catalog export), B2B pricing (Shopify Plus)
- Webhooks: real-time order creation, order update, refund creation, inventory level update
Connection topology:
Odoo 19 (ERP Backend)
↕ Product, Inventory, Price
Shopify Admin API / Webhooks
↕ Real-time events
Shopify Storefront (Customer-facing)
Authentication:
Shopify uses private app API keys or custom app OAuth:
- Private App: simpler, recommended for single-store integrations
- Custom App (OAuth): required for Shopify App Store distribution or multi-store management
For the ECOSIRE connector, configure a Custom App in Shopify's Partner Dashboard.
Shopify App Configuration
Step 1: Create a Custom App in Shopify
- Go to your Shopify admin → Settings → Apps and Sales Channels
- Click Develop Apps → Create an App
- Set the app name (e.g., "Odoo Integration")
- Configure API scopes:
read_products, write_products read_orders, write_orders read_inventory, write_inventory read_shipping, write_shipping read_customers, write_customers read_fulfillments, write_fulfillments read_locations read_price_rules, write_price_rules - Set webhook URL:
https://your-odoo.com/shopify/webhook - Install the app → copy Admin API Access Token
Step 2: Configure in Odoo
Navigate to Sales → Shopify or Inventory → Shopify Stores:
| Field | Value |
|---|---|
| Store Name | Your store name |
| Shopify Domain | yourstore.myshopify.com |
| Admin API Token | From custom app |
| API Version | 2024-10 (latest stable) |
| Webhook Secret | Auto-generated, used to verify webhooks |
| Default Warehouse | Primary warehouse for Shopify orders |
| Currency | Store currency |
| Company | Odoo company for this store |
| Payment Journal | Shopify Payments journal |
| Refund Journal | Shopify Refunds journal |
| Order Prefix | e.g., "SHO-" |
Step 3: Register webhooks
After saving the configuration, click Register Webhooks. The connector subscribes to:
orders/createorders/updatedorders/paidorders/fulfilledorders/partially_fulfilledorders/cancelledrefunds/createinventory_levels/updateproducts/update
Product Catalog Synchronization
Sync direction options:
| Mode | Description | Use Case |
|---|---|---|
| Odoo → Shopify | Odoo is master, Shopify is display | New products created in Odoo ERP first |
| Shopify → Odoo | Shopify is master, Odoo is slave | Existing Shopify store, adding Odoo |
| Bidirectional | Changes in either system sync both ways | Rare; risk of conflicts |
Recommended: Odoo → Shopify for new deployments. Odoo's product master provides richer data (purchase info, costing, BOM) that Shopify doesn't need.
Product field mapping:
| Odoo Field | Shopify Field |
|---|---|
| Product Name | Title |
| Sales Description | Body HTML |
| Product Category | Product Type |
| Tags | Tags |
| List Price | Price |
| Compare-at Price | Compare At Price |
| Barcode (EAN) | Barcode |
| Weight | Weight |
| Product Images | Images |
| Sales OK | Published (true/false) |
| Product Type (service/storable) | Requires Shipping |
Variant synchronization:
Shopify supports up to 3 product options (Color, Size, Material) with a maximum of 100 variants per product. The connector maps Odoo's product attributes:
- Odoo
product.template→ Shopify Product - Odoo
product.product(variants) → Shopify Variants - Odoo attribute values → Shopify option values
Bulk catalog sync:
For initial setup with large catalogs (1000+ products):
- Navigate to Shopify → Catalog → Bulk Sync
- Select product categories to sync
- Run the bulk sync job (background process)
- Monitor progress in the sync log
- Review and resolve any mapping errors
Order Management
Real-time order import via webhooks:
When a customer places an order on Shopify, the orders/create webhook fires within seconds. The connector:
- Receives webhook payload from Shopify
- Verifies webhook signature (HMAC-SHA256)
- Creates a sale order in Odoo immediately
- Returns 200 OK to Shopify (prevents retry)
The end-to-end time from Shopify checkout to Odoo sale order: typically 3-15 seconds.
Order data mapping:
| Shopify Field | Odoo Field |
|---|---|
| Order ID | Reference (with prefix) |
| Customer Name | res.partner name |
| Customer Email | Partner email |
| Billing Address | Invoice address |
| Shipping Address | Delivery address |
| Line Items | Sale order lines |
| Discount Codes | Discount lines |
| Shipping Method | Delivery carrier |
| Shipping Cost | Delivery fee line |
| Total Tax | Tax lines |
| Financial Status | Payment state |
| Fulfillment Status | Delivery status |
| Notes | Customer notes |
| Tags | Internal tags |
Custom order fields:
For Shopify Plus merchants with custom checkout attributes:
- Map Shopify order note attributes to Odoo custom fields
- Example: "PO Number" attribute →
x_purchase_order_numberon sale order - Example: "Gift Message" →
noteon sale order
Order processing workflow:
After import, the connector manages the order through Odoo's standard workflow:
- Sale order confirmed
- Delivery order created in Odoo WMS
- Warehouse picks, packs, ships
- Delivery validated in Odoo (tracking entered)
- Connector sends fulfillment to Shopify with tracking number
- Shopify marks order as "Fulfilled" and emails customer
Partial fulfillments:
Shopify supports orders with multiple fulfillments (ship what's available now, rest later). The connector handles:
- Partial delivery in Odoo → partial fulfillment sent to Shopify
- Shopify shows partial fulfillment status to customer
- Remaining items create a separate delivery when stock available
Inventory Synchronization
Bidirectional inventory sync:
Inventory flows in both directions to maintain accuracy:
Odoo → Shopify (primary direction):
- Every stock move in Odoo triggers an inventory level update to Shopify
- Available quantity = On-hand - Reserved - Safety Stock
- Updates via Shopify's Inventory Level API
Shopify → Odoo (fallback):
- If Shopify inventory is adjusted manually (admin or app), webhook fires
- Connector creates an Odoo inventory adjustment with audit note
Shopify multi-location:
Shopify's multi-location feature tracks inventory per physical location. Map Odoo warehouses to Shopify locations:
| Odoo Warehouse | Shopify Location |
|---|---|
| Main Warehouse | Main Location |
| East Coast DC | East Coast Location |
| West Coast DC | West Coast Location |
| Drop Shipper | Supplier Location |
The connector pushes per-location quantities to Shopify based on the warehouse-location mapping.
Inventory accuracy safeguards:
- Safety stock buffer prevents Shopify from showing all available inventory
- Out-of-stock handling: when quantity reaches 0, Shopify inventory = 0 (not negative)
- Continue selling when out of stock: configurable per product (some sellers allow backorders)
Shopify Payments Reconciliation
Shopify Payments fee structure:
| Plan | Online Rate | In-Person Rate |
|---|---|---|
| Basic | 2.9% + 30¢ | 2.7% |
| Shopify | 2.6% + 30¢ | 2.5% |
| Advanced | 2.4% + 30¢ | 2.4% |
| Plus | 0.2% (Shopify Payments) | 0.2% |
Payout reconciliation:
Shopify Payments remits to your bank account every 2-3 business days. The connector imports payout data:
- Download Shopify Payments payout report (or via API)
- Import via Shopify → Finance → Import Payout
- Connector creates journal entries:
- Revenue (net sale amounts per order)
- Shopify Fees expense (payment processing)
- Refunds adjustments
- Net payout receivable
- When bank transfer arrives: reconcile against Shopify Payments journal
Handling Shopify refunds:
When a refund is processed in Shopify:
refunds/createwebhook fires- Connector creates a credit note in Odoo against the original invoice
- If stock was returned (restocked): creates a return transfer
- Posts credit note → balance cleared against customer account
Shopify Plus B2B Integration
Shopify Plus includes B2B features (wholesale catalogs, payment terms, net payment). The connector integrates these with Odoo's B2B pricing:
Company and catalog mapping:
| Shopify B2B | Odoo Equivalent |
|---|---|
| Company | res.company (or customer segment) |
| Catalog | Pricelist |
| Payment Terms | Payment terms on sale order |
| Draft Orders | Quotations (sale.order in draft) |
Sync B2B pricing:
- Create a Shopify B2B catalog in the connector
- Link to an Odoo pricelist
- Assign to Shopify B2B companies
- Price changes in Odoo pricelist → automatically pushed to Shopify B2B catalog
Multi-Store Management
For brands operating multiple Shopify stores (regions, brands, wholesale vs. retail):
Multiple store configurations:
Create separate connector configurations for each Shopify store:
- Different API credentials per store
- Store-specific product visibility (some products in all stores, some in specific)
- Store-specific pricing (regional pricing, wholesale vs. retail)
- Store-specific inventory allocation
Inventory allocation across stores:
Available for Store A = On-Hand - Reserve for Store B - Reserve for Store C - Safety Stock
Configure allocation rules to prevent overselling when multiple stores draw from the same inventory.
Frequently Asked Questions
How does the connector handle Shopify's product metafields for custom data?
Shopify metafields store custom data on products, orders, and customers. The connector maps specific Odoo fields to Shopify metafields. For example, map Odoo's x_care_instructions field to a product.care_instructions metafield. Configure metafield mappings in the connector's advanced settings per resource type.
Can the connector handle Shopify's subscription products (Shopify Subscriptions or ReCharge)?
Standard Shopify subscription orders import as regular orders in Odoo. For ReCharge subscriptions, recurring orders fire as individual orders/create webhooks and import normally. The connector does not manage the subscription lifecycle in Shopify — it processes each order regardless of whether it's subscription-generated or one-time.
What happens if the Odoo server is down when a Shopify webhook fires?
Shopify retries failed webhooks up to 19 times over 48 hours. The connector processes the webhook when Odoo recovers, and the order imports. For mission-critical reliability, configure Odoo with redundant infrastructure (load balancer + multiple workers) and monitoring alerts for downtime. The 48-hour retry window provides a buffer for planned maintenance.
Does the connector support Shopify Markets (multi-currency international selling)?
Yes. Shopify Markets allows selling in multiple currencies from a single store. The connector imports orders in the buyer's checkout currency and creates sale orders in that currency in Odoo. Currency conversion uses the exchange rate at the time of order import. Configure separate pricelists per Shopify Market in Odoo for accurate local pricing.
How do I handle Shopify gift cards in Odoo?
Shopify gift cards appear as a payment method on orders. The connector creates a separate payment line for the gift card portion of each order. Configure a "Shopify Gift Cards" liability account in Odoo. When a gift card is sold (via a gift card product), the revenue is deferred. When redeemed on an order, the liability is cleared and revenue recognized.
Next Steps
A well-executed Odoo-Shopify integration becomes invisible — it just works, keeping both systems synchronized without manual intervention. The ECOSIRE team has built Shopify-Odoo integrations for everything from D2C brands processing 50 orders/day to enterprise retailers handling 10,000 orders/day.
Contact ECOSIRE About Your Shopify-Odoo Integration →
Explore ECOSIRE's Shopify Services →
Share your store details and current pain points and our team will scope a Shopify-Odoo integration that eliminates the gaps between your ERP and your storefront.
Written by
ECOSIRE Research and Development Team
Building enterprise-grade digital products at ECOSIRE. Sharing insights on Odoo integrations, e-commerce automation, and AI-powered business solutions.
Related Articles
Australian GST Guide for eCommerce Businesses
Complete Australian GST guide for eCommerce businesses covering ATO registration, the $75,000 threshold, low value imports, BAS lodgement, and GST for digital services.
eCommerce Bookkeeping: Revenue Recognition and Sales Tax
Master eCommerce bookkeeping with correct revenue recognition timing, sales tax collection across marketplaces, and reconciliation for Shopify, Amazon, and more.
Odoo Accounting vs QuickBooks: Detailed Comparison 2026
In-depth 2026 comparison of Odoo Accounting vs QuickBooks covering features, pricing, integrations, scalability, and which platform fits your business needs.