The core Shopify connector links any number of Shopify stores to Odoo 19 Community through company-scoped binding records. It synchronizes products, inventory, customers, orders, returns, refunds, and fulfillment through the GraphQL Admin API.
Signed webhooks provide the fast path, OCA queue_job provides durable execution, and scheduled reconciliation repairs missed or delayed events. Onboarding, health checks, a sync dashboard, error recovery, and configurable retention support day-to-day operation.
Product images cover the main image of each product and the images of its variants. Synchronizing the other Shopify product media needs the glue module Shopify Connector Website Sale, which installs automatically with eCommerce.
auto_awesome What this module does
AI-generated from the code · Odoo 19.0Connects Odoo to one or more Shopify stores, importing and exporting customers, B2B companies, catalogs, collections, orders, fulfillments and inventory through the Shopify API, with background jobs, webhooks and a sync dashboard.
This module links Odoo to Shopify stores. Each store is set up as a Shopify instance tied to one Odoo company, and every imported Shopify record is stored as a binding record that remembers its Shopify ID, its last sync date and whether it is pending, synchronized or in error.
What users can do: - Import Shopify customers, addresses, tags and B2B companies, locations, contacts and catalogs (with their price lists) from buttons on the instance. - Optionally export Odoo customer changes back to Shopify when Odoo owns the field. - Import products, collections, orders, fulfillments and inventory, and push inventory to Shopify. - Test the connection, repair webhook subscriptions, check webhook health, duplicate a configuration and open binding errors from the instance.
Automatic behaviour: - Imports run in the background through queue jobs, with scheduled reconciliation jobs that repair missed or delayed events. - A guest customer contact is created automatically for each instance, and changing the instance company recreates it. - Business rules block mixing records from different instances or companies, prevent manual editing of smart collection membership, and keep one binding per Shopify ID per instance. - Errors are stored on the binding and written to a log.
It touches sales orders, stock pickings, delivery carriers, pricelists, contacts and partner categories, and adds its own menus and dashboard screens.
Depends on
Required by other modules
Menus it adds
Models and fields (30)
- sale.order · extends an existing modelshopify_note, shopify_tags, shopify_risk_hold, shopify_risk_level, shopify_binding_ids (Shopify Bindings), shopify_discount_codes
- res.partner · extends an existing modelshopify_customer_binding_ids (Shopify Customer Bindings)
- shopify.log · new modellevel, entity, res_id (Related Document ID), message, direction, res_model (Related Document Model), instance_id
- stock.quant · extends an existing model
- shopify.order · new modelsource, odoo_id (Odoo Sales Order), is_draft, company_id, created_at (Shopify Created At), order_name (Shopify Order), risk_level, shop_total, raw_payload (Raw Shopify Payload), source_name, cancelled_at (Shopify Cancelled At), draft_status, order_number, shop_subtotal, discount_codes, payload_digest, replaced_by_id (Completed Order Binding), shop_tax_total, fulfillment_ids (Fulfillments), shop_money_json, financial_status, line_binding_ids (Shopify Lines), missing_tax_rate, shop_currency_id, order_currency_id, presentment_total, source_identifier, fulfillment_status, refund_binding_ids (Shopify Refunds), return_binding_ids (Shopify Returns)
- stock.picking · extends an existing modelshopify_risk_hold, shopify_fulfillment_ids (Shopify Fulfillments)
- shopify.refund · new modelnote, amount, move_id (Credit Note), line_ids (Refund Lines), company_id, created_at, currency_id, raw_payload, order_binding_id, restock_requested
- shopify.return · new modelname, closed_at, company_id, created_at, raw_payload, return_lines, return_status, exchange_lines, total_quantity, order_binding_id
- product.product · extends an existing modelshopify_variant_binding_ids (Shopify Variant Bindings)
- sale.order.line · extends an existing modelshopify_line_id, shopify_is_shipping, shopify_is_gift_card, shopify_expected_total, shopify_discount_amount
- shopify.catalog · new modeltitle, status, company_id, odoo_pricelist_id, price_list_shopify_id (Shopify Price List GID)
- shopify.company · new modelodoo_id (Odoo Company), company_id, external_id (Shopify External ID), contact_binding_ids (Company Contacts), location_binding_ids (Company Locations)
- product.template · extends an existing modelshopify_binding_ids (Shopify Bindings)
- shopify.customer · new modeltags, odoo_id (Odoo Customer), company_id, tax_exempt, tag_category_ids (Imported Shopify Tags), address_binding_ids (Shopify Addresses), email_marketing_state
- shopify.instance · new modelname, state, active, shop_url (Shop Domain), client_id (Shopify App Client ID), company_id, api_version (API Version), access_token (Admin API Access Token), webhook_secret (Shopify App Client Secret), accept_webhooks, tax_mapping_ids (Tax Mappings), dashboard_orders, guest_partner_id (Shopify Guest Customer), shop_currency_id (Shopify Shop Currency), auto_confirm_paid, field_mapping_ids (Product Field Ownership), order_binding_ids (Orders), b2b_import_enabled (Import Shopify B2B), dashboard_products, dashboard_variants, dashboard_webhooks, log_retention_days, shopify_plus_state, carrier_mapping_ids (Carrier Mappings), catalog_binding_ids (B2B Catalogs), company_binding_ids (B2B Companies), dashboard_companies, dashboard_customers, dashboard_financial, dashboard_locations
- shopify.location · new modelname, active (Active in Shopify), address, is_mapped (Mapped), company_id, warehouse_id (Odoo Warehouse), odoo_location_id (Odoo Internal Location), legacy_resource_id (Shopify Legacy ID), fulfills_online_orders
- shopify.collection · new modelname, active, handle, collection_type, product_binding_ids (Products)
- shopify.order.line · new modelsku, odoo_id (Odoo Sales Line), company_id, is_shipping, is_gift_card, shop_unit_price, current_quantity, order_binding_id, variant_shopify_id, refundable_quantity, shop_discount_total, shop_discounted_total, presentment_unit_price, presentment_discount_total, presentment_discounted_total
- shopify.fulfillment · new modelorigin, company_id, picking_id (Odoo Delivery), shopify_id (Shopify GID), raw_payload, tracking_url, idempotency_key, tracking_number, order_binding_id, tracking_company, fulfillment_status (Status), location_shopify_id, fulfillment_order_ids (Fulfillment Orders)
- shopify.refund.line · new modeltax, quantity, subtotal, refund_id, shopify_id, restock_type, order_line_binding_id
- shopify.tax.mapping · new modelrate, tax_id, company_id, country_id, instance_id, price_included
- res.partner.category · extends an existing modelshopify_company_id
- shopify.binding.mixin · new modelstate, shopify_id (Shopify GID), instance_id (Shopify Instance), error_message, last_sync_date (Last Synchronization), external_updated_at (Shopify Updated At)
- shopify.field.mapping · new modelfield, owner, instance_id
- shopify.webhook.event · new modelstate, topic, payload (Raw Payload), webhook_id, instance_id, error_message
- product.pricelist.item · extends an existing model
- shopify.carrier.mapping · new modelcarrier_id, company_id, instance_id, tracking_company
- shopify.company.contact · new modelroles, title, odoo_id (Odoo Company Contact), company_id, company_binding_id, customer_shopify_id
- shopify.gateway.journal · new modelgateway, company_id, journal_id, instance_id
- shopify.gateway.payment · new modelamount, gateway, payment_id, instance_id, order_binding_id, transaction_shopify_id
Text generated by AI (DeepSeek) from reading the Odoo 19.0 code on GitHub; it may contain mistakes, so check the code before deciding. The module is very large and only part of the code was read. View the code on GitHub
Availability by version
Reviewed: 2026-11-03Confirmation status: 2 confirmed, 7 with no information of 9 versions.
Sources · Odoo 19.0
Confirmed on 2026-11-03 in branch 19.0 of OCA/connector-shopify.
terminal Installation and usage
OCA documentation · Odoo 19.0Configuration
Source · Odoo 19.0Shopify app
Since January 1, 2026, Shopify no longer lets merchants create legacy custom apps from the Shopify admin. Create the app in the Shopify Dev Dashboard:
- Open the Dev Dashboard of the organization that owns the store. Odoo gets its access tokens with the client credentials grant, which only works when the app and the store belong to the same organization. Owning the store or installing the app on it is not enough. For a test store, create it from the Dev stores page of that same Dev Dashboard.
- Create the app and fill in its version. The connector has no page in the Shopify admin and never sends users through Shopify's authorization pages, so:
- App URL:
https://shopify.dev/apps/default-app-home, the default Shopify gives for apps that are not embedded. - Embed app in Shopify admin: unchecked.
- Allowed redirection URL(s): none. If Shopify asks for one, enter the App URL again.
- Use legacy install flow: unchecked, so that installing the app grants the scopes selected on the version. With the legacy flow the app would have to request them itself, which the connector cannot do.
- Webhooks: none. Odoo creates its own subscriptions during onboarding.
- Webhooks API version:
2026-01, the Admin API version the connector uses. Shopify writes the payloads of the subscriptions Odoo creates in this version. - Scopes:
read_customers,write_customers,read_draft_orders,read_fulfillments,read_inventory,write_inventory,read_locations,read_merchant_managed_fulfillment_orders,write_merchant_managed_fulfillment_orders,read_orders,read_products,write_productsandread_returns. To import orders older than 60 days, also selectread_all_orders, which Shopify may have to approve. - Release the version and install the app on the store. After a later scope change, release a new version and approve the change on the store.
- Copy the client ID and the client secret from the app's Settings page.
The app must have access to protected customer data: names, addresses, emails and phone numbers. For merchant-created apps this depends on the store's plan, and the Basic plan does not include it. Without it, Shopify refuses some of the order webhooks and the order and customer imports fail.
A legacy custom app created before 2026 keeps working. Leave the client ID empty and enter the app's Admin API access token and API secret key instead.
Odoo
- Add OCA
queue_joband this repository to the Odoo addons path, then install Shopify Connector. - Grant operators the Shopify Manager group. The administrator gets it on install.
- Set the
web.base.urlsystem parameter to a public HTTPS address of Odoo, and setweb.base.url.freezetoTrueso that it does not change when an administrator logs in from another address. Shopify sends its webhooks to<web.base.url>/shopify/webhook/<instance id>and downloads exported product images from the same address. - Open Shopify > Configuration > Instances and click Start Onboarding:
- Credentials: enter the
<store>.myshopify.comdomain, the client ID and the client secret, then Test Connection. Odoo requests the access token and renews it before it expires, every 24 hours. The client secret also verifies the webhook signatures. - API Scopes: add any missing scope to a new app version, release it, approve the change on the store and check again.
- Map the Shopify locations, review the generated tax mappings, choose the synchronization policies, install the webhooks and queue the initial imports.
- Review the payment-gateway and carrier mappings before enabling unattended order and fulfillment processing.
Jobs run on the root.shopify.import, root.shopify.export and root.shopify.webhook channels. Add queue_job to the server-wide modules, after the Odoo defaults base,rpc,web, and give each channel a capacity in odoo.conf, for example:
[options]
server_wide_modules = base,rpc,web,queue_job
[queue_job]
channels = root:4,root.shopify.import:2,root.shopify.export:1,root.shopify.webhook:1Usage
Source · Odoo 19.0Use Shopify > Dashboard to monitor binding states, queue backlog, recent errors, webhook health, drift schedules, and operational table sizes.
Normal changes flow through webhooks and idempotent jobs. Use the entity import or reconcile actions for manual catch-up. For failures, correct the underlying configuration or data, select error bindings, and choose Retry Failed Shopify Bindings. Resetting to pending clears the state without scheduling work.
Run Check Webhooks after changing domains or credentials and repair any missing or misrouted subscriptions. Never edit Shopify IDs or raw payloads.
No verified information in OCA: Installation.
Installation instructions, the distribution package, dependencies and configuration steps are not shown because they have not yet been verified in the module documentation for any version.
Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.