Shopify Marketplace Connector
by Terrabit https://www.terrabit.ro , Dorin Hongu https://www.terrabit.ro$ 962.07
Shopify Marketplace Connector
Shopify interface
The Deltatech Shopify Marketplace Connector is a comprehensive Odoo extension developed by Terrabit that creates a seamless integration between Odoo’s ERP system and Shopify. This connector enables businesses to synchronize and manage their Shopify online stores directly from Odoo, providing a unified solution for managing products, customers, and orders.
Key Features
- Product Synchronization
- Export product templates and variants from Odoo to Shopify (create and update)
- Import product templates, variants, and images from Shopify
- Synchronize product prices and basic information (barcode, weight, SKU) in both directions
- Export and import product variant price, SKU, barcode and weight individually
- Support for multiple product images per product template
- Associate product images with specific product variants
- Real-time product updates via Shopify webhooks (
products/update)
- Product Attributes
- Import product attributes (characteristics) and their values from Shopify
- Map Shopify options/variants to Odoo product attributes
- Customer Integration
- Import Shopify customers into Odoo’s contact database
- Maintain consistent customer records across platforms
- Automated detection of companies based on Shopify note attributes or company field
- Real-time customer updates via Shopify webhooks
- Order Management
- Import sales orders from Shopify into Odoo
- Automated creation of Odoo sales orders for Shopify purchases
- Order status updates synchronized from Odoo to Shopify via tags (Sale Phases)
- Import and map Shopify sale stages (order tags) to Odoo phases
- Synchronize order cancellation from Odoo to Shopify
- Support for Shopify webhooks (
orders/updated) to automatically update orders in Odoo
- Payment and Delivery
- Import and map Shopify payment methods (payment acquirers) to Odoo
- Integration with Shopify payment transactions and creation of payments in Odoo
- Automatic mapping of delivery carriers and creation of delivery lines on orders
- Support for pickup points (lockers) information from Shopify notes
- Stock Export
- Export stock quantities from Odoo to Shopify via
InventoryLevelAPI - A Shopify Location maps 1-to-1 to an Odoo Warehouse
(
marketplace.warehousebinding,odoo_id=stock.warehouse) — there is no finer-grained mapping to a specificstock.locationinside a warehouse - Triggered automatically by the existing marketplace stock export cron
- Requires
inventory_item_idstored on each variant binding (populated at import)
- Export stock quantities from Odoo to Shopify via
- Order Warehouse Routing
sale.order.warehouse_idis set from the Shopify order’slocation_id, using an already-mappedmarketplace.warehousebinding- Unmapped locations are left on the default warehouse — order import never creates a new warehouse binding on its own (mapping is only done through the warehouse sync)
- Price Export
- Export product prices per variant from Odoo pricelist to Shopify
- Sets
compare_at_priceautomatically when a pricelist discount exists (Shopify shows crossed-out original price) - Triggered automatically by the existing marketplace price export cron (only for variants with price differences)
- AWB / Fulfillment Export
- Sends tracking numbers (AWB) to Shopify when
send_to_shipper()is called in Odoo - Uses the modern Shopify
FulfillmentV2API withline_items_by_fulfillment_order - Automatically finds open FulfillmentOrders and marks the order as fulfilled in Shopify
- Includes carrier name and tracking URL when available
- Runs asynchronously via
queue_jobwith automatic retry on failure
- Sends tracking numbers (AWB) to Shopify when
- Automated Operations
- Scheduled synchronization jobs via
queue_job - Real-time updates for orders, products and customers via webhooks
- Automatic OAuth token refresh for Shopify Dev Dashboard Apps (tokens expire every 24h)
- Scheduled synchronization jobs via
Authentication
The module supports two authentication modes:
Legacy Private Apps (permanent token)
Set Access Token manually in the backend configuration. Leave
Token Expires At empty. The token is used as-is and never
auto-refreshed.
Dev Dashboard Apps (OAuth ``client_credentials``, tokens expire in 24h)
Starting early 2025, Shopify Dev Dashboard Apps issue short-lived tokens
via the OAuth client_credentials grant. Configure Client Id and
Client Secret in the backend.
On first login (or when the token is missing), the module automatically
requests a new token by posting to /admin/oauth/access_token with
grant_type=client_credentials. The expiry time
(Token Expires At) is saved on the backend record.
Subsequent API calls check the expiry: if the token expires within 30 minutes, it is silently refreshed before the call proceeds.
A scheduled action (“Shopify: Refresh Access Tokens”) runs every 23
hours to proactively renew tokens for all active backends that already
have a Token Expires At date set (i.e. Dev Dashboard App backends).
Backends with a permanent token (no expiry date) are never touched by
the cron.
Technical Implementation
The module leverages the ShopifyAPI Python library to communicate
with Shopify’s REST API and implements a sophisticated binding system
based on the Deltatech marketplace framework:
- Backend Adapter: Manages API communication and authentication with Shopify
- Binding Models: Connect Odoo entities with their Shopify
counterparts:
- Product template and variant bindings
- Customer and address bindings
- Sales order and order line bindings
- Delivery carrier and payment acquirer bindings
- Sale phase (tags) bindings
- Warehouse/location bindings (
marketplace.warehouse↔ Shopify locations)
Integration Requirements
The module requires:
- External Python dependency:
ShopifyAPIlibrary - Core Deltatech marketplace modules:
deltatech_marketplace(base functionality)deltatech_marketplace_sale(sales integration)deltatech_marketplace_payment(payment integration)deltatech_marketplace_delivery(delivery integration)
Benefits
- Operational EfficiencyManage online stores without switching between platforms
- Data ConsistencySingle source of truth for product and customer information
- Time SavingsEliminate manual data entry and reduce administrative overhead
- Error ReductionAutomated synchronization prevents discrepancies
- Improved Customer ExperienceFaster order processing and automated tracking updates
Features:
- ✓import products (templates and variants) from Shopify
- ✓export product templates and variants to Shopify (create and update)
- ✓import product images (multiple images, with variant association) from Shopify
- ✓import product prices (list_price) from Shopify; export price per variant
- ✓import product metadata (barcode, weight, SKU) from Shopify; export per variant
- ✓import product attributes (characteristics) and values from Shopify
- ✓import sale orders from Shopify
- ✓import customers from Shopify
- ✓import sale stages (order tags / phases) from Shopify
- ✓import payment acquirers (payment methods) from Shopify
- ✓synchronize order status (tags) to Shopify via Sale Phases
- ✓cancel Shopify orders when cancelled in Odoo
- ✓export stock quantities to Shopify via InventoryLevel API (multi-location support)
- ✓export product prices to Shopify from pricelist, with compare_at_price for discounted items
- ✓export new products (templates + variants) from Odoo to Shopify with images and initial stock
- ✓update existing Shopify products from Odoo (full or partial update on change)
- ✓send AWB tracking numbers to Shopify via FulfillmentV2 API when shipment is dispatched
- ✓import Shopify warehouse locations as marketplace.warehouse bindings
- ✓support for Shopify webhooks (orders/updated, products/update, customers/update)
- ✓automatic OAuth token refresh for Dev Dashboard Apps (client_credentials grant)
Configuration
Getting Shopify credentials
The connector supports two authentication modes; which one to use depends on how the Shopify app is created.
Since January 1, 2026, merchants can no longer create new “legacy custom apps” in the Shopify admin (existing legacy apps keep working, but no new ones can be created that way — confirmed in the Shopify admin under Settings > Apps > Develop apps > Legacy custom apps). For any new store connection, use the Dev Dashboard App (OAuth) mode below.
Mode A — Legacy custom app (existing apps only, permanent token)
Only usable for apps already created before January 1, 2026 (or created by a Partner account before the store was transferred to the merchant).
- In the Shopify admin: Settings > Apps > click Develop apps (top right) > App development.
- Under Legacy custom apps, open the existing app.
- The app page has four tabs: Overview / Configuration / API credentials / App settings.
- Configuration > Admin API integration lists the granted scopes.
Minimum scopes needed by this module, depending on what is synced:
read_products,write_productsread_orders,write_ordersread_customers,write_customersread_inventory,write_inventoryread_fulfillments,write_fulfillments
- API credentials shows the Admin API access token — Shopify displays it only once (“You can’t view this again because it provides authenticated Admin API access.”) — copy it immediately.
- Use this token as Access Token on the Odoo backend. It does not expire, but stays valid only while the app remains installed on the store.
Mode B — Dev Dashboard App (OAuth ``client_credentials``, token expires in 24h)
Recommended / required for new integrations.
- From the App development page (see step A.1), click Build apps
in Dev Dashboard to open the Shopify Dev Dashboard
(
https://shopify.dev/) — may require a separate Shopify Partners login. - Create a new app linked to the store
(
{store-name}.myshopify.com). - Configure the same API scopes as in Mode A.
- From the app page, note the Client ID (API key) and Client Secret.
- Enter these two values on the Odoo backend; Odoo requests and refreshes the access token automatically (see below) — no token is entered manually.
Configuring the backend in Odoo
- Go to Marketplace > Backends (requires the
Marketplace Managergroup). - Click New and set:
- Provider:
Shopify - Location:
https://{store-name}.myshopify.com - Company: the Odoo company for this integration
- Provider:
- For Mode A: set Access Token to the value from step A.5/A.6; leave Token Expires At empty.
- For Mode B: set Access Type to
Client_id and client_secret, then fill Client Id and Client Secret; leave Access Token / Token Expires At empty — they are populated automatically on the first call. - Save, then click Test connection (calls
Shop.current()). For Mode B, this first call also triggers the initial OAuth token request. - Click Import basic data — for Shopify this also registers the
expected webhooks (
orders/create,orders/updated,orders/paid,orders/cancelled) on the Odoo endpoint, if not already active. - Click Check webhooks to open a wizard comparing active Shopify
webhooks against what Odoo expects (
missing= needs to be created,orphan= no longer used by Odoo).
Warehouse / location mapping
A Shopify Location corresponds to an Odoo Warehouse
(stock.warehouse), not to an arbitrary stock location — the binding
model marketplace.warehouse links one Shopify Location to one whole
Odoo warehouse via its odoo_id field. There is currently no way to
map a Shopify Location to a specific sub-location inside a warehouse.
- Create the corresponding warehouses in Odoo first (Inventory > Configuration > Warehouses) if they do not exist yet.
- Import the Shopify locations as
marketplace.warehouserecords (backend item Warehouses, “Import”). The match against an existing Odoo warehouse is done by name or code (seesave_from_marketplace): the Shopify Location’s name must equal the Odoo warehouse’scodeornameexactly. Import warehouses only after step 1 — if no Odoo warehouse matches,save_from_marketplacedoes not fail or skip the record; it silently creates a brand new (empty)stock.warehousenamed after the Shopify Location, which then needs to be found and cleaned up manually. - Both stock export (
InventoryLevel) and order warehouse routing (sale.order.warehouse_id) rely on this same binding — a location left unmapped is simply skipped by stock export and left on the default warehouse on order import (neither path creates a warehouse or a binding automatically).
Automatic token refresh (Mode B only)
- A scheduled action, “Shopify: Refresh Access Tokens”, runs every
23 hours and only targets backends that have both
Client IdandClient Secretset. Backends with a static Mode A token are never touched by this cron. - In addition, every API call checks the current token and refreshes it if it expires within 30 minutes, so refresh does not strictly depend on the cron.
If the store uninstalls/reinstalls the Mode A app, the old token is invalidated and must be regenerated in Shopify and updated manually in Odoo.
Bug Tracker
Bugs are tracked on Terrabit Issues. In case of trouble, please check there if your issue has already been reported.
Do not contact contributors directly about support or help with technical issues.
Credits
Authors
- Terrabit
- Dorin Hongu
Maintainers
Current maintainer:

This module is part of the terrabit-ro/bitshop project on GitHub.
You are welcome to contribute.
Need help getting started?
We are an Odoo partner building apps for the Romanian market (SAGA & WinMentor export; Romanian accounting localization in progress). Direct support from the team that built the module.
Contact Terrabit →| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Invoicing (account) • Contacts (contacts) • Discuss (mail) • Purchase (purchase) • eCommerce (website_sale) • Website (website) |
| Community Apps Dependencies |
Show
•
Marketplace Base Connector
• Marketplace Delivery addon • Marketplace Payment Acquirer addon • Marketplace Sales Order Stage addon • Marketplace Sales Order addon • Marketplace website addon • Job Queue • Delivery in locker - Base • Deltatech Delivery Base • Deltatech Delivery Status • Deltatech Sale Order Stage • Many2one Badge Widget • eCommerce Sale Short Description |
| Lines of code | 16166 |
| Technical Name |
deltatech_marketplace_shopify |
| License | OPL-1 |
| Website | https://www.terrabit.ro |
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module