Odoo Implementation
Shopify Inventory Connector
Keep Odoo as your absolute source of truth for stock quantities. This module automatically synchronizes Odoo's "Free to Use" inventory quantities to your Shopify store variants in real-time or scheduled runs, avoiding stock discrepancies and ensuring seamless store operations.
Key Features
One-Way Sync (Odoo -> Shopify)
Odoo is treated as the master. Inventory levels are pushed to Shopify; Shopify sales/adjustments never overwrite Odoo quantities.
SKU-Based Auto Matching
Variant matching is performed using an exact, case-sensitive match between Odoo's Internal Reference and Shopify's Variant SKU.
Scheduled and On-Demand Sync
A background cron action automatically checks and syncs stock every 4 hours by default (which can be customized to any interval you prefer), and a "Sync Inventory Now" button permits immediate full reconciliation.
Aggregate "Free to Use" Stock
Aggregates and syncs Odoo's total Free to Use quantity across all stock locations. Clamps negative stock counts to zero.
Efficient Change-Only Sync
The scheduled task only calls Shopify APIs for variants whose quantities changed since the last sync baseline, saving API limits.
Live SKU Re-verification
Always verifies SKUs live against Shopify before making an update, preventing drift if SKUs are renamed in Shopify.
Detailed Sync Logs & Retries
Keeps detailed lines for Updated/Failed runs. Features a "Retry Failed" button to re-run only failed lines with fresh stock levels.
Concurrency & Advisory Locking
Uses database-backed locks to prevent multiple manual or scheduled sync jobs from overlapping and corrupting data.
Secure GraphQL Integration
Integrates securely using OAuth Client Credentials, auto-renewing access tokens without needing manual token management.
1. Sync Direction & Scope
This connector syncs inventory one way only: Odoo → Shopify. Odoo is always the source of truth for stock quantity. The connector never reads inventory back from Shopify, and it never creates, imports, or modifies Shopify products, orders, or customers — it only updates the available quantity of variants that already exist on both sides.
2. Product Matching (SKU-based)
Matching happens at the variant level, using an exact match between:
- Odoo's Internal Reference on the product variant, and
- Shopify's Variant SKU.
The match is exact and case-sensitive. If the SKU doesn't exist on Shopify, or exists on more than one variant, the sync fails for that product with a specific message rather than guessing.
3. Enabling Sync Per Product variants.
Nothing syncs by default. Each product variant has a "Sync Inventory with Shopify" checkbox (Shopify Connector → Product Variants → open a variant → Shopify Inventory tab). Only checked variants are ever touched by the connector — everything else is completely ignored.
The Product Variants menu only appears once Odoo's own Variants feature is turned on (Inventory or Sales → Configuration → Settings → check Variants), as shown in the first screenshot below. Once enabled, the menu shows up under Shopify Connector, as shown in the second screenshot.
By checking the "Sync Inventory with Shopify" option on Odoo product variants and ensuring that the variant SKU on Shopify matches Odoo's Internal Reference (as shown in the screenshot below), you activate the connector for specific variants. This gives you complete control over which products sync and which are ignored.
Enable Variants in Settings
Product Variants Menu
Shopify Inventory Tab
4. How the Quantity is Calculated
The quantity sent to Shopify is Odoo's Free to Use quantity, combined across every warehouse and internal stock location. It is not forecasted quantity and it doesn't include incoming receipts.
If the combined free quantity is
negative, Shopify receives 0
— Shopify never accepts a negative inventory count.
5. Scheduled vs Manual Sync
Scheduled Sync (Change-Only): A scheduled action runs every 4 hours by default (you can configure or change this to run at any interval you want, e.g. every hour or every 10 minutes) and processes every enabled product. To keep this fast and light on Shopify's API, it's change-only. For each product, it compares the current Odoo quantity to the last quantity Shopify confirmed receiving.
| Comparison | Result |
|---|---|
| Current quantity == last confirmed quantity | Unchanged — no Shopify API call is made at all |
| Current quantity differs | Updated — Shopify is updated and the new quantity becomes the baseline |
Manual Full Sync: The "Sync Inventory Now" button forces every enabled product through, even if the quantity hasn't changed since the last sync. This is the tool for reconciling drift if someone manually edited a quantity directly in Shopify.
6. Common Failure Reasons
| Message | Cause / Resolution |
|---|---|
Odoo Internal Reference is missing.
|
Sync is enabled on a variant with no Internal Reference set. Assign an Internal Reference. |
No Shopify product variant found with SKU "...".
|
No variant on Shopify has that exact SKU. Update the SKU on Shopify or Internal Reference in Odoo. |
Multiple Shopify variants found with SKU "...".
|
More than one Shopify variant shares that SKU — the connector refuses to update to prevent corrupting stock. Resolve the duplicated SKU on Shopify. |
Shopify inventory tracking is disabled for this variant.
|
The Shopify variant has "Track quantity" turned off. Enable tracking in the Shopify variant settings. |
Inventory item is not available at the selected Shopify location.
|
The variant exists but isn't stocked/activated at the connector's chosen location in Shopify. Add it to the location in Shopify. |
Unable to authenticate with Shopify...
|
Client ID/Secret are wrong, or the app isn't installed/released properly. Check the credentials and connection. |
7. Boundaries & Limits (Out of Scope)
- No Shopify → Odoo sync. It's strictly Odoo → Shopify.
- No importing or syncing of Shopify orders, customers, refunds, or deliveries.
- No syncing of product information (price, title, description, images). Only the inventory quantity.
- Never auto-creates a product on either side.
- Supports one Shopify store and one Shopify location only.
Shopify App Setup & Integration Guide
Follow these step-by-step instructions in order to create the Shopify app, install it on your store, and get the values Odoo needs: Shop Domain, Client ID, and Client Secret.
A. Create the Shopify Custom App
In your Shopify admin portal, click on Settings (located at the bottom-left of the sidebar).
Click on the Apps option in the settings menu.
Click the Develop apps button (top right corner) to access the developer dashboard.
Press the green Build apps in Dev Dashboard button.
Click the Create app button at the top right corner.
Provide a recognizable name for the app (e.g. "Odoo Inventory Connector") and click Create.
On the App Creation screen, configure the following options:
- App URL: Keep the default placeholder URL (this integration runs in the background and has no embedded UI).
- Uncheck "Embed app in Shopify admin".
- Preferences URL: Leave it empty.
- Webhooks API version: Keep the default.
Next, under the API access section, paste the following scope line exactly into Scopes:
read_products,read_inventory,write_inventory,read_locations
Click the Release button in the top right corner.
In the confirmation dialog, leave the Version name and Version message fields empty, then click the red Release button to confirm.
B. Retrieve Client Credentials
Go to the Settings tab on the left-hand sidebar of the app's development dashboard. Under Client Credentials, you will find your Client ID and Client Secret. Use the copy button to capture these values safely.
C. Install App on Shopify Store
Click the app name at the top-left sidebar (e.g. "Connector") to navigate back to the main app dashboard page.
Click the green Install app button at the top-right corner.
Select the store you wish to install the integration on.
Review permissions and click Install to complete the process.
You will land on a page displaying "Example Domain". This is expected and verifies that the app is installed successfully. You can now close this tab.
D. Find the Shopify Shop Domain
Head back to the main Settings page of your Shopify admin portal (step 1).
Click on the Domains section.
Locate the domain ending
in .myshopify.com. If multiple are listed, copy the one matching your
active store handle shown in the browser address bar
(admin.shopify.com/store/<handle>/...).
E. Configure & Authenticate in Odoo
In Odoo, navigate to Shopify Connector → Configuration.
Paste the three retrieved values into the matching fields:
- Shop Domain — the `.myshopify.com` domain.
- Client ID — from step 10.
- Client Secret — from step 10.
Save the changes, and click Test Connection. Once successful, click Fetch Shopify Locations to load and select your active Shopify location.
Congratulations! Your Shopify Inventory Connector is fully configured. The connector will now automatically manage background stock refreshes.
0 when transmitting to Shopify.
Version 19.0.1.0 | Released on : 14th August 2026
Professional Support
Need help with configuration, experiencing integration issues, or want to request custom features? Our team of Odoo experts is here to assist. Please email us directly at support@mindphin.com.
Our Services