O Odoo Integration/Help
Book a meeting
01Start

Getting started

21 min read

This topic takes you from installing the app to your first working sync. It explains the words the app uses, what you need in Odoo, every field in the setup guide, and where to turn on each automatic sync.

What the app does

The app connects your Shopify store to your Odoo database. It moves data between the two, so you do not have to type it twice.

It can:

  • Sync products, variants, prices and images, in the direction you choose.
  • Keep stock levels in step, from Odoo to Shopify or from Shopify to Odoo.
  • Create a sale order (or only an invoice) in Odoo for each Shopify order, with the customer, lines, taxes, shipping and discounts.
  • Create invoices and payments in Odoo, and handle refunds as credit notes or restocks.
  • Send fulfillment, payment, cancel and refund status back from Odoo to Shopify.
  • Sync customers, and send abandoned checkouts, draft orders and orders to Odoo CRM.
  • Copy extra fields, metafields and custom Odoo fields with Field Mapping.

Each part has its own settings page and its own on/off switch. Nothing syncs until you turn it on.

Key words

Word What it means
Shopify store Your shop on Shopify, where you installed the app.
Odoo database One Odoo instance with its own data. A single Odoo server can hold several databases. You connect the app to exactly one.
Server URL The web address you use to open Odoo, for example https://mycompany.odoo.com.
API key A long secret code that Odoo makes for a user. The app can use it instead of the user's password.
Sync direction Which way data flows. Odoo → Shopify means Odoo is the source and Shopify is updated. Shopify → Odoo is the other way. Products, stock, customers and orders each have their own direction.
Product matching How the app knows that a Shopify variant and an Odoo product are the same item. You choose one field for this: SKU, barcode or Shopify variant ID.
SKU (Internal Reference) The product code. In Shopify it is the variant SKU. In Odoo it is the Internal Reference field.
Barcode The barcode field on the Shopify variant and on the Odoo product.
Mapping A rule that pairs a value on one side with a value on the other. Examples: a Shopify location with an Odoo warehouse, a Shopify order tag with an Odoo company, a Shopify field with an Odoo field.
Company An Odoo company. Orders, invoices, journals and taxes in Odoo always belong to one company.
Journal An Odoo accounting journal. Invoices go into a sale journal. Payments go into a bank or cash journal.
Manual sync A sync you start yourself with a button, such as Import Products or Process Inventory Sync.
Automatic sync A sync that runs on a schedule, or in real time when something changes.
Real-time (webhook) An instant update. Shopify or Odoo tells the app about a change the moment it happens, instead of the app checking on a schedule.

Before you start

You need the following.

Odoo version:

  • Odoo 16.0 or later. This covers Odoo Online (odoo.com), Odoo.sh and self-hosted Odoo, Community or Enterprise.
  • Some real-time features (Odoo → Shopify webhooks) depend on your Odoo version and setup. They usually work on Odoo 18 and later.

An Odoo user for the app:

  • A user that can log in to the database you want to connect. Many stores create a separate user just for the app, so its actions are easy to spot in Odoo.
  • That user needs rights to read and write the records the app syncs: products, stock, sales, invoices and contacts. Giving it administrator rights is the simplest way to avoid permission errors.
  • If you want to match products by Shopify Variant ID, the user also needs the right to create fields (administrator Settings access), so the app can create the custom field for you.

A password or an API key for that user:

  • An API key is recommended. It keeps working if the password changes or the user turns on two-factor authentication, and you can delete it at any time to cut off the app.
  • Some Odoo servers refuse passwords for API access. Odoo Online does this. On those servers you must use an API key.

Odoo apps (modules) installed:

Odoo app Needed for
Sales Sale orders created from Shopify orders.
Inventory Stock levels, warehouses, locations and deliveries.
Invoicing (or Accounting) Invoices, payments, journals, taxes and credit notes.
Contacts Customers. It is installed with Sales.
CRM Only if you send abandoned checkouts, draft orders or orders to Odoo CRM.
Automation Rules (base_automation) Only for real-time updates from Odoo to Shopify.

External API access:

  • The app talks to Odoo through Odoo's external API (XML-RPC and JSON-RPC). If your Odoo sits behind a proxy or firewall, it must let through requests to /xmlrpc/2/*, /jsonrpc and /web/*.
  • On Odoo Online, Odoo only allows external API access on some of its pricing plans. If the connection fails with "external API is not responding", check your Odoo plan with Odoo.
Good to know

You can install and connect the app during the 30-day free trial. See Plans & billing.

Install the app

  1. 1
    Open the app listing in the Shopify App Store and click Install.
  2. 2
    Shopify shows the list of permissions the app needs. Approve them. They let the app read and write products, inventory, locations, orders, fulfillments, draft orders, customers and sales channels.
  3. 3
    Pick a plan on the Plans page and approve it on Shopify's screen. Every plan starts with the free trial, so you are not charged until the trial ends.
  4. 4
    The app opens the setup guide: Welcome to TM Odoo Integration.

The setup guide has three steps. The bar at the top shows your progress (0 / 3 completed up to 3 / 3 completed). Click a step's title to open or close it.

Step 1: Odoo Connection

This step connects the app to your Odoo database. All four fields are required.

Field What to enter Where to find it
Server URL The address you use to open Odoo, with https:// (or http://) in front. Example: https://mycompany.odoo.com. Copy it from your browser's address bar when you are logged in to Odoo. Leave out everything after the domain, such as /odoo or /web#....
Database Name The exact name of the Odoo database. On Odoo Online it is the first part of your address: for https://mycompany.odoo.com it is mycompany. On Odoo.sh it is shown on your branch in the Odoo.sh project. On self-hosted Odoo, open /web/database/selector on your server, or ask your Odoo partner.
Username The login of the Odoo user, usually an email address. In Odoo, Settings > Users & Companies > Users, open the user and read the Login field.
Password / API Key The user's password, or an API key for that user. See "How to make an API key" below. The (Generate API Key) link next to the label opens Odoo's own guide.

Each field has a ? icon with a short hint.

To connect:

  1. 1
    Fill in the four fields.
  2. 2
    Click Establish Connection.
  3. 3
    Wait while the app checks the server and logs in.
  4. 4
    When it works, the badge next to Odoo Connection shows Odoo account is connected and the next step opens.

The app checks in this order:

  1. 1
    Is the Server URL a reachable Odoo server? It also reads your Odoo version.
  2. 2
    Does the Database Name exist on that server?
  3. 3
    Do the Username and Password / API Key log in?

If something is wrong, the message appears under the field that is wrong. The badge shows Invalid Odoo Host Url for a URL problem, or Invalid Odoo account credentials. for a login problem.

How to make an API key in Odoo:

  1. 1
    Log in to Odoo as the user the app will use.
  2. 2
    Click your avatar in the top-right corner and open My Profile (in some versions, Preferences).
  3. 3
    Open the Account Security tab.
  4. 4
    Click New API Key. Odoo asks for your password.
  5. 5
    Give the key a name, such as "Shopify app". If Odoo asks how long the key should last, pick the longest option. When the key expires, the app can no longer reach Odoo.
  6. 6
    Copy the key. Odoo shows it only once.
  7. 7
    Paste it into Password / API Key in the app.
Good to know

Need help with this step? The step has a link to Watch connection setup video and a link to Schedule a meeting with our team.

Important

Changing the Server URL or Database Name later resets most of your settings. See Change or disconnect Odoo.

Step 2: General configuration

This step sets the basics that every sync uses. The app fills the lists from your Odoo database, so this step only opens after the connection works.

Setting What it does
Odoo SKU/Barcode Mapping How products are matched between Shopify and Odoo. Pick one: SKU (Internal Reference), Barcode or Shopify Variant ID (Custom Odoo Field).
Odoo Custom Field for Shopify Variant ID Shown only when you pick Shopify Variant ID (Custom Odoo Field). The technical name of the Odoo field that holds the Shopify variant ID, for example x_shopify_variant_id.
Company Your main Odoo company. Orders, invoices and stock use this company unless a multi-company rule sends them elsewhere.
Setup Multi Company Configuration Yes or No. Choose Yes to send orders to different Odoo companies by order tag, or to sync stock from several companies.
GST Treatment Shown only when the selected company is in India. The GST treatment the app puts on Odoo documents.

Odoo SKU/Barcode Mapping

This is the most important choice in the setup. The app uses it in every product, stock and order sync.

  • SKU (Internal Reference): the Shopify variant SKU must equal the Odoo Internal Reference. This is the usual choice.
  • Barcode: the Shopify variant Barcode must equal the Odoo Barcode.
  • Shopify Variant ID (Custom Odoo Field): the Shopify variant ID is stored in a custom field on the Odoo product. Use this when your SKUs and barcodes are not unique or are empty.

When you pick Shopify Variant ID (Custom Odoo Field):

  1. 1
    Type the field name in Odoo Custom Field for Shopify Variant ID. It can only use letters, numbers and _.
  2. 2
    Click Save changes.
  3. 3
    The app looks for the field on the Odoo product variant and product template.
  4. 4
    If the field does not exist and its name starts with x_, the app creates it on the product variant for you.
  5. 5
    If the name does not start with x_, you must create the field in Odoo first.
Important

Shopify Variant ID matching only applies when syncing from Shopify to Odoo. An Odoo product that does not have its Shopify variant ID in this field yet is not matched, and a duplicate product may be created in Odoo.

Good to know

Every Shopify variant should have its own unique SKU or barcode, and so should every Odoo product. Duplicates make the app pick the wrong product. The Logs page has tabs that list duplicates in Shopify and in Odoo.

Company

Pick the Odoo company your store sells from. If your Odoo has only one company, it is the only choice.

When you save a different company, the app clears the sale invoice journal and the fixed tax setting, because they belong to the old company. Set them again on the Orders Settings and Additional Order Settings pages.

Important

Warehouses, locations, journals and taxes in Odoo belong to one company. After you change the company, check Inventory Settings, Orders Settings and Additional Order Settings, and pick values that belong to the new company.

Good to know

If you switch to or from a company in India, click Save changes, reload the page and open Configuration again. The GST Treatment field then shows or hides to match the new company.

Sale invoice journal and fixed tax mapping

Earlier versions of the app had Sale Invoice Journal and Enable Fixed Tax Mapping in this step. They have moved:

  • Select Sale Invoice Journal is on the Orders Settings page.
  • Enable Fixed Tax Mapping and Tax Type are on the Additional Order Settings page.

Values you saved earlier are kept.

GST Treatment (India)

This field appears only when the selected Company has India as its country in Odoo. The choices come from your Odoo's Indian localization, for example "Registered Business - Regular" or "Consumer". Pick the treatment that fits most of your Shopify sales. The app uses it on the Odoo documents it creates, such as credit notes for refunds.

Multi-company setup

Choose Yes in Setup Multi Company Configuration to see the Multi-company setup box. It has two check boxes:

  • Inventory mapping: sync stock from locations in several Odoo companies. You then pick each company's locations on the Inventory Settings page.
  • Order mapping: send each Shopify order to an Odoo company based on its order tags.

Tick at least one, then add your rows:

  1. 1
    Click Add new mapping.
  2. 2
    If Order mapping is ticked, pick a Shopify order tag. The list shows tags used on your Shopify orders.
  3. 3
    Pick the Odoo company.
  4. 4
    Repeat for each company. Use the bin icon to remove a row.
  5. 5
    Click Save changes.

How order mapping works:

  • When an order arrives, the app reads its tags and goes through your rows from top to bottom. The first row whose tag is on the order decides the company. Tags are matched without regard to upper or lower case.
  • An order with no matching tag goes to the main Company.
  • The sale invoice journal for each company is set on the Orders Settings page.

The app checks your rows when you save:

  • With no rows, you see Please add at least one mapping.
  • A row without a company shows Please add a company.
  • With Order mapping ticked, a row without a tag shows Please add a Shopify order tag.

Choosing No again removes all rows and unticks both boxes.

Save or reset

  • Save changes checks the fields and saves them. The progress bar moves on, the app menu appears in Shopify's sidebar, and step 3 opens.
  • Reset configuration reloads the companies, journals and taxes from Odoo and empties the fields on this form. Nothing is saved until you click Save changes. Use it when you added a company or journal in Odoo and it does not show in the list.

Step 3: Ready To GO!

The last step confirms the app is installed. It gets its check mark once you have saved both Inventory Settings and Orders Settings at least once.

It has three parts.

Shortcuts: buttons to open Dashboard, Product Settings, Inventory Settings, Order Settings and Customer Settings.

Backup & Restore Settings: save all your settings to a file, or load them from one.

  • Export settings downloads a .json file with your configuration, sync settings, mappings and field mapping rules. It holds your Odoo address and database name, but not your password or API key.
  • Import settings loads a file you exported. The app asks Import settings? first.
    • If the shop is connected to the same Odoo server and database as in the file, everything is restored.
    • If it is connected to a different Odoo database, only the sync preferences are restored. Odoo-specific choices such as journals, warehouses, companies and field mapping rules are skipped, because their IDs differ between databases. You then set those again.
  • A file that is not a valid backup shows Invalid backup file.
Good to know

Export your settings before big changes, such as moving to a new Odoo database or reinstalling the app.

Clear Temporary Cache: the app keeps its own list of which Shopify product or customer belongs to which Odoo record. You only need to clear it if you changed the Odoo database or a sync keeps picking the wrong record.

  1. 1
    Tick Clear Customer Data, Clear Product Data, or both.
  2. 2
    Click Clear Cache.
  3. 3
    Confirm in the Confirm Clear Cache window.

The app then forgets those links and builds them again on the next sync, by matching SKU, barcode or variant ID. It also resets a product or customer import that looks stuck. Clearing the cache never deletes anything in Shopify or Odoo.

Your first sync

Do the first sync in this order. Each step relies on the one before.

  1. 1
    Products. Open Product Settings and choose the Product Sync Direction. If Odoo holds your catalog, use Odoo → Shopify and click Import Products. If Shopify holds it, use Shopify → Odoo and click Export Products. If both already have the same products, start with Only update existing products, so the app links them by SKU or barcode without creating new ones.
  2. 2
    Check the links. The Product Sync Status tab shows which products are linked and which are not. The Missing SKUs (or Missing Barcodes) tab lists products the app cannot match.
  3. 3
    Stock. Open Inventory Settings, choose the direction, map your Shopify locations to Odoo warehouses or locations, and click Process Inventory Sync once.
  4. 4
    Orders. Open Orders Settings, choose a journal in Select Sale Invoice Journal, set your invoice options, turn on Enable Order Sync, and click Save. Then place a test order in Shopify and check it on the Dashboard.
  5. 5
    Customers. Open Customer Settings if you also want customers synced on their own. Customers on orders are created in Odoo with the order anyway.
Good to know

Try each sync with a few records first. Product syncs can use a category, collection or tag filter, and manual syncs can be limited to a date range.

Turn on automatic syncs

Each automatic sync is turned on in its own page. Saved settings start working right away.

What Where to turn it on How often it runs
Products Product Settings: Enable Auto Product Sync from Odoo to Shopify (or from Shopify to Odoo) Once a day.
Stock Inventory Settings: Enable Stock Sync & Set Auto Sync Frequency and Select Auto-Sync Frequency The frequency you pick: Every 15 Minutes, Every 30 Minutes, Hourly, Every 6 Hours, Every 12 Hours, Once a Day or Once a Week. Real-time is also possible.
Shopify orders to Odoo Orders Settings: Enable Order Sync Real time. Each new Shopify order is sent to Odoo within moments.
Order status from Odoo to Shopify Orders Settings: fulfillment, payment, cancel and refund status Hourly (cron) or Real-time (webhook) for each status. Refunds are hourly only.
Odoo orders to Shopify Orders Settings, when the order direction is Odoo → Shopify New Odoo orders are picked up every 5 minutes.
Customers Customer Settings: Enable Customer Sync from Odoo to Shopify (or from Shopify to Odoo) Every 3 hours. Customers on Shopify orders are also created with the order.
CRM leads Customer Settings, CRM tab Abandoned checkouts and draft orders every hour.

Each of these has its own topic in this help center with all the details: Product sync, Inventory sync, Order sync and Customer sync & CRM leads.

How the app is laid out

The app lives inside your Shopify admin. After step 2 is saved, its pages show under the app's name in Shopify's left sidebar:

Page What you do there
Dashboard See if Odoo is connected, order sync numbers, and the list of synced and failed orders. Resync failed orders.
Product Settings Product sync direction and options, manual product, price and image syncs. Tabs: Product Settings, Product Sync Status, Missing SKUs (or Missing Barcodes).
Inventory Settings Stock sync direction, frequency, quantity type and location mapping.
Orders Settings Order sync, invoices, payments, refunds and order status sync.
Additional Order Settings Order rules, tags, discounts, pricelists, customer mapping, warehouses and taxes. It needs Enable Order Sync to be on.
Customer Settings Customer sync and Odoo CRM leads.
Field Mapping Extra field rules for orders, products and customers.
Configuration The setup guide again: Odoo connection, general configuration, backup and cache.
Logs Every sync action with its result, plus tabs for duplicate SKUs or barcodes, duplicate Odoo orders and app updates.
Plans Your plan, trial and billing.

Good to know:

  • On the Dashboard, the line ✓ Odoo account is connected (or ✗ Odoo account is not connected - Click to configure) opens Configuration when you click it.
  • Settings pages use Shopify's save bar. When you change something, save or discard it before you leave the page.
  • The Dashboard, Logs and Plans pages may show a Love this app? banner with other apps from our team. Click Dismiss to hide it.
  • The bottom of most pages has our support email and a link to schedule a call.

Change or disconnect Odoo

To change the connection, open Configuration and edit the Odoo Connection fields, then click Establish Connection. The button is greyed out until you change a field.

What happens depends on what you change:

  • Username or Password / API Key only: the app logs in again with the new details. All your settings stay. Use this when you change the password or replace an API key.
  • Server URL or Database Name: the app treats it as a new Odoo database. Odoo records have different IDs in each database, so old choices could point at the wrong record. The app resets them.

When the URL or database changes, the app:

  • Turns off order sync, stock sync, product sync and order status sync.
  • Clears the general configuration, so you do step 2 again.
  • Clears Odoo-specific choices: journals, payment journals, taxes, warehouses, pricelists, locations, categories, and their mappings.
  • Removes the Shopify webhooks the app used for those syncs. They are added again when you turn the syncs back on.

Settings that do not depend on Odoo IDs, such as text values and account codes, are kept.

Important

Export your settings in Backup & Restore Settings before you change the Server URL or Database Name. Then use Import settings after you reconnect, and set the Odoo choices again.

There is no disconnect button. To stop the app reaching Odoo:

  • Delete the API key in Odoo (My Profile > Account Security), or change the user's password. The app can no longer log in, and syncs to and from Odoo stop with login errors.
  • Turn off each sync in the app if you want the app to stop trying.
  • To remove everything, uninstall the app. See Privacy & uninstall.

Troubleshooting

?
The badge says "Invalid Odoo Host Url".
  • Check that Server URL starts with https:// (or http://). Without it, you see Invalid URL provided.
  • Use only the address of your Odoo, such as https://mycompany.odoo.com. Remove /odoo, /web and anything after them.
  • Open the same address in your browser. If Odoo does not load, the app cannot reach it either.
?
It says Odoo is reachable but its external API is not responding.

Your Odoo server answers, but blocks the API the app uses. Ask whoever runs your Odoo server or proxy to allow /xmlrpc/2/* and /jsonrpc. On Odoo Online, check that your Odoo plan includes external API access.

?
It says the database does not exist.
  • On Odoo Online, the database name must equal the first part of your address. The message shows the name it expected.
  • On other servers, the message means the server does not list that database. Check the spelling. Upper and lower case do not matter.
?
It says no Odoo user was found with this login.

The Username must be the user's Odoo login, usually an email address. Check it in Odoo under Settings > Users & Companies > Users.

?
It says the password is correct but API access requires an API key.

Your Odoo server does not accept passwords for API access. Make an API key (see Step 1) and paste it into Password / API Key.

?
It says to recheck the username and password.
  • Check both for typos and spaces.
  • If the user has two-factor authentication on, a password does not work. Use an API key.
  • If you use an API key, check that it was made for the same user as the Username, and that it has not expired or been deleted.
?
The Company, journal or tax list is empty or missing an entry.
  • The Odoo user may not see that company. In Odoo, give the user access to all the companies you need.
  • If you added the record in Odoo after connecting, click Reset configuration to reload the lists, then fill the form and click Save changes.
?
Saving fails with a message about the Shopify Variant ID field.
  • Use only letters, numbers and _ in the field name.
  • To have the app create the field, the name must start with x_.
  • If the message says the field could not be created, the Odoo user lacks the right to create fields. Create a Text (char) field with that name on the Product Variant model in Odoo, or give the user administrator rights, then save again.
?
Stock or invoices fail after I changed the company.

Your mappings still point at warehouses, locations, journals or taxes of the old company. Open Inventory Settings, Orders Settings and Additional Order Settings, pick values of the new company and click Save on each page.

?
The app menu does not appear in Shopify's sidebar.

The menu appears after step 2 is saved. Finish General configuration and click Save changes, then reload the page.

Need help

When you write to us, include your Shopify store address, what you expected, what happened, and the error from the Logs page. A screenshot helps.

02Start

Plans & billing

6 min read

This topic explains what the app costs, how the free trial works, and what happens when you change or end your plan. All billing goes through Shopify and shows on your Shopify bill.

What it does

The app has one plan with every feature included. You choose how you pay:

  • Pay monthly: billed every 30 days.
  • Pay yearly (save up to 17%)*: billed once a year, at a lower price than 12 monthly payments.

Every plan starts with a 30-day free trial. You are not charged until the trial ends.

What every plan includes

There are no feature tiers and no usage limits. Every plan includes:

  • Unlimited orders
  • Automatic product sync
  • Automatic inventory sync
  • Two-way fulfillment flow
  • Refund flow
  • Implementation support

The yearly plan adds:

  • Includes everything in the monthly plan
  • Priority support
  • 2 months free
  • Save up to 17% on annual billing

There is no cap on orders, products, customers or syncs on any plan.

Prices

The price depends on your Shopify plan. The app reads your Shopify plan and shows the matching price:

Your Shopify plan App price level
Basic, development and partner stores, and any other plan Basic level
Grow (formerly "Shopify") Grow level
Advanced Advanced level
Shopify Plus Plus level

The Plans page always shows the exact price that applies to your store, in USD, per month or per year. For current prices you can also check the app's listing in the Shopify App Store.

Good to know

Stores that installed the app a long time ago may keep an older, lower price. If we gave your store a discount, the price on the Plans page already includes it.

The free trial

  • The trial lasts 30 days.
  • It starts when you first install the app, not when you pick a plan.
  • If you pick a plan on day 10, Shopify's approval screen shows the 20 days that are left. Billing starts the day the trial ends.
  • During the trial, the Plans page shows how many days are left and the date billing will start, for example 12 days remaining in your free trial and Billing will start on 15/11/2026.

The trial is given once per store:

  • If you uninstall and install again, the trial does not start over. It keeps counting from your first install.
  • If your trial has already ended, a reinstalled store goes straight to a paid plan. The Plans page then shows the Free trial completed banner. If you need more time to test, write to support@techmarbles.com.

How to choose a plan

  1. 1
    Open Plans in the app menu. New installs are taken there on their own.
  2. 2
    Choose Pay monthly or Pay yearly (save up to 17%)* at the top.
  3. 3
    Click Start free trial now on the plan card. While your trial is still running, the button says Continue free trial.
  4. 4
    Shopify opens its approval screen with the price and the trial days. Click Approve.
  5. 5
    Shopify sends you back to the app.

The button shows Processing… while the app prepares the charge.

The Plans page explained

Your current plan (top card):

Item What it shows
Plan name The plan you are on.
Active Billing is in order.
Expired There is no active subscription. Choose a plan to keep using the app.
Reconnect required Your subscription is fine, but the app's link to Shopify has expired. See below.
Next billing on The date of your next charge.
Expired on The date your subscription ended.
Trial lines Days left in the trial and the date billing starts.

The plan cards:

  • The green strip on top shows 30 days free trial, or how many trial days you have left.
  • The yearly card has a Most popular badge.
  • The price shows in USD with /month or /year.
  • Under the button you see when billing starts.

Banners:

  • Free trial completed: you reinstalled the app after your trial was used up.
  • Reconnect your store to Shopify: see Troubleshooting.

Change your plan

You can switch between monthly and yearly billing at any time:

  1. 1
    Open Plans.
  2. 2
    Click the other billing option at the top.
  3. 3
    Click the button on that plan card and approve the new charge in Shopify.

Shopify replaces your old subscription with the new one. Shopify handles any credit for the unused part of the old plan.

The button on the plan type you already pay for is greyed out, so you cannot buy the same plan twice.

Good to know

There is no smaller or bigger plan to move to, because every plan has every feature. The price level follows your Shopify plan.

Cancel

To stop paying, uninstall the app from your Shopify admin (Settings > Apps and sales channels). Shopify ends the subscription when the app is uninstalled.

Read Privacy & uninstall first. Uninstalling deletes your app settings.

What happens without an active plan

When the trial ends without a plan, or a subscription is declined or cancelled:

  • The app opens the Plans page instead of your settings. Every other page sends you back there.
  • The current plan card shows Expired and the Expired on date.
  • Pick a plan and approve it to get access back. Your settings are kept, so you carry on where you left off.

Paid add-on: Personalized Alert Mails

This optional service is billed separately from your plan.

  • It emails you right away when an order fails to sync from Shopify to Odoo because required information is missing, such as a missing product or address detail. The email has the order details and the reason.
  • It does not cover errors made by the app itself or technical system errors.
  • It costs $30 per year.

To turn it on:

  1. 1
    On the Dashboard, click Activate Personalized Alert Mails.
  2. 2
    Enter the Email address for notifications.
  3. 3
    Click Request activation.
  4. 4
    Our support team sends you a payment link. Once payment is confirmed, the alerts are switched on and you are told.

When it is active, the button reads View Personalized Alert Mails. It shows the email address, the Activated from date and the Active until date.

Troubleshooting

?
The Plans page says "Reconnect required".

Your subscription is active and your billing is not affected. The app's access to your store has expired, so it cannot read your subscription or sync your data. Reload the page and approve the Shopify permission prompt. This does not create a new charge.

?
I approved a plan, but the app still shows the Plans page.

Reload the app. Shopify can take a few seconds to confirm a new subscription. If it still shows Expired, open Settings > Billing in your Shopify admin and check that the app charge was approved, then contact support.

?
The "Start free trial now" button is greyed out.

You already pay for that plan type. Switch the billing option at the top to see the other plan.

?
The trial shows fewer than 30 days.

The trial counts from your first install of the app on this store, including installs before a reinstall.

?
My price is different from what I expected.

The price follows your Shopify plan. If you changed your Shopify plan, or think the price is wrong, contact support@techmarbles.com.

03Catalog

Product sync

23 min read

Product sync creates and updates products between Odoo and Shopify. You choose the direction, whether new products are created, which fields are updated, and which products are included.

What it does

  • Odoo → Shopify (the default): Odoo is your product master. The app imports Odoo products into Shopify and keeps them up to date.
  • Shopify → Odoo: Shopify is your product master. The app exports Shopify products to Odoo and keeps them up to date.

Only one direction is active at a time. The direction is shown next to the Product Settings page title.

The page has these tabs:

  • Product Settings: all options and the manual sync buttons.
  • Product Sync Status: a list of your products and whether each one is matched.
  • Missing SKUs or Missing Barcodes: products the app can't match because they have no SKU or barcode. This tab is hidden when you match by Shopify variant ID.

If you have unsaved changes, you can't switch tabs. You see "Save or discard your changes before switching tabs."

Stock quantities are not part of product sync. See Inventory sync.

Before you start

  • Connect Odoo and finish Configuration.
  • In Configuration, Odoo SKU/Barcode Mapping decides how products are matched:
    • SKU (Internal Reference): the Shopify variant SKU is matched with the Odoo Internal Reference.
    • Barcode: the Shopify variant barcode is matched with the Odoo Barcode.
    • Shopify Variant ID (Custom Odoo Field): the Shopify variant ID is stored in a custom Odoo field (for example x_shopify_variant_id). Enter its name in Odoo Custom Field for Shopify Variant ID. If the field does not exist and its name starts with x_, the app creates it when you save.
  • Give every product and variant a unique SKU or barcode on both sides. A product without one can't be matched, and duplicates can link the wrong products.
Important

Shopify Variant ID matching only works for Shopify → Odoo. If an Odoo product does not have its Shopify variant ID stored yet, it is not matched and a duplicate product may be created in Odoo.

How to set it up

  1. 1
    In the app, open Product Settings.
  2. 2
    Under Product Sync Direction, pick Odoo → Shopify or Shopify → Odoo. Click Confirm in the pop-up.
  3. 3
    Under Product Sync Options, choose Create new and update existing products or Only update existing products.
  4. 4
    Tick the options you need for your direction (see Settings explained).
  5. 5
    Optional: turn on Update Product Fields and tick the fields to update on existing products.
  6. 6
    Optional: limit the sync with Sync Product By Category / Sync Shopify Product By Collection and Sync Product By Tags / Sync Shopify Product By Tags.
  7. 7
    Optional: set up price lists (Sync Odoo Pricelist or Target Odoo Pricelist).
  8. 8
    Optional: turn on Enable Auto Product Sync to sync once a day.
  9. 9
    Click Save.
  10. 10
    Run the first sync with Import Products (Odoo → Shopify) or Export Products (Shopify → Odoo) at the top of the page.
Good to know

For a large Odoo catalog, sync one category or tag at a time. This avoids Shopify rate limit errors.

Settings explained

Product Sync Direction

Option What it does
Odoo → Shopify Import products from Odoo into Shopify. This is the default.
Shopify → Odoo Export products from Shopify into Odoo.

Changing it shows Confirm Sync Direction Change. The new direction applies after you click Save. The options on the page change with the direction.

Create or update

Under Product Sync Options (both directions):

Option What it does
Create new and update existing products Products that are not matched yet are created on the other side. Matched products are updated.
Only update existing products Only matched products are updated. Nothing new is created. This is the default.

When a product is created, all of its main fields are copied (title, description, variants, SKU, barcode, price, cost, tags and so on). On later runs, only the fields you tick under Update Product Fields are changed.

Options for Odoo → Shopify

Setting What it does
Auto-publish newly synced products. New products are published to your sales channels. If unticked, they are created as active but not published. On by default.
Sync only products which has stock available on Odoo. Only products with stock above 0 in Odoo are synced. Products with zero or negative stock are skipped.
Create Odoo Product Category as Shopify Collections. Odoo product categories are created as Shopify collections, and products are added to the collection of their category.
Map Odoo categories to Shopify product categories Sets the Shopify product category (Shopify's standard category list) from each product's Odoo category. See Shopify product categories below. Off by default.
Map Products to Shopify Locations New products are stocked at all active Shopify locations used in your Inventory Settings location mapping. If unticked, only the default location is used. Later changes must be made in Shopify.
Set products in draft state on import for new products New products are created as Draft instead of Active. Draft Shopify products are then also checked when looking for existing matches.
Disable Inventory Tracked on Shopify For Synced Products Turns off Track quantity in Shopify for products created or updated from Odoo. It does not change inventory settings or location mapping. When off, tracking follows Odoo (see Inventory tracking below).
Add fixed tax rate (%) on top of synced prices Adds the Tax rate (%) you enter to the Odoo sale price before it goes to Shopify. It applies to price and compare-at price. With 5%, an Odoo price of 100 becomes 105. Use it when Odoo prices are tax-exclusive but Shopify shows tax-inclusive prices.
Minimum sale price floor (same currency as Shopify) Products with a sale price of 0, or below the Amount you enter, are not created or updated. Leave the amount empty or 0 to only block zero prices. Set 10 to skip any price below 10.
Sync translated product content Reads product titles, descriptions and tags from Odoo in the Odoo language you pick, instead of the default English text. Use it when you edit product names in a non-English Odoo. The list shows the languages installed in Odoo. If you turn it on, you must pick a language.

Shopify product categories

Map Odoo categories to Shopify product categories (Odoo → Shopify) fills in the Category field of Shopify products from Odoo:

  1. 1
    Tick Map Odoo categories to Shopify product categories.
  2. 2
    In each row, pick an Odoo product category and type in Shopify product category to search Shopify's category list, for example "T-shirts". Click Add mapping for more rows. Click Refresh Odoo categories if a new Odoo category is missing.
  3. 3
    Optional: in Odoo field for a product's own Shopify category (optional), enter the technical name of an Odoo product field, for example x_shopify_category.
  4. 4
    Click Save.

Which category a product gets:

  • If the product has a Shopify category id in the optional Odoo field, such as aa-1-13-8 (Apparel & Accessories > Clothing > Clothing Tops > T-Shirts), that category is used. A value that is not a Shopify category id is ignored, and the Logs page says so.
  • Otherwise the mapping of the product's Odoo category is used. A mapping also covers subcategories that have no mapping of their own: mapping "Clothing" also covers "Clothing / T-shirts".
  • Otherwise the product's category in Shopify is left as it is.

The category is set when a product is created. For existing products it is updated during the product sync when Update Product Fields is turned on. You don't need to tick any field under it for the category. It is only changed when the mapped category is different from the category the product has in Shopify. Changing a product's category in Shopify removes the category attributes filled in for it, so a product whose category already matches is never touched.

Options for Shopify → Odoo

Setting What it does
Map to Odoo Product Category: How Odoo product categories are set.
None - Don't map to categories Products use the default Odoo category.
Shopify Product Type → Odoo Product Category The Shopify product type becomes an Odoo product category. Missing categories are created.
Shopify Collections → Odoo Product Category The Shopify collection becomes an Odoo product category. If a product is in several collections, only the first one is used.
Invoicing Policy in Odoo: Sets the invoicing policy on products created in Odoo. Ordered quantities: invoice the full quantity when the order is confirmed. Delivered quantities: invoice only what has been delivered.
Sync Draft Products Also exports Shopify products that are in Draft status.
Enable Product Vendor Mapping Sends the Shopify product vendor to Odoo. Only for newly created products.
Minimum sale price floor (same currency as Shopify) Same as above: products priced at 0 or below the floor are not created or updated in Odoo.

Inventory tracking

When products are created or updated, the app keeps Shopify's Track quantity in line with Odoo's Track Inventory:

  • On Odoo 18 and later, it follows the Track Inventory checkbox on the product.
  • On older Odoo versions, it follows the product type: storable products are tracked, consumables are not.

Tick Disable Inventory Tracked on Shopify For Synced Products to turn tracking off in Shopify for every synced product instead.

Enable Auto Product Sync

Enable Auto Product Sync from Odoo to Shopify (or from Shopify to Odoo) runs a full product sync once a day, in your chosen direction. Turning it on asks you to confirm.

  • It uses your create/update setting, field update settings and filters.
  • It covers SKU, Barcode, Price, Title, Description, Tags and Cost.
  • It runs at about 00:00 UTC. If a product sync finished less than 30 minutes earlier, that day's run is skipped.

Update Product Fields

Update Product Fields from Odoo to Shopify (or from Shopify to Odoo) controls which fields are changed on products that already exist on the other side. It applies to the daily auto sync and to manual import and export. It does not affect new products.

Turn it on, then tick at least one field under Select the fields to update: (or Select the fields to export:). Otherwise saving shows "Please select at least one field to update."

Field What is updated
Price The sale price (and compare-at price where used).
Title The product name.
Description The product description.
Tags The product tags.
Cost The product cost. Odoo → Shopify this writes Shopify Cost per item.

Cost is the only way to change Cost per item on products that already exist. A product sync sends the cost when it creates the product, but on later runs it changes only the ticked fields, and Sync Prices never touches the cost. If your costs change often, turn on Enable Auto Product Sync, tick Cost here, and the daily run updates them.

Prices of products with variants (Shopify → Odoo)

Each Shopify variant's price goes to its own variant in Odoo. What the main product shows as Sales Price depends on your Odoo version:

  • Odoo above 19.0: the main product shows the lowest price of its Shopify variants, for example 19.50 for a shirt sold at 19.50, 24.90 and 29.00. Each variant keeps its own price.
  • Odoo 19.0 and older: the main product's Sales Price stays at 0 when the variant prices are synced, because Odoo adds each variant's price on top of it. Open a variant to see its price.

Filter by category, collection or tag

Setting Direction What it does
Sync Product By Category Odoo → Shopify Only products in the Odoo categories you pick are synced.
Sync Shopify Product By Collection Shopify → Odoo Only products in the Shopify collections you pick are exported.
Sync Product By Tags Odoo → Shopify Only Odoo products with the tags you pick are synced.
Sync Shopify Product By Tags Shopify → Odoo Only Shopify products with the tags you pick are exported.
  • With the switch off, all products are synced.
  • With the switch on, pick at least one value. Otherwise saving shows, for example, "Please select at least one category or disable the option."
  • Type in the box to search. With a long list, only the first matches are shown; keep typing to narrow it.
  • Category lists show the full path, for example "Parent / Child / Subchild". If your Odoo has eCommerce categories, Odoo product categories show "(General)" and website categories show "(Website)". Only categories of the company set in Configuration are listed.
  • Click Refresh to load new categories, collections or tags.
  • The filters apply to the daily auto sync and to manual import or export.
  • Sync Prices and market catalog prices follow the Odoo → Shopify filters too: only the products that match get new prices.

Sync Odoo Pricelist (Odoo → Shopify)

Turn on Sync Odoo Pricelist to price Shopify products from an Odoo price list instead of the default sale price.

  1. 1
    Turn on Sync Odoo Pricelist.
  2. 2
    In Select Price List, pick the Odoo price list. Click Refresh to reload the list.
  3. 3
    Click Save.

The price list rules are applied at product, variant and category level, and the price is worked out in the price list's own currency. See How a price list price is worked out. If you turn it on without picking a sales list, a market catalog mapping or Map Price list to Cost per item, you see "Please select a price list to save…". You can leave Select Price List empty when a Select Cost Price List is set or when you map price lists to market catalogs. To clear it, pick --Select--.

Price list names are shown in the language of the Odoo user you connected, the same names you see in Odoo. Only active price lists are shown. If you rename a price list in Odoo, click Refresh to see the new name.

Map Price list with Shopify Market Catalog sends Odoo price lists to Shopify Markets catalogs, so each market gets its own prices:

  1. 1
    Tick Map Price list with Shopify Market Catalog.
  2. 2
    In each row, pick an Odoo Pricelist and a Shopify Market Catalog.
  3. 3
    Click Add mapping for more rows. Use the delete icon to remove a row.
  4. 4
    Click Refresh market catalogs if a catalog you created in Shopify is missing.
  5. 5
    Click Save.
  • Each price list and each catalog can be used in one row only.
  • A half-filled row shows Required. You need at least one complete row.
  • Prices follow the price list's rules, in the price list's own currency. A Fixed Price line gives exactly that price. If the product's price is in another currency than the price list, it is converted with your Odoo exchange rates first. See How a price list price is worked out.
  • Tick Add Odoo taxes to market catalog prices when your Odoo price list is before tax and the market shows prices with tax. Each product's Odoo sales taxes are then added to its catalog price. It is off by default.
  • To change only the market catalogs, leave Select Price List empty. A price sync then updates the catalog prices and leaves the Shopify base price unchanged, for example EUR base prices with a CHF catalog for Switzerland. A product sync still writes the base price from the Odoo sale price if Price is ticked under Update Product Fields, so untick it.
  • Turning off Sync Odoo Pricelist also removes the market catalog mapping.

Map Price list to Cost per item writes an Odoo price list to Shopify Cost per item instead of the product's cost:

  1. 1
    Tick Map Price list to Cost per item.
  2. 2
    In Select Cost Price List, pick the Odoo price list. It can be the same list as Select Price List, or a different one.
  3. 3
    Click Save.
  • Rules are applied the same way as sale prices (product, variant and category). Products without a line keep their normal cost.
  • You can use cost mapping alone: leave Select Price List empty and Shopify sale prices stay on the product's normal sale price.
  • On later syncs, Cost must be ticked under Update Product Fields for cost to change on products that already exist.
  • Turning off Sync Odoo Pricelist also turns this option off.
  • If you turn it on without picking a list, you see "Please select a cost price list to save, or disable this option."

Target Odoo Pricelist (Shopify → Odoo)

Turn on Target Odoo Pricelist and pick a list in Select Target Price List. Synced Shopify prices are then also written into that Odoo price list, for every product and variant, on every Odoo version.

  • Prices on the Odoo product itself keep syncing as before.
  • Leave it off and nothing changes.
  • If you turn it on without picking a list, you see "Please select a target price list to save, or disable this option."

Save

Click Save at the bottom of the page, or Save in the Shopify save bar. Click Discard to undo your changes. You see "Product settings data saved successfully" when it worked.

How often it runs

  • Auto product sync: once a day at about 00:00 UTC, when Enable Auto Product Sync is on.
  • Manual sync: whenever you click a button at the top of the page.
  • Product Sync Status: whenever you click Sync on a row or sync selected products.

Manual sync buttons

The buttons are at the top right of the Product Settings tab:

Button What it does
Sync Prices Updates only prices of products that are already matched. In the pop-up, pick the Price sync direction for this run only. Your saved direction does not change. A warning reminds you that prices on the other side are overwritten. Price list settings still apply. It sends sale prices only, never Cost per item.
Import Products / Export Products Runs a full product sync in your direction. Your create/update setting, field settings and filters apply. A Shopify → Odoo export runs in the background and can take several hours for a large catalog.
Import Images / Export Images Copies product images. Pick Default Images Only (the main image of each product, recommended) or All Images.
Important

Remove existing images on the destination before an image sync, or images may be duplicated. All Images may hit API rate limits, so some images may not sync and you may need to run it again.

The buttons are greyed out while a related sync is running. A new manual product sync can only start 5 minutes after the last one finished.

Date range

Each manual sync pop-up asks what to sync:

  • All: everything, as before.
  • Date range: only records updated between the dates you pick. Use Today, Yesterday, Last 7 days, Last 30 days, Last 90 days, or the calendar. Dates are full days in your own time zone, matched against each record's last-updated date.

Confirm stays greyed out until you pick both a start and an end date. The pop-up always opens on All.

Progress cards

When a manual sync starts, a card shows under the tabs: Product Sync, Price Sync or Image Sync.

  • Status: Starting, In progress, Stopping…, Completed, Failed or Stopped.
  • A progress bar with "X of Y processed", and failed and skipped counts.
  • Stop ends the run at the next safe point. Products already synced stay synced.
  • Dismiss hides a finished card. If it failed, Error details says why.

For Shopify → Odoo, if an export finished with failed or skipped products, a banner shows "Product export in progress: X of Y (Z%). Failed: A. Skipped: B." Click Retry failed or skipped products to try just those again. You can leave the page while an export runs.

A large export sends a lot of calls to your Odoo, and pauses for a minute or two when it has sent as many as Odoo should take for the minute. The products it is waiting on stay counted as still to do, not as failed, and the export carries on by itself once there is room again. Only if it is still waiting after a few hours does the export give up on them: they are then counted as failed, and the Logs page says "N product(s) were not synced because Odoo's API rate limit stayed saturated — run the export again to sync them." Start the export again, or click Retry failed or skipped products, to sync those products.

Product Sync Status

This tab lists your Odoo Products (Odoo → Shopify) or Shopify Products (Shopify → Odoo), 50 per page.

Column What it shows
Image The main product image.
Product The title. Products with several variants show "N variants". Click it to see each variant.
SKU / Barcode / Variant ID The identifier used for matching, set in Configuration.
Shopify Product ID / Odoo Product ID The product ID in each system, when matched.
Sync Status Synced when a product with the same identifier exists on the other side. Not Synced when not. Each variant has its own status.
Action Sync syncs this product now. Sync Images syncs its images (pick Default Images Only or All Images).
  • Use the All, Synced and Not Synced tabs to filter. On Not Synced, products with unmatched variants open automatically.
  • Search by name, SKU or barcode.
  • Sort by Product title, Created or Updated.
  • If your settings have a collection or tag filter, a "Filtered by: …" badge shows and only those products are listed.
  • Select products and click Sync Selected Products (or Sync Odoo → Shopify / Sync Shopify → Odoo at the top) to sync them as one batch. Sync Images for Selected (or Sync Images) does the same for images. The progress card shows the batch.
  • Click Refresh to reload the list. The match status is cached for about 10 minutes.

Missing SKUs or barcodes

The Missing SKUs (or Missing Barcodes) tab lists products on the side you sync from that have no SKU or barcode. These can't be matched.

  • Odoo: Product Name, Odoo ID and the other identifier (for example the barcode when you match by SKU). Only active, saleable, non-service products are listed.
  • Shopify: Product Name, Variant Title, Product ID, Variant ID and the other identifier.
  • Up to 500 rows are shown. The summary says how many there are in total.
  • "Every Odoo product has a SKU." means nothing is missing.
  • Click Refresh after you fix products.

What is synced / not synced

Synced on create (both directions): title, description, variants and options, SKU, barcode, price, cost, tags, and the inventory tracking flag. Plus the extra options you turned on (category, collection, vendor, draft status, images).

Shopify options (Odoo → Shopify): only the Odoo attributes your variants are made of become Shopify options, for example Color and Size. Attributes set to Never under Variant Creation in Odoo (for example "Material" or "Fit") are product information, not options, so they are not sent as options. Shopify allows at most 3 options per product, and an option name can't contain " / ", so "Cut / Style" is sent as "Cut/Style".

Synced on update: only the fields ticked under Update Product Fields.

Not synced:

  • Stock quantities. Use Inventory sync.
  • Creating bundle or kit products (Shopify bundles, Odoo Kit BoMs). Sync the single products, then build the bundle or kit by hand. Once a Shopify product and an Odoo kit share a SKU or barcode, the app can sync the kit's stock and deliveries. See Kit products.
  • Deleting a product on one side does not delete it on the other.
  • Products outside your category, collection or tag filters.

Limits

  • Odoo → Shopify: up to about 20,000 products for a first import. Sync by category or tag to stay within Shopify rate limits.
  • Shopify → Odoo: up to about 10,000 simple products, or about 500 products with 10 to 20 variants. Large exports run in the background with automatic rate limiting.
  • One manual product sync at a time per store, with 5 minutes between runs.
  • One price sync and one image sync at a time.

Good to know

  • Bundle and kit limit: Shopify and Odoo store bundles in different ways, and there is no standard API to convert one into the other, so the app does not create them. Build the kit on both sides with the same SKU or barcode, then turn on the kit options described in Kit products.
  • Switching on Create new and update existing products with duplicate or missing identifiers can create duplicate products. Check the Missing tab and the Duplicate SKUs tabs on the Logs page first.
  • Product sync results and errors appear on the Logs page.

Troubleshooting

?
A product was not created on the other side.
  • Check that Create new and update existing products is selected.
  • Check that the product has a SKU or barcode (see the Missing tab).
  • Check your category, collection and tag filters.
  • Check Minimum sale price floor: products with price 0 or below the floor are skipped.
  • For Odoo → Shopify, check Sync only products which has stock available on Odoo.
  • For Shopify → Odoo, draft products are only exported with Sync Draft Products on.
  • For Odoo → Shopify, check the Logs page for a line such as "Product Creation failed: Shopify rejected 1 of 1 lines". It quotes Shopify's reason, for example "Can only specify a maximum of 3 options". A product with more than 3 Odoo attributes that create variants can't be created in Shopify.
?
A product was created twice.
  • The identifiers did not match. Check that the SKU or barcode is exactly the same on both sides.
  • Check the Duplicate SKUs - Shopify and Duplicate SKUs - Odoo tabs on the Logs page.
  • With Shopify Variant ID matching, the Odoo product must already have its Shopify variant ID in the custom field.
?
Changes to existing products are not updated.
  • Turn on Update Product Fields and tick the field you changed, for example Price or Title. Then click Save.
?
A product with variants shows Sales Price 0 in Odoo.
  • On Odoo 19.0 and older this is expected: each variant holds its own price. See Prices of products with variants.
  • On Odoo above 19.0, run a product sync with Price ticked under Update Product Fields, or run Sync Prices. The main product then shows the lowest variant price.
?
The price in Shopify is different from Odoo.
  • Check Sync Odoo Pricelist: when it is on, the price list price is used, not the sale price.
  • Check Add fixed tax rate (%) on top of synced prices.
  • Check that Price is ticked under Update Product Fields, or run Sync Prices.
?
I see "Product sync is already running. Please wait for the current sync to complete."
  • Another product sync is busy. Wait for its progress card to finish, or click Stop on the card.
?
I see "Product sync was completed recently. Please wait at least 5 minutes before starting another sync."
  • Wait 5 minutes and try again.
?
I see "Product export is already running. Cancel or reset the current export first".
  • A Shopify → Odoo export is still in progress. Wait for it, or stop it from its progress card.
?
I see "Price sync is already running" or "An image sync is already running".
  • Wait for the current run to finish, or click Stop on its card.
?
Images are duplicated.
  • Delete the extra images on the destination, then run the image sync with Default Images Only.
?
Some images did not sync with All Images.
  • This is usually a rate limit. The app waits and tries each image again a few times, but if other syncs are running at the same time some images can still be skipped. Run the image sync again until all images are copied.
?
Shopify products show "Track quantity" off.
  • Check Disable Inventory Tracked on Shopify For Synced Products.
  • Check Track Inventory (or the product type) on the Odoo product.
?
The language of titles is wrong.
  • Turn on Sync translated product content and pick the right Odoo language. Make sure the Odoo translation exists.
04Catalog

Inventory sync

17 min read

Inventory sync copies stock quantities from one system to the other. You pick which side is the source of truth, how often it runs, which quantity is sent, and which locations are linked.

What it does

  • Odoo → Shopify (the default): Odoo is the source of truth. The app reads stock from Odoo and writes it to your Shopify locations.
  • Shopify → Odoo: Shopify is the source of truth. The app reads stock from your Shopify locations and writes it to Odoo locations as an inventory adjustment.

Only one direction is active at a time. The direction is shown next to the page title.

Inventory sync only changes quantities. It does not create products. Products must already exist on both sides and be matched (see Product sync).

Before you start

  • Connect Odoo and finish Configuration. The matching method you chose there (SKU (Internal Reference), Barcode or Shopify Variant ID (Custom Odoo Field)) is also used to match products for stock.
  • Make sure each product has the same SKU or barcode on both sides. Duplicate or empty values are the most common cause of wrong stock.
  • In Shopify, turn on Track quantity for the products you want to sync. Untracked products are skipped.
  • In Shopify, make sure each product is stocked at the locations you plan to map. The inventory sync does not add products to a location.
  • Archived Shopify products are not synced. Active, draft and unlisted products are.

How to set it up

  1. 1
    In the app, open Inventory Settings.
  2. 2
    Under Inventory Sync Direction, choose Odoo → Shopify or Shopify → Odoo. Click Confirm in the pop-up.
  3. 3
    Turn on Enable Stock Sync & Set Auto Sync Frequency Odoo to Shopify (or …Shopify to Odoo).
  4. 4
    In Choose Quantity Type to Sync, pick the quantity to send.
  5. 5
    For Odoo → Shopify, pick a Shopify Target Type. Leave it on Default if you are not sure.
  6. 6
    In Select Auto-Sync Frequency, pick how often the sync runs. Or tick the real-time option instead.
  7. 7
    Set the optional checkboxes (zero stock, combine, incoming).
  8. 8
    Map your locations under Inventory Location Mapping. Click (+) Add for each row. For Odoo → Shopify you can tick Skip location mapping instead.
  9. 9
    Optional: turn on Sync Inventory by Category (Odoo → Shopify) or Sync Inventory by Collection (Shopify → Odoo) to limit which products are synced.
  10. 10
    Click Save.
  11. 11
    Click Process Inventory Sync at the top of the page to run the first sync now.
Good to know

If you leave the page with unsaved changes, the Shopify save bar asks you to Save or Discard first.

Settings explained

Direction and stock sync

Setting What it does
Inventory Sync Direction Odoo → Shopify or Shopify → Odoo. Changing it shows Confirm Sync Direction Change. The new direction is used after you click Save.
Enable Stock Sync & Set Auto Sync Frequency The main switch. When it is off, no scheduled inventory sync runs and the other options are hidden or greyed out. Turning it off also turns off the category and collection filters.

Quantity type

Choose Quantity Type to Sync decides which number is sent:

Option Odoo → Shopify Shopify → Odoo
Quantity Available (recommended) Odoo stock that is not reserved for other orders (on hand minus reserved). Shopify's Available quantity.
Quantity On Hand Odoo's total physical stock, including reserved units. Shopify's On hand quantity.
Quantity Forecasted Odoo's forecasted quantity: on hand plus incoming, minus outgoing. Only offered for Odoo → Shopify. Not available.

Below the fields, a note tells you which Shopify field receives the number. For example: "Note: Quantity Available will be mapped to Shopify's Available field."

Good to know

Quantity Forecasted needs location mapping. With Skip location mapping on, the app sends the available quantity instead.

Shopify Target Type

Only for Odoo → Shopify. It picks which Shopify inventory field receives the Odoo quantity:

Option What it does
Default Keeps the standard mapping from the note under the quantity type. This includes the Combine Odoo available + Shopify committed option when it is on.
On Hand Writes the selected Odoo quantity to Shopify's On hand field.
Available Writes the selected Odoo quantity to Shopify's Available field.

The target type only changes where the number goes. It does not change how the number is calculated in Odoo.

Frequency and real time

Select Auto-Sync Frequency sets how often the scheduled sync runs. Times are in UTC.

Option When it runs
Every 5 Minutes Every 5 minutes. Only shown for stores where we have turned it on. Ask support if you need it.
Every 15 Minutes At :00, :15, :30 and :45 each hour.
Every 30 Minutes At :00 and :30 each hour.
Hourly At the start of every hour. This is the default.
Every 6 Hours At 00:00, 06:00, 12:00 and 18:00 UTC.
Every 12 Hours At 00:00 and 12:00 UTC.
Once a Day Every day at 01:00 UTC.
Once a Week Every Sunday at 01:00 UTC.
Good to know

Scheduled inventory syncs do not run between 00:00 and 00:30 UTC. A run due in that window is skipped and the next one runs as normal. For example, Every 12 Hours really runs once at 12:00 UTC.

Real time sync using webhook (Odoo → Shopify) or Real-time sync using Shopify webhooks (Shopify → Odoo) sends changes as they happen, instead of on a schedule.

  • When you tick it, the frequency selector is replaced by "Auto-sync frequency is disabled when real-time sync is enabled."
  • The scheduled sync stops for your store while real time is on. Process Inventory Sync still works.

Odoo → Shopify real time:

  • Odoo has to tell the app when stock changes. This uses the base_automation module (Automation Rules) in Odoo. It is included with Odoo. Real-time webhooks usually work on Odoo 18 and above.
  • The app does not create the automation in Odoo for you. Book a call from the banner (Schedule a call) or email support@techmarbles.com. The setup takes about 5 minutes, at no extra cost.
  • When Odoo reports a change, the app waits a few seconds to collect more changes. Then it re-counts that product across all Odoo locations mapped to each Shopify location and updates Shopify.
  • Changes in locations that do not belong to a warehouse, or to another company, are ignored.

Shopify → Odoo real time:

  • Shopify sends an update each time an inventory level changes. The app waits a few seconds (longer if order sync is also on), so a burst of changes becomes one update.
  • Shopify only sends the available quantity. So Quantity Available is used automatically and the quantity type can't be changed.
  • Changes at Shopify locations that are not mapped are ignored.

Extra options

Setting Direction What it does
Do not sync zero stock Both Skips products whose stock is 0 or lower. Fewer API calls, but Shopify (or Odoo) keeps the last number it had. It is not set to 0. Leave it unticked to sync every product, including zero stock.
Combine Odoo available + Shopify committed Odoo → Shopify Shown only with Quantity Available and Shopify Target Type set to Default. Writes the Odoo available quantity into Shopify's Available field. Shopify then shows On hand = Odoo available + units committed to open Shopify orders. This keeps products in stock while units are reserved during busy sales.
Calculate kit stock from components Odoo → Shopify For Odoo kit products (Bill of Materials of type Kit), sends Shopify the number of complete kits the components in stock can make, at each mapped location. Off by default. See Kit products.
Sync Odoo Incoming Qty To Shopify Incoming Qty Odoo → Shopify Copies Odoo's incoming quantity (receipts and purchase orders on the way) to Shopify's Incoming quantity at each mapped location. It does not change Available, On hand or Forecasted. It does not create transfers or purchase orders in Shopify.

Kit products

An Odoo kit (Bill of Materials of type Kit) has no stock of its own. Odoo takes its components out of stock when the kit is delivered. To sell a kit in Shopify, create the Shopify product (or bundle) with the same SKU or barcode as the Odoo kit product.

  • Calculate kit stock from components (Inventory settings): Shopify gets the number of complete kits the components can make. With location mapping, this is worked out per mapped location. If a kit needs 2 of a component and 5 are in stock, that component allows 2 kits. The lowest number across the components is sent. Components that Odoo does not track in stock (consumables, services) are left out. Without this option and with location mapping on, kits sync as 0.
  • Deliver kit components when a kit is fulfilled in Shopify (Order Settings > Order Status Sync): fulfilling the kit in Shopify fills in and validates the component lines of the Odoo delivery. Without it, the delivery of a kit stays open in Odoo.
  • Deliveries from Odoo to Shopify always count whole kits: a kit is marked fulfilled in Shopify only once all its components are delivered in Odoo, even if they ship in separate deliveries.
  • Kit stock is updated by the scheduled sync and Process Inventory Sync. Real-time sync does not recalculate kits when a component changes.
  • A kit made of other kits is not converted. Its stock follows Odoo's own kit quantity.

Location mapping

Location mapping tells the app which Odoo location feeds which Shopify location. It is on automatically when stock sync is on. Use (+) Add to add a row and the delete icon to remove one.

Odoo → Shopify (Inventory Location Mapping Odoo to Shopify):

  1. 1
    Click (+) Add.
  2. 2
    In Select Shop, pick one Shopify location.
  3. 3
    In Select/Search Odoo Locations, pick one or more Odoo locations.
  4. 4
    Repeat for each Shopify location, then click Save.
  • If you pick several Odoo locations for one Shopify location, their quantities are added up.
  • If you pick a parent location, the stock of all its sub-locations is included.
  • If you map a parent and one of its sub-locations, the sub-location is only counted once.
  • Each Shopify location and each Odoo location can be used in one row only.
  • Products not stocked at a Shopify location in Shopify are skipped for that location.
  • Orders synced to Odoo: the Odoo delivery takes its stock from the first Odoo location in the row of the Shopify location the order is assigned to. If Odoo had already reserved the products somewhere else, the app releases that reservation and reserves them again from that location. A delivery Odoo had not reserved yet is left for Odoo to reserve.

Shopify → Odoo (Inventory Location Mapping Shopify to Odoo):

  1. 1
    Click (+) Add.
  2. 2
    In Select/Search Shopify Locations, pick one or more Shopify locations.
  3. 3
    In Select Odoo Location, pick one Odoo location.
  4. 4
    Click Save.
  • The quantities of all Shopify locations in a row are added up and written to that one Odoo location.
  • Shopify → Odoo always needs mapping rows. Shopify locations that are not mapped are ignored.

Click Refresh to load locations you added recently in Shopify or Odoo. If you see "Do not see locations? Click on refresh.", the list may be out of date. (+) Add is greyed out when every location is already used.

When saving, every row needs both sides filled in. Empty fields show Required. With no rows at all you see "Please add locations."

Good to know

If you use multi-company in Configuration, the Odoo location list also shows the internal locations of your mapped companies.

Skip location mapping (Odoo → Shopify only):

  • The app writes stock only to your default Shopify location. It uses the product's total stock in Odoo (all locations of your configured company).
  • The mapping table is hidden.
  • "Note: Skipping the mapping may affect fulfilment from Shopify to Odoo only." Order fulfilment also falls back to the default location.

Category and collection filter

Setting Direction What it does
Sync Inventory by Category Odoo → Shopify Syncs stock only for products in the Odoo categories you pick. Sub-categories are included.
Sync Inventory by Collection Shopify → Odoo Syncs stock only for products in the Shopify collections you pick.
  • Leave the filter off to sync all products.
  • When the filter is on, pick at least one category or collection. Otherwise saving shows "Please select at least one category or disable the option."
  • Category lists show the full path, for example "Parent / Child". If your Odoo has eCommerce categories, they show "(Website)" and product categories show "(General)".
  • Click Refresh to load new categories or collections.
  • The filter applies to scheduled and manual syncs. It is not applied to real-time updates.

How often it runs

  • Scheduled sync: at the frequency you picked, in UTC, except between 00:00 and 00:30 UTC.
  • Real time: a few seconds after a change, when the real-time option is on. No scheduled runs while real time is on.
  • Manual: whenever you click Process Inventory Sync.

Odoo → Shopify sends the current quantity of every matched product on each run, not only the ones that changed.

Shopify → Odoo scheduled runs only look at stock that changed in Shopify since the last run (with a one-hour overlap). Manual runs look at everything. In Odoo, only quantities that differ are changed.

Only one inventory sync runs at a time for a store. If a run is still busy when the next one is due, the next one is skipped.

Process Inventory Sync

  1. 1
    Click Process Inventory Sync at the top of Inventory Settings.
  2. 2
    In Confirm Inventory Sync, choose the scope:
    • All: sync every product.
    • Date range: sync only records updated between the dates you pick. Use Today, Yesterday, Last 7 days, Last 30 days, Last 90 days, or the calendar. Dates are full days in your own time zone.
  3. 3
    Click Confirm.

For Odoo → Shopify, the date range uses the date the product's stock last changed in Odoo. For Shopify → Odoo, it uses the date the inventory level last changed in Shopify. Confirm stays greyed out until you pick both a start and an end date.

A manual sync always reloads the latest product list from Shopify, so it also picks up new products and changed SKUs.

Progress card

While a sync runs, an Inventory Sync card shows at the top of the page:

  • Status: Starting, In progress, Stopping…, Completed, Failed or Stopped.
  • A progress bar with "X of Y processed", plus failed and skipped counts. For Odoo → Shopify, each product-and-location pair counts as one item.
  • Steps such as "Fetching inventory data from Shopify (bulk operation)…" and "Updating inventory on Shopify…".
  • Stop ends the run. Updates already sent are not undone.
  • Dismiss hides a finished card. If it failed, Error details says why.

What is synced / not synced

Synced:

  • Stock quantity per location (or for the default location with Skip location mapping).
  • Odoo incoming quantity to Shopify Incoming, if you tick that option.

Not synced:

  • Products that are not matched by SKU, barcode or variant ID.
  • Shopify products with Track quantity off. The app never turns tracking on.
  • Archived Shopify products, and archived (inactive) Odoo products.
  • Odoo service products.
  • Odoo products that belong to another company.
  • Products that are not stocked at the mapped Shopify location.
  • Products outside your category or collection filter.
  • Products with zero stock, when Do not sync zero stock is ticked.

Limits

  • Quantities sent to Shopify are whole numbers. Negative Odoo stock is sent as 0.
  • Up to 100 Shopify locations per product are read.
  • Large catalogs are sent in batches with automatic rate limiting. A very large Odoo → Shopify sync can take a long time.
  • If Odoo cannot be reached, the sync stops and nothing is changed in Shopify. No zeros are pushed. The next run tries again.
  • Odoo kit products need Calculate kit stock from components, and their stock is updated by the scheduled sync only. See Kit products.

Good to know

  • Shopify → Odoo writes stock as an inventory adjustment in Odoo, at the exact Odoo location you mapped. Odoo products need to be storable (Track Inventory on).
  • After an order or refund syncs to Odoo and changes its stock, the app re-checks the stock 30 seconds later so a sale is not counted twice.
  • With Odoo → Shopify real time, the app re-sends Odoo's stock after a Shopify fulfilment, so Shopify's own deduction does not leave the numbers out of step.
  • Scheduled Odoo → Shopify syncs may use a saved copy of your Shopify product list. If you just added products in Shopify or changed SKUs, run Process Inventory Sync once.
  • Results and errors of each run appear on the Logs page.

Troubleshooting

?
Stock in Shopify does not match Odoo.
  • Check which quantity you send (Quantity Available, Quantity On Hand or Quantity Forecasted). Also check the Shopify Target Type: it decides whether Shopify's Available or On hand field receives the number.
  • If Combine Odoo available + Shopify committed is on, Shopify's On hand includes units committed to open orders. It will be higher than Odoo's available.
  • If Sync Odoo Incoming Qty To Shopify Incoming Qty is on, the incoming number is shown separately in Shopify.
  • Check the location mapping. A Shopify location shows the sum of all Odoo locations in its row, including their sub-locations.
  • Check for duplicate SKUs or barcodes on the Logs page (tabs Duplicate SKUs - Shopify and Duplicate SKUs - Odoo). With duplicates in Odoo, only one product is used.
  • If Do not sync zero stock is ticked, products that sold out in Odoo keep their old number in Shopify.
?
A product's stock never updates.
  • In Shopify, check that Track quantity is on for the product.
  • Check that the product is stocked at the mapped Shopify location (Shopify admin, product, Inventory).
  • Check that the SKU or barcode is the same on both sides and is not empty.
  • Check that the Odoo product is active, is not a service, and belongs to your configured company.
  • Shopify → Odoo: stock is counted in the company of the mapped Odoo location. If Odoo still answers "company inconsistencies", the product, the location and the product's Inventory adjustment location must belong to the same company. A product of one company can't get stock in another company's location.
  • Check your category or collection filter.
  • If the product is new in Shopify, run Process Inventory Sync once.
?
I see "Please enable Stock Sync or inventory location mapping to process inventory".
  • Turn on Enable Stock Sync & Set Auto Sync Frequency, add at least one location mapping row (or tick Skip location mapping), and click Save.
?
I see "An inventory sync is already running for this store".
  • Another run is still busy, often the scheduled one. Its card shows at the top of the page. Wait for it to finish, or click Stop on the card and start again.
?
I see "Inventory sync failed: your Odoo server could not be reached".
  • Check that Odoo is online and that the Odoo URL in Configuration is correct. Then run the sync again. Nothing was changed in Shopify.
?
I see "none of your Shopify products have Track quantity enabled".
  • In Shopify admin, go to Products, select the products, choose Bulk edit and turn on Track quantity. Then run the sync again.
?
I see "none of your Shopify SKUs matched an active product in Odoo".
  • Check that the same SKU (or barcode) exists on active Odoo products. Also check your category filter and Do not sync zero stock.
?
I see "no Odoo stock was updated between …".
  • No stock changed in Odoo in the date range you picked. Pick a wider range, or choose All.
?
Real-time sync does not update Shopify.
  • For Odoo → Shopify, the Odoo automation rule must be set up. Contact support to set it up or check it.
  • Check that the direction is Odoo → Shopify and that real time is ticked and saved.
  • Stock moves in locations outside a warehouse, or in another company, are ignored.
?
Real-time sync does not update Odoo.
  • Check that the direction is Shopify → Odoo, Real-time sync using Shopify webhooks is ticked, and stock sync is on.
  • Check that the Shopify location is in a mapping row.
?
I don't see a location in the list.
  • Click Refresh next to (+) Add. If it is still missing, check that it is an internal Odoo location of your company, or an active Shopify location.
05Orders & people

Order sync

31 min read

Order sync creates an Odoo sales order for each Shopify order, and can add the invoice, the payment and refund credit notes. It also brings delivery, payment, cancel and refund status from Odoo back to Shopify. You set it up on the Order Settings page. The detailed rules (which orders, taxes, discounts, shipping, customers, warehouse) are on Additional order settings.

What it does

With order sync on (direction Shopify → Odoo), each new Shopify order becomes an Odoo sales order with:

  • the customer (found in Odoo or created), with delivery and invoice addresses,
  • one line per product, plus lines for shipping, discounts, and (if you choose) taxes, tariffs and tips,
  • the warehouse, pricelist, sales team, carrier and tags you set in Additional order settings.

On top of that, if you turn them on:

  • an invoice (Export Invoice), marked paid or in payment, with a payment record,
  • credit notes for Shopify refunds,
  • updates to the order when it is edited in Shopify,
  • fulfillment, payment, cancel and refund status sent back from Odoo to Shopify.

You can also turn the flow around (Odoo → Shopify) so that confirmed Odoo sales orders create Shopify orders. See Odoo → Shopify orders.

Before you start

  • Connect Odoo and finish Configuration first (company, product matching by SKU or barcode, and the Odoo user the app signs in with).
  • Make sure your products exist in Odoo with the same SKU or barcode as in Shopify, or let the app create them (see Disable new product creation on Odoo with order sync in Additional order settings).
  • To create invoices, your Odoo database needs the Invoicing (Accounting) app and at least one sales journal. For deliveries and fulfillment sync, it needs the Inventory app.
  • Set Start Date for Order Sync in Additional Order Settings. Orders created before that date are never sent.
Bulk Sync Notice

For best results, sync up to 300 orders per bulk update at a time. Syncing more at once can overload the Odoo API and cause failures. There is no limit on how many orders sync per day — this applies only to bulk actions.

How to set it up

  1. 1
    In the app, open Order Settings.
  2. 2
    Under Order Sync Direction, keep Shopify → Odoo (the default).
  3. 3
    Turn on Enable Order Sync.
  4. 4
    Choose your numbering options (see Order numbering).
  5. 5
    Turn on Export Invoice if you want invoices, then pick the Select Sale Invoice Journal and when invoices are created.
  6. 6
    Turn on Mark Invoice as Paid / In Payment if invoices should be marked paid, and set up payments.
  7. 7
    Turn on Enable Refund Order Sync (or Enable Restock On Odoo for Refund Order Sync).
  8. 8
    Turn on Order Status Sync and choose how each status comes back from Odoo.
  9. 9
    Turn on Enable Comprehensive Order Editing if Shopify edits should update Odoo.
  10. 10
    Click Save.
  11. 11
    Click Go to Additional Order Settings and finish the detailed rules there.
Important

Click Save on Order Settings before you go to Additional Order Settings, especially after turning on Enable Order Sync. Unsaved changes are lost when you leave.

Order sync direction

Order Sync Direction decides which way orders flow. Only one direction is active at a time.

Option What it does
Shopify → Odoo Default. Each Shopify order creates an Odoo sales order.
Odoo → Shopify Each confirmed Odoo sales order creates a Shopify order.

When you change the direction, the app asks you to confirm (Confirm Sync Direction Change). The other direction stops, but its settings are kept and come back if you switch again. Click Save to apply the change.

The page title shows the active direction. Each direction shows only its own settings.

Enable order sync

Enable Order Sync is the main switch for order sync in both directions.

  • Turning it on in Shopify → Odoo shows two numbering options below it.
  • Turning it off switches off every order option on the page (invoices, payments, refunds, status sync, order editing, POS). The direction and the sale invoice journal are kept.
  • Additional Order Settings can only be changed while it is on.

Invoice sync only

Enable Invoice Sync Only sends Shopify orders to Odoo as customer invoices only. No sales order is created.

  • It cannot be on together with Enable Order Sync. Turning one on turns the other off.
  • Export Invoice is switched on for you and cannot be turned off in this mode.
  • You can still choose when invoices are created, mark them paid, create payments, and sync refunds as credit notes against the invoice.
  • Order numbering, status sync, order editing and POS options are switched off.
Important

No sales order is created in Odoo. Stock is not reduced, no deliveries are created, and these orders do not show in Odoo Sales reports. Refunds still sync as credit notes against the invoice.

On the dashboard these orders show Success with an Invoice only badge. An order that is waiting for your invoice rule (for example, until it is paid) is not sent until it matches.

Order numbering

These checkboxes appear under Enable Order Sync (Shopify → Odoo).

Setting What it does
Set Odoo order number same as Shopify order number. The Odoo sales order gets the Shopify order name (for example #1001) instead of Odoo's own number (S00042).
Remove shopify order prefix or suffix when syncing to Odoo Strips the prefix or suffix you set in Shopify (for example # or -EU), so only the number is used. Only available when the option above is ticked.

When numbering is off, Odoo names the order itself and the Shopify order name is kept on the order as its reference.

Which orders sync

A Shopify order is sent to Odoo when all of these are true:

  • Enable Order Sync (or Enable Invoice Sync Only) is on and saved.
  • The order was created on or after Start Date for Order Sync.
  • It matches Sync Orders By Status: All Orders, Only Paid Orders, Only Fulfilled Orders, or Paid & Fulfilled Only.
  • If you chose tags in Sync Orders by Specific Shopify Tags, the order has at least one of them.

An order that does not match yet is checked again each time Shopify sends an update for it. So an unpaid order syncs as soon as it is paid, if you chose Only Paid Orders.

Orders that never reached the app are listed in the dashboard's Skipped tab (last 60 days, never before your start date), with a reason:

Reason Meaning
Order status filter The order does not match Sync Orders By Status.
Tag filter The order has none of the tags in Sync Orders by Specific Shopify Tags.
Cancelled in Shopify The order was cancelled. It has no Sync now button.
Not received No rule explains it. The order's notice from Shopify never arrived, or order sync was off at the time.

Click Sync now on a row to send that order to Odoo right away. Sync now sends the order even if it does not match your rules.

Invoices

Turn on Export Invoice to create an invoice in Odoo for Shopify orders. The invoice is confirmed (posted) in Odoo.

Select Sale Invoice Journal

Pick the Odoo sales journal your invoices are created in. Only sales journals are listed, because Odoo rejects an invoice on a bank or cash journal. Click Refresh if a journal you just created is missing. A journal is required to save when Odoo returns journals.

If your setup uses several Odoo companies (multi-company in Configuration), you see a table instead: pick an Odoo Company and its Sale Invoice Journal in each row. Use Add Mapping for more rows and the bin icon to delete one. Companies without a row use the journal of your main company. If the table shows "Couldn't load companies and journals from Odoo", check the Odoo connection in Configuration and click Refresh.

Map sale journals by order tag or payment method

Tick Map sale journals by order tag or payment method to use a different sales journal for some orders (for example "Wholesale" → Wholesale Sales journal, PayPal → PayPal Sales journal).

  1. 1
    Next to Map by:, choose Order tags or Payment methods.
  2. 2
    Click Add Mapping.
  3. 3
    Enter the Shopify Order Tags (type a tag and press Enter) or pick the Shopify Payment Method, then pick the Sale Invoice Journal.
  4. 4
    Click Refresh to load your store's tags or payment methods and the Odoo journals.
  5. 5
    Click Save.

Rules:

  • If an order has tags from more than one row, the first of those rows is used.
  • Orders that match no row use the Select Sale Invoice Journal above.
  • A tag or payment method can be mapped once (once per company in a multi-company setup).
  • Credit notes for refunds use the journal of the invoice they reverse.
  • Payment methods come from your orders of the last 60 days. If none are found, place a test order with that payment method, then click Refresh.
  • Both lists (by tag and by payment method) are kept. Switching Map by: back restores the other list.

When invoices are created

Option What it does
Create Invoice for All Orders Default. The invoice is created right after the sales order.
Create Invoice for Paid Orders Only The invoice is created when the Shopify order is Paid.
Create Invoice for Fulfilled Orders Only The invoice is created once the Shopify order has a fulfillment.

An order that does not qualify yet syncs without an invoice. The invoice is added when a later Shopify update shows the order paid or fulfilled. Until then the dashboard shows Invoice pending.

Draft orders cannot be invoiced

If Odoo Order Creation State in Additional Order Settings is Draft (Quotation), the page shows Invoices will not be created while orders sync as drafts. Switch to Confirmed (Sale Order), or invoice those orders in Odoo yourself.

Mark invoice paid or in payment

Mark Invoice as Paid / In Payment sets the payment status of the invoice in Odoo. It needs Export Invoice.

Choose one option:

Option What it does
Mark Invoice as Paid On Odoo for All Orders Every invoice is marked paid.
Mark Invoice as Paid On Odoo for Shopify's Paid Orders Only Only invoices of orders that are paid (or partly paid) in Shopify.
Mark Invoice as In Payment On Odoo All Orders Every invoice is set to In Payment (status only, no payment record).
Mark Invoice as In Payment On Odoo for Shopify's Paid Orders Only Only invoices of orders that are paid (or partly paid) in Shopify.
  • "Paid" without payment creation only changes the status of the invoice. Turn on Activate Payment Creation to create a real payment and reconcile it with the invoice.
  • "In Payment" only changes the status. No payment is created, even with Activate Payment Creation ticked. The page shows a warning when you combine the two. To create payments, pick one of the Mark Invoice as Paid options.
  • If an order is unpaid when it syncs, the invoice is marked when Shopify later reports it paid.
  • If Odoo refuses the update (for example, a missing payment journal), the order is not marked paid in the app, so it is tried again on the next Shopify update once you fix the cause.
  • While this is on, Payment status (Odoo → Shopify) is hidden, and Update Existing Invoice for order edits is not available.

Payments

Tick Activate Payment Creation (under Mark Invoice as Paid / In Payment) to create a payment in Odoo and reconcile it with the invoice. Reconciliation depends on your Odoo setup: journal accounts, payment methods and reconciliation rules.

Which journal gets the payment:

  1. 1
    If Map Shopify payment methods to payment journals is ticked and the order's payment method has a row, that journal is used.
  2. 2
    Otherwise, in a multi-company setup with Enable Company-wise Journal Mapping, the journal mapped to the order's company.
  3. 3
    Otherwise, the journal in Select journal (Odoo Journal).
Setting What it does
Select journal The bank or cash journal for payments. Required when payment creation is on. Click Refresh if a new journal is missing.
Enable Company-wise Journal Mapping Multi-company only. A table of Odoo Company → Payment Journal. Needs at least one row.
Map Shopify payment methods to payment journals A table of Shopify Payment Method → Payment Journal (for example Cash on Delivery → courier wallet). Methods without a row use the journal above. Shopify does not list payment methods directly, so the choices come from your recent orders.
Important

Always pick a payment journal. Without one, Odoo may put the payment in any bank journal.

In a multi-company setup each journal shows its company in brackets, and a payment method can be mapped once per company.

One payment per Shopify transaction

By default, one payment covers the whole invoice, in one journal. If an order is paid in more than one way, for example with a gift card and a card, tick Create one payment per Shopify transaction. It is under Activate Payment Creation.

With it on:

  • Each successful Shopify payment on the order becomes its own payment in Odoo, with its own amount. A gift card of 80.00 plus 16.39 by card gives two payments.
  • Each payment goes to the journal mapped to its payment method in Map Shopify payment methods to payment journals. Payment methods without a row use the payment journal above. Tick the mapping too, otherwise every payment lands in the same journal.
  • Each payment is reconciled with the invoice. The memo shows the invoice, the payment method and the Shopify transaction ID.
  • Declined attempts and authorizations that were never captured are skipped.
  • If Shopify has not received the full amount yet, the invoice stays partly paid. The rest is added when Shopify receives it, for example when a pending payment is captured.
  • A payment is never booked twice. If one payment fails, the others stay, and the next order update adds only the missing one.
  • An order without any successful Shopify payment (for example cash on delivery under Mark Invoice as Paid On Odoo for All Orders) still gets one payment for the whole invoice.
  • Refunds go back the same way. See Refunds.

To clear a gift card or a payment provider's clearing account, set up a journal for it in Odoo:

  1. 1
    Create a Bank journal, for example "Gift cards".
  2. 2
    On its incoming and outgoing payment methods, set the Outstanding Receipts and Outstanding Payments account to your gift card liability account, or to the clearing account of your payment provider.
  3. 3
    In the app, map the Shopify payment method (for example gift_card, shopify_payments or paypal) to that journal.
Important

Without an outstanding account on the payment method, Odoo 18 and later create the payment without a journal entry. Then it can't be reconciled with the invoice. The app writes this to Logs with the journal's name.

Selling gift cards is not a payment. The account a sold gift card is booked to comes from the gift card product's income account in Odoo.

Refunds

Two refund options exist. Which one you see depends on Export Invoice.

Setting Shown when What it does
Enable Refund Order Sync Export Invoice is on Each Shopify refund creates a credit note in Odoo against the order's invoice.
Enable Restock On Odoo for Refund Order Sync Export Invoice is off Refunded items that you restock in Shopify are put back into Odoo stock. No credit note is created.

How refund sync works:

  • It starts when you create a refund in Shopify.
  • The credit note covers the refunded items and refunded shipping, for full and partial refunds.
  • A refund made in Shopify for an amount only, without picking items, is added to the credit note as one line without a product. If every priced line of the invoice has the same tax and that tax is included in the price, the line gets that tax, so the VAT is reversed as on the invoice. Otherwise Odoo uses the default tax of the sales account.
  • If Restock was ticked in Shopify, the return in Odoo is created only after both the Shopify return and the refund are completed. Validate that return in Odoo to put the items back in stock.
  • Each Shopify refund is sent once, even if Shopify sends it twice.
  • The app will not create a credit note against an invoice that belongs to a different order.
  • With Create one payment per Shopify transaction on, each posted credit note also gets one refund payment for each Shopify refund transaction, in the journal of its payment method, and is reconciled with it. A refund to a gift card goes back to the gift card journal. A refund that returns no money through Shopify leaves the credit note open.
  • A failed refund is listed in Logs with the reason.
Good to know

Turning Export Invoice off or on resets both refund options. Check them again after changing Export Invoice.

Order status sync

Order Status Sync keeps the status of orders aligned between Shopify and Odoo, in both directions. It works for orders that exist in both systems, whichever way they were created. It is not available in Enable Invoice Sync Only mode.

Odoo → Shopify

Each status has its own mode:

Setting Modes What it does
Fulfillment status (Odoo → Shopify) Off, Hourly (cron), Real-time (webhook) A validated (done) delivery in Odoo fulfills the Shopify order, with tracking number, carrier and tracking link.
Payment status (Odoo → Shopify) Off, Hourly (cron), Real-time (webhook) A paid Odoo invoice marks the Shopify order paid.
Cancel status (Odoo → Shopify) Off, Hourly (cron), Real-time (webhook) A cancelled Odoo sales order cancels the Shopify order.
Refund status (Odoo → Shopify) Off, Hourly (cron) An Odoo credit note creates a refund on the Shopify order. Full and partial refunds. No real-time mode.

Good to know:

  • Payment status needs Export Invoice in the Shopify → Odoo direction, because that is what creates the Odoo invoice. If you create invoices in Odoo yourself, tick Use invoices created in Odoo instead (see below). It is hidden while Mark Invoice as Paid / In Payment is on.
  • Real-time (webhook) only works once the webhook is set up in your Odoo. Until then, nothing is sent, and the hourly check does not run for payment or cancel status either. If you are not sure the webhook is set up, choose Hourly (cron).
  • Partial deliveries create partial fulfillments in Shopify.
  • To ship an order again after a return: cancel the fulfillment in Shopify, validate the return in Odoo, then validate the new delivery. The new delivery fulfills the order in Shopify again, also when the first fulfillment was created by the app. A validated return lowers the delivered quantity and never fulfills the order by itself.
  • Shopify emails the customer about the fulfillment only for orders from the last 14 days, so a catch-up of old orders never mass-emails customers.
  • The hourly fulfillment check also runs for stores on Real-time (webhook), as a safety net for a webhook Odoo did not send.

Tracking numbers and carrier names

The tracking number, carrier and tracking link come from the validated delivery in Odoo (Tracking Reference and Carrier).

  • Several parcels: when the Tracking Reference holds several numbers separated by commas, each number is added to the Shopify fulfillment on its own, with its own tracking link.
  • Tracking link: if Odoo has a tracking link for the delivery (set Tracking Link on the carrier in Odoo), that link is used. If not, Shopify creates the link itself, but only for carrier names it knows, such as DPD Germany, DHL Express or UPS.

If your Odoo carriers have their own names (for example "DPD Deutschland - Express"), Shopify shows the number without a link. Map them to Shopify carrier names:

  1. 1
    Set Fulfillment status (Odoo → Shopify) to Hourly (cron) or Real-time (webhook).
  2. 2
    Tick Map Odoo carriers to Shopify carriers. The mapping table opens with one empty row. Click Add Mapping for more rows.
  3. 3
    In Odoo Carrier, type the carrier name exactly as it appears in Odoo. Capital letters don't matter.
  4. 4
    In Shopify Carrier, type the Shopify carrier name, for example DPD Germany.
  5. 5
    Click Save.

Carriers without a row are sent with their Odoo name, as before. Untick the box to stop using the mapping; your rows are kept. The mapping applies to new fulfillments and tracking updates. Fulfillments already in Shopify are not changed.

Use invoices created in Odoo

For stores that sync orders Shopify → Odoo, keep Export Invoice off, and create the invoices in Odoo themselves. Turning on Export Invoice would add a second invoice next to yours.

  1. 1
    Set Payment status (Odoo → Shopify) to Hourly (cron) or Real-time (webhook).
  2. 2
    Tick Use invoices created in Odoo. It shows only while Export Invoice is off.
  3. 3
    Pick a date in Only orders placed on or after. It starts as today.
  4. 4
    Click Save.

When the invoice of an Odoo sales order is paid, the Shopify order is marked paid. The app finds the sales order by its Customer Reference, which holds the Shopify order name (for example #1001). Orders placed before the date you picked are left as they are, even if their invoice is paid.

Real-time (webhook) mode

When you choose Real-time (webhook) for any status, the page shows Real-time (webhook) setup. Real-time updates need a webhook set up in your Odoo, which depends on your Odoo version (usually Odoo 18 and above). Use Schedule a call to have our team set it up with you.

If Odoo cannot be reached when a delivery webhook arrives, the app retries the fulfillment automatically (up to 6 times, with growing delays). The fulfillment and tracking then appear in Shopify a few minutes later. You do not need to do anything.

Shopify → Odoo

The two checkboxes depend on the direction:

Direction Setting What it does
Shopify → Odoo Disable Order Fulfillment Sync from (Shopify → Odoo) Ticked: fulfilling an order in Shopify does not update Odoo. Unticked (default): the Odoo delivery is validated when the order is fulfilled in Shopify.
Shopify → Odoo Disable Order Cancel Status Sync from (Shopify → Odoo) Ticked: cancelling in Shopify does not update Odoo. Unticked (default): the Odoo sales order is cancelled.
Odoo → Shopify Enable Order Fulfillment Sync from (Shopify → Odoo) Off by default. Ticked: fulfilling in Shopify validates the matching Odoo delivery (useful when a 3PL fulfills in Shopify). Fulfillments the app created itself are ignored, so it cannot loop.
Odoo → Shopify Enable Order Cancel Status Sync from (Shopify → Odoo) On by default. Ticked: cancelling in Shopify cancels the Odoo sales order.
Both Deliver kit components when a kit is fulfilled in Shopify Off by default. For Odoo kit products, a Shopify fulfilment fills in and validates the component lines of the Odoo delivery. See Kit products.

When a Shopify fulfillment validates an Odoo delivery, each product is taken from the locations and lots Odoo reserved for it on that delivery. If Shopify fulfilled more than Odoo could reserve, the extra quantity comes from the first reserved location, which can then go below zero.

Sync order status manually

Click Sync Order Status From Odoo → Shopify at the top of Order Settings to run the Odoo → Shopify status sync now. It needs Order Status Sync on and at least one of fulfillment, payment, cancel or refund set to Hourly or Real-time. Otherwise the button is greyed out.

Cancellations

  • Cancelled in Shopify: the Odoo sales order is cancelled, unless you ticked Disable Order Cancel Status Sync from (Shopify → Odoo). If the order is still on its way to Odoo, the cancel is retried once it arrives. Odoo can refuse to cancel an order whose delivery is done or whose invoice is paid. The reason is shown in Logs.
  • Cancelled in Odoo: the Shopify order is cancelled when Cancel status (Odoo → Shopify) is set to Hourly (cron) or Real-time (webhook).
  • A Shopify order that was cancelled before it ever reached the app shows in the Skipped tab as Cancelled in Shopify, without a Sync now button.

Order editing

Turn on Enable Comprehensive Order Editing to send changes made to a Shopify order after it synced: quantities, added and removed items, discounts, shipping, tags and notes.

Setting What it does
Draft (Quotation) Orders in this Odoo state are updated. On by default.
Sale (Confirmed) Confirmed orders are also updated.
Skip Invoice Updates Default. The invoice is left as it is.
Update Existing Invoice The invoice lines are rebuilt to match the edited order. Not shown while Mark Invoice as Paid / In Payment is on.

Good to know:

  • Only unfulfilled or partly fulfilled orders are updated. Fully fulfilled orders are left alone.
  • Orders in an Odoo state you did not tick are not updated.
  • Updating a confirmed order means Odoo cancels it, sets it back to quotation and confirms it again. That cancels and recreates its delivery, changes the order date and can send the confirmation email again. Only tick Sale (Confirmed) if that is fine for you.
  • If the Odoo order already has a validated delivery, it is not cancelled. Added items and higher quantities are added to the order, and Odoo creates a new delivery for them. Removed items, lower quantities and price changes are left for you: the Logs tab lists them ("The Odoo order is already delivered, so these changes were not applied: …"), so you can make the return or correction in Odoo. A discount for an item that was not added or removed in Odoo is left as it is too.
  • Update Existing Invoice works only on an invoice that is posted (or draft) and not yet paid or in payment ("Invoices can only be updated if they are in "Posted" state and not yet paid or in-payment.").
  • After you edit an order, wait at least 2 minutes before editing it again.
  • Your Odoo must allow order edits (for example, no locked confirmed orders).

Shopify POS orders

Sync Confirmed Shopify POS Orders to Odoo creates confirmed Shopify Point of Sale orders as paid POS orders in Odoo on the mapped register, instead of sales orders. Online and other orders keep syncing as sales orders. It needs the Odoo Point of Sale app.

  1. 1
    Turn on Sync Confirmed Shopify POS Orders to Odoo.
  2. 2
    Under Map Shopify Locations to Odoo POS Configuration, pick one or more Shopify Locations and the Odoo POS Configuration (register) for them.
  3. 3
    Click Add Mapping for more rows, or Refresh to reload locations and registers.
  4. 4
    Click Save.

Rules:

  • Each location and each register can be mapped once. You need at least one row.
  • Orders open or reuse a session on the mapped register.
  • POS orders from a location without a mapping fail to sync.
  • Payment methods are matched by name to the payment methods of the mapped register.

Odoo → Shopify orders

With Order Sync Direction set to Odoo → Shopify and Enable Order Sync on, each confirmed Odoo sales order creates a Shopify order. New Odoo orders are picked up every 5 minutes.

Setting What it does
Set Shopify order number same as Odoo order number. Names the Shopify order after the Odoo order (for example S00123) instead of Shopify's own number (#1001). Leave off if shipping apps, accounting exports or reports rely on Shopify numbering. The Odoo reference is kept on the order either way.
Create orders in Shopify as Order (confirmed) creates a real Shopify order with Odoo's totals and tax. Draft order creates a Shopify draft you review and invoice from Shopify. Shopify then recalculates tax from your store settings, so the total can differ, and the Odoo number and date are not carried over.
Mark payment status as Pending (default) or Paid. Paid also records a manual payment so Shopify's reports agree. Leave on Pending to let the payment status sync update it later. Not available for draft orders.
Mark fulfillment status as Unfulfilled (default) or Fulfilled. Fulfilled marks the order shipped with the tracking from the completed Odoo delivery. The customer is not emailed. Leave on Unfulfilled to let fulfillment status sync handle it, including partial deliveries. Not available for draft orders.

More options for this direction (order states, start date, tags, product creation) are in Additional order settings.

To bring in Odoo orders now:

  1. 1
    Click Sync Orders From Odoo → Shopify at the top of Order Settings.
  2. 2
    In Sync Orders From Odoo, pick the dates the Odoo orders were created on (for example Today or Last 7 days).
  3. 3
    Click Start Sync.

Confirmed Odoo orders in that range that are not in Shopify yet are created. Orders already synced are skipped, so running it twice is safe.

  • The sync works through every order in the range, oldest first. An order it can't create (for example, a product Shopify doesn't have) is logged with the reason and the sync moves on.
  • One run creates up to 300 orders. If there are more, the log says it stopped at the limit. Run it again for the same range to continue.
  • A range can cover up to 90 days. If you pick a longer one, only the last 90 days are synced, and the log says so.
Important

Orders created in Shopify from Odoo cannot be resynced the other way from the dashboard. If you delete such an order from the app's dashboard and it syncs from Odoo again, a duplicate Shopify order is created.

How often it runs

What When
New Shopify orders to Odoo Right away, when Shopify sends the order (usually within seconds; updates that arrive close together are combined).
Shopify edits, payments, fulfillments, cancels Right away, when Shopify sends the update.
Shopify refunds Right away, when the refund is created.
Missed orders check Once a day, the app looks for yesterday's and today's Shopify orders that never arrived and syncs them with your normal rules.
Short Odoo outages Orders that failed because Odoo was briefly unreachable or busy are retried automatically, a few times with growing delays.
Odoo → Shopify fulfillment Hourly (at about 15 minutes past the hour), or real time with a webhook.
Odoo → Shopify payment and cancel Hourly, or real time with a webhook.
Odoo → Shopify refunds Hourly.
New Odoo orders to Shopify (Odoo → Shopify direction) Every 5 minutes.

What is synced / not synced

Synced from Shopify to Odoo:

  • Customer, delivery address and invoice address
  • Products, quantities and prices
  • Discounts, shipping, and (if set) taxes, tariffs and tips as lines
  • Order tags, payment method, warehouse, pricelist, sales team and carrier (per your settings)
  • Invoice, payment status and payment
  • Refunds (as credit notes) and restocks
  • Edits, fulfillments and cancellations

Synced from Odoo to Shopify:

  • Fulfillment with tracking, payment status, cancellation and refunds

Not synced:

  • Orders created before Start Date for Order Sync (use Sync now or Resync for single orders)
  • Changes made in Odoo to order lines, prices or customers (Odoo does not push these back)
  • Edits of fully fulfilled orders, and edits of orders in an Odoo state you did not allow

Retry failed orders

Open the Dashboard. The orders table has the tabs All, Synced, Not Synced and Skipped.

Status Meaning
Success The order is in Odoo.
Invoice only Synced as an Odoo invoice only, no sales order (Invoice Sync Only).
Invoice pending The invoice will be created once the order matches your invoice rule (for example, when it is paid).
Syncing The order is being sent. The table refreshes on its own.
Failed The order did not sync. Hover the icon to read the error.

To retry:

  1. 1
    Fix the cause (for example, add the missing product or customer in Odoo).
  2. 2
    Click the Resync Order icon on the order.
  3. 3
    Or, in the Not Synced tab, tick several orders and click Resync N Orders.

Resync sends the order even if it does not match your sync rules. Export Orders downloads the current view as a CSV file with the error for each order.

Important

Delete Order removes the order from this app only. The Shopify order and the Odoo sales order stay. It also removes the link between them, so a later resync or edit of that order creates a duplicate sales order and delivery in Odoo. Delete the Odoo sales order first if you want it gone.

Good to know

  • Settings apply to orders synced after you save. Orders already in Odoo are not changed.
  • Option lists from Odoo (journals, registers) are kept for your browser session. Click Refresh next to a list after creating something new in Odoo.
  • Changing several toggles resets dependent options: turning off Export Invoice turns off Mark Invoice as Paid / In Payment and the refund options; turning off Order Status Sync resets every status option.

Troubleshooting

?
An order did not sync to Odoo.
  • Check Enable Order Sync is on and saved.
  • Open the dashboard's Skipped tab. The reason shows why (status filter, tag filter, cancelled, or not received). Click Sync now to send it.
  • Check the order date is on or after Start Date for Order Sync.
?
The order shows Failed on the dashboard.
  • Hover the alert icon to read the error, fix the cause in Odoo or in your settings, then click Resync Order.
  • A missing product: create it in Odoo with the same SKU or barcode, or untick Disable new product creation on Odoo with order sync.
  • A missing customer email for Map Orders to Single Odoo Customer: create that customer in Odoo with the exact email.
?
"Customer not found on odoo for the email id : …"
  • Map Orders to Single Odoo Customer is on, but no Odoo customer has that email. Create the customer in Odoo with exactly the email in Odoo Customer Email, or correct the email, then click Resync Order.
?
"Order currency … was not found in Odoo."
  • The order is in a currency that is not active in Odoo. Add and activate it in Odoo (Accounting → Configuration → Currencies), then click Resync Order. Or set Currency to Sync with Odoo to Shop Currency.
?
"The payment journal mapped for Shopify payment method … was not found in Odoo"
  • The journal in Map Shopify payment methods to payment journals was deleted or belongs to another company. The default payment journal was used instead. Pick a valid journal in that row and click Save.
?
Orders are stuck on Syncing.
  • Wait a few minutes. Orders that stay half-synced are picked up again automatically. If it does not clear, click Resync Order.
?
No invoice was created.
  • Check Export Invoice is on.
  • Check Odoo Order Creation State is Confirmed (Sale Order). Draft quotations are not invoiced.
  • With Create Invoice for Paid Orders Only or Create Invoice for Fulfilled Orders Only, the invoice waits until the order is paid or fulfilled (status Invoice pending).
?
The invoice is not marked paid.
  • Check the order is paid in Shopify if you chose one of the "Shopify's Paid Orders Only" options.
  • With Activate Payment Creation, check a payment journal is selected and that it has a payment method in Odoo.
  • With a Mark Invoice as In Payment option, no payment is created, even with Activate Payment Creation ticked. Pick a Mark Invoice as Paid option instead.
?
The payment landed in the wrong journal.
  • Check Map Shopify payment methods to payment journals and Select journal. A mapped payment method wins over the default journal.
?
The order is shipped in Odoo but not fulfilled in Shopify.
  • Check Fulfillment status (Odoo → Shopify) is Hourly (cron) or Real-time (webhook).
  • Check the delivery is validated (Done) in Odoo. Only done deliveries fulfill in Shopify.
  • The hourly sync runs at about 15 minutes past each hour. Or click Sync Order Status From Odoo → Shopify.
  • Shipping again after a return: the fulfillment must be cancelled in Shopify first, and the new delivery must be a new validated delivery in Odoo. A delivery that was already synced is not sent again.
  • If it is still unfulfilled after an hour, contact support with the order number.
?
A refund did not create a credit note.
  • Check Export Invoice and Enable Refund Order Sync are on.
  • Check the order has an invoice in Odoo. A credit note needs an invoice.
  • Check Logs for the reason.
?
Edits in Shopify do not reach Odoo.
  • Check Enable Comprehensive Order Editing is on.
  • Check the order's Odoo state is ticked (Draft (Quotation) or Sale (Confirmed)).
  • Fully fulfilled orders are not updated.
  • Wait 2 minutes between edits of the same order.
?
"Enable Order Status Sync and choose at least one Odoo → Shopify sync (fulfillment, payment, or cancel) before running manual sync."
  • Turn on Order Status Sync, set at least one status to Hourly (cron) or Real-time (webhook), click Save, then try again.
?
The page says a journal is required.
  • Pick a journal in Select Sale Invoice Journal (or Select journal for payments). Click Refresh if your journal is missing.
?
A duplicate sales order appeared in Odoo.
  • This usually happens after an order was deleted from the dashboard and then resynced or edited. Check Logs → Duplicate Orders – Odoo, cancel the extra sales order in Odoo, and avoid Delete Order for orders that are in Odoo.
06Orders & people

Additional order settings

21 min read

Additional Order Settings holds the detailed rules for order sync: which orders are sent, how they are created in Odoo, and how taxes, discounts, shipping, customers and warehouses are mapped. The main switches (turning order sync on, invoices, payments, refunds and status sync) are on Order Settings. See Order sync.

Before you start

  • Turn on Enable Order Sync on Order Settings and click Save there first. While order sync is off, this page shows the banner Order Sync is disabled, every field is greyed out, and Save is disabled. Use Go to Order Settings in the banner to switch it on.
  • The page follows the Order Sync Direction you chose on Order Settings. The page title shows Shopify → Odoo or Odoo → Shopify. Most cards only apply to Shopify → Odoo. See Odoo → Shopify settings.
  • Lists that come from Odoo (warehouses, pricelists, carriers, taxes, payment methods) are kept for your browser session so the page loads fast. If you just created something in Odoo and it is missing from a list, click the Refresh button next to that list.

How to set it up

  1. 1
    In the app, open Order Settings and make sure Enable Order Sync is on and saved.
  2. 2
    Click Go to Additional Order Settings at the bottom of Order Settings (or open Additional Order Settings from the app menu).
  3. 3
    Work through the cards from top to bottom: Order Sync Rules, Taxes, Order Tags, Products, Discounts & Pricing, Customer Mapping, and Warehouse, Delivery & Sales Team.
  4. 4
    Click Save at the bottom of the page, or Save in the bar that appears at the top when you change something. Discard in that bar undoes your unsaved changes.
Good to know

Changes apply to orders that sync after you save. Orders already in Odoo are not changed. To apply new rules to an order that already synced, you have to fix it in Odoo yourself.

Order sync rules

The Order Sync Rules card controls which Shopify orders sync, how they are created in Odoo, and how currency is handled.

Setting What it does
Odoo Order Creation State Confirmed (Sale Order) (default) creates a confirmed sales order. Draft (Quotation) creates a quotation that you confirm in Odoo yourself.
Sync Orders By Status Which Shopify orders are sent: All Orders (default), Only Paid Orders, Only Fulfilled Orders, or Paid & Fulfilled Only.
Start Date for Order Sync Only orders created on or after this date are sent. Older orders are ignored.
How to Sync Old Orders? A link next to the date that opens a short video on bringing in older orders.
Currency to Sync with Odoo Shop Currency (default) sends amounts in your store's currency. Customer Presentment Currency sends the amounts in the currency the customer paid in.
Draft orders are not invoiced

If you choose Draft (Quotation) while Export Invoice is on, the page shows Invoices will not be created while orders sync as drafts. Odoo cannot invoice a draft quotation, so the app does not create invoices for these orders. Switch to Confirmed (Sale Order), or create the invoices in Odoo yourself.

How the status rule works:

  • Only Paid Orders means the Shopify payment status is Paid. Partly paid, pending and authorized orders wait.
  • Only Fulfilled Orders means the whole order is fulfilled. Partly fulfilled orders wait.
  • An order that does not match yet is not lost. When it is paid or fulfilled later, Shopify sends an update and the order syncs then — as long as its creation date is on or after the Start Date for Order Sync.
  • Orders that never matched a rule show in the Skipped tab on the dashboard with the reason Order status filter or Tag filter. You can still send one with Sync now.

Taxes

The Taxes card decides how Shopify taxes reach Odoo: inside the price, as their own lines, or mapped to Odoo taxes. It has five options.

Setting What it does
Enable Fixed Tax Mapping Puts one fixed Odoo tax on every order line, instead of the tax Shopify charged. When on, pick the tax in Tax Type.
Tax Type The Odoo sales tax used by fixed tax mapping. Required when fixed tax mapping is on. Click Refresh if your tax is missing ("Do not see your Odoo tax? Click on refresh.").
Map Shopify Tax to Odoo Tax A table that maps each Shopify tax to an Odoo tax. Each order line gets the Odoo tax mapped to the Shopify tax on that line.
Sync Tax-Included Price For stores whose Shopify prices already include tax. Sends Shopify's gross price as-is.
Map Taxes to Product Line Item Posts each Shopify tax as its own service line on the Odoo order, instead of as a tax on the product lines.
Map Tariffs As Product Line Items Posts Shopify import duties (tariffs) as their own service lines.

Which tax options can be combined

The first four options are alternatives. Each one decides on its own what tax reaches the Odoo line, so using two of them would charge the tax twice or contradict each other.

  • While one of them is on, the others are greyed out. Turn the active one off first to choose another. Nothing you set up under the other options is deleted.
  • The one allowed pair is Map Shopify Tax to Odoo Tax together with Sync Tax-Included Price. In that case every mapped Odoo tax must be a tax that is included in the price.
  • Turning on Sync Tax-Included Price always turns off Map Taxes to Product Line Item.
  • If more than one option was already on from an older setup, the card shows More than one tax option is active. Orders keep syncing as before, but turn off the ones you do not need.
  • Map Tariffs As Product Line Items is separate and can be used with any of them.

When no tax option is on

The app takes the tax off each Shopify line and sends the net price. Odoo then works out the tax from the taxes set on the product (or your fiscal position), so the Odoo total should match Shopify when your Odoo taxes use the same rates.

Fixed tax mapping

  1. 1
    Tick Enable Fixed Tax Mapping.
  2. 2
    Choose the tax in Tax Type. Click Refresh if it is not in the list.
  3. 3
    Click Save.

Every product line on every synced order gets this one tax, whatever Shopify charged. Turning the option off also clears Tax Type.

Map Shopify Tax to Odoo Tax

  1. 1
    Tick Map Shopify Tax to Odoo Tax. A table with Shopify Tax, Country and Odoo Tax columns opens.
  2. 2
    Click Add for each tax you want to map.
  3. 3
    In Shopify Tax, pick the tax (for example "VAT 20%"). Leave Country on Any country. In Odoo Tax, pick the Odoo tax.
  4. 4
    Click Save.

Good to know:

  • Shopify has no list of tax rates, so the Shopify Tax choices are the taxes seen on your orders of the last 60 days. After adding a new tax in Shopify, place an order with it and click Refresh Tax Rates. That button also reloads the Odoo taxes.
  • A tax is matched on its name and rate. Each Shopify tax can be mapped only once per country.
  • Set Country only when the same Shopify tax is charged for several countries (EU OSS), with one row per country. See Map Shopify Tax to Odoo Tax.
  • Discount lines take the mapped tax of the lines they were taken off, when those lines all have the same mapped tax.
  • Lines with no matching row keep the tax the app would use without mapping.
  • Pick an Odoo tax with the same "included in price" setting as Shopify, otherwise the Odoo totals will not match.
  • With Sync Tax-Included Price also on, the card reminds you to map each Shopify tax to an Odoo tax marked "(tax included)". Save refuses a row whose Odoo tax is not included in the price.
  • Delete a row with the bin icon in the Action column.

Sync Tax-Included Price

Use this when your Shopify prices include tax. With it off, the app takes the tax out of each line and sends the net price, so Odoo adds its own tax back. With it on, Shopify's gross price is sent as-is, so the Odoo tax on the line must be a tax included in the price.

Map Taxes to Product Line Item

Each Shopify tax becomes its own service line on the Odoo order, one line per tax name and rate, covering product and shipping taxes. An order that only reports a total gets one "Total Tax" line. Use it when Odoo should record the tax as a fixed amount instead of recalculating it from a rate.

Map Tariffs As Product Line Items

Shopify import duties become their own service lines, one per HS code and country of origin (for example "Tariff (6109.10, IN)"). An order that only reports a total gets one "Total Tariff" line. Orders whose prices already include duties are skipped, so the duty is never charged twice.

Order tags

The Order Tags card sends Shopify order tags to Odoo and can limit syncing to certain tags.

Setting What it does
Sync Order Tags Copies the Shopify order tags onto the Odoo sales order as sales order tags.
Sync Orders by Specific Shopify Tags Only orders carrying at least one of the chosen tags are sent. Leave it empty to sync every order.

To choose tags:

  1. 1
    Click in Select or create order tags. The app loads your store's order tags the first time.
  2. 2
    Pick tags from Suggested Tags, or type a new tag and press Enter (or choose Create "your tag").
  3. 3
    Click Refresh to reload the tag list. Remove a tag with the x on it.
  4. 4
    Click Save.

Good to know:

  • Tags are matched without caring about upper or lower case.
  • The app reads the tags on the order when it arrives. If another app adds the tag a moment later, Shopify sends an update and the order syncs then.
  • Once an order is in Odoo, it keeps receiving its updates even if its tags change later.

Products, discounts and pricing

The Products, Discounts & Pricing card maps payment methods, discounts and shipping to Odoo products, and sets the pricelist behaviour.

Setting What it does
Sync Payment Method as Line Item Adds the Shopify payment method name as a note line on the Odoo order.
Map Shopify Payment Method to Odoo Payment Method A table that maps each Shopify payment method (gateway) to an Odoo payment method.
Default Discount Product Mapping The SKU (internal reference) of an Odoo discount service product. All discounts on the order are added up into one line with this product.
Map Discount to Product line item Puts each product's discount on its own line as a percentage, instead of a separate discount line.
Default Shipping Product Mapping The SKU of an Odoo shipping service product. Shipping charges become a separate line with this product.
Map Shopify Shipping Method to Odoo Shipping Product A table that maps each Shopify shipping method to its own Odoo shipping product SKU.
Disable new product creation on Odoo with order sync Stops the app from creating missing products in Odoo. The order fails instead.
Disable Pricelist Mapping (Let Odoo Decide) Skips pricelist mapping and lets Odoo use its own default pricelist for the customer.
Default Pricelist for Order Sync One Odoo pricelist used on every synced order.

Payment method mapping

  1. 1
    Tick Map Shopify Payment Method to Odoo Payment Method.
  2. 2
    Click Add Mapping.
  3. 3
    Pick a Shopify Payment Method and the Odoo Payment Method it should become.
  4. 4
    Click Save.

What it does:

  • The mapped method is set on the Odoo sales order (Invoicing → Payment Method).
  • When Export Invoice is on, the same method is set on the invoice.
  • When payment creation is on, the same method is used on the payment. This mapping does not need Mark Invoice as Paid / In Payment.
  • Unmapped methods are left blank, so Odoo uses its default.
  • Shopify does not list payment methods, so the choices come from your recent orders. If the list says No payment methods were found on your recent Shopify orders, wait until an order with that method has synced, then click Refresh. Refresh also reloads the Odoo payment methods.
  • Each Shopify payment method can be mapped once.

Discounts

Choose one of the two discount options, not both. While one is set, the other is greyed out.

  • Default Discount Product Mapping: enter the SKU of a discount service product in Odoo (for example DISC-001). All discounts on the order are summed into one line with that product, so the line total matches Shopify.
  • Map Discount to Product line item: each product line gets its own discount as a percentage. Use it when you want to see the discount on the product line itself.

When neither is set, each Shopify discount (by its title or code) becomes its own negative service line on the Odoo order, so the order total still matches Shopify.

Shipping

Choose one of the two shipping options, not both. While one is set, the other is greyed out.

  • Default Shipping Product Mapping: enter the SKU of a shipping service product in Odoo (for example SHIP-001). Every shipping charge becomes a separate line with that product.

  • Map Shopify Shipping Method to Odoo Shipping Product:

    1. Tick the option. A table with Shopify Shipping Method and Odoo Shipping Product SKU opens.
    2. Click Add Mapping, pick a shipping method, and type the Odoo product SKU.
    3. Click Refresh Shipping Methods if a method is missing from the list.
    4. Click Save.

    Each shipping method can be mapped only once. A shipping method with an exact name match wins; otherwise the row whose method name is the longest part of the Shopify shipping title is used. Methods with no row use Default Shipping Product Mapping.

When no shipping product is set at all, the app uses a service product named after the Shopify shipping code, and creates it in Odoo if it does not exist.

Products that are not in Odoo yet

By default, when an order line's product cannot be found in Odoo (by the SKU, barcode or variant ID matching you chose in Configuration), the app creates the product in Odoo so the order can sync. Tick Disable new product creation on Odoo with order sync to stop that. The order then fails with an error that names the product, and you can create or fix the product in Odoo and resync the order from the dashboard.

Pricelists

By default, the app sets a pricelist on each order from the customer's pricelist in Odoo or from the order currency.

  • Default Pricelist for Order Sync: choose one pricelist to use on every order. It overrides the automatic choice. Leave it empty to keep automatic mapping.
  • Disable Pricelist Mapping (Let Odoo Decide): the app sends no pricelist and Odoo uses the customer's default. While this is ticked, Default Pricelist for Order Sync is greyed out with the hint "Pricelist mapping is disabled, so Odoo decides the pricelist."

Customer mapping

The Customer Mapping card decides which Odoo customer an order is assigned to. Without any of these options, the app finds the customer in Odoo or creates a new contact.

Setting What it does
Create Customer as Company on Odoo When the Shopify address has a company name, the order is placed under that company in Odoo.
Map Orders to Single Odoo Customer Assigns orders to one existing Odoo customer, found by email.
Map Guest Orders Only / Map All Orders With single-customer mapping: map only orders that have no Shopify customer, or every order.
Odoo Customer Email The email of the Odoo customer to use. Required when single-customer mapping is on.
Map Default Customer Based on Order Tag A table of Order Tag → Customer Email. Orders with that tag go to that Odoo customer.
Map Shopify Shipping Address to Odoo Delivery Address With a mapped customer: adds the order's shipping address as a delivery contact under that customer.
Map Shopify Billing Address to Odoo Invoice Address With a mapped customer: adds the order's billing address as an invoice contact under that customer.

Create Customer as Company on Odoo

When the order's address carries a company name:

  • The company becomes the Odoo contact and the customer on the order.
  • The order's billing and shipping addresses become invoice and delivery contacts under the company, and are set on the order.
  • An Odoo contact with the same company name is reused, so no duplicate is created.
  • The company contact is never renamed after the shopper.

Map Orders to Single Odoo Customer

Use this for marketplaces, wholesale accounts, or when you do not want every shopper as an Odoo contact.

  1. 1
    Tick Map Orders to Single Odoo Customer.
  2. 2
    Choose Map Guest Orders Only (orders placed without a customer account) or Map All Orders.
  3. 3
    Enter the Odoo Customer Email. The customer must already exist in Odoo with this email.
  4. 4
    Click Save.

Map Default Customer Based on Order Tag

  1. 1
    Tick Map Default Customer Based on Order Tag.
  2. 2
    In each row, type the Order Tag and the Customer Email of the Odoo customer.
  3. 3
    Click Add for more rows. Delete a row with the bin icon.
  4. 4
    Click Save. Every row needs both a tag and an email, and you need at least one row.

If an order arrives without the tag yet (for example because another app adds it a moment later), the app waits briefly for the tag before it syncs the order.

Mapped Customer Addresses

This section appears when single-customer or tag mapping is on. The mapped customer itself is never changed. The two checkboxes only add child contacts under it, so the delivery and invoice addresses on the order are the shopper's:

  • Map Shopify Shipping Address to Odoo Delivery Address
  • Map Shopify Billing Address to Odoo Invoice Address

Warehouse, delivery and sales team

The Warehouse, Delivery & Sales Team card routes orders to the right warehouse, delivery carrier and sales team.

Setting What it does
Default Warehouse to Sync Order Delivery The Odoo warehouse that ships synced orders. The delivery is created from this warehouse. Click Refresh next to it to load a warehouse you just created in Odoo.
Map Odoo Warehouse Based on Order Tags A table of Shopify Order Tags → Odoo Warehouse. Orders with a mapped tag use that warehouse.
Sales Team Mapping The exact name of an Odoo sales team (for example "Shopify Sales Team"). It is set on every synced order, and the team leader becomes the salesperson. If no team has that name, the order syncs without one.
Map Shopify Shipping Method to Odoo Carrier A table of Shopify Shipping Method → Odoo Carrier. Sets the delivery carrier on the order.

Map Odoo Warehouse Based on Order Tags

  1. 1
    Tick Map Odoo Warehouse Based on Order Tags.
  2. 2
    Click Add. In Shopify Order Tags, pick one or more tags. In Odoo Warehouse, pick the warehouse.
  3. 3
    Click Refresh to reload tags and warehouses.
  4. 4
    Click Save.

Rules:

  • When an order has a mapped tag, that warehouse is used instead of the default.
  • If tags from several rows match, the first matching row wins.
  • If no tag matches, the default warehouse is used.
  • Each tag and each warehouse can be used only once across all rows.

Map Shopify Shipping Method to Odoo Carrier

  1. 1
    Tick Map Shopify Shipping Method to Odoo Carrier.
  2. 2
    Click Add. Pick the Shopify Shipping Method and the Odoo Carrier.
  3. 3
    Click Refresh methods if a shipping method is missing.
  4. 4
    Click Save.

The shipping methods come from your recent orders. Matching uses the Shopify shipping line title, without caring about upper or lower case. An exact match wins. Otherwise the row whose method name is the longest part of the title is used, so a short, general row (for example "Standard") does not hide a more specific one.

Odoo → Shopify settings

When Order Sync Direction on Order Settings is Odoo → Shopify, this page shows the banner Showing settings for Odoo → Shopify. The tax, order tag, product, customer, warehouse and carrier cards are hidden because they describe how a Shopify order is written into Odoo. They keep their values and come back if you switch the direction back.

The Order Sync Rules card then shows:

Setting What it does
Sync Odoo orders in these states Which Odoo orders are sent to Shopify: Draft (Quotation), Quotation Sent, Confirmed (Sales Order). Default is confirmed only. At least one must stay ticked.
Start Date for Order Sync Odoo orders created before this date are never sent to Shopify.
Sync Order Tags Copies the Odoo order tags onto the Shopify order. The tag that marks the order as coming from Odoo is always added.
Disable new product creation on Shopify with order sync By default a product missing in Shopify is created from Odoo (with price, stock and image). Tick this to make the order fail instead, with a message naming the product.
Only sync orders with these tags Pick Odoo tags from Select a tag to add. Only orders with at least one of them sync. Leave empty to sync every eligible order.
Good to know

The app looks for each order product in Shopify only by the product matching field you chose in Configuration: SKU, barcode or Shopify variant ID. It does not try the other fields. For example, if you match by barcode, a product without an internal reference (SKU) is fine when Shopify already has it with the same barcode. A product that is not found fails the order if it has no internal reference (SKU), because a new product without a SKU could never be matched again.

Good to know

  • All rules on this page apply when an order is synced. The Resync and Sync now buttons on the dashboard send an order even if it does not match Sync Orders By Status, Start Date for Order Sync or the tag filter.
  • Mapping tables check your rows when you click Save. A missing value shows "Required" under the field, and a duplicate row shows a message such as "Each Shopify tax can only be mapped once."
  • A mapping switch that is on with no rows blocks the save, for example "Please add at least one shipping method to carrier mapping."

Troubleshooting

?
I cannot change anything on this page.
  • Enable Order Sync is off. Turn it on in Order Settings, click Save there, then come back.
?
My Odoo tax, warehouse, pricelist or carrier is not in the list.
  • Click Refresh next to that list. The lists are kept for your browser session.
  • Check the item belongs to the Odoo company the app is connected to.
?
An option in the Taxes card is greyed out.
  • Another tax option is already on. Only one of Enable Fixed Tax Mapping, Map Shopify Tax to Odoo Tax, Sync Tax-Included Price and Map Taxes to Product Line Item can be on (except mapping plus tax-included price). Turn the active one off first.
?
The Odoo order total does not match Shopify.
  • If your Shopify prices include tax, turn on Sync Tax-Included Price, or map each Shopify tax to a price-included Odoo tax.
  • Check the Odoo taxes use the same rates as Shopify.
  • Check only one tax option is on (see the banner More than one tax option is active).
  • Check discounts and shipping are mapped to products in Products, Discounts & Pricing.
?
A Shopify tax is not in the Shopify Tax list.
  • The list is built from orders of the last 60 days. Place an order that uses the tax, then click Refresh Tax Rates.
?
"With "Sync Tax-Included Price" on, choose an Odoo tax that is included in the price."
  • Pick an Odoo tax marked "(tax included)" for that row, or turn off Sync Tax-Included Price.
?
Orders fail because a product is missing.
  • Disable new product creation on Odoo with order sync is on. Create the product in Odoo with the same SKU or barcode, then resync the order from the dashboard. Or untick the option.
?
Orders from one tag go to the wrong warehouse.
  • Check the tag is in only one row of Map Odoo Warehouse Based on Order Tags. If an order has tags from several rows, the first row wins.
?
Orders are not syncing at all.
  • Check Start Date for Order Sync is not in the future.
  • Check Sync Orders By Status and Sync Orders by Specific Shopify Tags. Open the Skipped tab on the dashboard to see why an order did not sync.
07Orders & people

Customer sync & CRM leads

15 min read

Customer sync copies your customers between Shopify and Odoo contacts, with their addresses, phone, tags and tax ID. The CRM Lead tab turns Shopify abandoned checkouts, draft orders and orders into leads in Odoo CRM.

What it does

There are two ways a customer reaches the other system:

  • With every order. When an order syncs to Odoo, the app always finds or creates the Odoo contact for that order, with its billing and delivery addresses. This happens even when customer sync is off. See How customers are handled during order sync.
  • With a customer sync run. On the Customer Sync Settings page you can copy all your customers at once, in one direction: Import Customers (Odoo → Shopify) or Export Customers (Shopify → Odoo).

The CRM Lead tab (Shopify → Odoo only) creates Odoo CRM leads from:

  • abandoned checkouts,
  • draft orders,
  • orders (instead of sale orders).

Before you start

  • Finish the app setup: Odoo connection and Company in the general configuration. Contacts are created in that company.
  • For the CRM Lead tab, install the CRM app in Odoo. Without it, the app turns the CRM options off when you save.
  • Customers are matched by email. Make sure your customers in Odoo have an email, and that it is written the same way as in Shopify. See Limits.

How to set it up

  1. 1
    In the app menu, open Customer Settings. The page is called Customer Sync Settings.
  2. 2
    In Customer Sync Direction, choose Odoo → Shopify or Shopify → Odoo. Confirm the change in the window that opens.
  3. 3
    For Odoo → Shopify, choose a Customer Sync Option (see below).
  4. 4
    Turn on Enable Customer Sync from Odoo to Shopify (or Enable Customer Sync from Shopify to Odoo) and click Confirm.
  5. 5
    Optional: turn on Sync Customer Tags (or Sync Shopify Customer Tags) and pick the tags of the customers you want to sync.
  6. 6
    Click Save.
  7. 7
    Click Import Customers (Odoo → Shopify) or Export Customers (Shopify → Odoo) at the top of the tab.
  8. 8
    In the window, choose to sync everything or only customers updated in a date range, then click Confirm.

The run happens in the background. Follow it under Logs.

Settings explained

Customer tab

Setting What it does
Customer Sync Direction Odoo → Shopify or Shopify → Odoo. Sets the direction of the Import Customers / Export Customers run and which tag filter you see. The CRM Lead tab only works with Shopify → Odoo. Changing it asks you to confirm.
Customer Sync Option (Odoo → Shopify only) Create new and update existing customers: Odoo contacts without a Shopify customer are created in Shopify. Only update existing customers (the default): only customers that already exist in Shopify (same email) are updated. Nothing new is created.
Enable Customer Sync from Odoo to Shopify / Enable Customer Sync from Shopify to Odoo Turns on the manual run for the chosen direction. The Import Customers / Export Customers button stays disabled until this is on and saved (tooltip: Enable and save customer sync to use this feature.).
Sync Customer Tags (Odoo → Shopify) Only Odoo contacts with at least one of the selected Odoo contact tags are imported. Pick tags in Select Odoo Customer Tags.
Sync Shopify Customer Tags (Shopify → Odoo) Only Shopify customers with at least one of the selected Shopify customer tags are exported. Pick tags in Select Shopify Customer Tags.
Refresh (next to the tag picker) Reloads the tag list from Odoo or Shopify.
Import Customers / Export Customers Starts a one-off run. You choose all customers or only customers updated in a date range.
Tag filter

Leave the tag option off to sync all customers. If you turn it on, you must pick at least one tag. Otherwise you see Please select at least one tag or disable the option. With the Shopify tag filter on, Export Customers only sends customers with those tags, and the confirm window lists the tags.

Good to know

With Odoo → Shopify selected, the page shows Note: CRM Lead is only available for Shopify → Odoo direction. and the CRM Lead tab can't be opened.

Date range for a manual run

When you click Import Customers or Export Customers, the confirm window lets you sync everything, or only customers updated in a date range. Presets are Today, Yesterday, Last 7 days, Last 30 days and Last 90 days, or pick your own dates. Confirm stays disabled while only one date is set.

  • Odoo → Shopify: the range is checked against the date the Odoo contact was last changed.
  • Shopify → Odoo: the range is checked against the date the Shopify customer was last updated.

CRM Lead tab

Setting What it does
Sync Abandoned Checkouts to Odoo CRM Lead Creates a lead in Odoo CRM for each abandoned checkout, every hour.
Sync Shopify Draft Orders to Odoo CRM Lead Creates a lead for each open draft order, every hour.
Sync Shopify Orders to Odoo CRM Lead New orders become CRM leads instead of sale orders. Needs Enable Order Sync on in Order sync. You confirm it in a window: orders will not be synced as sale orders while this is on.
Create Abn Checkout Creates leads now from abandoned checkouts of the last 24 hours. Enabled after you turn on and save the abandoned checkout option.
Sync Draft Orders Creates leads now from open draft orders of the last 24 hours. Enabled after you turn on and save the draft order option.

Click Save after changing a toggle. If Odoo CRM is not installed, you see Customer settings saved successfully. However, the CRM Lead module is not installed in Odoo, so the "CRM Lead" option has been disabled.

Good to know

While you have unsaved changes, you can't switch tabs. You see Save or discard your changes before switching tabs. Use Save or Discard in the save bar.

How often it runs

What When
Customer with an order With every order that syncs to Odoo.
Import Customers / Export Customers Only when you click the button. There is no automatic schedule for these runs.
Abandoned checkouts → CRM Every hour. Each run looks at checkouts updated in the last 2 hours.
Draft orders → CRM Every hour. Each run looks at open draft orders updated in the last 2 hours.
Orders → CRM As each order arrives.
Manual CRM buttons Look back 24 hours.

Running a CRM sync again does not create the same lead twice.

What is synced / not synced

Shopify → Odoo (Export Customers)

The app looks for an Odoo contact with the customer's email. If several contacts have that email, it updates the main contact (one with no parent company or contact), not a contact filed under it. If there is no match, it creates a new contact.

Synced to the Odoo contact:

  • Name (first and last name), email, phone.
  • Street, city, ZIP, state and country from the customer's default address.
  • On an existing contact, an empty name, phone, street, city or ZIP in Shopify leaves the Odoo value as it is. It is never cleared.
  • Shopify customer tags, as Odoo contact tags. Missing tags are created in Odoo. Tags are added, never removed.
  • Tax ID / VAT from the customer's Shopify tax details, when the customer has one. An existing VAT in Odoo is never cleared.
  • Any extra fields you set up in Field mapping (Customers tab).

Not synced: the second address line, extra addresses, the company name, a salesperson. Customers without an email are skipped.

Odoo → Shopify (Import Customers)

Synced to the Shopify customer:

  • First and last name (the Odoo name is split at the first space), email, phone (or mobile).
  • The Odoo Notes field, as the customer note.
  • All addresses of the contact: the main address first, then invoice and delivery addresses.
  • Odoo contact tags, as Shopify customer tags. Tags are added, never removed.
  • Any metafields you set up in Field mapping.

Not synced: marketing consent, company, tax ID. Contacts without an email are skipped. Contacts are taken from your configured company and from contacts shared by all companies.

How customers are handled during order sync

This runs for every order that syncs to Odoo, whatever the customer settings.

Finding the customer

  1. 1
    The app takes the order's email. If there is no email, it uses the phone.
  2. 2
    It looks for an Odoo contact with the same email. With phone only, it also matches phone numbers written in another format (with or without country code).
  3. 3
    If there are several matches, it prefers a person over an address or a company.
  4. 4
    If nothing matches, it creates a new contact.

An order with no email and no phone fails with Customer email and phone number not found in shopify order data.

What a new contact gets

  • Name, email, phone and address from the order's customer.
  • The company from your configuration (or from the multi-company tag mapping).
  • The tag Shopify, plus the customer's Shopify tags.
  • The salesperson of the sales team you set in Sales Team Mapping (see Order sync), if any.

An existing contact also gets the Shopify tag. Its name is never changed.

Billing and delivery addresses

  • If the shipping address (or recipient name) differs from the customer's main address, the app adds a delivery address under the contact and uses it on the order.
  • If the billing address differs, it adds an invoice address under the contact.
  • If the main contact has no address yet, it is filled in. If it has a different address, it is not overwritten. A child address is used instead.
  • Before it creates an address, the app looks for an existing one of the same type with the same name, street, city, ZIP, country and phone. Upper/lower case and spaces don't matter. If it finds one, it reuses it, so you don't get a new address for every order.

Company or individual

By default every customer is created as an individual.

Turn on Create Customer as Company on Odoo (in Additional Order Settings → Customer Mapping) to file orders under the company:

  • If the Shopify address has a company name, the company becomes the Odoo contact and the customer on the order.
  • The billing and shipping addresses become invoice and delivery addresses under the company.
  • An existing Odoo contact with the same company name is reused. Upper/lower case and punctuation don't matter.
  • The company is never renamed after the shopper.

Tax ID / VAT

  • The app reads the tax ID the customer saved in their Shopify customer account (Shopify's customer tax details).
  • It is written to the Odoo Tax ID field when the contact is created, and updated when it changes.
  • An existing VAT in Odoo is never cleared when Shopify has none.
  • A Field mapping rule that writes to Tax ID (VAT) has the final say.

Shared customers (map orders to one customer)

In Additional Order Settings → Customer Mapping you can send orders to a fixed Odoo customer instead:

Setting What it does
Map Orders to Single Odoo Customer Assigns orders to the Odoo customer with the email in Odoo Customer Email. Choose Map Guest Orders Only or Map All Orders. If no contact has that email, the order fails with Customer not found on odoo for the email id : ….
Map Default Customer Based on Order Tag One row per Order Tag → Customer Email. An order with that tag goes to that customer. Tags match without regard to upper/lower case. The first matching row wins. If the email is not found in Odoo, the order uses the normal customer.
Map Shopify Shipping Address to Odoo Delivery Address Shown under Mapped Customer Addresses when one of the two options above is on. Adds the order's shipping address as a delivery address under the mapped customer.
Map Shopify Billing Address to Odoo Invoice Address Adds the order's billing address as an invoice address under the mapped customer.

The mapped customer itself is never changed. A guest order is an order without a customer, or with a customer that has no email and no phone. Without single-customer mapping, an order with no customer fails with Customer not found in shopify order data.

CRM leads in detail

What a lead contains

Source Lead name
Abandoned checkout Abandoned Checkout Shopify #… - email (or phone)
Draft order Draft Order #D… - email (or phone)
Order Order #1001

Each lead is an opportunity with:

  • the customer (found by email, else phone; created if missing), email, phone and address,
  • Expected Revenue = the Shopify total,
  • a description with the items (quantity, price, discount), discount codes, total, and a link (checkout recovery link, draft invoice link or order status page).

Checkouts and drafts with no email and no phone are skipped.

Orders as leads

With Sync Shopify Orders to Odoo CRM Lead on:

  • No sale order, invoice or payment is created in Odoo for new orders.
  • The order shows as synced on the dashboard and links to the lead.
  • If Odoo CRM is not installed, the order fails with Order sync failed: Odoo CRM module is not installed.
Important

Turn this off if you want sale orders in Odoo. Orders that arrive while it is on become leads, not sale orders.

Limits

  • Matching is by exact email, and upper/lower case counts in a customer sync run. "Ann@Shop.com" and "ann@shop.com" are seen as two customers. This can create a duplicate in Odoo, or make Shopify refuse the new customer.
  • Phone is not used to match customers in a customer sync run. Only order sync uses the phone, when the order has no email.
  • A customer sync run copies only one address to Odoo (the first Shopify address).
  • Only one customer sync run can run at a time. A new Odoo → Shopify run can't start within 5 minutes of the last product sync.

Good to know

  • Start with Only update existing customers. It can't create duplicates in Shopify.
  • A Shopify → Odoo export run can change existing Odoo contacts: their phone and main address are rewritten with the Shopify values. Use the tag filter or a date range to limit a run.
  • Customers spending store credit or earning points: see Loyalty points & store credit.

Troubleshooting

?
The Import Customers or Export Customers button is disabled.
  • Turn on Enable Customer Sync from … and click Save first.
?
I can't open the CRM Lead tab.
  • Set Customer Sync Direction to Shopify → Odoo. The CRM tab only works in that direction.
?
The CRM options switch off after I save.
  • The Odoo CRM app is not installed. Install it in Odoo, then turn the options on again and save.
?
Create Abn Checkout or Sync Draft Orders is disabled.
  • Turn on the matching option, click Save, then try again.
  • Sync is already running. Please wait. means a run is still busy.
?
"Customer sync is already running. Please wait for the current sync to complete."
  • A run is still busy. Wait for it to finish. Check Logs for progress.
?
"Customer sync was completed recently. Please wait at least 5 minutes before starting another sync."
  • Wait 5 minutes and click Import Customers again.
?
Customers were not created in Shopify.
  • Check Customer Sync Option. Only update existing customers never creates new customers.
  • Check that the Odoo contacts have an email.
  • If Sync Customer Tags is on, check that the contacts have one of the selected tags.
  • Shopify refuses customers with an invalid or duplicate phone number or email. Each refused customer has its own line on the Logs page, "Customer … was not synced to Shopify: …", with Shopify's reason. Fix the contact in Odoo and run Import Customers again.
  • Contacts in Puerto Rico, Guam, the US Virgin Islands and other US territories are created with country United States and the territory as the state, because that is how Shopify lists them.
?
"Customer import: no Odoo customers matched the configured filters."
  • No Odoo contact has an email and matches your tag filter and date range. Widen the date range or the tag list.
?
A duplicate contact was created in Odoo.
  • Check that the email is written the same way (upper/lower case) in Shopify and Odoo.
  • If the existing Odoo contact belongs to another Odoo company, it is not found. Make it shared or move it to the configured company.
?
The order shows a new delivery address every time.
  • The app reuses an address only when name, street, city, ZIP, country and phone are the same. Check the order's address against the Odoo address.
?
"Customer email and phone number not found in shopify order data"
  • The order has no email and no phone. Add one in Shopify and resync the order, or use Map Orders to Single Odoo Customer for such orders.
?
"Customer not found in shopify order data"
  • The order has no customer (a guest order). Turn on Map Orders to Single Odoo Customer with Map Guest Orders Only.
?
"Customer not found on odoo for the email id : …"
  • No Odoo contact has the email in Odoo Customer Email. Check the spelling, or create the contact in Odoo.
?
"Missing country in customer address"
  • The order address has no country, or Odoo has no matching country. Check the address in Shopify.
?
The Tax ID / VAT did not reach Odoo.
  • The customer must save the tax ID in their Shopify customer account. A tax ID typed only in the checkout company field is not read.
  • Or add a Field mapping rule from Tax ID / VAT (customer tax details) to Tax ID (VAT).
?
Orders are not becoming sale orders any more.
  • Sync Shopify Orders to Odoo CRM Lead is on. Turn it off and save.
08Orders & people

Loyalty points & store credit

9 min read

Loyalty Points copies each customer's point balance from an Odoo loyalty program into Shopify store credit. Your customers can then spend that credit at the Shopify checkout. You can also look up a customer and redeem points for them from the app.

Available on request

Loyalty Points is turned on for selected stores only. If you don't see Loyalty Points in the app menu, contact support@techmarbles.com and ask for it to be turned on for your store.

What it does

  • Odoo's Loyalty app gives points to a customer as their orders sync to Odoo. This is Odoo's own logic. The app does not calculate points.
  • The app reads the customer's points in the Odoo loyalty program you choose.
  • It turns the points into money with your conversion rate, and adds that amount to the customer's Shopify store credit.
  • When the points go down in Odoo (for example after a refund, or when points are used in Odoo), the app takes the same value off the customer's Shopify store credit.
  • You can redeem points for a customer from the Balances tab. The points are taken off in Odoo and the value is added to their Shopify store credit.

The sync goes one way only: from Odoo to Shopify.

Before you start

  • In Odoo, install the Loyalty (eCommerce / Sales loyalty programs) app and create at least one loyalty program.
  • Your Odoo connection must be working. The program list and the customer lookup read from Odoo.
  • A customer must have at least one order synced by the app. That is how the app links a Shopify customer to an Odoo contact. Customers without a synced order are skipped.
  • The app needs permission to use Shopify store credit. You grant it on the Loyalty Points page (see below). See Shopify permissions.

How to set it up

  1. 1
    In the app menu, open Loyalty Points.
  2. 2
    If you see the banner Allow access to Shopify store credit, click Grant permission. Shopify opens its own permission window. Approve it.
  3. 3
    When you see Store credit access granted, tick Enable loyalty points sync.
  4. 4
    In Odoo loyalty program, pick the program whose points you want to show in Shopify.
  5. 5
    In Points to currency conversion rate, enter how much store credit 1 point is worth, in your shop's currency.
  6. 6
    Click Save in the save bar at the top of the page.

The first sync runs within 30 minutes. After that, the Balances tab shows each customer the app has synced.

Settings explained

The Settings tab starts with a How this works banner that sums up the feature.

Setting What it does
Grant permission (in the Allow access to Shopify store credit banner) Asks Shopify for store credit access. The banner only shows while the access is missing.
Enable loyalty points sync Turns the sync on or off. You can't turn it on until store credit access is granted. The help text then says Grant store credit access above to turn this on. You can always turn it off.
Odoo loyalty program The Odoo program to read points from. The list shows every loyalty program in your Odoo. Points on other programs are ignored. Disabled while the sync is off.
Points to currency conversion rate How much store credit (in your shop's currency) 1 Odoo point is worth. Default is 1. It must be 0 or more. Example: with 0.05, 200 points become 10.00 of store credit. Disabled while the sync is off.

Store credit is always added in your shop's main currency.

Good to know

Changes are saved with the save bar. While you have unsaved changes, you can't switch tabs. You see Save or discard your changes before switching tabs.

The Balances tab

This tab shows only while Enable loyalty points sync is on.

Look up a customer

  1. 1
    Enter the customer's Email. You can also enter a Phone. The app searches by email first and uses the phone only when the email is empty or not found.
  2. 2
    Click Look up.
  3. 3
    The app shows two values:
    • Odoo Loyalty Points: the customer's current points in the chosen program, read live from Odoo.
    • Shopify Store Credit: the customer's current store credit in Shopify.

Look up is disabled until the sync is on and a program is chosen. Looking up a customer does not change their store credit.

Redeem points for a customer

  1. 1
    Look up the customer.
  2. 2
    Click Redeem points.
  3. 3
    In Points to redeem, enter the number of points. The help text shows the Available balance.
  4. 4
    Check the preview: This will credit approximately … in Shopify Store Credit.
  5. 5
    Click Redeem.

What happens:

  • The points are taken off the customer's loyalty card in Odoo. Odoo records it in the card history as "Redeemed via Shopify App".
  • The points × your conversion rate are added to the customer's Shopify store credit.
  • A Redemption row is added to the History tab.

Redeem points is disabled when the customer has 0 points or is not linked to Odoo.

The balances table

Column What it shows
Shopify customer ID The Shopify customer.
Odoo points The last point balance read from Odoo.
Store credit synced The store credit value the app has added in Shopify for these points, with the currency.
Last synced When the app last checked this customer.
Actions The delete button removes the app's log for this customer and its history rows. It does not change anything in Shopify or Odoo.

Use Show to pick 10, 25, 50 or 100 rows per page, and the arrows to move between pages.

The History tab

The History tab lists every store credit change the app made.

  • Filter with All, Success or Failed. Click Refresh to reload the list.
  • If some changes failed, a red banner shows … loyalty sync(s) failed.
Column What it shows
When Date and time.
Shopify customer ID The customer.
Type Balance sync (the regular sync), Redemption (you redeemed points), or Manual adjustment.
Triggered by Scheduled sync, Admin redemption, Admin lookup or Odoo webhook.
Points How much the points changed.
Store credit How much store credit was added (positive) or taken off (negative).
Status Pending, Completed or Failed.
Error Why a change failed.

How often it runs

  • The app checks balances every 30 minutes, for all linked customers of the chosen program.
  • There is no "sync now" button. A redemption from the Balances tab is sent right away.
  • The app sends only the change since the last sync. Shopify has no "set balance" action, so the app adds or takes off the difference.
  • Changes smaller than 0.01 are ignored.

What is synced / not synced

Synced:

  • Points of the chosen Odoo program → Shopify store credit (Odoo → Shopify).
  • Point decreases in Odoo → store credit is taken off in Shopify.
  • Redemptions you make in the app → points off in Odoo, store credit on in Shopify.

Not synced:

  • Store credit your customer spends at the Shopify checkout does not lower their points in Odoo.
  • Store credit you add by hand in Shopify is not sent to Odoo.
  • Points from other Odoo loyalty programs.
  • Customers that have no synced order yet, because the app can't link them to an Odoo contact.
  • Nothing is written to customer tags or metafields.

Limits

  • One loyalty program per store.
  • Store credit uses the shop's main currency.
  • The app can't take off more store credit than the customer has. If a customer already spent the credit, the rest stays open and the app tries again on later syncs.
  • The lookup must match exactly one Shopify customer.

Good to know

  • Pick a conversion rate before the first sync. If you change it later, the next sync adds or takes off the difference for every customer.
  • Removing the store credit permission in Shopify stops the sync. Each change then fails and shows in History.

Troubleshooting

?
I don't see Loyalty Points in the menu.
?
I can't tick Enable loyalty points sync.
  • Click Grant permission in the Allow access to Shopify store credit banner and approve Shopify's window.
  • If you see Store credit access was not granted., open the banner again and approve all three store credit permissions.
  • If saving shows Grant access to Shopify store credit before turning on loyalty points sync., the permission is still missing. Grant it and save again.
  • Could not confirm this store's Shopify permissions right now. Please try again. means Shopify did not answer. Wait a minute and save again.
?
The Odoo loyalty program list is empty.
  • Check that the Odoo Loyalty app is installed and has at least one program.
  • Check your Odoo connection. Odoo is not connected. means the app can't reach Odoo.
?
A customer's store credit did not change.
  • The sync runs every 30 minutes. Wait for the next run.
  • Check that the customer has at least one order synced by the app.
  • Check that their points are on the program you chose in Odoo loyalty program.
  • Open History and filter Failed to see the error.
?
"No Shopify customer found for the provided email or phone."
  • Check the spelling of the email. The search uses the exact email.
  • Try the phone number instead.
?
"Multiple Shopify customers matched. Use a more specific email or phone."
  • More than one Shopify customer has this email or phone. Search with the email, which is usually unique.
?
"This customer is not yet linked to an Odoo contact (they need at least one synced order)."
  • The customer has no order synced by the app yet. Their balance appears after their first synced order.
?
"This customer does not have a loyalty card for the configured program."
  • In Odoo, the customer has no card in the chosen program. They get one when Odoo first gives them points.
?
"Insufficient points balance in Odoo."
  • The customer has fewer points in Odoo than you tried to redeem. Look them up again and redeem a smaller number.
?
"Points were deducted in Odoo, but crediting Shopify Store Credit failed: …"
  • The points are already off in Odoo, but Shopify did not add the credit. Check the store credit permission, then add the credit by hand in Shopify or contact support. Don't redeem again, or the points are taken off twice.
?
"Customer has no Shopify store credit available to debit; … could not be recovered and remains outstanding."
  • Points went down in Odoo (often after a refund), but the customer had already spent the store credit. The app keeps the open amount and takes it off later if the customer gets new credit.
?
"Partial debit: … left outstanding (customer had insufficient store credit)."
  • Same as above, but the customer had part of the amount. The app took off what it could.
09Advanced

Field mapping

15 min read

Field mapping lets you copy extra fields between Shopify and Odoo for orders, products and customers. Use it for custom Odoo fields (x_…), Shopify metafields, product images from a URL, product attributes, unit prices, or to copy a field only when a condition is met.

What it does

The app already syncs the common fields (names, prices, SKUs, addresses, and so on). A mapping rule adds one more field pair on top:

  • From a Shopify field or metafield to an Odoo field (Shopify → Odoo), or
  • From an Odoo field to a Shopify field, metafield or image (Odoo → Shopify).

Each rule can have a condition, so it only runs for some records. For example: only fill Customer Reference when the order has the tag "B2B".

When to use field mapping

You only need it for custom Odoo fields, metafields or conditional rules. The most common standard fields are already mapped and used during sync.

Before you start

  • For a custom Odoo field: create the field in Odoo first (for example with Odoo Studio). Its technical name must start with x_. The app does not create custom fields for you.
  • For a Shopify metafield: create the metafield definition in Shopify first (Settings → Custom data). Only metafields with a definition are listed.
  • The sync itself must be on: the rule runs inside Order sync, Product sync or Customer sync.

How to set it up

  1. 1
    In the app menu, open Field Mapping. The page is called Field mapping configuration.
  2. 2
    Pick a tab: Orders, Products or Customers.
  3. 3
    Click Add mapping. A New mapping card opens.
  4. 4
    Choose the Sync direction: Shopify → Odoo or Odoo → Shopify.
  5. 5
    Choose the Shopify side:
    • Products only: Shopify level (Product or Product variant).
    • Shopify field type: Standard fields, Metafields or Product media.
    • The Shopify field itself: Shopify field, Shopify metafield or Shopify media target.
  6. 6
    Choose the Odoo side:
    • Odoo model.
    • Odoo field type: Default fields or Custom fields (x_*) (or Attribute Names for product attributes).
    • Odoo field (or Attribute).
  7. 7
    Check the preview line, for example "Shopify (Note) → Odoo (Customer Reference)".
  8. 8
    Optional: tick Optional condition (apply mapping only when this condition is met) and fill in the condition.
  9. 9
    Keep Enabled ticked and click Done.
  10. 10
    Click Save in the save bar at the top of the page.

Each tab is saved on its own. Save before you switch to another tab. Otherwise you see Save or discard your changes before switching tabs.

You can add the next rule once both fields of the open rule are chosen. Until then the page shows Select both Shopify and Odoo fields in the open mapping to add another.

Settings explained

On every rule

Setting What it does
Sync direction Shopify → Odoo or Odoo → Shopify. New rules on Orders start as Shopify → Odoo. On the other tabs they follow the direction most of your rules use.
Enabled Untick to pause the rule without deleting it. A paused rule shows an Off badge.
Remove Deletes the rule (after you save).
Edit Opens a saved rule again.
Done / Cancel Closes the card. Discard on a new, incomplete rule removes it.
Optional condition (apply mapping only when this condition is met) Runs the rule only when the condition is true. See Conditions.

The closed card shows badges: Enabled / Off, the direction, Standard / Metafield / Media, Shopify variant (variant-level product rules), and Default / Odoo custom / Attribute.

Shopify field types

Type What it is
Standard fields Built-in Shopify fields, such as order Note, product Vendor or customer Phone. The list shows the label and the technical path, such as billing_address.city.
Metafields Your Shopify metafields with a definition (up to 250 per type). Shown as namespace.key.
Product media Products tab, Odoo → Shopify only. Puts an image from a URL into Shopify. Choose Product media gallery or Variant image (attach to synced variant).

Odoo models

Tab Odoo model options
Orders Order (sale.order), Order line (sale.order.line)
Products Variant (product.product), Template (product.template), Vendor (product.supplierinfo), Product attributes (product.attributes) (Odoo → Shopify only)
Customers Main contact (res.partner), Billing address (res.partner.billing), Shipping / delivery address (res.partner.delivery)

Odoo field types

Type What it is
Default fields A fixed list of common Odoo fields. Each shows its type, for example "Customer Reference (char)".
Custom fields (x_*) Loaded live from your Odoo: fields starting with x_ and fields made in Odoo Studio. While loading you see Loading custom fields from Odoo…. Created a field in Odoo while the mapping is open? Click Refresh next to Odoo field.
Attribute Names With Product attributes only. Your Odoo product attributes, such as "Color" or "Material". Click Refresh next to Attribute to load one you just created.

What you can map

Orders tab

Shopify order fields you can pick include: Order ID, Name (e.g. #1001), Email, Phone, Created at, Tags, Note, Note attributes, Source, Reference, Financial status, Currency, Presentment currency, Payment gateways, Payment ID, Fulfillment status, totals (Total price, Subtotal price, Total tax, Total discounts), Taxes included, Customer locale, Landing site, Referring site, billing and shipping city, province, country and ZIP, shipping first and last name, and customer email and names. Order metafields are listed under Metafields.

Odoo order fields include: Order Date, Delivery Date, Expiration, Terms and conditions, Customer Reference, Source Document, Pricelist, Payment Terms, Fiscal Position, Analytic Account, Warehouse, Company, Salesperson, Sales Team, Currency, Delivery Method, Tags, Invoice Address, Delivery Address, and your custom fields.

Order line rules (Order line (sale.order.line)):

  • Shopify → Odoo only.
  • The Shopify side is Line item properties, or a metafield of the line's product or variant (pick it with Shopify level).
  • The Odoo side is Description, or a custom x_ field on the order line.
  • The text is added to the line description, never replaces it.
  • Picking Line item properties on an order rule moves the rule to the order line model and picks Description for you.
Good to know

Order rules run when the order is first created in Odoo. Order line rules also run for lines added by a later order edit. Order rules with direction Odoo → Shopify are saved but don't do anything yet.

Products tab

Shopify product fields include: Title, Handle, Vendor, Product type, Tags, Description HTML, SEO title, SEO description, Online store URL, Total inventory, Featured image URL, and first-variant SKU, price, weight, barcode and compare-at price.

With Shopify level set to Product variant: SKU, Barcode, Price, Compare-at price, Variant title, weight and weight unit, Country of origin (code), HS code, Cost price, Unit cost currency, Variant image URL and Unit price (needs paired unit field).

Odoo product fields include: Product Name, Sales Price, Cost, Can be Sold, Can be Purchased, Invoicing Policy, Product Type, Weight, Volume, HS Code, Country of Origin, Product Category, Unit of Measure, Base Unit Count, Base Unit of Measure, Product Tags, Sales Description, Ecommerce Description, website meta title and description, Internal Reference (SKU), Barcode, and your custom fields. Vendor (product.supplierinfo) offers Vendor Code.

Product Brand is listed for Template (product.template) when your Odoo has a product brand module installed. To show the brand as the Shopify vendor, map it with Odoo → Shopify to the Shopify standard field Vendor. The brand's name is sent. A product with no brand in Odoo gets an empty vendor in Shopify.

Product rules run on manual and scheduled product syncs and price syncs, and when order sync creates a missing product in Odoo. They do not run when a product is only edited in Shopify and no product sync runs.

Customers tab

Shopify customer fields include: Email, First name, Last name, Phone, Tags, Note, Number of orders, Verified email, Tax exempt, Tax ID / VAT (customer tax details), and the default, billing and shipping address lines, city, province, country, ZIP, phone and company.

Odoo contact fields include: Name, Email, Phone, Mobile, Street, Street 2, City, Zip, Country, State, Tax ID (VAT), Related Company, Tags, Address Type, Language, Notes, Follow-up, and your custom fields. The billing and shipping models offer the same fields, labelled "Billing — …" and "Shipping — …".

When customer rules run:

  • Shopify → Odoo: when an order syncs (for the contact and its billing and delivery addresses), and in an Export Customers run (main contact only, because there is no order address).
  • Odoo → Shopify: in an Import Customers run. Only these Shopify fields are written: first name, last name, phone, email, tags, note, default address fields, and metafields.

Special mappings

Product images from a URL

  1. 1
    On Products, set Sync direction to Odoo → Shopify.
  2. 2
    Set Shopify field type to Product media.
  3. 3
    Pick Product media gallery or Variant image (attach to synced variant).
  4. 4
    Pick the Odoo field that holds the image URL (usually a custom x_ char field).

The field must hold a full http:// or https:// link to a public image. Images are uploaded in the background after the product syncs.

Product attributes to a metafield

  1. 1
    On Products, set Odoo model to Product attributes (product.attributes). The direction becomes Odoo → Shopify and the field type Attribute Names.
  2. 2
    Pick the Attribute.
  3. 3
    Pick the Shopify metafield. At the Product level you get all values of the attribute. At the Product variant level you get the variant's own value.

The selected attribute's value(s) on the Odoo product are written to this Shopify metafield. Use a list metafield (for example "List of single line text") when a product has several values. Supported metafield types: single and multi-line text, rich text, integer, decimal, true/false, date, date and time, URL, and their list versions.

Unit price

To fill Shopify's unit price (for example "€2.50 / 100 g"):

  1. 1
    On Products, set Sync direction to Odoo → Shopify and Shopify level to Product variant.
  2. 2
    Pick Unit price (needs paired unit field) as the Shopify field.
  3. 3
    As Odoo field, pick the quantity, for example Base Unit Count.
  4. 4
    As Odoo unit field, pick the unit, for example Base Unit of Measure or Unit of Measure.

A reference amount in the unit name is respected: "100 g" shows the price per 100 g, "kg" per 1 kg. Supported units: weight (mg, g, kg, oz, lb), volume (ml, cl, l, m³, gal, qt, pt, fl oz), length (mm, cm, m, in, ft, yd), area (m², ft²) and item.

Order note attributes and line item properties

  • Note attributes (checkout extra fields) are written as "Name - value". In an HTML field each pair is on its own line. In a one-line text field they are joined with " | ".
  • Line item properties are written as "Name: value". Hidden properties (names starting with _) are left out.

Company name in the street

On the Customers tab, map a Shopify … company field to Odoo Street or Street 2. The company is put in front of the street, separated by a comma, and repeated words are not doubled.

How values are converted

Odoo field type Shopify → Odoo
Text (char, text, html, selection) Copied as text. A list becomes JSON text. Selection values are not checked, so use Odoo's exact value.
Whole number Copied if it is a number, else the rule is skipped.
Decimal / money Copied as a number. An empty value becomes 0.
True/false "true", "1", "yes" and "on" become true.
Date / date and time Converted to Odoo's format (UTC). Unreadable dates are skipped.
Link to another record (many2one), such as Country or Salesperson Matched by the exact name of an existing Odoo record (upper/lower case ignored). If no record or several records match, the rule is skipped. Records are never created.
Tags on orders and contacts Each tag is found or created in Odoo. Contact tags are added, existing tags stay.

Odoo → Shopify:

  • A link to another record (many2one) is sent as its name.
  • Weight, size and volume metafields are sent in kg, cm and liters, unless you pick a unit field.
  • Rich text is converted to Shopify's rich text format and back.
  • Empty Odoo values are not written to metafields, so Shopify does not reject them.
  • Metafields that point to Shopify records (…_reference) only accept Shopify IDs (gid://shopify/…).
  • Shopify weight goes to Odoo Weight in kg (grams, pounds and ounces are converted).

Conditions

Tick Optional condition (apply mapping only when this condition is met). Then fill in:

Field What to enter
Field path (dot notation, e.g. tags or addresses.0.country) The field to test. Use dots for nested fields and numbers for list items, for example shipping_address.country or variants.0.sku. For a metafield, use namespace.key.
Operator See below.
Value / Values (comma-separated) What to compare with.

The path is read from the source side: the Shopify record for Shopify → Odoo rules, the Odoo record for Odoo → Shopify rules.

Operator True when
equals The field is exactly the value. Upper/lower case counts.
not equals The field is not exactly the value.
in list The field is one of the comma-separated values. Upper/lower case counts.
contains The field contains the value. Upper/lower case is ignored. For a list such as tags, the whole list is searched.
empty The field is missing or blank. No value needed. 0 and false are not empty.
not empty The field has a value. No value needed.

The closed card shows the condition, for example "Condition: tags contains wholesale".

Examples

Goal Rule
Put the Shopify order note into Customer Reference Orders · Shopify → Odoo · Standard Note → Order (sale.order) Customer Reference
Send gift message line properties to the Odoo line Orders · Shopify → Odoo · Line item properties → Order line Description
Fill a Shopify "material" metafield from an Odoo custom field Products · Odoo → Shopify · Product level · Metafield custom.material → Template · Custom x_material
Copy the Shopify customer tax ID to Odoo Customers · Shopify → Odoo · Tax ID / VAT (customer tax details) → Main contact Tax ID (VAT)
Set a fiscal position only for EU B2B orders Orders · Shopify → Odoo · Standard Tags → Fiscal Position, condition tags contains EU-B2B. The tag text must match the name of an Odoo fiscal position, so a fixed tag name works best.

Limits

  • The app never creates custom Odoo fields. Create them in Odoo first.
  • Fields that your Odoo does not have are left out when the record is written. The sync goes on, and nothing is written for that rule.
  • Image (binary) fields can't be mapped. Use a URL field with Product media.
  • Order line rules can only add text or fill custom fields. They can't change the product, quantity, price or taxes.
  • If two rules write the same field, the last rule in the list wins.
  • A mapping runs after the built-in sync and overwrites the built-in value for that field.
  • Only metafields with a definition in Shopify are offered, up to 250 per owner type.

Good to know

  • An empty Shopify text value clears the Odoo text field. Add a not empty condition if you want to keep the Odoo value.
  • Rules are included when you export and import your app settings.
  • A mistake in a rule does not stop the sync. The rule is skipped and the record syncs without it.

Troubleshooting

?
My custom field is not in the Odoo field list.
  • Check that the field exists on the model you picked (for example Template vs Variant).
  • Pick Custom fields (x_*) as the Odoo field type. The list loads from Odoo, so wait for Loading custom fields from Odoo… to finish.
  • If you see Odoo is not connected., fix the connection in Configuration first.
?
"The field 'x_…' does not exist in Odoo…"
  • This message comes from the Odoo Custom Field for Shopify Variant ID setting in Configuration, not from field mapping. The name must start with x_ so the app can create it. If it says the field could not be created, the Odoo user has no right to create fields: create it in Odoo, then save again.
  • In field mapping, a field that does not exist in Odoo is simply skipped. Create the field in Odoo with the same technical name.
?
"Odoo custom fields must start with x_."
  • Pick a field from the Custom fields (x_*) list, or rename the field in Odoo so it starts with x_.
?
"Select a Shopify field for this mapping." / "Select an Odoo field for this mapping."
  • Pick both fields before you save.
?
"Enter a field path, or turn the condition off." / "Enter a value to compare against."
  • Fill in the condition, or untick Optional condition (apply mapping only when this condition is met).
?
My custom Odoo field is not in the list.
  • Check Odoo field type is Custom fields (x_*) and the Odoo model is the model the field was created on.
  • Click Refresh next to Odoo field to load fields created in Odoo after you opened the mapping.
?
My metafield is not in the list.
  • Create a metafield definition in Shopify (Settings → Custom data).
  • On Products, check Shopify level: product and variant metafields are listed separately.
?
The value did not reach Odoo.
  • Check that the rule is Enabled and saved, and that the condition is true for this record.
  • Order rules run only when the order is first created. Resync a new order to test.
  • For a link field (such as Country or Salesperson), the Shopify value must match the name of exactly one Odoo record.
  • For a number field, the Shopify value must be a number.
?
The value did not reach Shopify.
  • An empty Odoo value is not written to a metafield.
  • Check that the metafield type fits the value. A text with several attribute values needs a list metafield.
  • Run a product sync. Rules don't run on their own.
?
"Field Mapping could not write line item properties to the order line Description…"
  • The Odoo order was created, but Odoo did not keep the mapped text on the line. On some Odoo versions the description is read-only. Map the properties to a custom x_ field on the order line instead.
?
The product image did not appear in Shopify.
  • The Odoo field must hold a full public https:// link to an image file.
  • Images upload in the background. Wait a few minutes after the product sync.
10Advanced

Taxes & pricelists

17 min read

This topic brings all tax and price settings together in one place: how Shopify taxes reach your Odoo orders, which Odoo pricelist an order gets, and how Odoo pricelists set prices in Shopify and in Shopify markets.

What it does

Area Where you set it Direction
Tax on synced orders Additional Order Settings → Taxes Shopify → Odoo
GST treatment (India) Configuration Shopify → Odoo
Currency of synced orders Additional Order Settings → Order Sync Rules Shopify → Odoo
Pricelist on synced orders Additional Order Settings → Products, Discounts & Pricing Shopify → Odoo
Product prices from an Odoo pricelist Product Settings Odoo → Shopify
Market catalog prices Product Settings Odoo → Shopify
Shopify prices written to an Odoo pricelist Product Settings Shopify → Odoo
Tax added on top of synced product prices Product Settings Odoo → Shopify

The order settings are explained in full in Order sync. The product settings are explained in Product sync. This page explains how they work together.

Before you start

  • In Odoo, create the sales taxes you need (Invoicing/Accounting → Configuration → Taxes). Check the Included in Price option of each tax. It must match how your Shopify prices work.
  • In Shopify, check Settings → Taxes and duties: do your prices include tax or not?
  • Activate every currency you sell in, in Odoo (Accounting → Configuration → Currencies).
  • Create the Odoo pricelists you want to use.
  • Turn on Enable Order Sync in Orders Settings. The Taxes card is disabled until order sync is on.

Choose a tax option

The Taxes card has four ways to handle tax. They are alternatives: pick one. Once one is on, the others are greyed out until you turn it off again. The only pair you can use together is Sync Tax-Included Price with Map Shopify Tax to Odoo Tax.

Your situation Use
Odoo should work out the tax itself from the product's taxes. Shopify prices exclude tax. None of the four (leave all off).
Every order should get the same Odoo tax, whatever Shopify charged. Enable Fixed Tax Mapping
You have several tax rates and want each Shopify tax to land on the matching Odoo tax. Map Shopify Tax to Odoo Tax
Your Shopify prices include tax. Sync Tax-Included Price (add Map Shopify Tax to Odoo Tax with price-included Odoo taxes for exact totals)
Odoo should record the tax Shopify charged as a fixed amount. Map Taxes to Product Line Item

Map Tariffs As Product Line Items is separate. You can use it with any of the above.

If more than one option is already on (for example from an older version of the app), you see More than one tax option is active. Your orders keep syncing as before, but turn off the options you don't need.

How to set it up

  1. 1
    In the app menu, open Additional Order Settings.
  2. 2
    Go to the Taxes card.
  3. 3
    Turn on the option you chose (see the table above) and fill in its fields.
  4. 4
    Click Save.
  5. 5
    Sync a test order and compare the Odoo total with the Shopify total.

Settings explained

Enable Fixed Tax Mapping

Applies one fixed Odoo tax to every order synced to Odoo, instead of the tax Shopify charged.

  • When you turn it on, a Tax Type dropdown appears. Pick the Odoo sales tax. You must pick one before you can save.
  • Do not see your Odoo tax? Click on refresh. The Refresh button reloads the Odoo tax list.
  • The tax goes on the order lines, and on credit notes the app creates for refunds.
  • Turning it off clears the chosen tax.
  • When you change Company in Configuration, this option is switched off and the tax is cleared, because taxes belong to a company.

Map Shopify Tax to Odoo Tax

Maps each Shopify tax to an Odoo tax.

  1. 1
    Tick Map Shopify Tax to Odoo Tax.
  2. 2
    Click Add. Pick a Shopify Tax and an Odoo Tax. Leave Country on Any country.
  3. 3
    Add one row per Shopify tax.
  4. 4
    Click Save.

How it works:

  • Shopify has no list of tax rates, so the Shopify Tax list is built from the taxes on your orders of the last 60 days. Click Refresh Tax Rates after you add a new tax in Shopify. It also reloads the Odoo tax list.
  • Each Shopify tax (name + rate) can be mapped once per country. Taxes already used in a row are hidden in the other rows, unless your orders show that tax for more than one country.
  • On every order, each line gets the Odoo tax mapped to its Shopify tax.
  • Country is for EU OSS stores, where Shopify uses the same tax name and rate for several countries (for example "VAT 6%" for Belgium and Portugal). Add one row per country, each with that country's Odoo tax. The country is the order's shipping country, or its billing country when there is no shipping address. A row for the order's country wins over an Any country row. An order from a country with no row, and no Any country row, keeps the fixed tax or Odoo's own tax for the product. The Country list shows the countries that tax was seen for on recent orders.
  • A line with several Shopify taxes (for example CGST + SGST, or state + county tax) gets every mapped Odoo tax.
  • Shipping lines get the mapped tax when their Shopify tax matches.
  • A discount that goes to Odoo as its own line (a shipping discount, or any discount when Map line item discount is off) gets the mapped tax of the lines it was taken off. This only happens when all those lines have the same mapped tax. A discount spread over lines with different taxes keeps the tax of its discount product in Odoo.
  • A line whose tax is not mapped keeps the fixed tax, or Odoo's own tax for the product.
  • If a rate changes in Shopify, the tax is still matched by name, as long as that name is mapped only once.
  • Invoices and credit notes follow the tax on the sale order line, so all three stay the same.
  • Pick an Odoo tax with the same price-included setting as Shopify. Otherwise the Odoo totals will not match.

With Sync Tax-Included Price also on, the table shows "Sync Tax-Included Price" is on: Shopify's gross price is sent to Odoo, so map each Shopify tax to an Odoo tax marked "(tax included)". Saving a tax that is not included in the price shows With "Sync Tax-Included Price" on, choose an Odoo tax that is included in the price.

Sync Tax-Included Price

For stores whose Shopify prices already include tax.

  • Off: the app takes the tax out of each line with the line's tax rate and sends the net price. A line discount is then taken off in Odoo and Odoo adds its own tax back, so discounted lines and the total match Shopify. Orders that were already in Odoo before October 2026 keep the prices they were synced with.
  • Rounding cents with Off: Shopify works out the tax on the whole order and spreads it over the lines, but Odoo works it out line by line, so the two can end up a cent or two apart. When your Odoo company rounds tax per line, the app moves those cents so the Odoo order's untaxed amount, tax and total match Shopify's exactly. It shifts a line price by a few cents, and if needed adds a "Tax rounding adjustment" line of a few cents with the same tax. Each line's own tax can still differ from Shopify's by a cent; only the order totals match. Orders already in Odoo are not changed.
  • On: Shopify's gross price is sent as it is. Odoo must not add tax on top. Use Odoo taxes with Included in Price, or map them with Map Shopify Tax to Odoo Tax.
  • Map Taxes to Product Line Item is switched off while this is on.

Map Taxes to Product Line Item

Posts each Shopify tax as its own service line on the Odoo order, instead of as a tax on the product lines.

  • One line per tax name and rate, for both product and shipping taxes.
  • An order that reports only a total gets a single "Total Tax" line.
  • Use it when Odoo should record the tax as a fixed amount and not recompute it.
  • Can't be used with Sync Tax-Included Price or Map Shopify Tax to Odoo Tax. Either would tax the order twice.

Map Tariffs As Product Line Items

Posts Shopify import duties (tariffs) as their own service lines.

  • One line per HS code and country of origin, for example "Tariff (6109.10, IN)".
  • An order that reports only a total gets a single "Total Tariff" line.
  • Orders whose prices already include duties are skipped, so the amount is never charged twice.

GST Treatment (India)

GST Treatment shows in Configuration only when your Odoo company is in India. The list comes from Odoo's GST treatment values (for example Registered Business, Unregistered Business, Consumer). It is cleared when you change Company.

Fiscal positions

The app does not set a fiscal position on orders by itself. Odoo picks one from the customer and the address, with its own rules. To set one from Shopify data, add a Field mapping rule on the Orders tab to Fiscal Position.

Currencies and markets on orders

Currency to Sync with Odoo (in Additional Order Settings → Order Sync Rules) decides which amounts go to Odoo:

Option What Odoo gets
Shop Currency (default) The amounts in your store's main currency, even when the customer paid in another currency.
Customer Presentment Currency The amounts and currency the customer saw and paid in (for example EUR in your Euro market).
  • The Odoo order gets the matching Odoo currency.
  • If the currency is not active in Odoo, the order is not synced. You see Order currency … is not active in Odoo. Please activate … in Odoo (Accounting → Configuration → Currencies) and then click Resync on this order. or Order currency … was not found in Odoo….
  • Payments and refunds use the same currency choice.

Pricelists on orders

Each synced order gets an Odoo pricelist. The app picks it in this order:

  1. 1
    Default Pricelist for Order Sync, if you chose one. Every order uses it.
  2. 2
    Else, if Disable Pricelist Mapping (Let Odoo Decide) is on, the app sends no pricelist, and Odoo uses its own default for the customer.
  3. 3
    Else, the customer's pricelist in Odoo (the Pricelist on the contact's Sales & Purchase tab), when it fits the order's company and currency.
  4. 4
    Else, an Odoo pricelist in the order's currency for that company.
  5. 5
    Else, no pricelist. Odoo uses its default.
Setting What it does
Disable Pricelist Mapping (Let Odoo Decide) Skips the pricelist choice above and lets Odoo decide. While it is on, Default Pricelist for Order Sync is disabled with the hint Pricelist mapping is disabled, so Odoo decides the pricelist….
Default Pricelist for Order Sync One pricelist for every synced order. Leave it empty for the automatic choice.
Good to know

The pricelist does not change the prices on the order lines. The app sends the price the customer paid in Shopify.

Pricelists on products

These are in Product Settings. See Product sync for the full list.

Setting Direction What it does
Sync Odoo Pricelist + Select Price List Odoo → Shopify Shopify prices come from this Odoo pricelist instead of the product's sale price. A pricelist line for a variant wins over a line for the product. Products without a line keep their normal sale price. Turn it off to sync the default sale price.
Map Price list with Shopify Market Catalog Odoo → Shopify Inside Sync Odoo Pricelist. One row per Odoo Pricelist → Shopify Market Catalog. Prices from each pricelist are written as fixed prices in that market's catalog, in the catalog's currency. Refresh market catalogs reloads the list. Leave Select Price List empty to update only the catalogs: price syncs then leave the Shopify base price unchanged.
Add Odoo taxes to market catalog prices Odoo → Shopify Inside Map Price list with Shopify Market Catalog. Off by default. Adds each product's Odoo sales taxes to its market catalog price. Example: 40.61 with 8.1% tax becomes 43.90. Taxes marked Included in Price in Odoo are not added again, and the Shopify base price is not changed. Use it when your Odoo price lists are before tax and the Shopify market shows prices with tax.
Map Price list to Cost per item + Select Cost Price List Odoo → Shopify Inside Sync Odoo Pricelist. Shopify Cost per item comes from this Odoo pricelist instead of the product's cost. Products without a line keep their normal cost. Select Price List (sale price) can be left empty when this is set. On later syncs, Cost must be ticked under Update Product Fields.
Target Odoo Pricelist + Select Target Price List Shopify → Odoo Shopify prices are also written into this Odoo pricelist, for every product and variant. The product's own price keeps syncing as before.
Add fixed tax rate (%) on top of synced prices + Tax rate (%) Odoo → Shopify Adds this percentage to the Odoo price (and compare-at price) before it is sent to Shopify. Example: with 5%, 100 becomes 105. Use it when Odoo prices exclude tax and Shopify shows prices with tax.
Minimum sale price floor (same currency as Shopify) Both Products priced at 0 or below the floor are not synced.

Market catalog prices are updated after every Odoo → Shopify product or price sync, including large product syncs and price syncs where the base prices were already up to date. Only products already linked between Odoo and Shopify get a market price. This includes products you created in Shopify yourself, once a product sync has matched them by SKU or barcode. Market prices follow the same filters as the product sync: with Sync Product By Category, Sync Product By Tags or Sync only products which has stock available on Odoo. on, or a date range on a manual sync, only the products that match are updated. The catalog prices of other products are left as they are.

Only prices that changed are sent. A compare-at price you set on a catalog price in Shopify is kept: the app changes the price and leaves the compare-at price as it is.

Market catalog prices follow the price list rules the same way as the base price: a Fixed Price line gives exactly that price, and Discount and Formula lines start from the product's sales price. Lines for a variant, a product, a product category or all products are used. Products with no matching line keep their current catalog price. Add fixed tax rate (%) on top of synced prices changes only the base price, not the catalogs.

How a price list price is worked out

The app works out the same price Odoo shows for the price list, in the price list's own currency:

  1. 1
    It starts from the product's Sales Price, or its Cost when the line is based on cost, or the price another price list gives when the line is based on that price list.
  2. 2
    If that price is in a different currency than the price list, it is converted first, using the exchange rates in your Odoo (Accounting → Configuration → Currencies).
  3. 3
    Then the line's Discount, Rounding Method, Extra Fee and Margins are applied, in that order. A negative discount is a markup.

So a product with a 160 JOD sales price on a price list in AED, with a 30% markup rounded up to 1, syncs as 1,095 AED - not 208.

Important

Keep your currency rates up to date in Odoo. The app uses the rate Odoo itself would use for the company your Odoo connection is set to. If a currency has no rate in that company, the price is sent without being converted, and the sync log says so.

What is not covered

  • Fields or Apply On options that an extra Odoo module adds to a price list line, such as a percentage extra fee or a price rule for a brand or a designer. The app only knows Odoo's own price list fields. A rule whose Apply On it does not recognise is left out, and the product keeps its normal sales price - it is not applied to your whole catalogue.
  • Price list lines with a Min. Quantity above 1. Shopify prices are for one item.

Limits

  • Only one of the four tax options can be on, apart from Sync Tax-Included Price with Map Shopify Tax to Odoo Tax.
  • The Shopify tax list only knows taxes from orders of the last 60 days.
  • A pricelist mapped to a market catalog must give a price above 0, or the variant is skipped.
  • Every order currency must be active in Odoo.

Good to know

  • Test any tax change with one order and compare the totals before you rely on it.
  • Changing a tax option affects new orders only. Orders already in Odoo keep their taxes.
  • If the totals are off by the tax amount, the price-included setting of the Odoo tax usually does not match Shopify.

Troubleshooting

?
The Odoo total is higher than the Shopify total.
  • Shopify prices include tax, but Odoo adds tax again. Turn on Sync Tax-Included Price, or map to Odoo taxes with Included in Price.
  • Check that only one tax option is on.
?
The Odoo total is lower than the Shopify total.
  • Your Odoo tax is marked Included in Price, but Shopify prices exclude tax. Use a tax without Included in Price.
  • Check that the product in Odoo has a sales tax, or use Map Shopify Tax to Odoo Tax.
?
My Shopify tax is not in the Shopify Tax list.
  • The list comes from orders of the last 60 days. Wait for an order with the new tax, then click Refresh Tax Rates.
?
My Odoo tax is not in the list.
  • Click Refresh next to Tax Type, or Refresh Tax Rates in the tax mapping table.
  • Check that the tax is a sales tax and belongs to the company set in Configuration.
?
"Unable to populate Tax Type list options"
  • The app can't read taxes from Odoo. Check your Odoo connection and that the Odoo user can read taxes.
?
I can't tick a tax option.
  • Another tax option is on. Turn it off first. Order sync must be on as well.
?
"Each Shopify tax can only be mapped once per country."
  • Remove the second row with the same Shopify tax and the same Country.
?
"Order currency … is not active in Odoo."
  • Activate the currency in Odoo (Accounting → Configuration → Currencies), then click Resync on the order.
?
The order has the wrong pricelist.
  • Check Default Pricelist for Order Sync. It wins over everything else.
  • Check the customer's pricelist in Odoo.
  • Check that a pricelist exists in the order's currency for the order's company.
?
Market catalog prices are different from the prices I expect.
  • Open the price list in Odoo and check the line for the product. A Fixed Price line is sent as that price.
  • If your expected prices include tax and the Odoo price list doesn't, turn on Add Odoo taxes to market catalog prices.
  • Check the product's sales taxes in Odoo. Only taxes for the price list's company are added.
?
Market catalog prices did not update.
  • Check that Sync Odoo Pricelist and Map Price list with Shopify Market Catalog are on and every row is complete.
  • Run an Odoo → Shopify price sync.
  • Check that the products are linked (synced at least once) and the pricelist gives them a price above 0. For a product you created in Shopify yourself, run an Odoo → Shopify product sync first so it gets matched, then run the price sync.
  • Check your category, tag and stock filters under Product Settings. Products outside them keep their current catalog price.
11Advanced

Shopify permissions

5 min read

Shopify apps can only read or change what the store owner allows. This topic lists the access the app asks for when you install it, why it needs each one, and the optional permissions you grant later for some features.

What it does

There are two kinds of permissions:

  • Required permissions. Shopify asks you to approve these when you install the app. Without them the app can't sync.
  • Optional permissions. Shopify does not ask for these at install. You grant them only if you use the feature that needs them.

Required permissions

Permission (as Shopify shows it) Technical scope Why the app needs it
View and edit products read_products, write_products Product sync in both directions: create and update products, variants, prices, images, metafields, collections and market catalog prices.
View product listings read_product_listings See which products are published to the app's sales channel.
View and edit publications read_publications, write_publications Publish products created from Odoo to your sales channels.
View and edit inventory read_inventory, write_inventory Inventory sync: read and set stock levels.
View locations read_locations List your Shopify locations for location / warehouse mapping.
View and edit orders read_orders, write_orders Order sync: read orders, refunds and transactions, mark orders paid or cancelled, add tags, and create orders from Odoo.
View and edit draft orders read_draft_orders, write_draft_orders Draft orders to Odoo CRM leads, and Odoo orders sent to Shopify as drafts.
View and edit fulfillments read_fulfillments, write_fulfillments Send Odoo deliveries and tracking numbers to Shopify.
Fulfillment orders (assigned, merchant-managed, third-party) read_/write_assigned_fulfillment_orders, read_/write_merchant_managed_fulfillment_orders, read_/write_third_party_fulfillment_orders Fulfil orders from every kind of location, including apps and 3PL locations.
View and edit customers read_customers, write_customers Customer sync: read and create customers, addresses, tags and tax IDs.

The app also reads abandoned checkouts and customer data. Shopify treats customer names, emails, phones and addresses as protected customer data. The app has Shopify's approval to use them for sync.

Optional permissions

Permission Technical scope Used by What stops working without it
Store credit accounts read_store_credit_accounts Loyalty points & store credit The app can't read a customer's store credit.
Store credit transactions read_store_credit_account_transactions, write_store_credit_account_transactions Loyalty points & store credit The app can't add or take off store credit, so Enable loyalty points sync can't be turned on.
Returns read_returns, write_returns Enable Restock On Odoo for Refund Order Sync in Order sync Restocks you make in Shopify's Returns screen are not sent to Odoo. Refunds with restock still sync.

How to grant an optional permission

Store credit (Loyalty Points)

  1. 1
    Open Loyalty Points in the app menu.
  2. 2
    In the banner Allow access to Shopify store credit, click Grant permission.
  3. 3
    Shopify opens its own permission window. Review the store credit permissions and approve them.
  4. 4
    You see Store credit access granted. You can now tick Enable loyalty points sync.

If you close the window or decline, you see Store credit access was not granted. Click Grant permission again when you are ready.

Good to know

Loyalty Points is turned on for selected stores only. If you don't see it in the menu, contact support@techmarbles.com.

Returns

The app has no button for this permission yet. If you use Shopify's Returns screen to restock items and want those restocks in Odoo, contact support@techmarbles.com.

How to check or remove permissions

  • In Shopify admin, go to Settings → Apps and sales channels, open the app, and look at its permissions.
  • To take back all permissions, uninstall the app. The sync stops at once.
  • If you remove an optional permission, only the feature that needs it stops. For Loyalty Points, store credit changes then fail and show in the History tab.

Limits

  • Shopify decides which permissions can be optional. The required permissions can't be turned off one by one.
  • When the app adds a new required permission, Shopify asks you to approve the update the next time you open the app. Until you approve it, the feature that needs it can fail.

Troubleshooting

?
Shopify asks me to approve new permissions when I open the app.
  • The app was updated and needs more access. Approve it so all features keep working.
?
"Grant access to Shopify store credit before turning on loyalty points sync."
  • Click Grant permission on the Loyalty Points page and approve it, then save again.
?
"Could not request store credit access. Please try again."
  • Shopify's permission window did not open. Reload the app inside Shopify admin and try again.
?
"Could not confirm this store's Shopify permissions right now. Please try again."
  • Shopify did not answer. Wait a minute and save again.
?
Restocks from Shopify Returns don't reach Odoo.
12Monitor

Dashboard

17 min read

The Dashboard is the first page you see when you open the app. It shows whether Odoo is connected, a row of numbers about your order sync, and a table of every order the app has handled, so you can spot and fix a failed order quickly.

What it does

The dashboard has five parts, from top to bottom:

  • The page header, with the Odoo connection badge and the alert mails button.
  • Announcement banners, when we have published one.
  • Seven number cards (the metrics).
  • The orders table, with the tabs All, Synced, Not Synced and Skipped.
  • A help line at the bottom of the page.
Good to know

The dashboard only shows the order direction your store syncs right now (Order Sync Direction in Order Settings). If orders sync from Shopify to Odoo, you see those orders. If you switched to Odoo to Shopify, you see the orders the app created in Shopify from Odoo. The number cards follow the same rule.

If the app is not set up yet, opening the dashboard takes you to the Configuration page first.

Connection status

The badge at the top right of the page tells you if the app can log in to your Odoo:

Badge What it means
✓ Odoo account is connected (green) The app can reach your Odoo and your login works.
✗ Odoo account is not connected - Click to configure (red) The app cannot log in to Odoo with the saved details. Click the badge to open the Configuration page and check your Odoo URL, database, user and password or API key.

While the badge is red, nothing can sync to or from Odoo.

Announcement banners

When we release something new, a blue (or other colour) banner can appear above the number cards. It shows the message and the date it was published, as Launched at followed by the date. Click See more updates to open the App Updates tab on the Logs page, which keeps every announcement we have made. See App updates.

If there is no current announcement, no banner is shown.

Metrics

Each card shows one number. The numbers load when the page opens and update each time the orders table refreshes.

Card What it shows
Total Orders Synced How many orders have synced successfully, in total.
Failed Orders How many orders are not synced. This is the same list as the Not Synced tab. When it is above zero, the number turns red and shows in Not Synced tab next to it.
Sync Success Rate The share of orders the app received in the last 30 days that synced, as a percentage. Next to it you see the counts, for example 45/50 · 30 days. It shows - when no orders came in during the last 30 days.
Orders Synced Today How many synced orders were placed today, in your store's time zone.
Last Order Synced The date of the newest synced order, for example Today at 3:15 PM. It shows - if no order has synced yet.
Inventory Last Synced When the last inventory sync run finished, for example Yesterday at 9:00 AM. It shows - if inventory has never synced.
Customers How many customers the app has synced and keeps track of.
Good to know

Failed Orders also counts orders that are still syncing, because they are not synced yet. A number that drops back after a minute or two was most likely an order in progress, not a real failure.

Orders Synced Today and Last Order Synced use the date the order was placed in Shopify, the same date shown in the Date column. They do not show the moment the sync ran. An old order you resync today does not count as "today".

All dates in the app use your Shopify store's time zone. Recent dates are shown as Today at …, Yesterday at …, or the month and day, for example Oct 12 at 4:05 PM.

Orders table

The table lists the orders the app has handled, newest first.

Tabs

Tab What it lists
All Every order the app has handled.
Synced Orders that synced successfully.
Not Synced Orders that failed, and orders that are still syncing. This is where you resync.
Skipped Shopify orders from the last 60 days that never reached the app. See Skipped orders.

Toolbar

Above the table, on the All, Synced and Not Synced tabs:

  • Show: choose how many orders to show per page: 10, 25, 50 or 100. The default is 10.
  • Showing 1–10 of 250 orders: which rows you are looking at, and how many orders the tab holds.
  • Resync 3 Orders: appears on the Not Synced tab when you have ticked one or more orders. See Retry and resync.
  • Export Orders: downloads the rows on the current page as a CSV file. See Export orders.
  • Refresh: reloads the table and the number cards.

Search and sort

Use the search field (Searching in all) to find an order. You can type part of:

  • the order name, for example #1052 or 1052
  • the Shopify order ID
  • the Odoo order ID

The table updates a moment after you stop typing. Clear the field, or click Cancel, to see all orders again.

Use the sort button to change the order of the rows:

  • Order name: Ascending or Descending
  • Date: Oldest first or Newest first (the default)

On a phone, the search field is called Search orders and the sort list is called Sort by.

Columns

Column What it shows
Order The Shopify order name, for example #1052.
Shopify Order Id The Shopify order number. Click it to copy it. A short message confirms: Copied … to clipboard!
Date When the order was placed in Shopify, in your store's time zone.
Sync Status Where the order stands. See Sync statuses.
Action Buttons for this order. See Row actions.

Pagination

Use the left and right arrow buttons below the table to move between pages. The text next to them, for example 11–20 of 250 orders, shows where you are. Changing the tab, the sort or the page size takes you back to page 1.

Sync statuses

Status What it means
Success (green) The order synced. It exists in Odoo (or in Shopify, if you sync orders from Odoo).
Success + Invoice only (blue) The order synced as an Odoo invoice only. No sale order was created. This happens when Enable Invoice Sync Only is on. Hover the badge to read: "Synced as an Odoo invoice only — no sale order was created".
Success + Invoice pending (yellow) The order is accepted in invoice-only mode, but the invoice is not created yet. It will be created once the order matches your invoice policy, for example when it is paid. There is nothing in Odoo to open yet.
Syncing (blue, with a spinner) The app received the order and is working on it.
Failed (red) + red alert icon The sync stopped with an error. Hover the red alert icon to read the error message.
Good to know

While any order on the page shows Syncing, the table refreshes by itself every 8 seconds, for about 2 minutes. Click Refresh if an order is still syncing after that.

Row actions

The Action column changes with the status of the order.

When the order shows Syncing:

  • You only see a spinner (Sync in progress). There are no buttons, so you can't resync or delete an order while it is still being processed.

When the order shows Failed:

  • Resync Order (circular arrow icon): tries the sync again. See Retry and resync.
  • Delete Order (red trash icon): removes the order from the app. See the warning below.

When the order shows Success:

  • View on Shopify (Shopify icon): opens the order in your Shopify admin. For an order the app created from Odoo that is still a draft in Shopify, it opens the draft order.
  • View on Odoo (Odoo icon): opens the sale order in Odoo. The tooltip says View Invoice on Odoo for an invoice-only order and View POS Order on Odoo for an order synced to Odoo Point of Sale. If you sync orders to Odoo CRM, the link opens the CRM record. The Odoo icon is hidden when there is nothing to open yet (Invoice pending).
  • Delete Order (red trash icon): removes the order from the app.

The Resync Order button is not shown for orders that were created in Shopify from Odoo. Resync always sends a Shopify order to Odoo, so for those orders it would make a second copy of the Odoo sale order.

Delete Order

Delete Order removes the order from this app only. It does not delete anything in Shopify or in Odoo. Before it deletes, the app asks you to confirm: "Are you sure you want to delete order … ? This action cannot be undone."

Important

The app's order record is the only link between the Shopify order and the Odoo sale order. Once you delete it:

  • For a Shopify order: if the order is resynced or edited in Shopify afterwards, the app no longer knows the Odoo sale order exists. It creates a duplicate Odoo sale order and a duplicate delivery. If you want the order gone from Odoo, delete the Odoo sale order first.
  • For an order created from Odoo: if it is synced again from Odoo, a duplicate Shopify order is created. If you want it gone from Shopify, delete the Shopify order first.

Use Delete Order to clear a test order or an order you have already removed on the other side. Don't use it to "reset" an order that is already in Odoo.

Retry and resync

Resync one order

  1. 1
    Open the Not Synced tab.
  2. 2
    Hover the red alert icon to read why the order failed.
  3. 3
    Fix the cause. For example, create the missing product in Odoo, or correct the SKU.
  4. 4
    Click Resync Order (circular arrow icon) on the row.

The app fetches the order from Shopify again and sends it to Odoo straight away. When it works, you see "Order … successfully synced." and the row turns Success (or leaves the Not Synced tab). When it fails, you see "Sync failed. Please check the error details." and the error stays on the row.

Resync checks Odoo for a sale order with the same customer reference first. If an earlier attempt already created the sale order, resync uses it and does not create a second one.

Resync several orders

  1. 1
    Open the Not Synced tab. Checkboxes appear only on this tab.
  2. 2
    Tick the orders you want to retry, or tick the box in the header to select every order on the page.
  3. 3
    Click Resync 3 Orders (the number matches your selection) in the toolbar.

The app retries the orders one by one. Each row updates as it goes. When all are done, you see Resync Completed. Orders that synced disappear from the Not Synced tab. Orders that failed again show their new error.

Automatic retries

You don't always have to click Resync:

  • If an order fails because your Odoo could not be reached (for example during Odoo maintenance or a short outage), the app keeps retrying it in the background, with growing gaps between attempts, until Odoo answers again. It does this for orders up to about 7 days old.
  • If an order stays on Syncing because the sync stopped half way, the app picks it up again by itself after about 35 minutes.

Errors caused by your data, such as a missing SKU or missing customer details, are not retried automatically. They fail the same way every time until you fix the cause and click Resync Order.

Skipped orders

The Skipped tab answers the question "Why is this Shopify order not in Odoo?". It lists Shopify orders that the app has no record of at all, so they appear in none of the other tabs.

It only works when orders sync from Shopify to Odoo. If your store syncs orders from Odoo to Shopify, the tab says: "Orders sync from Odoo to Shopify on this store, so no Shopify orders are skipped."

What it shows

The line at the top says which period is covered, for example "Shopify orders since 2026-08-20 that are not in the app." The tab looks back 60 days. It never goes back further than your Start Date for Order Sync (or the day you installed the app, if you never set one), because older orders are left out on purpose.

Column What it shows
Order The Shopify order name. Click it to open the order in Shopify.
Date When the order was placed.
Total The order total and currency.
Reason Why the order was not synced (see below).
Action Sync now, to send the order to Odoo.

The reasons:

Reason What it means
Order status filter The order did not match Sync Orders By Status in Additional Order Settings (for example, you sync Only Paid Orders and it is not paid). This is your setting working as intended.
Tag filter The order does not carry the tags you chose in Sync Orders by Specific Shopify Tags. This is also your setting working as intended.
Not received No rule explains it. The app never got this order from Shopify, or it arrived while order sync was switched off. This is the one worth a look.
Cancelled in Shopify The order was cancelled in Shopify. It has no Sync now button.

Sync a skipped order

  1. 1
    Open the Skipped tab.
  2. 2
    Find the order. The search field filters the loaded rows by order name or Shopify order ID.
  3. 3
    Click Sync now.

Sync now sends the order to Odoo even if your status or tag rules would normally keep it out. When it works, you see "Order … synced to Odoo." and the row disappears from this tab (it now shows on the Synced tab). When it fails, you see "Order … could not be synced." and the error appears under the reason. Once an order is in Odoo, later changes to it keep syncing, even if it still doesn't match your tag rule.

Loading more

The tab loads about 50 skipped orders at a time, newest first. Click Load more at the bottom to see older ones. Click Refresh at the top of the tab to check Shopify again. Nothing is saved for this tab: the app asks Shopify each time you open it, so a large store can take a few seconds.

If there is nothing to show, you see No skipped orders. (or No skipped orders match your search.). If Shopify could not be reached, you see Could not load skipped orders.

Export orders

Click Export Orders to download the orders on the current page as a CSV file. The file is named after the tab you are on, for example orders_all.csv, orders_synced.csv or orders_not_synced.csv.

The file has these columns:

  • Order
  • Shopify Order ID
  • Date
  • Sync Status: Success, Success (Invoice only), Failed or Syncing
  • Error: the error message, for failed orders
Good to know

The export contains only the rows on the page you are looking at. To export more orders at once, set Show to 100 first, and export each page. The button is greyed out when the page is empty. An Invoice pending order is exported as Success.

Personalized alert mails

Personalized alert mails is a paid add-on that emails you when an order fails to sync because required information is missing, so you can fix it without checking the dashboard.

The button in the page header (also on the Logs page) says Activate Personalized Alert Mails until the service is active, and View Personalized Alert Mails after that.

What the window explains:

  • Important: It covers order sync failures caused by missing required information that needs a person to check. It does not cover errors made by the app or technical system errors.
  • Pricing: $30 per year. Once active, you get an email with the order details and the failure reason each time an order fails for missing data.

How to activate

  1. 1
    Click Activate Personalized Alert Mails.
  2. 2
    Enter the address in Email address for notifications.
  3. 3
    Click Request activation.

You see "Activation request submitted successfully. Our support team will contact you soon." Our support team then sends you a payment link. Once the payment is verified, the alert mails are switched on and you are told.

When the service is active, the window shows a green box with the address the alerts go to, Activated from: with the start date, and Active until: with the end date (one year later). The email field can't be changed from the app while the service is active. Contact support to change it.

If the email address is not valid, you see Please enter a valid email address under the field. If the request fails, the reason is shown inside the window.

When an alert is sent

  • The app waits at least 5 minutes after a failure before it emails you. If the order syncs in the meantime (for example after an automatic retry), no email is sent.
  • You get one email per failed order, not one per retry.
  • Each email has the order number, the reason, the time and a link to the order in Shopify.

Help and support

At the bottom of the page you find Need help? with three links: Read the docs opens this help center, or contact us at support@techmarbles.com, or schedule a call books a call with our support team. A chat bubble is also available in the corner of the app.

The dashboard can also show a Love this app? card that links to other apps made by our team (View apps). Click Dismiss to hide it.

Troubleshooting

?
An order shows Failed. What do I do?

Hover the red alert icon on the row to read the error. Fix the cause in Odoo or Shopify (for example a missing product, a wrong SKU, or a missing country in the address). Then click Resync Order. The Logs page often has more detail. Search it for the Shopify order ID.

?
An order is stuck on Syncing

The table refreshes by itself for about 2 minutes. Click Refresh after that. A large order or a busy Odoo can take longer. If the order is still Syncing after about 35 minutes, the app retries it by itself. If it stays stuck, contact support with the order number.

?
An order from Shopify is missing from the dashboard

Open the Skipped tab. The Reason column tells you if your status or tag rule kept it out, or if the app never received it. Click Sync now to send it to Odoo anyway. Orders older than 60 days, or placed before your Start Date for Order Sync, are not listed there.

?
The badge says Odoo account is not connected

Click the badge. On the Configuration page, check your Odoo URL, database name, user and password or API key, and save. If you use Odoo Online and changed your password, an API key often works better.

?
Failed Orders shows a number, but the Not Synced tab looks fine

The card also counts orders that are still syncing. Click Refresh after a minute. Make sure you are on the Not Synced tab and that the search field is empty.

?
Orders Synced Today is 0 but I just resynced an order

Orders Synced Today counts orders placed today. An older order that you resynced today counts under its own order date.

?
I deleted an order and now it is in Odoo twice

Delete Order removed the link between the Shopify order and the Odoo sale order. When the order was edited or resynced, the app created a new sale order. Cancel or delete the extra sale order in Odoo. The Duplicate Orders - Odoo tab on the Logs page helps you find these. See Duplicate orders in Odoo.

13Monitor

Logs & tools

11 min read

The Logs page records what the app did and what went wrong, and gives you tools to find data problems that break a sync, such as two products with the same SKU. Open it from Logs in the app menu.

What it does

The page has five tabs, and a list of webhooks below them:

Tab What it is for
Logs Every sync event the app wrote down, with its result and message.
App Updates All the features and improvements we have announced, newest first.
Duplicate SKUs - Shopify Shopify variants that share the same SKU.
Duplicate SKUs - Odoo Odoo products that share the same SKU.
Duplicate Orders - Odoo Shopify orders that ended up as more than one sale order in Odoo.

Below the tabs, the Active Webhooks section lists the Shopify webhooks registered for your store.

The two duplicate tabs follow the product matching you chose on the Configuration page. If you match products by barcode, they are called Duplicate Barcodes - Shopify and Duplicate Barcodes - Odoo, and they check barcodes. If you match by Shopify variant ID, they are called Duplicate Variant IDs - Shopify and Duplicate Variant IDs - Odoo.

On a phone, the tabs are replaced by a drop-down list with the same five views.

The Activate Personalized Alert Mails button (or View Personalized Alert Mails) at the top of the page works the same as on the dashboard. See Personalized alert mails.

Good to know

Looking for products with no SKU or barcode? That check moved to the Missing SKUs tab on the Product Settings page (the name follows your product matching, for example Missing Barcodes).

Logs tab

The Logs tab is a list of events, newest first. The app adds a line when a sync starts, finishes or fails. For example:

  • an order was synced, updated, cancelled or refunded
  • a fulfillment was synced to Odoo, for example "Fulfillment synced to Odoo: WH/OUT/00005", or why it was not
  • a product, price or image import or export ran
  • an inventory sync ran, and how many items it updated
  • a customer import or export ran
  • an error came back from Odoo or Shopify, with the reason

Columns

Column What it shows
Log ID The number of the log line, for example #10432. Quote it when you contact support.
Created Date When the event happened, in your store's time zone.
Operation Which part of the sync wrote the line, for example customers, product import, product export, orders or inventory.
Status success (green) or failed (red).
Message What happened, in words. For a failure, this is the reason.
Shopify Order ID For order events, the Shopify order ID. Click it to open the order in Shopify.
Odoo Order ID For order events, the Odoo sale order ID the app has linked to that order. Click it to open it in Odoo.
Good to know

Created Date is the time the event was logged, not the order date. A refund logged three days after the order shows the day of the refund, so the lines stay in the order they happened.

On a phone, each log line is a card titled Log #…, with the date, operation, Message, and the Shopify Order and Odoo Order links when there are any.

  • All, Success and Failed: show every line, only successful lines, or only failures. Use Failed to see what needs your attention.
  • Search (Searching in all): type a Shopify order ID to see every line about that order. The search matches the Shopify order ID only. It does not search the message text or the order name.

The list shows 10 lines per page. Use the arrow buttons below the list to move between pages.

Buttons

  • Refresh: loads the newest log lines.
  • Clear Logs: deletes every log line for your store.
Important

Clear Logs deletes all log lines straight away. It does not ask you to confirm, and you can't undo it. If you are waiting on support to look into a problem, don't clear the logs until they are done.

How long logs are kept

Log lines are kept until you click Clear Logs. They are also deleted when you uninstall the app.

Duplicate SKUs in Shopify

The app matches Shopify variants to Odoo products by SKU (or by barcode or variant ID, depending on your Configuration). When two variants share the same SKU, the app can't tell which one an Odoo product belongs to. That leads to the wrong product being updated, wrong stock numbers, or orders with the wrong line.

The Duplicate SKUs - Shopify tab reads every active product in your Shopify store and lists each variant whose SKU is also used by another variant.

Column What it shows
SKU (or Barcode, Variant ID) The shared value.
Product Name The Shopify product.
Variant Title The variant, for example Red / Large.
Product ID The Shopify product ID.
Duplicate Count How many variants share this value, for example 3 duplicates.

Each variant that shares the value gets its own row, so a SKU used three times shows three rows.

What is not checked:

  • Draft and archived products.
  • Variants with an empty SKU or barcode.

In variant ID mode, Shopify variant IDs are always unique, so this tab normally shows No duplicate Variant IDs found in Shopify.

Fix a duplicate in Shopify

  1. 1
    Open the product in Shopify from the Product Name and Product ID.
  2. 2
    Give each variant its own SKU (or barcode), so that each one matches only one Odoo product.
  3. 3
    Back in the app, click Refresh to check again.

Duplicate SKUs in Odoo

The Duplicate SKUs - Odoo tab does the same check on the Odoo side. It reads your Odoo products and lists each one whose Internal Reference (or barcode, or the field that holds the Shopify variant ID) is also used by another product.

Column What it shows
SKU (or Barcode, Variant ID) The shared value.
Product Name The Odoo product.
Product ID The Odoo product (variant) ID.
Company ID The Odoo company the product belongs to, or - if it is shared by all companies.
Duplicate Count How many products share this value.

What is checked:

  • Products of the company you chose on the Configuration page, plus products that belong to no company.
  • Active products only. Archived products are left out.

What is not checked:

  • Service products.
  • Products with an empty value.

Fix a duplicate in Odoo

  1. 1
    Open the product in Odoo by its Product ID or name.
  2. 2
    Change the Internal Reference (or barcode) so that each product has its own, or archive the product you no longer use.
  3. 3
    Back in the app, click Refresh to check again.
Good to know

These checks read your whole catalog live from Shopify or Odoo. On a large store the tab can take a little while to load. Nothing is changed in Shopify or Odoo: the tabs only read.

Duplicate orders in Odoo

The Duplicate Orders - Odoo tab finds Shopify orders that ended up as more than one sale order in Odoo. This can happen, for example, after Delete Order was used on the dashboard, after a manual import next to the sync, or when someone duplicated a sale order in Odoo.

It looks at orders the app synced from Shopify to Odoo in the last 30 days. For each one, it searches Odoo for sale orders whose Customer Reference is the Shopify order name or the Shopify order ID. When it finds two or more, it lists them all.

Column What it shows
Shopify Order The Shopify order name. It is shown on the first row of the group. The other rows of the same group show ↳.
Odoo Order The Odoo sale order name, for example S00123.
Odoo ID The Odoo sale order ID.
State The Odoo state: sale or done (green), cancel (red), or another state such as draft (yellow).
Order Date The order date in Odoo.
Total The order total in Odoo.
Company The Odoo company of the sale order.
Mapping Tracked by app (green) for the sale order the app has linked to the Shopify order. Extra (yellow) for every other copy.
Duplicate Count How many sale orders this Shopify order has, for example 2 orders.

The orders with the most copies are listed first, then the newest.

Clean up a duplicate order

  1. 1
    Find the group for the Shopify order.
  2. 2
    Keep the row marked Tracked by app. That is the sale order the app keeps updating with payments, fulfillments, edits and refunds.
  3. 3
    In Odoo, cancel or delete the rows marked Extra, after checking that nothing was delivered or invoiced from them.
  4. 4
    Click Refresh to check again.
Important

Don't cancel the Tracked by app sale order and keep an Extra one. The app will keep sending updates to the tracked one.

If there are no duplicates, you see "No duplicate orders found in Odoo for orders synced by this app in the last 30 days." If Odoo can't be reached, a red message says "Could not read orders from Odoo. Please try again."

This tab only checks orders that sync from Shopify to Odoo. Orders created in Shopify from Odoo are not checked.

App updates

The App Updates tab shows the App updates timeline: "All feature announcements and improvements we have released for this app, newest first."

  • Each entry shows the date it was published and the message.
  • The newest entry has a Latest badge.
  • The coloured dot shows the kind of update (blue for information, green for success, yellow for a warning, red for something important).
  • The tab shows the 6 newest updates first. Click See … more updates to load the rest.

These are the same announcements that appear as banners on the dashboard. A banner only stays on the dashboard for a while. This tab keeps the full history. The See more updates link on a dashboard banner opens this tab.

If nothing has been published yet, you see No updates yet and "New feature announcements will appear here as soon as they are released."

For a full list of changes, including fixes, see the Changelog.

Active webhooks

Webhooks are how Shopify tells the app, right away, that something changed: a new order, an order edit, a cancellation, a refund, a product or stock change. The Active Webhooks section at the bottom of the Logs page lists the webhooks registered for your store.

Column What it shows
Webhook The Shopify event, for example ORDERS_CREATE, ORDERS_UPDATED, ORDERS_CANCELLED, REFUNDS_CREATE, PRODUCTS_UPDATE, INVENTORY_LEVELS_UPDATE or CUSTOMERS_UPDATE.
URL The app address Shopify sends that event to.

The list is read-only. Which events show depends on the syncs you have turned on. If you see No active webhooks found. (on a phone) or an empty list, Shopify has no webhooks for the app. Real-time order, refund and stock updates then can't reach the app. Contact support.

Good to know

The list shows up to 10 webhooks.

Help and support

At the bottom of the Logs page, a Need help? line links to this guide and lets you schedule a call with our support team. The Love this app? card with our other apps can also show here. Click Dismiss to hide it.

Troubleshooting

?
I can't find the log line for an order

Search with the Shopify order ID (the number in the Shopify Order Id column on the dashboard), not the order name like #1052. Also check that the All filter is selected, and that the logs were not cleared.

?
The Odoo Order ID is empty on an order log line

The order is not linked to an Odoo sale order yet, for example because the sync failed before the sale order was created. Check the Message column, and the order on the dashboard.

?
A duplicate tab shows nothing but products still match wrongly

The checks skip draft and archived products in Shopify, archived products in Odoo, and products of other Odoo companies. A duplicate can hide there. Also check that the match field on the Configuration page (SKU, barcode or variant ID) is the one you expect.

?
The duplicate tabs take long to load

They read your whole catalog live. On a store with many thousands of products, wait for the page to finish. Click Refresh to run the check again later.

?
Duplicate Orders - Odoo shows an order I already cleaned up

Click Refresh. The tab only updates when you open it or click Refresh. A cancelled sale order still counts as a copy: it shows with the cancel state. Delete it in Odoo if you want it gone from the list.

14Help

Troubleshooting

25 min read

Something did not sync the way you expected? This page starts from what you see, such as a missing order or wrong stock, and walks you to the cause and the fix. For the exact text of an error, look it up in Error messages.

First checks

Most problems are found with these five checks. Do them first.

  1. 1
    Open the Dashboard and look at the badge at the top. If it says ✗ Odoo account is not connected - Click to configure, nothing can sync. Fix the connection first (see Connection problems).
  2. 2
    Open Logs. Search for the Shopify order number, or filter on Failed. The newest line for that order or sync tells you what went wrong. See Logs & tools.
  3. 3
    Open the settings page for that sync and check that it is turned on and that you clicked Save. A change you did not save is not used.
  4. 4
    Check the sync direction. Products, stock, orders and customers each sync one way at a time. If Product Sync Direction is Odoo → Shopify, a product you create in Shopify is not sent to Odoo.
  5. 5
    Check how products are matched. In Configuration, Odoo SKU/Barcode Mapping says whether the app matches by SKU (Internal Reference), Barcode or Shopify Variant ID (Custom Odoo Field). A product with an empty or duplicate value cannot be matched.
Good to know

The Logs page shows the app's own messages. Odoo's own error text is often included after a colon, for example "Error creating order on Odoo: …". The part after the colon comes from Odoo and names the real cause.

Connection problems

The badge says Odoo is not connected

  1. 1
    Open Configuration. Look at the message under Odoo Connection.
  2. 2
    Invalid Odoo Host Url means the Server URL is wrong or the server did not answer. Use the full address with https://, for example https://mycompany.odoo.com. Open it in a browser to check that it loads.
  3. 3
    Odoo is reachable but its external API is not responding. means the server answers but blocks the API. On self-hosted Odoo, ask your IT team to allow /xmlrpc/2/* and /jsonrpc through the proxy or firewall. On Odoo Online, check that your Odoo plan allows external API access.
  4. 4
    Invalid Odoo account credentials., or a message on one field, means the login failed. Check the Database Name, the Username (the user's Odoo login, usually an email) and the Password / API Key.
  5. 5
    Click Establish Connection again.

Each message is explained in Error messages and in Getting started.

Syncs stopped working after weeks of working fine

The saved login no longer works. Common causes:

  • The Odoo user's password was changed, or the API key was deleted or expired.
  • Two-factor authentication was turned on for the Odoo user. A password no longer works for the API. Use an API key.
  • Your Odoo server stopped accepting passwords for API access. Odoo Online does this. Use an API key.
  • The Odoo trial ended, the database was renamed, or the domain changed.

How to fix it:

  1. 1
    In Odoo, make a new API key for the same user (avatar > My Profile > Account Security > New API Key).
  2. 2
    In the app, open Configuration and paste the key into Password / API Key.
  3. 3
    Click Establish Connection.

Changing only the username or the password/API key keeps all your settings. Reconnecting also ends any pause the app had put on calls to your Odoo. Then resync the orders on the Not Synced tab that failed while the login was broken.

Important

Changing the Server URL or Database Name is treated as a new Odoo database. The app turns syncs off and clears Odoo choices such as journals, taxes, warehouses and locations. See Change or disconnect Odoo.

Odoo is down, slow or in maintenance

When Odoo does not answer, the app does not lose your data:

  • Orders are retried automatically several times, over about half an hour. Orders received while Odoo is down are synced when it is back.
  • After repeated failures, the app pauses calls to that Odoo for about 10 minutes, then tries again. Log lines then say "Odoo host unreachable (cached)".
  • Stock sync stops without changing Shopify. It never writes zeros because Odoo did not answer.

If your Odoo has a nightly maintenance or backup window, orders placed in that window may fail and wait for a retry. Check the Not Synced tab the next morning and click Resync Order for any that are left.

Shopify says "Reconnect required"

The app's connection to Shopify has expired. Your billing is not affected, but the app cannot read or write your store.

  1. 1
    Reload the app page in Shopify admin.
  2. 2
    Approve the Shopify permission prompt.

Orders that failed with "the Shopify connection for this store has expired" can then be resynced from the Not Synced tab. See Shopify permissions.

A list of companies, journals, taxes, warehouses or locations is empty

The app reads these lists from Odoo when you open the page.

  1. 1
    Check that the badge says Odoo is connected.
  2. 2
    Click Refresh next to the list.
  3. 3
    Check that the Odoo user can see the record. A user who is not allowed in a company does not see its journals, warehouses or locations.
  4. 4
    If you just installed an Odoo app (for example Point of Sale, CRM or Loyalty), wait up to 15 minutes, or reconnect in Configuration to make the app check again at once.

Products not syncing

Products from Odoo do not appear in Shopify

  1. 1
    Check Product Sync Direction is Odoo → Shopify.
  2. 2
    Check the filters: Sync Product By Category, Sync Product By Tags and Sync only products which has stock available on Odoo. A product outside the filter is skipped.
  3. 3
    Check Only update existing products. With it on, new products are never created.
  4. 4
    Check that every variant has a SKU or barcode in Odoo (the value you match on). At the end of each sync, Logs show one line, "Products missing SKU(Reference/Barcode) on Odoo: … products were skipped in this sync", with the count and up to 10 example product names.
  5. 5
    Check Minimum sale price floor. A product priced at 0 or below the floor is not synced.
  6. 6
    Check the product in Odoo is active and can be sold.
  7. 7
    Open Product Sync Status to see each product's status, and click Sync on one row to try it on its own.

If Set products in draft state on import for new products is on, new products arrive in Shopify as drafts. They are there but not visible in your store.

Products from Shopify do not appear in Odoo

  1. 1
    Check Product Sync Direction is Shopify → Odoo.
  2. 2
    Check Sync Shopify Product By Collection and Sync Shopify Product By Tags.
  3. 3
    Draft products are skipped unless Sync Draft Products is on.
  4. 4
    Every variant needs the matching value (SKU or barcode). Logs show "Product missing SKU(Reference/Barcode) on Shopify".
  5. 5
    Open the export progress banner. It shows how many products were synced, skipped or failed. Click Retry failed or skipped products to try the failed ones again.
  6. 6
    Look in Logs for "Product not synced to Odoo: …". The text after "=>" is Odoo's reason, for example a required field or a permission error.

The wrong product was matched, or one product updates another

This is almost always a duplicate SKU or barcode.

  1. 1
    Open Logs and check the Duplicate SKUs - Shopify and Duplicate SKUs - Odoo tabs. (The tab names follow your matching field.)
  2. 2
    Give each variant its own value, in both Shopify and Odoo.
  3. 3
    Resync the affected products or orders.

If you cannot keep SKUs unique, switch Odoo SKU/Barcode Mapping to Shopify Variant ID (Custom Odoo Field). See Product sync.

If you connected the app to a new Odoo database, the product links saved for the old database are checked before they are used. A link is ignored when its Odoo product now belongs to a different product, so a new Odoo product is not added to an existing Shopify product by mistake.

Some variants or options are missing in Shopify

  • Shopify allows at most 3 options per product. If the Odoo product has more attributes, the first 3 are used and the log line names the rest.
  • Shopify can refuse variants, for example two variants with the same option values. The log line starts with "Product sync (Odoo→Shopify): Shopify refused to add …" and lists Shopify's reasons.
  • A variant with no SKU or barcode is skipped. At the end of the sync, Logs show "Product variants missing SKU(Reference/Barcode) on Odoo: … variants were skipped in this sync", with up to 10 of the products they belong to.

Prices do not change

  1. 1
    Prices sync with the product. Check that Price is ticked in Update Product Fields from Odoo to Shopify (or from Shopify to Odoo) for products that already exist.
  2. 2
    To push prices only, use Sync Prices and check the Price sync direction in the box before you confirm.
  3. 3
    If you use Sync Odoo Pricelist, the price comes from that pricelist, not from the product's sale price.
  4. 4
    If Add fixed tax rate (%) on top of synced prices is on, the Shopify price is higher than the Odoo price on purpose.
  5. 5
    Logs saying "No mapped product prices to update on Shopify." mean no product is matched yet. Sync the products first.

See Taxes & pricelists.

Cost per item does not change (Odoo → Shopify)

The cost is sent when the app creates the product. After that it changes only when you ask for it:

  1. 1
    Tick Cost in Update Product Fields from Odoo to Shopify, then click Save.
  2. 2
    Run Import Products, or turn on Enable Auto Product Sync so the daily run updates it.
  3. 3
    Sync Prices does not update the cost. It sends sale prices only.
  4. 4
    If Map Price list to Cost per item is on, the cost comes from that price list, not from the Odoo product cost. Products with no line in the list keep the cost they already have.
  5. 5
    A log line saying "No products to import in Shopify." means every product already exists, so nothing was changed. That is what you see when Update Product Fields is off.

See Update Product Fields.

Images do not sync

  • Remove the existing images first. The import and export boxes say so: images that are already there are not replaced.
  • All Images can hit Shopify or Odoo limits. Run it again until all images are in, or use Default Images Only.
  • Logs saying "Shopify is rate limiting the sync — retrying shortly…" are normal. The sync waits and continues.

The product export looks stuck

  1. 1
    Open Product Settings. The banner shows progress and an estimated time. Large catalogs can take several hours, and you can leave the page.
  2. 2
    If nothing moves for a long time, click Cancel export & reset, then start the export again.
  3. 3
    "Product sync was completed recently. Please wait at least 5 minutes…" means you must wait 5 minutes between two runs.

Bundles or kits

The app does not create bundle or kit products. Sync the component products, then build the bundle in Shopify and the kit (Bill of Materials) in Odoo by hand, with the same SKU or barcode. Kit stock and deliveries then sync with the kit options. See Kit products.

Stock is wrong

Stock in Shopify does not match Odoo

Check these settings on Inventory Settings:

  1. 1
    Inventory Sync Direction. Only one direction syncs.
  2. 2
    Choose Quantity Type to Sync: Quantity Available, Quantity On Hand or Quantity Forecasted give different numbers. Compare the same figure in Odoo.
  3. 3
    Shopify Target Type: which Shopify field is written (Available or On Hand).
  4. 4
    Combine Odoo available + Shopify committed adds Shopify's committed units on purpose.
  5. 5
    Sync Odoo Incoming Qty To Shopify Incoming Qty changes only Shopify's incoming figure.
  6. 6
    Do not sync zero stock skips products with 0, so Shopify keeps its old number.
  7. 7
    Location mapping. Each Shopify location gets the stock of the Odoo locations mapped to it. A parent location includes its sublocations. With Skip location mapping, all stock goes to your default Shopify location.
  8. 8
    Sync Inventory by Category or Sync Inventory by Collection limit which products are synced.

Then click Process Inventory Sync to sync now, and compare again.

One product's stock never updates

  • In Shopify, the variant must have Track quantity on and be stocked at the mapped location.
  • The SKU or barcode must be the same in both systems, and must not be duplicated.
  • Archived Shopify products and inactive Odoo products are skipped.
  • Check that the product is inside your category or collection filter.

Stock is updated twice, or goes back after an order

Orders already change stock in Odoo through their deliveries. If you also sync stock from Shopify to Odoo, the same sale can be counted twice. Use one stock direction and let orders move the stock. See Inventory sync.

An inventory sync will not start

  • "Please enable Stock Sync or inventory location mapping to process inventory": turn on stock sync for the direction you use, add a location mapping (or tick Skip location mapping), and click Save.
  • "An inventory sync is already running for this store": wait for it to finish, or click Stop on the progress card. A run that hangs is released automatically after about 2 hours.

Orders missing or failed

The order is not on the Dashboard at all

Open the Skipped tab on the Dashboard. It lists Shopify orders from the last 60 days that the app did not sync, with a reason:

Reason What it means What to do
Cancelled in Shopify The order was cancelled before it synced. Nothing, unless you want it in Odoo. Then click Sync now.
Order status filter Sync Orders By Status is set to paid or fulfilled orders, and this order was not. It syncs on its own when it becomes paid or fulfilled. Or click Sync now.
Tag filter Sync Orders by Specific Shopify Tags is on and the order has none of the tags. Add the tag to the order, or click Sync now.
Not received The app never got the order from Shopify. Click Sync now. If many orders show this, contact support.

Sync now syncs the order whatever your rules say.

Orders created before Start Date for Order Sync are not synced and are not listed. The start date is the day you installed the app unless you changed it. To sync older orders, set an earlier start date in Additional order settings and click Save.

The order is on the Not Synced tab with an error

  1. 1
    Hover the red alert icon to read the error.
  2. 2
    Find the message in Error messages.
  3. 3
    Fix the cause in Shopify or Odoo. Common causes: a product that is missing or has no SKU, a duplicate SKU, a missing country in the address, a customer with no email or phone, an inactive currency, or an Odoo permission.
  4. 4
    Click Resync Order. To retry many orders, tick them and click the resync button in the toolbar. Resync up to 300 orders at a time.

Errors caused by Odoo being briefly unavailable are retried automatically. Errors caused by your data fail the same way every time until you fix the cause.

The order shows "Syncing" for a long time

  • The order is waiting in the queue. During a large bulk resync or a busy sale, this can take several minutes.
  • Odoo did not answer. The order is retried automatically.
  • If it is still syncing after an hour, open Logs for that order. If the last line is "Order sync process started." with nothing after it, click Resync Order.

The order is in Odoo, but lines, discounts, shipping or taxes are wrong

  • A line is missing: the order may have been fully refunded or edited to quantity 0 before it synced. Lines with no quantity left are not sent.
  • Discount missing or doubled: check Default Discount Product Mapping and Map Discount to Product line item in Additional order settings. Logs show "Discount product not found for the code (SKU): …" when the mapped product does not exist.
  • Shipping missing: check Default Shipping Product Mapping or Map Shopify Shipping Method to Odoo Shipping Product. Logs show "Shipping Product not found for the code (sku) : …".
  • Total differs by the tax amount: your prices include tax in Shopify but the Odoo tax is not "included in price", or the other way round. Look at Sync Tax-Included Price and Map Shopify Tax to Odoo Tax. Only one tax option should be on. See Taxes & pricelists.
  • Wrong price list prices: the app sets a pricelist on each order. Use Default Pricelist for Order Sync, or Disable Pricelist Mapping (Let Odoo Decide).
  • A custom item (no product in Shopify) is synced as a service product called "Shopify custom item" (SKU SHOPIFY-CUSTOM-ITEM).
  • A product deleted in Shopify before the order synced is created in Odoo as a service product, with a note that it was deleted on Shopify.

Changes to the Shopify order do not reach Odoo

  1. 1
    Turn on Enable Comprehensive Order Editing in Order sync. Without it, edits to lines are not sent.
  2. 2
    Only unfulfilled or partly fulfilled orders are updated.
  3. 3
    The Odoo order must be in one of the states you allowed. Logs show "Order update skipped: Order state '…' not in allowed states".
  4. 4
    Once Odoo has a validated delivery, line changes are not applied. Logs show "Order line changes not applied: the Odoo order already has a validated delivery".
  5. 5
    Wait at least 2 minutes between two edits of the same order.
  6. 6
    If the invoice is already paid or in payment, it is not changed.

The order went to the wrong company, warehouse or sales team

  • Company: Multi-company setup uses order tags. The first row whose tag is on the order wins. Orders with no matching tag go to the main Company.
  • Warehouse: Map Odoo Warehouse Based on Order Tags decides first, then Default Warehouse to Sync Order Delivery.
  • Sales team: Sales Team Mapping must match the team's name in Odoo exactly.

The same order is in Odoo twice

  1. 1
    Open Logs > Duplicate Orders - Odoo to see them.
  2. 2
    Cancel the extra sale order in Odoo.
  3. 3
    Common causes: you clicked Delete Order and then resynced, someone created the order in Odoo by hand, or two stores sync to one Odoo with the same order numbers.

Resync itself is safe. It looks for an Odoo order with the same customer reference first and reuses it.

Orders from Odoo are not created in Shopify (Odoo → Shopify)

  1. 1
    Check Order Sync Direction is Odoo → Shopify, Enable Order Sync is on, and you clicked Save.
  2. 2
    Only orders in the states chosen in Sync Odoo orders in these states are sent. The default is confirmed sales orders only.
  3. 3
    Orders created in Odoo before the start date are never sent.
  4. 4
    If Only sync orders with these tags has tags, the Odoo order needs one of them.
  5. 5
    New Odoo orders are picked up every 5 minutes. Click Sync Orders From Odoo → Shopify to run it now for a date range.
  6. 6
    Read the log line "Odoo order … not pushed to Shopify: …". It gives the reason, such as a product with no internal reference (SKU) that Shopify does not have under your product matching field, or a currency your Shopify store cannot hold.

Shopify POS orders fail

  • Sync Confirmed Shopify POS Orders to Odoo needs the Odoo Point of Sale app.
  • Every Shopify location that sells in person must be mapped in Map Shopify Locations to Odoo POS Configuration. Unmapped locations fail.
  • Each payment method on the order must exist, with the same name, on the mapped Odoo POS configuration.

Shipped in Odoo but not fulfilled in Shopify

  1. 1
    In Order Settings, check that Fulfillment status (Odoo → Shopify) is Hourly (cron) or Real-time (webhook), not Off, and that you clicked Save.
  2. 2
    In Odoo, check that the delivery is validated (Done). Deliveries that are waiting, ready or cancelled are not sent.
  3. 3
    With a two- or three-step delivery (pick, pack, ship), the last step must be done.
  4. 4
    Wait. Hourly sync runs once an hour. Real-time sync needs the Odoo automation rule to be set up (see Webhooks).
  5. 5
    The order must have been synced by the app. An order created by hand in Odoo has no link to Shopify.
  6. 6
    To sync now, click Sync Order Status From Odoo → Shopify on Order Settings. It checks orders from the last 14 days.
  7. 7
    If only some lines were delivered, Shopify gets a partial fulfillment for those lines.
  8. 8
    If the order is still unfulfilled after an hour, contact support with the order number.
Good to know

Shopify emails the customer about a fulfillment only when the order is 14 days old or newer. Older orders are fulfilled silently, so customers are not emailed about old orders.

Fulfilled in Shopify but not delivered in Odoo

  1. 1
    Check that Disable Order Fulfillment Sync from (Shopify → Odoo) is not ticked.
  2. 2
    Read the log line for the order:
    • "Fulfillment synced to Odoo: WH/OUT/…" means it worked. "(… still open)" means other deliveries are still open.
    • "Fulfillment not synced to Odoo: WH/OUT/… not enough stock" means Odoo has no stock to reserve. Add stock or adjust the delivery in Odoo, then validate it by hand.
    • "… products do not match" means the delivery in Odoo has other products or quantities than the Shopify fulfillment.
    • "… is cancelled" means the delivery was cancelled in Odoo.
  3. 3
    Map your Shopify locations to Odoo warehouses in Inventory Settings. With Skip location mapping, fulfillment from Shopify to Odoo can be affected.

Invoices and payments

No invoice was created in Odoo

  1. 1
    Check that Export Invoice is on in Order Settings.
  2. 2
    Check the invoice rule: Create Invoice for Paid Orders Only or Create Invoice for Fulfilled Orders Only waits until the order is paid or fulfilled. The log says "Invoice creation deferred: order does not match the invoice policy yet".
  3. 3
    Orders created as Draft (Quotation) are not invoiced. Odoo cannot invoice a quotation. Use Confirmed (Sale Order) in Odoo Order Creation State.
  4. 4
    With the invoicing policy Delivered quantities, Odoo can only invoice what was delivered.
  5. 5
    Check the Sale Invoice Journal still exists in Odoo. If not, the log says "The Sale Invoice Journal selected in the app configuration … no longer exists".

The invoice is a draft, or not paid

  • "Invoice was created but could not be posted in Odoo: …" gives Odoo's reason. A common one is a locked accounting period (lock date). Ask your accountant to open the period, or post the invoice by hand.
  • To mark invoices paid, turn on Mark Invoice as Paid / In Payment. "In Payment" changes the status only. To create a real payment, also turn on Activate Payment Creation and choose a Payment Journal.
  • "Invoice not marked as paid: the payment journal selected in the app settings … was not found" means the journal was deleted or belongs to another company. Pick a valid journal.
  • With Map Shopify payment methods to payment journals, a method with no mapping uses the default journal. The log says so.
  • Payment reconciliation depends on your Odoo journals, accounts and rules. If Odoo cannot reconcile, register the payment by hand.

The invoice has a different total from Shopify

The invoice is built from the sale order. Fix the tax or discount setup (see Orders missing or failed), then resync. Invoices that are posted and already paid are not changed.

"Odoo invoice … is incomplete"

The invoice exists but was cancelled, has no lines, or is still a draft. Fix it in Odoo (or delete it so the app can create a new one), then click Resync Order.

Refunds and cancellations

A Shopify refund did not create a credit note

  1. 1
    Check that Enable Refund Order Sync is on.
  2. 2
    The order must be synced and invoiced in Odoo first. No invoice means no credit note. The log says "Invoice ID not found."
  3. 3
    "Refund amount is zero, so no reverse invoice was created in Odoo." is normal for a restock with no money back.
  4. 4
    "Refund line skipped: the refunded product was not found on the Odoo invoice for this order." means the invoice lines differ from the order. Create the credit note by hand.
  5. 5
    "Refund credit note was created in Odoo but could not be confirmed, so it is still a draft." gives Odoo's reason. Fix it, then confirm the credit note in Odoo.
  6. 6
    "Refund not synced: the Odoo invoice linked to this order … belongs to another order." usually means you changed Odoo database. Create the credit note by hand.

Refunded items were not restocked in Odoo

  • Enable Restock On Odoo for Refund Order Sync must be on, and you must choose Restock in Shopify when you refund.
  • The return delivery is created in Odoo as ready, not done. Validate it in Odoo to put the stock back.
  • With Shopify Returns, the Odoo return is created after both the return and the refund are done.

A refund made in Odoo did not reach Shopify

  1. 1
    Set Refund status (Odoo → Shopify) to Hourly (cron). Real-time is not available for refunds.
  2. 2
    The credit note must be posted (confirmed). Drafts and cancelled credit notes are not sent.
  3. 3
    Credit notes that the app created from a Shopify refund are not sent back.

Cancelling did not cancel the other side

  • Shopify → Odoo: check that Disable Order Cancel Status Sync from (Shopify → Odoo) is not ticked. Odoo may refuse to cancel an order with a validated delivery or a posted invoice. The log says "Order cancellation not applied in Odoo …" with the reason.
  • Odoo → Shopify: set Cancel status (Odoo → Shopify) to Hourly (cron) or Real-time (webhook). Real-time (webhook) needs the webhook set up in your Odoo, and the hourly check does not run in that mode. If nothing is ever cancelled, choose Hourly (cron) or use Schedule a call to set up the webhook.

Customers

  • No customer, or the order failed with "Customer email and phone number not found": the Shopify order has no email and no phone. Add one, or use Map Orders to Single Odoo Customer with Map Guest Orders Only.
  • "Missing country in customer address": add the country to the address in Shopify, then resync.
  • A duplicate contact was created: the app matches customers by email, or by phone when the order has no email. A different email makes a new contact. Merge the contacts in Odoo.
  • A new delivery address on every order: the app reuses an address only when name, street, city, ZIP, country and phone are the same. If one of them differs, it adds a new delivery address under the contact.
  • A company was not used: turn on Create Customer as Company on Odoo. The Shopify address must have a company name.
  • A tax ID (VAT) was dropped: if Odoo says the VAT number is not valid, the app creates the contact without it so the order can sync. Fix the number in Odoo.
  • Customers do not reach Shopify: check Customer Sync Direction, the tag filter, and Only update existing customers.

See Customer sync.

Webhooks and real-time sync

Shopify → Odoo

Shopify sends new orders, edits, cancellations, refunds and stock changes to the app straight away. Open Logs > Active Webhooks to see what is registered. If a webhook is missing, turn the related sync off, click Save, turn it back on and click Save again. The app registers it again.

Odoo → Shopify (real time)

Real-time fulfillment, payment, cancel, stock and loyalty updates need an automation rule in Odoo that calls the app.

  • The Odoo Automation Rules app (base_automation) must be installed.
  • It usually works on Odoo 18 and later.
  • We set it up with you, free, in about 5 minutes. Book a call or email support.

If real-time updates stop:

  1. 1
    In Odoo, open the automation rule and check it is active.
  2. 2
    Check the rule's log in Odoo. "Invalid payload" with "webhook_token is required and is not valid." means the token in the rule is missing or wrong. Contact support for the right one.
  3. 3
    "… sync is disabled for this store; webhook ignored." means the setting in the app is Off or Hourly (cron). Choose Real-time (webhook) and click Save.
  4. 4
    "Shop access token missing" means the app must be reconnected in Shopify.

Until it is fixed, switch the status to Hourly (cron) so updates still arrive.

Slow syncs

  • Bulk actions: resync up to 300 orders at a time. More can overload Odoo and cause failures.
  • Large catalogs: product export runs in the background with automatic rate limiting and can take hours. For Odoo → Shopify, sync by category or tag instead of everything at once.
  • Images: use Default Images Only. All Images is much slower and may need several runs.
  • Manual runs: use the Date range option to sync only records updated between two dates.
  • Rate limits: Shopify and Odoo limit how many calls the app can make per minute. "Shopify is rate limiting the sync — retrying shortly…" means the app is waiting, not failing.
  • A slow Odoo server slows every sync. Odoo.sh and self-hosted servers with few workers are the most common cause.
  • Stock frequency: pick a frequency that fits your order volume. Real-time sync turns the schedule off.

After changing the Odoo database

If you moved from a test database to production, restored a backup, or connected another database:

  1. 1
  2. 2
    Open Configuration > Clear Temporary Cache, tick Clear Customer Data and Clear Product Data, and click Clear Cache. This clears only the app's saved links. Nothing is deleted from Shopify.
  3. 3
    Set your Odoo choices again (journals, taxes, warehouses, locations) and turn syncs back on.

If you skip this, old links point at the wrong records. You see "Odoo not updated: the linked Odoo sale order … is a different order, not this Shopify order." The app then writes nothing to Odoo, to protect your data. Resync the order to link it again.

Still stuck?

Email support@techmarbles.com or book a call. Send us:

  • Your Shopify store address.
  • The order number or product SKU.
  • What you expected and what happened.
  • The error text from Logs or the Not Synced tab, and a screenshot if you can.
15Help

Error messages

50 min read

This page lists the messages you can see in the app: on the Configuration page, in the Not Synced tab of the Dashboard, on the Logs page, in pop-up messages and in progress cards. Use your browser's search (Ctrl+F or Cmd+F) to find the words you see.

How to read a message

  • "…" in a message below stands for a part that changes, such as an order number, a SKU, or Odoo's own error text.
  • Many messages end with Odoo's own reason after a colon, for example "Error creating order on Odoo: …". That part comes from Odoo. See Common Odoo errors for the usual ones.
  • Messages that end in "process started." or "process completed." are progress lines, not errors. They show in Logs so you can see when a sync ran.
  • After you fix the cause of an order error, click Resync Order on the Not Synced tab. See Retry and resync.

Connection

Shown on the Configuration page when you click Establish Connection, and on the dashboard badge.

Message What it means What to do
"Invalid Odoo Host Url" / "Invalid database server URL of Odoo Account." The Server URL is wrong, or the server did not answer. Use the full address with https://, for example https://mycompany.odoo.com. Check that it opens in a browser.
"Invalid URL provided." The text in Server URL is not a web address. Type the full URL.
"… is required." A connection field is empty. Fill in Server URL, Database Name, Username and Password / API Key.
"Odoo is reachable but its external API is not responding." The server answers, but the API the app uses is blocked. The field note says "Host reachable (Odoo …) but the XML-RPC/JSON-RPC API did not respond." Ask your IT team to allow /xmlrpc/2/* and /jsonrpc. On Odoo Online, check that your plan allows external API access.
"Invalid Odoo database name." The Database Name is wrong. Copy the exact name. On Odoo Online it is the first part of your address.
"Database "…" does not exist on this Odoo Online server (expected "…")." On Odoo Online the database name must match the address. Use the name the message expects.
"Database "…" was not found on this Odoo server." No database with that name exists on the server. Check the name in Odoo (database manager or Odoo.sh branch).
"No Odoo user found with this login. Please recheck the username (it must match the user's Odoo login, usually their email)." The API key works, but the Username does not exist. Enter the user's Odoo login.
"Invalid Odoo username." / "Invalid Odoo database name and username." One or both of these fields are wrong. Fix the named fields.
"Invalid Odoo account credentials." The login failed. The fields say "Please recheck Odoo database name.", "Please recheck Odoo database username." or "Please recheck Odoo database password." Check all three. If the password is right or the user has two-factor login, use an API key.
"Please recheck the password. If it is correct, or your account uses two-factor authentication, use an Odoo API key here instead." Username and password do not log in. Use an API key.
"Your Odoo username and password are correct, but this Odoo server does not accept password logins for API access. …" / "Password verified, but API access requires an Odoo API key. Replace the password with an API key." Your Odoo only accepts API keys for the API. Odoo Online does this. Make an API key (avatar > My Profile > Account Security > New API Key) and paste it into Password / API Key.
"Odoo connection validated." / "Odoo Host is valid." The connection works. Nothing.
"Unsuccessful Authorization on Odoo JSON-RPC endpoint for db …" Odoo rejected the saved login during a sync. Enter a new API key in Configuration.
"Odoo credentials rejected (cached): … skipped for this store" Odoo rejected the login several times, so the app pauses calls for up to 30 minutes. Fix the login in Configuration. Reconnecting clears the pause at once.
"Odoo host unreachable (cached): … skipped for this store" Odoo did not answer, so the app pauses calls for about 10 minutes. Check that your Odoo is online. The app tries again on its own.
"Odoo access denied (cached): … skipped for this store" The Odoo user is not allowed to do this, so the app stops trying for 15 minutes. Give the Odoo user the rights it needs (see Common Odoo errors).
"Odoo model missing (cached): … skipped for this store" An Odoo app the sync needs is not installed (for example Point of Sale, CRM or Loyalty). Install the Odoo app. The app checks again after 15 minutes, or at once when you reconnect.
"Odoo JSON-RPC transport failure: …" / "Connection error: …" The connection to Odoo broke during the call. Usually temporary. The sync is retried. If it keeps happening, check your Odoo server.
"Odoo JSON-RPC returned an unparseable body from …" Odoo sent back something that is not a valid answer, often an error page from a proxy or a maintenance page. Check that Odoo is up and not in maintenance.
"Odoo is not connected." A page needs Odoo but the connection is not set up. Connect Odoo in Configuration.
"Odoo connection not configured." Same as above, for the Odoo → Shopify order sync. Connect Odoo in Configuration.
"Couldn't load companies and journals from Odoo. …" The Order Settings page could not read Odoo. Check the connection and click Refresh. An expired Odoo trial or a database upgrade returns no data.

Shopify connection and billing

Message What it means What to do
"Reconnect required" / "Reconnect your store to Shopify" The app's connection to Shopify expired. Billing is not affected. Reload the app page and approve the Shopify permission prompt.
"Shopify connection expired. Reconnecting your store…" The app is renewing its access. Wait, then approve the prompt if Shopify shows one.
"Order not synced: the Shopify connection for this store has expired. Reconnect the app to resume order sync." An order arrived while the connection was expired. Reconnect, then resync the order from Not Synced.
"Creating Shopify orders needs an offline access token. Please reconnect the app and try again." Odoo → Shopify order sync needs a renewed connection. Reload the app and approve the prompt.
"Session not found. Please refresh the page and try again." / "Unable to determine shop. Please refresh the page and try again." The app page lost its session. Reload the page from Shopify admin.
"Unable to load plans. Please refresh the page and try again." / "Unable to load plans. Please try again." Plans could not be loaded. Reload. If it continues, contact support.
"Your free trial has expired. Please select a paid plan." The 30-day trial is over. Choose a plan. See Plans & billing.
"An error occurred while processing your billing request. Please try again later." / "Billing error occurred. Please try again later." / "An error occurred while saving your plan. Please try again." Shopify billing did not complete. Try again. If it continues, contact support.
"Free trial completed" This store already used its trial. Choose a paid plan, or contact support.

Products

Shown in Logs, in the product sync progress card, and in pop-up messages on Product Settings.

Message What it means What to do
"Product sync is already running. Please wait for the current sync to complete." Another product sync is in progress. Wait for it to finish.
"Product sync was completed recently. Please wait at least 5 minutes before starting another sync." Runs must be 5 minutes apart. Wait 5 minutes.
"Product export is already running. Cancel or reset the current export first (Cancel export & reset)." / "A product export is already running. Track progress on this page or wait for it to finish." A Shopify → Odoo export is still running. Wait, or click Cancel export & reset.
"Product export reset. You can start a new export." The export was cancelled. Start a new export if needed.
"Could not cancel the export. Please try again." / "Could not reset the export. Please try again or contact support." The cancel did not go through. Try again.
"No product sync run found." There is nothing to retry. Start an export first.
"Retry started for … product(s) (failed or skipped)." Your retry has started. Nothing.
"… Product missing SKU(Reference/Barcode) on Shopify. Please review product on Shopify." The Shopify product has no SKU or barcode (the field you match on). Add it in Shopify, then sync again.
"Products missing SKU(Reference/Barcode) on Odoo: … products were skipped in this sync. Examples: …" / "Product variants missing SKU(Reference/Barcode) on Odoo: … variants were skipped in this sync. …" Odoo products or variants have no internal reference or barcode, so they were not synced to Shopify. The line comes once at the end of each sync, with the count and up to 10 product names. Add the value in Odoo.
"Product mapping failed - no SKU or barcode returned for product ID: …" Shopify returned the product without a SKU or barcode. Add the value in Shopify.
"Product not synced to Odoo: … => …" Odoo refused to create the product. Odoo's reason follows "=>". Fix what Odoo names (often a required field or a permission).
"Odoo rejected the product (no reason returned)" Odoo refused without a reason. Try creating the product in Odoo by hand to see the error.
"Product not created in Odoo ("Only update existing" mode): …" The product does not exist in Odoo and new products are not allowed. Create it in Odoo, or switch to Create new and update existing products.
"Product export process failed." / "Product export process failed (bulk operation could not start)." The export could not read your Shopify catalog. Try again in a few minutes. Check that no other Shopify bulk export is running.
"Could not fetch … batch(es) of the selected products from Shopify; syncing the … product(s) that were fetched." Some products could not be read from Shopify. Sync the missing ones again.
"No Shopify products found to export." / "No Shopify products were … — nothing to export for that date range." Nothing matched your filters or date range. Widen the date range or the collection/tag filter.
"No products to sync — everything is already up to date." / "No products were … — nothing to sync for that date range." Nothing changed. Nothing.
"Product export finished: … synced to Odoo, … skipped, … failed." Summary of an export. Use Retry failed or skipped products for the failed ones.
"No products found in Odoo." / "No products were returned from Odoo for the configured filters. Check the product filter settings and the Odoo API user permissions." The import found no Odoo products. Check category and tag filters, and that the Odoo user can read products.
"No Odoo products were …. Widen the date range, or turn it off to sync everything." No Odoo product changed in that date range. Widen or remove the date range.
"Error getting Odoo products." / "Exception while getting Odoo products." / "Error getting Odoo products in chunk." Reading products from Odoo failed. Check the connection and try again.
"Product import process failed: …" / "Product import final sync failed: …" / "Product import chunk … failed: …" / "Exception in product import chunk …: …" The import stopped. The reason follows. Fix the reason and run it again.
"No products to import in Shopify." Nothing new to create. Nothing.
"Product "…" still syncs to Shopify using the first 3 attributes as options (…). Extra attributes are not sent as Shopify options (unsynced/pending): …." Shopify allows only 3 options per product. Reduce the attributes in Odoo, or accept the first 3.
"Product sync (Odoo→Shopify): Shopify refused to add … variant(s) to product … — …. No variant from this batch was created." Shopify rejected the new variants. Shopify's reasons follow. Fix what Shopify names, often two variants with the same option values.
"Errors while creating products on Shopify with V2 API." / "Errors while updating products on Shopify with V2 API." / "Errors in … operation: …" Shopify rejected some products. Check the products named in the following log lines.
"No product attributes found in Odoo" / "No product attribute values found in Odoo" / "No product variants found in Odoo" The Odoo product has no variants or attributes to read. Check the product in Odoo.
"Error getting Odoo product attributes" / "Error getting Odoo product variants: …" Reading variants from Odoo failed. Try again. Check the Odoo user can read products.
"[VendorSync] Skipped: the Purchase module is not installed on Odoo." Enable Product Vendor Mapping needs Odoo Purchase. Install Purchase in Odoo, or turn the option off.
"Warehouse not found for the company." No warehouse exists for the company the product belongs to. Create or check the warehouse in Odoo.
"No inventory locations found for the Shopify product." The Shopify product is not stocked at any location. Assign it to a location in Shopify.
"Odoo server temporarily unavailable." Odoo did not answer. The sync is retried.
"Please select at least one product" You clicked a bulk sync with nothing ticked. Tick products first.
"Please select at least one category or disable the option." / "… tag …" / "… collection …" / "… Shopify tag …" A filter is on but empty. Pick a value, or turn the filter off.
"Please select at least one field to update." Update Product Fields is on with no field ticked. Tick at least one field.
"Select an Odoo language for translated content or disable the option." Sync translated product content is on with no language. Pick a language.
"Product sync does not create bundles or kits …" A notice on the product sync page. Product sync does not build bundles or kits. Sync the components, then build the bundle in Shopify and the kit in Odoo with the same SKU or barcode. See Kit products.

Prices and images

Message What it means What to do
"Price sync is already running. Please wait for the current sync to complete." A price sync is in progress. Wait.
"Price sync started. Prices will be updated from Odoo to Shopify for mapped products." (or from Shopify to Odoo) Your price sync has started. Nothing.
"Price sync completed: all mapped product prices are already up to date on Shopify." Nothing to change. Nothing.
"No mapped product prices to update on Shopify." No product is matched yet. Sync the products first.
"Price sync failed: could not start Shopify price update." / "Price sync failed: Shopify bulk update did not complete." Shopify did not accept the bulk update. Try again later.
"Market catalog price sync failed: …" / "Market catalog price sync failed for one or more catalog mappings." One pricelist to market catalog mapping failed. Check the mapping on Product Settings and that the catalog still exists.
"Market catalog price sync updated … variant price(s) across … catalog mapping(s)." Summary. Nothing.
"No Odoo pricelist could hold the price rule for this product; the price stays on the product only." The target pricelist cannot be used for this product (for example another company). Check Target Odoo Pricelist and its company.
"Price rule for the new product was rejected by Odoo: …" Odoo refused the pricelist line. Fix what Odoo names.
"Please select a price list to save…" / "Please select a cost price list to save, or disable this option." / "Please select a target price list to save, or disable this option." / "Please add at least one complete Odoo pricelist to Shopify market catalog mapping, or disable market catalog mapping." A pricelist option is on but not filled in. Pick the pricelist (for sale price, a cost price list alone is enough), or turn the option off.
"Failed to start image sync." / "Server error occurred while starting image sync." / "Failed to sync images : …" The image sync could not start. Try again.
"Shopify is rate limiting the sync — retrying shortly…" Shopify asked the app to slow down. Nothing. The sync continues.
"No images to upload" / "No images to sync for the selected products." / "Shopify to Odoo selected image sync: no images to upload for the selected products." The products have no images to send. Add images, or remove existing ones on the other side first.
"No Shopify products or SKUs found" / "No Odoo products found." The image sync found no matched products. Sync products first.
"Image upload failed: …" / "Image sync failed: …" / "Media upload error: …" / "Error converting image for …: …" One image could not be sent. Check the image file (format, size). Try again.
"Odoo to Shopify image sync stopped: could not read products from Shopify (…). Not all products were processed." Shopify did not answer during the run. Run the image sync again.
"Image sync stopped: maximum batch limit (…) reached." The run stopped after its batch limit. Run it again to continue.
"Image sync stopped: cursor did not advance." The run stopped to avoid a loop. Run it again. If it repeats, contact support.
"Sync completed: removed existing images to update new images on Odoo." Old Odoo images were replaced. Nothing.

Inventory

Message What it means What to do
"Please enable Stock Sync or inventory location mapping to process inventory" Stock sync is off, or no location is mapped. Turn on stock sync for your direction, map a location (or tick Skip location mapping), and click Save.
"An inventory sync is already running for this store. Please wait for it to finish before starting another one." / "The inventory sync that started … ago is still in progress. Use Stop if you want to end it and start a new run." A run is in progress. Wait, or click Stop.
"Another inventory sync is already running for this store (started … minutes ago). Wait for it to finish, or use Stop to release it — it is released automatically within … minutes." A run is in progress or stuck. Wait or click Stop. A stuck run is released after about 2 hours.
"Inventory sync skipped: no active products found on your Shopify store (archived products are excluded from inventory sync)." No active product to sync. Make products active in Shopify.
"Inventory sync skipped: none of your Shopify products have "Track quantity" enabled, …" Shopify does not allow stock updates on untracked products. Turn on Track quantity in Shopify (Products > Bulk edit).
"Inventory sync skipped: your tracked Shopify products are not stocked at any Shopify location. …" Products are not assigned to a location. Assign them to a location in Shopify.
"Inventory sync skipped: none of your tracked Shopify products have a … set, so they cannot be matched with Odoo products." No SKU or barcode on the products. Add them in Shopify.
"Inventory sync failed: none of your … Shopify …s matched an active product in Odoo. …" No Shopify value matched an active Odoo product. Check the values exist on active Odoo products, and check category and zero-stock filters.
"Inventory sync finished: no Odoo stock was …, so there was nothing to push to Shopify. …" No stock changed in the chosen date range. Widen or remove the date range.
"Inventory sync failed: your Odoo server could not be reached. …" Odoo did not answer. Shopify stock was not changed. Check that Odoo is online, then run it again.
"Inventory sync failed: Odoo rejected the saved credentials. …" The login no longer works. Enter a new API key in Configuration.
"Inventory sync failed: your Odoo user is not allowed to read products. …" Missing read rights. Give the user read access to Inventory / Products.
"Inventory sync failed: the Products model is not available on your Odoo instance. …" The Odoo Inventory app is missing. Install Inventory in Odoo.
"Odoo returned an error while reading stock levels (…): … Nothing was changed in Shopify; run the sync again once Odoo is healthy." Odoo failed while reading stock. Run it again later.
"Inventory sync warning: … Only … products could be read before that happened; stock for the rest was left unchanged in Shopify." / "Inventory sync warning: … of … Odoo product lookups failed. …" Part of the run failed. The rest synced. A lookup that times out is first tried again in smaller parts, so this means Odoo was still too slow. Run it again to catch the rest. If it shows on every run, check how busy your Odoo is.
"Current user does not have access to stock, please confirm with Odoo admin." / "Current user does not have access to products, please confirm with Odoo admin." The Odoo user lacks Inventory rights. Give the user Inventory access in Odoo.
"Inventory sync process failed. No Shopify products found." / "Inventory sync process failed. No valid inventory updates after filtering." Nothing left to update after your filters. Check filters and Do not sync zero stock.
"Inventory sync process failed. …" / "Inventory sync failed." / "Inventory sync completed with failure." / "Exception in inventory import: …" The run stopped. Read the reason and run it again.
"Inventory sync finished with some failed chunks." / "Inventory batch chunk failed: …" Part of a Shopify → Odoo run failed. Run it again.
"Inventory sync completed - no updates found since last sync." / "Inventory sync completed - no items to sync." Nothing changed. Nothing.
"Inventory webhook: unmapped inventory item …" Shopify sent a stock change for a variant the app does not know. Sync the product, or check its SKU.
"Inventory webhook sync failed: …" A real-time stock change could not be sent to Odoo. Run Process Inventory Sync.
"Please add locations." / "Please choose Shopify location and Odoo warehouse locations." / "Please choose Shopify location." / "Please choose Odoo warehouse location." A location mapping row is incomplete. Fill in both sides, or remove the row.
"Error saving settings." The settings did not save. Try again.

Orders

Shown on the Not Synced tab and in Logs. These are for orders that sync from Shopify to Odoo.

Message What it means What to do
"Order sync process failed due to issues in the product in this order. …" A product on the order could not be found or created in Odoo. The reason follows. Fix the product named, then resync.
"Product not found on odoo: … (…: …)" No Odoo product has this SKU or barcode, and Disable new product creation on Odoo with order sync is on. Create the product in Odoo with that value, or turn the option off. Then resync.
"Odoo product create error, please review the product in Odoo for … …" The app tried to create the product and Odoo refused. Check the product in Odoo (archived copy, required field, permission).
"Please review the missing … on the order line variant (required for Odoo sync): …" The Shopify variant on the order has no SKU or barcode. Add it in Shopify, then resync.
"Please review the missing … on product variants (all variants need … for Odoo sync): …" Another variant of the same product has no SKU or barcode. Add it on every variant.
"Variant … not found on Shopify product …" The variant on the order no longer exists. Restore it, or create the product in Odoo with the same SKU.
"Variant … was deleted on Shopify after this order was placed, and no Odoo product matches the order line … "…" …. Create or restore that product in Odoo with this …, then resync the order." The variant is gone and Odoo has no match. Create or restore the product in Odoo, then resync.
"Shopify product not found (id …) for line "…". …" The product was deleted or made unavailable in Shopify. If it still exists, wait for the automatic retry.
"Could not fetch product "…" from Shopify (…): …. This is usually transient — the order will sync on retry." Shopify did not answer. Wait for the retry.
"Product details not found on Shopify (no product_id, sku, or resolvable variant_id): …" The line has no product link at all. Check the order in Shopify.
"Custom item "…" could not be synced: the "Shopify custom item" service product (SHOPIFY-CUSTOM-ITEM) could not be found or created in Odoo." A custom line (no Shopify product) needs a service product in Odoo. Create a service product with internal reference SHOPIFY-CUSTOM-ITEM, or give the Odoo user product create rights.
"Custom item without a Shopify product: "…" — synced as the "Shopify custom item" service product (SHOPIFY-CUSTOM-ITEM)." Information only. Nothing.
"No items to sync: all line items have zero net quantity on Shopify (…). Nothing was sent to Odoo. …" Every line was refunded or removed before the sync. Nothing, or restore quantity in Shopify.
"Odoo user is not allowed to create products (needed for shipping/fee service products). Order sync skipped — grant "Products/Create" access to the Odoo API user." The app needs to create a shipping or fee product. Give the Odoo user product create rights.
"Error creating service product on odoo …" / "Error creating product on Odoo." / "Error creating product in Odoo." / "Error creating product on Odoo: …" / "Error creating product attribute on Odoo." Odoo refused a product or attribute the order needs. Fix what Odoo names.
"Error searching product on Odoo." / "Error searching product on Odoo (variant-id mode)." The product search failed. Usually temporary. Resync.
"No matching variant found for shopify_variant_id: …" With Shopify Variant ID matching, no Odoo product has this ID in the custom field. Sync the product first, or fill in the field in Odoo.
"Skipped service/discount product lookup: blank … identifier (would match an unrelated Odoo product)." A mapped discount or shipping product code is empty. Fill in the SKU in Additional order settings.
"Discount product not found for the code (SKU): …" / "Consolidated discount product not found for the code (SKU): …" The discount product SKU you entered does not exist in Odoo. Create a service product with that internal reference, or fix the SKU.
"Shipping Product not found for the code (sku) : …" The shipping product does not exist and could not be created. Create it in Odoo or fix the mapping.
"Total tax product not found for the code (SKU): …" With Map Taxes to Product Line Item, the tax product is missing. Create the product or check the setting.
"Customer email and phone number not found in shopify order data" The order has no email and no phone. Add one, or map guest orders to one Odoo customer.
"Customer not found in shopify order data" The order has no customer. Add a customer, or use Map Orders to Single Odoo Customer.
"Customer not found on odoo for the email id : …" The mapped Odoo customer email does not exist in Odoo. Fix the email in Map Orders to Single Odoo Customer or Map Default Customer Based on Order Tag.
"Could not resolve shipping address as default contact partner" The delivery contact could not be found or created. Check the address (country, required fields). Resync.
"Order currency … is not active in Odoo. Please activate … in Odoo (Accounting → Configuration → Currencies) and then click Resync on this order." The order's currency is off in Odoo. Activate it in Odoo, then resync.
"Order currency … was not found in Odoo. Please add and activate … in Odoo …" The currency does not exist in Odoo. Add and activate it.
"Could not verify order currency … in Odoo (currency lookup failed). The order was not synced …; it will be retried automatically." Odoo did not answer the currency check. Wait for the retry.
"Could not verify order currency … in Odoo (…). … Please check that the Odoo user can read currencies and then click Resync on this order." The user may not read currencies. Give read rights on currencies, then resync.
"Could not verify order currency … in Odoo (currency lookup failed) and automatic retries did not succeed. …" Retries ran out. Check Odoo is reachable and the login works, then resync.
"Error creating order on Odoo: …" / "Error creating order on Odoo." Odoo refused the sale order. Odoo's reason follows. Fix what Odoo names (see Common Odoo errors).
"Error creating order on Odoo after retrying. Reason: …" / "Error creating order on Odoo after retrying without pricelist. Reason: …" The app tried again (also without the pricelist) and Odoo still refused. Fix the reason, then resync.
"Order created successfully after retry in draft state" / "… after retry without pricelist in draft state" / "… after warehouse restore retry in draft state" The first attempt failed; a retry worked. Nothing. Check the order in Odoo.
"Order created and confirmed successfully after retry" (and variants) Same, and the order was confirmed. Nothing.
"Order created but confirmation failed after retry: …" (and variants) The sale order exists but is still a quotation. Confirm it in Odoo, or fix the reason and resync.
"Order was created in Odoo but could not be linked locally; manual reconciliation required." The sale order exists in Odoo, but the app could not save the link. Contact support with the order number. Do not create it again by hand.
"sale.order idempotency search errored; aborting create to avoid duplicate: …" The app could not check for an existing Odoo order, so it stopped to avoid a duplicate. Resync later.
"Error creating sale order line" / "Error creating sale order line: …" / "Error creating sale order line after fallback" Odoo refused a line. Fix the product or tax named, then resync.
"Order not found for sale order line" / "Order not found after sale order line create" / "Local product ID could not be determined" / "Order not found in database" The app lost track of the order during the sync. Resync the order.
"Odoo sale order (id …) not found — it may have been deleted in Odoo. Resync to recreate it." The linked sale order no longer exists in Odoo. Click Resync Order.
"Odoo not updated: the linked Odoo sale order … is a different order, not this Shopify order. …" The saved link points at another order, usually after a database change. Nothing was written. Resync the order. See Troubleshooting.
"Odoo sale order link … is not this order (…); reset for re-sync" A wrong link was found and removed. Resync the order.
"This order was created in Shopify from Odoo and cannot be resynced the other way." Resync only sends Shopify orders to Odoo. Nothing.
"Order data not found" The app could not read the order from Shopify. Check it exists and was not deleted.
"Unexpected error occurred" / "Sync failed. Please check the error details." / "Resync failed" The resync did not finish. Read the error, then try again.
"Order core sync completed; post-line stages deferred" The order is in Odoo; invoice and payment steps follow shortly. Nothing.
"Comprehensive order update failed: …" An edit could not be applied. Read the reason. Temporary errors are retried.
"Order update skipped: Order state '…' not in allowed states" / "Order state '…' does not allow editing" The Odoo order is in a state you did not allow for edits. Change the allowed states, or edit Odoo by hand.
"Order line changes not applied: the Odoo order already has a validated delivery" Odoo has shipped it, so lines are not changed. Edit Odoo by hand if needed.
"Could not check deliveries of SO … before resetting it to draft" Odoo did not answer. The edit is retried.
"Order does not have Odoo order ID" The order was never synced. Resync it first.
"Failed to fetch order state from Odoo" / "Could not compare order against Odoo" / "Order comparison with Odoo failed" Odoo did not answer. The edit is retried.
"Failed to update order header: …" / "Failed to update line items: …" / "Failed to update shipping lines: …" / "Failed to update line item …: …" / "Failed to add line item: …" Odoo refused part of the edit. Fix the reason, or edit Odoo by hand.
"Product not found for new line item - Odoo Product ID: …" A product added to the Shopify order is not in Odoo. Sync the product, then edit again.
"Failed to update discount line: …" / "Failed to remove discount line: …" / "Failed to create discount line: …" / "Discount product not found for: …" A discount change could not be applied. Check the discount product, or edit Odoo by hand.
"Failed to update TIPS line" / "Failed to remove TIPS line" / "Failed to create TIPS line" / "TIPS product not found; tip line was not added" A tip could not be added or changed. Check that a tips service product exists in Odoo.
"No changes detected in order" / "No changes detected in order (snapshot)" Shopify sent an update with nothing new for Odoo. Nothing.
"Failed to add order line note: …" / "Error adding order line note: …" The note line (for example the payment method) could not be added. Usually harmless. Add the note by hand if needed.
"Order sync failed: Odoo CRM module is not installed." Orders are sent as CRM leads, but Odoo CRM is missing. Install CRM in Odoo, or turn off Sync Shopify Orders to Odoo CRM Lead.
"Sync failed: Partner resolution error or no data." The CRM lead could not get a customer. Check the customer details on the order.
"Order sync process completed (lead already exists)." / "Skipping lead creation (lead already exists)." The lead is already in Odoo. Nothing.

Fulfillment

Message What it means What to do
"Fulfillment synced to Odoo: …" The Shopify fulfillment validated these Odoo deliveries. "(… still open)" means others remain. Nothing.
"Fulfillment not synced to Odoo: … not enough stock" Odoo cannot reserve stock for the delivery. Add stock or adjust the delivery, then validate it in Odoo.
"Fulfillment not synced to Odoo: … products do not match" The Odoo delivery has other products or quantities. Validate the delivery in Odoo by hand.
"Fulfillment not synced to Odoo: … is cancelled" (or another state) The delivery is not open in Odoo. Check the delivery in Odoo.
"Fulfillment sync failed: …" Odoo did not answer while reading deliveries. It is retried with the next order update.
"Picking … cannot be marked done in Odoo (state: …). …" Odoo would not validate the delivery (for example a wizard or a rule). Validate it in Odoo by hand.
"Failed to validate picking ID: …" / "Exception while processing picking ID: … - …" Validation failed. Validate it in Odoo by hand.
"Fulfillment status sync skipped (store is realtime-webhook only)." Fulfillment uses real-time webhooks, so the hourly run skips it. Nothing.
"Enable Order Status Sync and choose at least one Odoo → Shopify sync (fulfillment, payment, or cancel) before running manual sync." All statuses are Off. Choose Hourly (cron) or Real-time (webhook) for at least one and save.
"Failed to sync order status" The manual status sync could not start. Try again.

Invoices and payments

Message What it means What to do
"Invoice creation deferred: order does not match the invoice policy yet" You invoice paid or fulfilled orders only, and this one is not yet. Nothing. It is invoiced when it qualifies.
"Invoice will be created once the order matches the invoice policy (e.g. when it is paid)" Shown as Invoice pending on the dashboard. Nothing.
"Invoice creation failed: The Sale Invoice Journal selected in the app configuration (Odoo journal ID …) no longer exists in this Odoo database, …" The chosen journal was deleted. Pick a valid Sale Invoice Journal in Order Settings.
"Invoice creation failed: …" / "Error creating invoice: …" / "error creating invoice for order: …" Odoo refused the invoice. Fix what Odoo names, then resync.
"error creating invoice for order: could not read the sale order in Odoo" Odoo did not answer. Resync later.
"Invoice creation skipped: missing currency_id on sale order and company" / "missing currency_id for invoice" The order and company have no currency in Odoo. Set a currency on the company in Odoo.
"no invoiceable line items found for direct invoice" With Enable Invoice Sync Only, nothing on the order can be invoiced. Check the order lines.
"Error creating invoice line ids" / "error creating invoice line ids: …" / "invalid invoice or sale order line id for invoice line create" Odoo refused invoice lines. Fix the reason (often tax or account setup), then resync.
"invoice create lock timeout" Another update for the same order was creating the invoice. Resync later.
"Invoice was created but could not be posted in Odoo: …" The invoice is a draft. Odoo's reason follows, often a lock date. Fix the reason, then post the invoice.
"Invoice not created: no Odoo customer is linked to this order, and the Odoo sale order has no partner to bill." No customer to invoice. Add a customer to the order, then resync.
"Odoo invoice … is incomplete: it no longer exists in Odoo / it was cancelled / it has no invoice lines / it is still a draft. The order stays unsynced until the invoice is fixed in Odoo." The linked invoice is not usable. Fix or delete the invoice in Odoo, then resync.
"Odoo invoice (id …) was deleted in Odoo; relinking or re-creating the invoice." The app noticed and is fixing it. Nothing.
"Invoice left in draft (not posted) for Shopify payment method: …" Your setup leaves invoices for this payment method as drafts. Post them in Odoo when paid.
"Invoice payment status updated" The payment status was written. Nothing.
"Invoice not marked as paid: the payment journal selected in the app settings (Odoo journal ID …) was not found in this Odoo database …. Open the order settings and select a valid payment journal." The payment journal is missing or in another company. Pick a valid Payment Journal.
"No payment journal is mapped for Shopify payment method "…". The default payment journal was used." The method has no mapping. Add a mapping if you want another journal.
"Payment method journal mapping skipped: the Shopify payment method of this order could not be determined. The default payment journal was used." The order has no clear payment method. Nothing, or register the payment by hand.
"The payment journal mapped for Shopify payment method "…" was not found in Odoo …. The default payment journal was used. …" The mapped journal is gone. Fix the mapping.
"Order line note added: Partial payment is fully paid" A partly paid order is now fully paid. Nothing.
"Failed to fetch invoice state" / "Failed to fetch invoice details" / "Failed to delete invoice" / "Failed to clear existing invoice lines." The invoice update after an order edit failed. Update the invoice in Odoo by hand.
"Invoice update only allowed for 'posted' or 'draft' invoices. Current state: …" / "Invoice cannot be updated because it is already '…'" The invoice is paid, in payment or cancelled. Change it in Odoo by hand if needed.
"Invoice update is not available when "Mark Invoice as Paid" is enabled." The two options conflict. Choose one.
"Please add at least one company mapping." / "Please select both company and journal for all mappings." A journal mapping row is incomplete. Fill it in, or remove the row.
"Please add at least one payment method mapping." / "This payment method is already mapped." The payment journal mapping is incomplete or doubled. Fix the rows.
"Could not refresh the journal list from Odoo. Please try again." / "Could not load Shopify payment methods. Please try again." A list did not load. Click Refresh.
"No payment methods were found on orders from the last 60 days. …" The list comes from recent orders. Place a test order with the method, then click Refresh.

Refunds and cancellations

Message What it means What to do
"Order refund process failed." The credit note was not created. The next lines give the reason. Fix the reason.
"Invoice ID not found." / "Error getting invoice on Odoo for refund." The order has no invoice in Odoo. Invoice the order, then create the credit note by hand.
"Refund amount is zero, so no reverse invoice was created in Odoo. The returned items were restocked." A restock with no money back. Nothing.
"Refund line skipped: the refunded product was not found on the Odoo invoice for this order." The invoice does not have that product. Add the line to the credit note by hand.
"Refund quantity capped from … to … to match the invoiced quantity for line … (…)." You refunded more than was invoiced. Check the credit note.
"Skipped refund line for line …: no invoiced quantity available to credit." Nothing was invoiced on that line. Check the invoice.
"Refund credit note was created in Odoo but could not be confirmed, so it is still a draft. Odoo said: …" Odoo refused to post it. Fix the reason, then confirm it in Odoo.
"Refund credit note was posted in Odoo but its refund payment was not registered: … Register the payment on the credit note in Odoo." The money-back payment is missing. Register it on the credit note.
"Refund not synced: the Odoo invoice linked to this order (…) belongs to another order. …" The order was likely synced to another database. Create the credit note by hand.
"Error creating refund invoice in Odoo." / "Error creating refund invoice." / "Error creating refund lines invoice" Odoo refused the credit note. Fix what Odoo names.
"No refundable SALE transaction found on Shopify order." / "No refundable product line items or shipping amount after classification." An Odoo credit note could not be turned into a Shopify refund. Refund in Shopify by hand.
"Return restock completed: the items restocked in Shopify Returns were added to a return delivery in Odoo (left at Ready for validation)." The return is ready in Odoo. Validate the return delivery in Odoo.
"Return restock failed: the items restocked in Shopify Returns could not be added to a return delivery in Odoo." The return delivery was not created. Create the return in Odoo by hand.
"Order cancellation not applied in Odoo (sale order …): …" Odoo refused to cancel, often because the order is delivered or invoiced. Cancel in Odoo by hand, or reverse the delivery and invoice first.

Customers

Message What it means What to do
"Missing country in customer address" / "… shipping address" / "… billing address." / "… default address" / "… shipping address (sync)." The address has no country. Add the country in Shopify, then resync.
"Customer email and phone number not found" The customer has no email or phone. Add one.
"Error searching customer on Odoo: …" The search failed. Usually temporary. Resync.
"Odoo API Error: …" / "Error creating customer in Odoo" / "Failed to create customer in Odoo." Odoo refused the contact. Fix what Odoo names (often a required field).
"Error getting/creating contact address" / "Error creating customer addresses in Odoo" A delivery or invoice address could not be created. Check the address.
"… create failed after company/person compatibility retries" / "Duplicate … partner error" Odoo refused the company or person contact. Check for a duplicate or locked contact in Odoo.
"Failed to create customer category: …" A customer tag could not be created in Odoo. Create the tag in Odoo, or give the user rights.
"Customer sync is already running. Please wait for the current sync to complete." / "Customer export is already running. …" A run is in progress. Wait.
"Customer sync was completed recently. Please wait at least 5 minutes before starting another sync." Runs must be 5 minutes apart. Wait.
"Customer import: no Odoo customers matched the configured filters." / "Customer import: no Odoo customers were … — nothing to sync for that date range." Nothing to import. Check tag filters or the date range.
"Customer Import Process Completed with errors: … customers could not be synced (Shopify rate limit)." Shopify limited the run. Run the import again.
"Customer import process failed." / "Customer export process failed: …" The run stopped. Read the reason and run it again.
"CUSTOMER SYNC: Batch … deferred — Odoo unreachable, retrying in …s …" / "… Odoo call budget saturated, retrying in …s …" The batch waits for Odoo. Nothing. It retries.
"CUSTOMER SYNC: Batch … Failed → Retrying individually" The batch failed, so customers are sent one by one. Nothing.
"CUSTOMER SYNC: Failed Customer → … | Error: …" One customer failed. Fix what Odoo names.
"CUSTOMER SYNC: Batch … Failed — no customers were created in Odoo (…)…" / "… Completed with errors (…)…" Summary of a batch with failures. Check the lines for each customer.
"Customer settings saved successfully. However, the CRM Lead module is not installed in Odoo, so the "CRM Lead" option has been disabled." CRM is not installed. Install CRM in Odoo to use leads.
"Please enable the "Sync Abandoned Checkouts" setting and save it first." / "Please enable the "Sync Shopify Draft Orders" setting and save it first." The option is off. Turn it on and save.
"Please select at least one tag or disable the option." / "Please check sync direction" A setting is incomplete. Fix it and save.

POS orders

Message What it means What to do
"POS sync is enabled but no Shopify location → Odoo POS configuration mappings are set in Order Settings." / "Please add at least one Shopify location to Odoo POS configuration mapping when Sync Shopify POS Orders to Odoo POS is enabled." No location is mapped. Map your POS locations in Order Settings.
"No Odoo POS configuration mapped for Shopify location "…". Add a mapping in Order Settings." This location is not mapped. Add it.
"POS order has no Shopify location; cannot map to an Odoo POS configuration." The POS order has no location. Check the order in Shopify.
"POS order sync failed: no matching Odoo POS payment method for Shopify gateway(s) [...]" The payment method is not on the Odoo register. Add a POS payment method with the same name.
"POS order sync failed: no Odoo product for Shopify line "…" (variant …)." A product is missing in Odoo. Sync the product, then resync.
"POS order sync failed: no line items with positive quantity." Nothing to sync. Nothing.
"POS order create failed in Odoo: …" / "POS order create returned an invalid id from Odoo." Odoo refused the POS order. Fix what Odoo names.
"Odoo rejected the POS order through sync_from_ui (…). Creating it directly instead; Odoo will not create a stock picking for it." A fallback was used; stock is not moved. Check stock in Odoo.
"POS refund failed: …" A POS refund could not be created. The reason follows. Fix the reason, or refund in Odoo POS.
"POS refund skipped: no refundable product lines and zero refund amount." Nothing to refund. Nothing.
"POS order cancel failed for pos.order …: …" Odoo refused to cancel. Cancel in Odoo by hand.
"Each Shopify location can only be mapped once." / "Each Odoo POS configuration can only be mapped once." A duplicate row. Remove it.

Odoo to Shopify orders

Message What it means What to do
"Set the order sync direction to Odoo → Shopify before running this sync." The direction is Shopify → Odoo. Change the direction and save.
"Enable Order Sync and save your settings before running this sync." Order sync is off. Turn it on and save.
"Sync started. Matching Odoo orders are being created in Shopify." Your manual run has started. Nothing.
"Odoo order … (id …) not pushed to Shopify: …" The order was skipped. The reason follows. Fix the reason. The order is tried again on the next run.
"Odoo order … (id …) failed to push to Shopify: …" Shopify refused the order. Fix the reason.
"Odoo order has no lines." / "Odoo order has no sellable lines to create in Shopify." Nothing to create. Nothing.
"Odoo product … ("…") has no internal reference (SKU), so it cannot be created in Shopify and the order was not synced. …" A product without a SKU cannot be matched. Set the internal reference in Odoo.
"Odoo product "…" has … variants and … of them have no internal reference (SKU): …. …" Some variants have no SKU. Add them all.
"Odoo product … ("…") on line … has no Shopify variant mapped. Run a product sync for it, then resync the order." The product is not in Shopify. Sync the product.
"Product "…" (SKU …, Odoo product …) does not exist in Shopify and new product creation on order sync is disabled, …" Disable new product creation on Shopify with order sync is on. Sync the product, or turn the option off.
"Odoo order is in …, which this Shopify store cannot hold on a draft order — …" A draft order cannot carry that currency. Create real orders instead of drafts, or add the currency to Shopify.
"Rebuilt total … does not match Odoo total …; order not created. This usually means a line uses a tax setup the sync cannot express yet." The totals would differ, so the order was not created. Contact support with the Odoo order.
"Shopify rejected the order: …" / "Shopify … threw: …" / "Shopify returned no order and no error." Shopify refused the order. Fix what Shopify names.
"Odoo → Shopify order sync failed: …" The run stopped. Run it again.
"Odoo → Shopify order sync completed…. Scanned …, created …, skipped …, failed …." Summary. Check skipped and failed lines.

Field mapping

Message What it means What to do
"The field '…' does not exist in Odoo on the Product Variant (product.product) or Product Template (product.template) model. …" The Shopify Variant ID field name is wrong. Use a name starting with x_ so the app creates it, or create the field in Odoo first.
"The field '…' does not exist in Odoo and could not be created automatically (…). …" The Odoo user cannot create fields. Create the field in Odoo by hand, then save.
"Unable to verify the custom Odoo field for the Shopify Variant ID mapping: …" The check failed. Try again.
"Some mappings need attention." / "Check the mappings below" / "This mapping needs attention" A rule is incomplete. Fix the highlighted rule.
"Odoo custom fields must start with x_." Custom field names need the x_ prefix. Rename it.
"Select a Shopify field for this mapping." / "Select an Odoo field for this mapping." One side is empty. Pick both fields.
"Enter a field path, or turn the condition off." / "Field path is required when a condition is enabled." The condition has no path. Fill it in, or turn the condition off.
"Enter a value to compare against." / "Enter at least one value to compare against." / "Value is required for this condition operator." The condition has no value. Add a value.
"The mapping condition is not valid." / "Choose a valid condition operator." / "The mapping condition needs an operator." The condition is broken. Rebuild the condition.
"Choose a valid sync direction." / "Choose a valid Odoo field type." / "Choose a valid Shopify field type." A choice is missing. Pick it.
"Media mappings are only available on the Products tab." / "Media mappings require the Odoo → Shopify direction." / "Choose one of the available Shopify media targets." Product media rules have limits. Use them on products, Odoo → Shopify.
"Line item fields can only be mapped to the order line model (sale.order.line)." / "Order line mappings require the Shopify → Odoo direction." / "Order line metafields must come from the product or the product variant." / "Order line mappings must use a Shopify line item field or a product metafield." / "Choose one of the Shopify line item fields." / "Choose one of the available Odoo order line fields." Order line rules have limits. Follow the message.
"Product attribute mappings require the Odoo → Shopify direction." / "… require the Attribute Names field type." / "… must target a Shopify metafield." / "Choose an Odoo product attribute." / "Choose a Shopify metafield with a known type." / "This Shopify metafield type cannot be filled from Odoo product attribute values." Attribute rules have limits. Follow the message.
"Could not save rules: …" / "Save failed" / "Failed to load" / "Network error" The page could not talk to the app. Reload and try again.

See Field mapping.

Loyalty points

Message What it means What to do
"Shopify store credit access is required" / "Store credit access was not granted." / "Could not request store credit access. Please try again." The app needs Shopify's store credit permission. Click Grant permission and approve it.
"No Odoo loyalty program configured for this store yet." / "Select an Odoo loyalty program in Settings first." No program is chosen. Choose one in Settings.
"Loyalty points sync is disabled. Enable it in Settings first." / "Enable loyalty points sync in Settings first." The sync is off. Turn it on.
"No Shopify customer found for the provided email or phone." / "Multiple Shopify customers matched. Use a more specific email or phone." The lookup found none or several. Use another email or phone.
"This customer is not yet linked to an Odoo contact (they need at least one synced order)." No synced order yet. Wait for an order to sync.
"This customer does not have a loyalty card for the configured program." / "Loyalty card not found in Odoo." No card in Odoo. Create the card in Odoo.
"Insufficient points balance in Odoo." / "Enter … points or fewer." Not enough points. Redeem fewer points.
"Points were deducted in Odoo, but crediting Shopify Store Credit failed: …" Odoo changed but Shopify did not. Contact support; do not redeem again.
"Failed to update points balance in Odoo." / "… (loyalty history entry was rejected)." Odoo refused the change. Check the loyalty program in Odoo.

See Loyalty points for the rest.

Webhooks

These are answers the app sends back to an Odoo automation rule. You see them in the automation rule's log in Odoo.

Message What it means What to do
"Invalid payload" with "webhook_token is required and is not valid." The rule has no token or a wrong one. Contact support for the correct token.
"User not found" The token belongs to no active store. Contact support.
"Shop access token missing" The app must be reconnected in Shopify. Reload the app and approve the prompt.
"… sync is disabled for this store; webhook ignored." / "Realtime webhook … sync is disabled for this store; webhook ignored." / "Export invoice is disabled for this store; payment webhook ignored." / "Inventory sync direction is not Odoo → Shopify; webhook ignored." The matching setting in the app is off. Choose Real-time (webhook) and save, or turn off the Odoo rule.
"… webhook received; processing queued." / "Inventory update buffered; will sync to Shopify after a short delay" Accepted. Nothing.
"Duplicate … webhook within debounce window; acknowledged." The same event came twice in a short time. Nothing.
"Picking state is not done and no tracking provided; webhook acknowledged." / "Payment state is not paid or partially paid or in payment; webhook acknowledged." Nothing to send yet. Nothing.
"Order not found in token-scoped store; webhook acknowledged." / "Order not found locally; webhook acknowledged." The Odoo order was not synced by the app. Nothing, or sync the order first.
"Order cancelled; webhook acknowledged." / "Fulfillment order already closed in Shopify; webhook acknowledged." Nothing to do in Shopify. Nothing.

Settings and tools

Message What it means What to do
"Save or discard your changes before switching tabs." You have unsaved changes. Click Save or discard.
"We couldn't load your saved settings" Order Settings or Additional Order Settings could not load your settings, usually because the app's session with Shopify ran out. Your saved settings have not changed. If the page shows "This page is showing a copy from earlier in this session…", the values may be out of date, so Save is turned off. Click Try again. If it keeps happening, reload the app from your Shopify admin.
"Please Save your changes on this page (especially Enable Order Sync) before proceeding, or your changes will be lost." A reminder. Click Save.
"To configure additional settings, please enable Enable Order Sync in the main Order Settings." Additional Order Settings needs order sync on. Turn on Enable Order Sync and save.
"Please add at least one mapping." / "Please add a company." / "Please add a Shopify order tag." A multi-company row is incomplete. Fill it in.
"Please add at least one … mapping" (shipping, warehouse, tax, payment method, customer) / "Each … can only be mapped once." / "… are required for all shipping mappings." / "Order Tag and Customer Email fields cannot be empty." / "Odoo Customer Email is required when Map Orders to Single Odoo Customer is enabled." An Additional Order Settings mapping is incomplete or doubled. Fix the rows and save.
"With "Sync Tax-Included Price" on, every Shopify tax must map to an Odoo tax that is included in the price. Not price-included: …" / "With "Sync Tax-Included Price" on, choose an Odoo tax that is included in the price." A mapped Odoo tax is not "included in price". Pick a tax marked "(tax included)".
"Could not read the mapped taxes from Odoo to check they are price-included. Please try again." Odoo did not answer. Try again.
"More than one tax option is active" Tax options conflict. Keep only one on. See Taxes & pricelists.
"Invoices will not be created while orders sync as drafts" Quotations cannot be invoiced. Use Confirmed (Sale Order).
"Please choose both a start and an end date." / "Select a start and an end date." / "The date range start must be on or before the end date." / "The date range … is not a valid date." The date range is incomplete or wrong. Pick both dates, start first.
"No active sync to stop." / "Invalid sync type." Nothing to stop. Nothing.
"Invalid backup file" / "Invalid backup file: missing settings." / "Unsupported backup version. Expected …." / "Failed to import settings: …" The backup file cannot be used. Use a file exported by this app.
"Preferences imported. Reconfigure Odoo mappings in the app." You restored to another Odoo database, so only preferences were kept. Set the Odoo choices again.
"Please select at least one data type to clear." / "Failed to clear cache. Please try again." Clear Temporary Cache needs a choice. Tick a data type.
"Could not load duplicate orders." / "Could not read orders from Odoo. Please try again." / "Could not read products from Odoo" A tab on the Logs or Product Settings page could not read Odoo. Click Refresh.
"Could not read orders from Shopify." / "Could not load skipped orders." The Skipped tab could not load. Try again.
"Failed to submit activation request. Please try again." / "Please enter a valid email address" The alert mails request failed. Check the email and try again.
"Error saving … settings data" / "Failed to save settings" / "Failed to save additional settings" / "Something went wrong, please try again later" A save failed. Try again. If it repeats, contact support.

Common Odoo errors

When Odoo refuses something, the app shows Odoo's text after its own message. These are the ones we see most.

Odoo says (in short) What it means What to do
"You are not allowed to access '…' (…) records." / "This operation is allowed for the following groups: …" / "You do not have enough rights to access the field …" The Odoo user the app logs in with is missing a permission. In Odoo, give that user the group named (for example Sales / Administrator, Inventory / Administrator, Invoicing / Billing). Admin rights avoid most of these.
"Access Denied" / "Unsuccessful Authorization" The password or API key no longer works. Enter a new API key in Configuration.
"The operation cannot be completed: … Missing required fields …" / "… field is required" Odoo needs a value the order or product does not have. Often caused by a required custom field or a studio rule. Make the field optional, give it a default in Odoo, or fill it with Field mapping.
"Invalid field '…' on model '…'" A field the app sends does not exist in your Odoo version or setup. The app removes such fields and tries again on its own. If it keeps failing, check field mapping rules for a wrong field name.
"Record does not exist or has been deleted." The app points at a record that was deleted in Odoo (product, customer, journal, tax, pricelist). Pick the record again in the app settings, or resync so the app finds it again.
"You cannot add/modify entries prior to and inclusive of the lock date …" The accounting period is locked. Ask your accountant to change the lock date, or post the invoice by hand.
"The VAT number … does not seem to be valid." The customer's tax ID failed Odoo's check. The app retries without the tax ID so the order still syncs. Fix the tax ID on the contact in Odoo.
"Incompatible companies on records" / a message that a company is not allowed Records from different companies are mixed (for example a journal, warehouse or tax of another company). Invoice lines are built in the invoice's company, and Shopify → Odoo stock is counted in the company of the mapped location; a tax, account, journal or location you set in the app must belong to that same company. Check the company in Configuration, the company-wise journal mappings and the Odoo tax you chose. Then sync the order again.
"No journal could be found in company … for any of those types: sale" The company has no sales journal. Create one in Odoo and pick it in Order Settings.
An error that names an automation rule, server action or Studio rule Your own Odoo automation stopped the record (for example a stock or credit check). Change or turn off that rule in Odoo. It is not part of the app.
"Please define an accounting sales journal …" / "No account defined for …" Accounting setup is incomplete. Finish the accounting setup in Odoo.
"Insufficient stock" or "could not be assigned" on a delivery There is not enough stock to reserve. Add stock, or validate the delivery by hand.
16Help

Best practices

8 min read

These tips come from the problems we help merchants fix most often. Follow them and most errors never happen.

Before you go live

  1. 1
    Test first. If you can, connect a test copy of Odoo, sync a few products and place a few test orders. Check the sale order, invoice, delivery and stock in Odoo.
  2. 2
    Then switch to production once. When you connect the real database, follow Change or disconnect Odoo: export your settings, change the connection, clear the app's cache with Clear Temporary Cache, and set the Odoo choices again. Links made against the test database must not be reused.
  3. 3
    Set the start date. Set Start Date for Order Sync in Additional order settings to the day you go live, so old orders are not pulled in by mistake.
  4. 4
    Turn syncs on one at a time. Start with products, then stock, then orders, then status sync. Check each before you add the next.
  5. 5
    Save on every page. Settings you do not save are not used. On Order Settings, save Enable Order Sync before you open Additional Order Settings.
  6. 6
    Export a backup. Use Backup & Restore Settings > Export settings when your setup works, and again after big changes.

Odoo connection and user

  • Use an API key, not a password. It keeps working when the password changes or two-factor login is turned on. Some Odoo servers, such as Odoo Online, accept only API keys.
  • Use a dedicated Odoo user for the app, for example "Shopify integration". You can then see in Odoo which records the app created, and you can cut off access without affecting a person.
  • Give that user enough rights: products, inventory, sales, invoicing and contacts, plus CRM, Point of Sale, Purchase or Loyalty if you use them. Administrator rights avoid most permission errors.
  • Put the user in every company the app should work with. A user who is not in a company cannot see its journals, warehouses or locations.
  • Keep Odoo reachable. If your server has a firewall or proxy, allow /xmlrpc/2/* and /jsonrpc. Plan Odoo upgrades and maintenance outside your busiest hours, and check the Not Synced tab afterwards.
  • Use the production URL. On Odoo.sh, connect the production branch, not a staging build. Staging builds are copies and their records can be reset.

Products

  • One unique SKU per variant. Match on SKU (Internal Reference) or Barcode, and make sure every variant has its own value in both Shopify and Odoo. Empty or duplicate values are the most common cause of wrong matches and failed orders.
  • Check the duplicate tabs. Look at Duplicate SKUs - Shopify and Duplicate SKUs - Odoo on the Logs page now and then, and the Missing SKUs tab on Product Settings. Fix what they show.
  • Can't keep SKUs unique? Use Shopify Variant ID (Custom Odoo Field) matching instead. See Product sync.
  • Choose one master. Pick one Product Sync Direction and make product changes on that side only. Changes on the other side are overwritten or ignored.
  • Fill in the product before it syncs: name, SKU or barcode, price, product type and taxes. It is easier than fixing it on both sides later.
  • Sync big catalogs in parts. For Odoo → Shopify, sync by category or tag. Use the Date range option on manual runs to send only what changed.
  • Images: default first. Use Default Images Only. Use All Images only when you need them, and remove existing images first.
  • Keep Shopify's limits in mind: 3 options per product. Bundles and kits are not created by the app; build them by hand with the same SKU, then use the kit options in Kit products.
  • Use Only update existing products when Odoo has products you do not want in Shopify.

Stock

  • Map every location before you turn on stock sync. Map each Shopify location to the Odoo location (or parent location) that really holds its stock.
  • Pick the right quantity. Quantity Available is the safe choice for most stores: it is what you can sell now.
  • Sync stock in one direction. Orders already move stock in Odoo through their deliveries. Do not also push the same sales back from Shopify, or stock can be counted twice.
  • Match the frequency to your sales. A busy store needs a short interval or real-time sync. A small store is fine with hourly.
  • During big sales, consider Combine Odoo available + Shopify committed, so items reserved by open orders do not show as sold out too early.
  • Decide on zero stock. Do not sync zero stock leaves Shopify's old number in place for items at 0. Turn it on only if that is what you want.
  • Turn on Track quantity for every Shopify product you want stock for.

Orders

  • Check the Dashboard daily. Look at the Failed Orders and Sync Success Rate cards, and fix orders on the Not Synced tab while they are fresh.
  • Fix the cause, then resync. Data errors (a missing SKU, a missing country, an inactive currency) fail the same way every time. Resync after you fix them.
  • Resync in batches of up to 300. Larger batches can overload Odoo.
  • Don't use Delete Order to retry. It removes only the app's link. A later resync or edit creates a second sale order in Odoo.
  • Use confirmed orders. Confirmed (Sale Order) lets Odoo reserve stock, create the delivery and invoice. Odoo cannot invoice a draft quotation.
  • Map the extra lines. Set a shipping product and a discount product in Additional order settings, so every amount on the Shopify order has a line in Odoo.
  • Pick one tax method. Choose one of Sync Tax-Included Price, Map Taxes to Product Line Item, Map Shopify Tax to Odoo Tax or Enable Fixed Tax Mapping, and test it with an order that has a discount and shipping. See Taxes & pricelists.
  • Activate every currency you sell in, in Odoo (Accounting > Configuration > Currencies).
  • Use tags for routing. Order tags can choose the company, warehouse, sale journal and customer. Keep the tag names short and fixed.
  • Check Duplicate Orders - Odoo on the Logs page now and then.
  • Wait 2 minutes between edits of the same order when Enable Comprehensive Order Editing is on.

Invoices, payments and refunds

  • Set up invoicing before go-live to match how your accountant works: invoice all orders, paid orders only, or fulfilled orders only.
  • Choose the right journal. Pick a sales journal in Order Settings, and a payment journal for each company if you use several.
  • Map payment methods to journals if you take cash on delivery, bank transfer or gift cards, so each payment lands in the right journal. If one order can be paid in more than one way (gift card plus card), also tick Create one payment per Shopify transaction.
  • Check the lock date. Invoices and credit notes cannot be posted in a locked period. Close periods only after the sync for them is done.
  • Use Invoice Sync Only with care. No sale order means no stock change and no delivery in Odoo.
  • Test refunds. Make a partial refund and a full refund with restock, and check the credit note and the return in Odoo. Validate return deliveries in Odoo to put stock back.

Customers

  • Start with Only update existing customers if Odoo already has your customers, to avoid duplicates.
  • Ask for an email or phone at checkout. Orders without both cannot get a customer, unless you map guest orders to one Odoo customer.
  • Ask for a country in every address.
  • Use tag filters to sync only the customer groups you need.
  • Turn on Create Customer as Company on Odoo if you sell to businesses, so orders are filed under the company.

Real-time updates

  • Set up webhooks with us. Real-time fulfillment, payment, cancel and stock updates need an Odoo automation rule. We set it up with you for free. Until then, use Hourly (cron).
  • Keep hourly as a backup for refunds, which sync hourly only.

Several stores, companies or databases

  • Several Shopify stores, one Odoo: install the app on each store and connect each to the same database. Give each store its own order number prefix (in Shopify's settings), sales team or tag, and its own warehouse or company where it makes sense, so you can tell the orders apart.
  • Several Odoo companies: use Multi-company setup and set a sale invoice journal for each company.
  • One store, one Odoo database. Do not switch a live store between databases. If you must, follow the steps in Change or disconnect Odoo.

Monitoring and support

  • Read the Logs when something looks wrong. Search by order number. The newest line usually names the cause.
  • Activate Personalized Alert Mails if you want an email when an order fails because of missing data. See Dashboard.
  • Read App Updates on the Logs page, or the Changelog, to learn about new options.
  • Test changes on a few records first before you run a full sync.
  • When you contact support, send your store address, the order number or SKU, the exact error text and a screenshot. Email support@techmarbles.com or book a call.
17Help

FAQ

12 min read

Short answers to the questions we get most often. Each answer links to the topic with the full details.

FAQ

?
Which Odoo versions does the app work with?

Odoo 16.0 and later, Community or Enterprise. The app reads your Odoo version when you connect and adjusts to it, including Odoo 19. Some real-time features that need Odoo to call the app (Odoo → Shopify webhooks) usually work on Odoo 18 and later. See Getting started.

?
Does it work with Odoo Online (odoo.com)?

Yes. Two things to know:

  • Odoo Online does not accept passwords for API access. Use an API key in Password / API Key.
  • Odoo allows external API access only on some of its plans. If you see "Odoo is reachable but its external API is not responding.", check your Odoo plan with Odoo.

The Database Name is the first part of your address. For https://mycompany.odoo.com it is mycompany.

?
Does it work with Odoo.sh or my own Odoo server?

Yes. On Odoo.sh, connect the production branch and use the database name shown on that branch. Staging builds are copies that Odoo.sh can reset, so use them only for testing. On your own server, the API paths /xmlrpc/2/* and /jsonrpc must be reachable from the internet.

?
Do I need to install a module in Odoo?

No. The app uses Odoo's standard API, so nothing is installed in Odoo for the normal syncs. Real-time updates from Odoo to Shopify need an automation rule in Odoo (the Automation Rules app, base_automation). We set that up with you for free.

?
Which Odoo apps do I need?
  • Sales, Inventory and Invoicing (or Accounting) for products, stock, orders and invoices.
  • CRM if you send abandoned checkouts, draft orders or orders as leads.
  • Point of Sale if you sync Shopify POS orders to Odoo POS.
  • Purchase if you use Enable Product Vendor Mapping.
  • Loyalty (the Odoo loyalty program) for Loyalty points.
?
Should I use a password or an API key?

An API key. It keeps working when the password changes or two-factor login is turned on, and you can delete it at any time to cut the app off. Some servers, such as Odoo Online, accept only API keys. To make one: avatar > My Profile > Account Security > New API Key.

?
What rights does the Odoo user need?

Read and write rights on products, stock, sales, invoices and contacts, plus CRM, Point of Sale, Purchase or Loyalty if you use them. The user must also belong to every company the app should use. Giving it administrator rights is the simplest way to avoid "You are not allowed to access …" errors. See Common Odoo errors.

?
Can I connect several Shopify stores to one Odoo database?

Yes. Install the app on each store and connect each one to the same Odoo database. Each store has its own settings. To keep the stores apart in Odoo, give each one its own order number prefix (in Shopify), sales team, order tag, warehouse or company. Watch out for products that exist in both stores with the same SKU: they map to the same Odoo product, which is usually what you want for shared stock.

?
Can one Shopify store sync with two Odoo databases?

No. Each store connects to one Odoo database at a time. You can switch to another database, but the app then resets its Odoo choices. See Change or disconnect Odoo.

?
Does the app support several Odoo companies?

Yes. Choose Yes in Setup Multi Company Configuration. Order mapping sends each order to a company based on its Shopify order tag. Inventory mapping reads stock from locations in several companies. Each company can have its own sale invoice journal. See Multi-company setup.

?
Can I move from a test Odoo to my live Odoo later?

Yes. Export your settings first, then change the Server URL or Database Name and click Establish Connection. The app turns syncs off and clears the Odoo choices (journals, taxes, warehouses, locations), because record IDs differ between databases. Also click Clear Temporary Cache. Then set the choices again and turn syncs back on. See Troubleshooting.

?
Can products sync both ways at the same time?

No. Products, stock, orders and customers each sync in one direction at a time. You choose it with the direction setting on each page, for example Product Sync Direction. Pick the system where you manage that data.

?
How does the app know which Shopify product is which Odoo product?

By the field you choose in Configuration > Odoo SKU/Barcode Mapping: SKU (Internal Reference), Barcode, or Shopify Variant ID (Custom Odoo Field). Every variant needs a unique value. Duplicates cause wrong matches; the Logs page has tabs that list them. See Product sync.

?
Which product fields are synced?

Title, description, SKU, barcode, price, cost and tags, plus variants, images, and categories or collections if you turn that on. For products that already exist, you choose which fields are updated in Update Product Fields. Custom fields and metafields can be added with Field mapping.

?
How often do products sync?

Once a day when Enable Auto Product Sync is on, and any time you click Import Products, Export Products or Sync on a single product. Price-only and image-only syncs have their own buttons (Sync Prices, Import Images, Export Images).

?
Are bundles and kits supported?

The app does not create them: Shopify bundles and Odoo kits (Bill of Materials) work too differently to be converted automatically. Build the bundle in Shopify and the kit in Odoo with the same SKU or barcode. The app then syncs the kit's stock (worked out from its components) and its deliveries, once you turn on Calculate kit stock from components and Deliver kit components when a kit is fulfilled in Shopify. See Kit products.

?
Are variants with many options supported?

Yes, up to Shopify's limit of 3 options per product. If an Odoo product has more attributes, the first 3 become options and the log names the others.

?
If I delete a product, is it deleted on the other side?

No. Deleting or archiving a product is never synced, so you never lose a product by accident. Delete it on the other side yourself if you need to. If an order arrives for a product that was deleted in Shopify, the line is created in Odoo as a service product with a note that it was deleted on Shopify.

?
Can I use Odoo pricelists or Shopify markets for prices?

Yes. Sync Odoo Pricelist sends prices from one Odoo pricelist to Shopify. Map Price list with Shopify Market Catalog sends a pricelist to each Shopify market catalog. Map Price list to Cost per item sends a pricelist to Shopify Cost per item. Target Odoo Pricelist writes Shopify prices into a pricelist when prices sync from Shopify to Odoo. See Taxes & pricelists.

?
How often does stock sync, and which quantity is sent?

You choose the frequency, from every 15 minutes to once a week, or real time. You also choose the quantity (Quantity Available, Quantity On Hand or Quantity Forecasted) and which Shopify field it goes to. Each Shopify location gets the stock of the Odoo locations mapped to it. See Inventory sync.

?
How quickly do new Shopify orders reach Odoo?

Usually within a minute. Shopify tells the app about each new order straight away. During a big sale or a bulk resync, orders wait in a queue and can take a few minutes. If Odoo is down, orders are retried automatically.

?
Can I sync orders placed before I installed the app?

Yes. The app syncs orders created on or after Start Date for Order Sync, which is the day you installed the app unless you change it. To bring in older orders:

  1. Set an earlier Start Date for Order Sync in Additional order settings and click Save.
  2. Open the Skipped tab on the Dashboard. It lists orders from the last 60 days that are not synced yet.
  3. Click Sync now on each order you want.

There is also a short video: click How to Sync Old Orders? on Additional Order Settings. Sync up to 300 orders at a time.

?
Can I sync only some orders?

Yes. Sync Orders By Status limits it to paid, fulfilled, or paid and fulfilled orders. Sync Orders by Specific Shopify Tags limits it to orders with certain tags. An order that does not match yet syncs later, when it becomes paid or fulfilled, or when the tag is added.

?
Will Resync create a duplicate order in Odoo?

No. Before it creates a sale order, resync looks in Odoo for an order with the same customer reference and reuses it. Duplicates usually come from Delete Order followed by a resync, or from orders created in Odoo by hand. Logs > Duplicate Orders - Odoo lists them.

?
What does Delete Order on the Dashboard do?

It removes the order from the app only. Nothing is deleted in Shopify or Odoo. The link between the two orders is lost, so a later edit or resync creates a new sale order. Use it only for test orders. See Dashboard.

?
What happens if I delete or cancel the sale order in Odoo?

If you delete it, the app shows "Odoo sale order (id …) not found — it may have been deleted in Odoo. Resync to recreate it." on the order. If you cancel it in Odoo and Cancel status (Odoo → Shopify) is on, the Shopify order is cancelled too.

?
Can orders arrive in Odoo as quotations?

Yes. Set Odoo Order Creation State to Draft (Quotation). Note that Odoo cannot invoice a quotation, so no invoices are created while this is on.

?
Can Odoo orders create orders in Shopify?

Yes. Set Order Sync Direction to Odoo → Shopify. Each confirmed Odoo sale order becomes a Shopify order (or a draft order, if you choose that). New Odoo orders are picked up every 5 minutes, and you can run it for a date range with Sync Orders From Odoo → Shopify. Only one order direction works at a time. See Order sync.

?
Which currency is used for orders?

You choose in Currency to Sync with Odoo: Shop Currency or Customer Presentment Currency (the currency the customer paid in). The currency must be active in Odoo. If it is not, the order fails with a message telling you which currency to activate.

?
Are Shopify POS orders supported?

Yes. Turn on Sync Shopify POS orders to Odoo POS and map each Shopify location to an Odoo POS configuration. POS orders then arrive as paid POS orders on that register, and online orders still arrive as sale orders. Payment methods are matched by name. Without this option, POS orders sync as normal sale orders.

?
Does the app work for B2B and wholesale?

Yes:

  • Create Customer as Company on Odoo files orders under the company name on the Shopify address.
  • The customer's tax ID from Shopify is written to the Odoo contact.
  • Order tags can choose the company, warehouse, sale journal or a fixed Odoo customer.
  • Orders use the customer's Odoo pricelist, or one pricelist for all orders set in Default Pricelist for Order Sync.

See Customer sync and Additional order settings.

?
How are discounts, shipping, tips, duties and custom items sent?
  • Discounts: as one discount product line (Default Discount Product Mapping), or as a percentage on each product line (Map Discount to Product line item).
  • Shipping: as a shipping product line. You can map each Shopify shipping method to its own product or to an Odoo carrier.
  • Tips: as a "Tips" service line.
  • Import duties: as their own lines with Map Tariffs As Product Line Items.
  • Items with no Shopify product: as a "Shopify custom item" service line.

See Additional order settings.

?
Do edits to a Shopify order update Odoo?

Yes, with Enable Comprehensive Order Editing. Quantity changes, added or removed items, discounts, tags and notes are sent for orders that are not fully fulfilled. Once Odoo has a validated delivery, lines are not changed. Wait 2 minutes between two edits of the same order.

?
Does fulfillment sync both ways?

Yes. When you validate a delivery in Odoo, the Shopify order is marked fulfilled, with tracking (hourly or in real time). When you fulfill in Shopify, the matching Odoo delivery is validated, unless you turn that off. Shopify emails the customer only for orders up to 14 days old, so old orders are not announced.

?
Are refunds synced?

Yes. A Shopify refund creates a credit note in Odoo, and can restock the items (Enable Refund Order Sync, Enable Restock On Odoo for Refund Order Sync). The order must be invoiced first. A credit note posted in Odoo can refund the Shopify order hourly (Refund status (Odoo → Shopify)). See Order sync.

?
Are customers created in Odoo automatically?

Yes. Every synced order finds or creates its customer in Odoo, by email, or by phone when there is no email. You do not need to turn on customer sync for that. Customer sync is for moving your whole customer list. See Customer sync.

?
Can abandoned checkouts and draft orders go to Odoo CRM?

Yes, as CRM leads, every hour. Only checkouts and draft orders from the last 24 hours are sent. You need the Odoo CRM app. See Customer sync.

?
Is there a limit on orders, products or syncs?

No. Every plan has unlimited orders, products, customers and syncs. For bulk actions, resync up to 300 orders at a time so Odoo is not overloaded. See Plans & billing.

?
Is there a free trial?

Yes, 30 days. Billing starts only after the trial ends. See Plans & billing.

?
What happens to my data if I uninstall?

Your products, orders and customers stay in Shopify and Odoo. The app stops syncing and removes its own data. See Privacy & uninstall.

?
Where can I get help?

Email support@techmarbles.com or book a call. Send your store address, the order number or SKU, and the exact error from Logs. Setup help is included in every plan. Also see Troubleshooting and Error messages.

18Help

Changelog

29 min read

This page lists the changes you may notice in the app, newest first. Small fixes that only affected a few stores are not listed. For the announcements we show inside the app, open the App Updates tab on the Logs page.

October 2026

  • New Map Odoo categories to Shopify product categories on Product Settings (Odoo → Shopify). Map each Odoo product category to a category from Shopify's standard category list, and optionally use an Odoo field to give single products their own Shopify category. The category is set when products are created and updated, and only changed when the mapped category is different, so category attributes in Shopify are kept. Off by default. See Shopify product categories.
  • Fixed Market catalog prices (Odoo → Shopify) now follow your product sync filters: Sync Product By Category, Sync Product By Tags, Sync only products which has stock available on Odoo. and the date range of a manual sync. Before, a filtered product or price sync still updated the catalog prices of every linked product. Products outside the filters now keep their current catalog price. See Taxes & pricelists.
  • Fixed Product sync (Odoo → Shopify): a new product with Odoo attributes that don't create variants (set to Never under Variant Creation, for example "Material" or "Fit") is now created in Shopify. Before, those attributes were sent as Shopify options too. Shopify refused the product when that made more than 3 options, or when an option name contained " / ", and the sync still showed as completed. Now only the attributes your variants are made of become options, and " / " in a name is sent as "/". Run the product sync again to create the products that were missing. See What is synced / not synced.
  • Improved Product sync (Odoo → Shopify): when Shopify refuses products in a sync of up to 1,000 products, the Logs page now says how many and quotes Shopify's reason, for example "Product Creation failed: Shopify rejected 1 of 1 lines". Before, only larger syncs showed this. See A product was not created on the other side.
  • Fixed Market catalog prices (Odoo → Shopify): products you created in Shopify yourself and that the app matched by SKU or barcode now get their market catalog prices. Before, they were matched and updated, but their catalog prices were skipped. Run a product sync and then Sync Prices to send them. See Market catalog prices did not update.
  • Improved Market catalog prices (Odoo → Shopify): a compare-at price you set on a catalog price in Shopify is now kept when the app updates that price, and prices that have not changed are no longer sent again. See Taxes & pricelists.
  • Fixed Fulfillment sync (Odoo → Shopify): when an Odoo delivery's Tracking Reference holds several parcel numbers separated by commas, each number is now added to the Shopify fulfillment on its own. Before, all numbers were sent as one invalid number with no tracking link. Fulfillments already in Shopify are not changed. See Tracking numbers and carrier names.
  • New Map Odoo carriers to Shopify carriers, a checkbox under Fulfillment status (Odoo → Shopify) on Order Settings. Tick it to show the mapping table. Shopify creates a tracking link only for carrier names it knows, so map your Odoo carriers (for example "DPD Deutschland - Express") to a Shopify carrier name (for example DPD Germany) to give customers a clickable tracking link. Off by default, so nothing changes until you tick it and add a row. See Tracking numbers and carrier names.
  • Fixed Price lists (Odoo → Shopify): when an Odoo price list is in a different currency than your product prices, the price is now converted with your Odoo exchange rates before the price list's rules are applied, the same way Odoo does it. Before, the raw number was sent, so a 160 JOD sales price on a price list in AED reached Shopify as 208 instead of 1,095. Market catalog prices no longer drop Discount and Formula lines when the price list is in another currency, and lines Based on another price list now work. Run a price sync to correct the prices. Keep your currency rates up to date in Odoo: with no rate, the price is sent unconverted and the sync log says so. See How a price list price is worked out.
  • Fixed Price lists (Odoo → Shopify): a Formula line's Min. Price Margin and Max. Price Margin are now measured from the price before the discount, as in Odoo, instead of from the discounted price. A line that fills in both Odoo's Discount and Markup boxes no longer counts the margin twice. See How a price list price is worked out.
  • Fixed Price lists (Odoo → Shopify): a price list line whose Apply On comes from an extra Odoo module, such as a rule for a brand or a designer, is no longer treated as All Products. Before, one such line repriced the whole catalogue. The products keep their normal sales price, and the sync log names how many lines were left out. See How a price list price is worked out.
  • Fixed Product export (Shopify → Odoo): products the export paused on because your Odoo had taken as many API calls as it should for the minute are no longer reported as failed and left unsynced. Before, an export could finish as Completed with a handful of products counted as failed that were never retried, so those products were missing from Odoo until you noticed and ran the export again. They now stay counted as still to do and the export syncs them as soon as there is room. If the wait lasts hours, the export gives up on them and the Logs page says how many were not synced and that you should run the export again. Products left behind by an earlier export are not synced automatically: click Retry failed or skipped products, or run the export again. See Progress cards.
  • Fixed Refund sync: a refund made in Shopify for an amount only, without picking items, now reverses the invoice's VAT on the credit note. Before, the credit note line took the default tax of the sales account, so with a fiscal position that maps to an account without a default tax (for example an OSS fiscal position for another EU country), the whole amount was booked as revenue and no VAT was reversed. The credit note total does not change. Credit notes already in Odoo are not changed. See Refunds.
  • Fixed Product sync (Odoo → Shopify) after connecting the app to a new Odoo database: a new Odoo product is no longer linked to an existing Shopify product through links saved for the old database. Before, it could reuse the old link and its variants were sent to the wrong Shopify product, where Shopify refused them with "Option does not exist". Now the new product is created on its own in Shopify. See The wrong product was matched.
  • Improved Product sync (Shopify → Odoo) on Odoo above 19.0: a product with variants now shows the lowest price of its Shopify variants as its Sales Price in Odoo, instead of 0. Each variant keeps its own price, and the product price is only written when it changes. Odoo 19.0 and older are unchanged. See Prices of products with variants.
  • Fixed Inventory sync (Shopify → Odoo) on an Odoo database with several companies: stock is now counted in the company of the mapped Odoo location. Before, if your Odoo user's default company was a different one, Odoo refused the stock update with "company inconsistencies", so Odoo kept its old quantity, and a full sync could run for hours and end as failed. Run Process Inventory Sync once to send the current Shopify stock. See Location mapping.
  • Improved Order Settings now shows a warning when Activate Payment Creation is ticked together with one of the Mark Invoice as In Payment options. "In Payment" only changes the invoice status and never creates a payment, so the tick had no effect. Pick a Mark Invoice as Paid option to create payments. Nothing changes in how orders sync. See Mark invoice paid or in payment.
  • Fixed Order editing: a discount whose title contains "shipping", such as an automatic "Free shipping on 2+ items" discount, is no longer added to the Odoo order again each time the Shopify order is updated. Before, every update after the order was created added one more copy of the discount line, so the Odoo order total dropped below Shopify's. The next update of such an order removes the extra copies and keeps the line already on the invoice. See Order editing.
  • Fixed Order sync (Shopify → Odoo) with location mapping: when an order's delivery is moved to the mapped Odoo location of another warehouse, its products are now reserved from that location. Before, the delivery showed the new Source Location but its lines stayed reserved in the order warehouse's stock, mainly on Odoo 16. Deliveries already in Odoo are not changed: set them to draft and back, or click Unreserve and then Check Availability. See Location mapping.
  • Improved The last English texts on the settings pages are now translated into every app language: the kit options on Order Settings and Inventory Settings, the Odoo invoice payment option, the message shown when companies and journals can't be loaded from Odoo, and the Sync Tax-Included Price tax mapping hints. See Order sync.
  • Improved The Loyalty Points page is now translated into every app language. Before, it was shown in English even when you chose another language. See Loyalty points.
  • Improved The Configuration page now shows the Odoo connection and configuration fields in your app language: field names, tips, placeholders, the warning for Shopify Variant ID (Custom Odoo Field) and the Yes/No and SKU/Barcode choices. Before, these fields were always in English. Company names and other lists from your Odoo are shown as they are in Odoo. See Getting started.
  • Improved The Logs page now shows in your app language on every tab: the log table, Active Webhooks and the duplicate checks for Shopify, Odoo and orders. Before, only the tab names and the page buttons were translated. Log messages written by the sync, and Odoo order states such as sale or draft, are still shown as they are stored. See Logs and tools.
  • Improved The orders table on the Dashboard, including the Skipped tab, now shows in your app language: tabs, column names, statuses, tooltips, sort options, buttons and messages. Before, it was always in English. The exported CSV uses the same column names. See Orders table.
  • New Field mapping: a Refresh link next to Odoo field (with Custom fields (x_*)) and Attribute (with Attribute Names). Click it to load a field or attribute you just created in Odoo without closing the mapping. See Odoo field types.
  • New Refresh button next to Default Warehouse to Sync Order Delivery on Additional Order Settings. Click it to load a warehouse you just created in Odoo, without reloading the page. See Warehouse, delivery and sales team.
  • Fixed Export Customers (Shopify → Odoo): when a contact filed under another contact has the same email as the main contact, the export now updates the main contact. Before, it could update the contact underneath instead, so fields from Field mapping seemed not to sync. The address now comes from the customer's default address, and an empty phone, street, city or ZIP in Shopify no longer clears the value on an existing Odoo contact. With the Shopify tag filter on, the confirm window now names the tags instead of saying all customers. See Customer sync.
  • Fixed Order sync (Shopify → Odoo) with tax-included Shopify prices and Sync Tax-Included Price off: when the Odoo total already matched Shopify but the untaxed amount and tax were a cent apart (for example 52.22 + 3.65 against Shopify's 52.21 + 3.66), new orders now match Shopify's untaxed amount and tax exactly. This happens when your Odoo company rounds tax per line. Orders already in Odoo are not changed. See Sync Tax-Included Price.
  • Fixed Market catalog prices (Map Price list with Shopify Market Catalog) now follow the Odoo price list rules the same way as the base price. A Fixed Price line is sent as exactly that price. Before, an old discount left on a fixed-price line was still applied, so the catalog price could be a few percent off. Discount and formula lines, and lines for a product category or for all products, now work for catalogs too. Run a price sync to correct the catalog prices. See Pricelists on products.
  • New Add Odoo taxes to market catalog prices, under Map Price list with Shopify Market Catalog. Turn it on when your Odoo price lists are before tax and your Shopify market shows prices with tax: each product's Odoo sales taxes are added to its catalog price. See Sync Odoo Pricelist.
  • Improved Product sync (Odoo → Shopify): products and variants skipped because they have no SKU or barcode in Odoo are now reported in one line at the end of each sync, with the count and up to 10 example names. Before, each skipped product got its own line on every sync, so a large catalog could fill the Logs page with thousands of identical lines. See Product sync.
  • Fixed Fulfillment sync (Shopify → Odoo): when Odoo reserved a product from more than one location or lot, validating the delivery now takes each quantity from where Odoo reserved it. Before, the whole quantity was taken from the first location, so that location could go negative while another still showed the stock. Stock already moved this way is not changed; move it back in Odoo. See Shopify → Odoo.
  • New Field mapping: Product Brand is now listed under Default fields for Template (product.template) when your Odoo has a product brand module. Map it to the Shopify Vendor to show each product's brand as its vendor. See Products tab.
  • Fixed Map Price list with Shopify Market Catalog now works without a Select Price List. Leave it empty (pick --Select--) and price syncs update only your market catalogs, leaving the Shopify base prices unchanged. Before, the page asked for a sales or cost price list, and a price sync then overwrote the base prices. See Sync Odoo Pricelist.
  • Fixed Market catalog prices are now updated after product syncs of more than 1000 products, and after price syncs where every base price was already up to date. Before, the catalogs kept their old prices in those cases. See Pricelists on products.
  • Fixed Invoices (Shopify → Odoo) on an Odoo database with several companies: invoice lines are now built in the invoice's company. Before, if your Odoo user's default company was a different one, Odoo picked that company's income account and tax and refused the lines ("Incompatible companies on records"), so the invoice stayed empty and the order unsynced. Sync the order again to fill in its invoice.
  • Fixed Order sync (Shopify → Odoo): an order no longer fails with "Failed to align local order items with Odoo lines after atomic create" when your Odoo marks the shipping line as a delivery line, for example with an automation that sets the delivery method. The order was already created in Odoo, but the invoice and payment steps after it were skipped.
  • Fixed Order editing: when you add items to a Shopify order whose Odoo order already has a validated delivery, the items are now added to the Odoo order and Odoo creates a new delivery for them. Before, only the discount for the new items reached Odoo. Removed items and lower quantities on such an order are listed in the Logs tab for you to handle in Odoo. See Order editing.
  • Fixed Sync Orders From Odoo → Shopify now works through every order in the date range you pick, up to 300 created orders per run, and a range can be up to 90 days. Before, each run only looked at the first 25 orders, so orders that couldn't be created kept the newer ones from ever being reached, and a range longer than 31 days was cut short without saying so. See Odoo → Shopify orders.
  • Fixed Fulfillment status (Odoo → Shopify): if a fulfillment the app created is cancelled in Shopify and you then validate a new Odoo delivery, for example after a return, the new delivery now fulfills the order in Shopify. Before, the order stayed unfulfilled because the app still treated it as fulfilled. See Order sync.
  • Fixed Order sync (Shopify → Odoo) with tax-included Shopify prices and Sync Tax-Included Price off: a discounted line now gets the right net price in Odoo. Before, the price sent to Odoo was too high and Odoo took the discount off on top, so the Odoo total was higher than Shopify's. Orders already in Odoo are not changed. See Sync Tax-Included Price.
  • Fixed Inventory sync with Calculate kit stock from components turned on: a store with thousands of products now finishes in minutes. Before, the run could take over two hours and end as failed every time, so stock stopped updating in Shopify. See Kit products.
  • Fixed Import Customers (Odoo → Shopify): a contact in Puerto Rico, Guam or another US territory is now created with country United States and the territory as the state. Before, it made Shopify refuse that contact and up to 24 others sent with it, and the log blamed the Shopify rate limit. Each customer Shopify refuses now has its own log line with the reason. See Customer sync.
  • Fixed Order sync (Odoo → Shopify): an address in a US territory no longer stops the order from being created.
  • Fixed Order sync (Odoo → Shopify): if you match products by barcode, an order product with no barcode now fails with "… has no barcode, and products are matched by barcode …" instead of a message about the internal reference.
  • Improved Image sync: an image that hits the Shopify rate limit is tried again a few times before it is skipped. See Product sync.
  • Fixed Order sync (Odoo → Shopify): order products are now found in Shopify only by the product matching field you chose in Configuration (SKU, barcode or Shopify variant ID). If you match by barcode, a product with no internal reference (SKU) in Odoo is now found by its barcode. Before, the order failed with "has no internal reference (SKU)" even when the product was already in Shopify. See Additional order settings.
  • Fixed Import Customers (Odoo → Shopify) now works when your Shopify store has no customers yet. Before, the run waited 15 minutes, then ended as completed without creating any customers. See Customer sync.
  • New Use invoices created in Odoo, under Payment status (Odoo → Shopify). If you sync orders Shopify → Odoo and create invoices in Odoo yourself, the Shopify order is now marked paid when its Odoo invoice is paid, without turning on Export Invoice. Only orders placed on or after the date you pick are changed. See Use invoices created in Odoo.
  • New Map Price list to Cost per item, under Sync Odoo Pricelist. Pick an Odoo price list and the app writes it to Shopify Cost per item when syncing Odoo to Shopify. See Sync Odoo Pricelist.
  • Fixed Price list choices, such as Select Price List and Default Pricelist for Order Sync, now show the names in the language of your Odoo user. Before, a price list you renamed in Odoo could keep its old name in the app, so two lists could look the same. See Sync Odoo Pricelist.
  • Improved The bundle and kit notice on the product sync page now explains how to set up a kit: build it in Shopify and in Odoo with the same SKU or barcode, then use the kit options. Before, it said kits could not be synced at all. See Kit products.
  • Fixed If Order Settings or Additional Order Settings can't load your settings, the page now says "We couldn't load your saved settings" with a Try again button, and Save stays off until they load. Before, the page could show default values, such as order sync turned off, as if they were saved. See Settings and tools.
  • Fixed Inventory sync (Odoo → Shopify): when Odoo takes too long to answer for a group of products, often kits, the app now tries that group again in smaller parts instead of skipping it. Before, the same products could be left unchanged in Shopify on every run, with the warning "Odoo product lookups failed".
  • New Create one payment per Shopify transaction, under Activate Payment Creation. An order paid with a gift card and a card gets one Odoo payment for each, in the journal mapped to its payment method. Refunds go back the same way. See One payment per Shopify transaction.
  • New Map Shopify Tax to Odoo Tax has a Country column. On EU OSS stores, where one Shopify tax is used for several countries, map it once per country. Existing rows apply to every country, as before. See Map Shopify Tax to Odoo Tax.
  • Fixed With Map Shopify Tax to Odoo Tax on, a discount synced as its own line (for example a shipping discount) now gets the mapped tax of the lines it was taken off, instead of the discount product's default tax.
  • Fixed After you change the tax rounding method of your Odoo company, the tax rounding fix on tax-included orders now uses the new method within an hour. Before, it could use the old one for up to a day.
  • Improved Shopify privacy requests are now handled automatically. A customer erasure deletes that customer's link record, email, addresses and loyalty history in the app, and blanks their email and phone in logs. A store erasure removes names, emails and error messages from the record kept after uninstall. See Customer privacy requests.
  • Improved Your Odoo password or API key is no longer sent to your browser or written to logs. The connection form shows dots in its place.
  • New Skipped tab on the dashboard. It lists Shopify orders from the last 60 days that never reached the app, with the reason (Tag filter, Order status filter, Not received or Cancelled in Shopify) and a Sync now button. See Skipped orders.
  • New Map Shopify payment methods to Odoo payment methods, in Additional Order Settings.
  • New Map sale journals by order tag or by payment method, in Order Settings.
  • New Sync the images of one product, or of the products you select, from the product sync list (Sync Images, Sync Images for Selected).
  • New The product sync list can now be searched and filtered for the Odoo to Shopify direction too.
  • New Choose the price sync direction for a single run, without changing your saved product sync direction.
  • New Shopify Payment ID can now be used as a source in Field Mapping.
  • New Fulfillments synced from Shopify to Odoo now write a line in the Logs tab, with the Odoo delivery name, or why it could not be synced.
  • Improved Orders that fail because your Odoo could not be reached are now retried in the background until Odoo answers again, for up to about a week. This helps stores whose Odoo has nightly maintenance.
  • Improved The Logs tab now shows when each event happened, instead of the date of the order it belongs to.
  • Improved The check for products without a SKU or barcode moved from the Logs page to a Missing SKUs tab on the Product Settings page.
  • Improved Orders already in Odoo keep receiving edits, payments and fulfillments, even when they no longer match your order tag rule.
  • Improved The inventory category filter now includes products in subcategories of the category you picked.
  • Improved Price sync now finishes on very large catalogs.
  • Improved The app is now called TM Odoo Integration in Shopify.
  • New Odoo kit products (Bill of Materials of type Kit) linked to a Shopify product by SKU or barcode: Calculate kit stock from components in Inventory settings and Deliver kit components when a kit is fulfilled in Shopify in Order Settings. See Kit products.
  • Fixed A kit delivered in Odoo is now marked fulfilled in Shopify only once all its components are delivered. Before, delivering one component could fulfil the whole kit.
  • Fixed After you cancel a fulfillment in Shopify and ship the order again from Odoo, the new delivery now fulfills the Shopify order. Before, it was ignored. A validated return in Odoo no longer counts as a delivery. See Order status sync.
  • Fixed New Odoo contacts created from an order now get the customer's Shopify tags.
  • Fixed A cancellation that hit a temporary error is now retried, so the Odoo sale order no longer stays open behind an order cancelled in Shopify.
  • Fixed Cancellations of orders that your tag rule keeps out of Odoo no longer log a "cancel it in Odoo manually" message.
  • Fixed Starting an inventory sync while one was already running no longer marked the running sync as failed.
  • Fixed With real-time stock sync from Shopify to Odoo, a sale was sometimes taken out of Odoo stock twice.
  • Fixed The shipping and billing address options now also show when you map all orders to a single customer.
  • Fixed Line discounts now sync to Odoo versions where the normal discount field can't be written.

September 2026

  • New Sync Shopify POS orders to Odoo Point of Sale, with a mapping from Shopify locations to Odoo POS configurations, in Order Settings.
  • New Order Status Sync in both directions, plus a manual status sync.
  • New Order Sync Direction in Order Settings: you can now sync orders from Odoo to Shopify instead. The app checks Odoo for new orders every five minutes.
  • New Map Shopify payment methods to Odoo payment journals.
  • New Disable Inventory Tracked on Shopify For Synced Products, in Product Settings.
  • New Shopify tips now sync to Odoo as a service product line.
  • New Shopify custom items (lines with no product behind them) now sync to Odoo as a service product line, instead of failing the order or being left out.
  • New Map Shopify line item properties to the Odoo order line description, and product or variant metafields to order lines.
  • New Sync the customer's tax ID (VAT number) from Shopify to the Odoo contact, and use it as a Field Mapping source.
  • New Restocks done from the Shopify returns screen now sync to Odoo.
  • New An Every 5 Minutes inventory sync frequency.
  • Improved Track Inventory in Odoo and Track quantity in Shopify now stay aligned during product sync.
  • Improved Company orders now sync under the company in Odoo, with the contact, invoice address and delivery address filed below it. Create Customer as Company on Odoo keeps the company name.
  • Improved When Odoo refuses to create a product during an order sync, the error now shows Odoo's real reason.
  • Improved Order edits made only to tags or notes now sync.
  • Improved Order edits now also reach locked Odoo sale orders.
  • Improved Short Odoo outages no longer mark an order as synced when it was not.
  • Improved Support for Odoo 20 and the 2026-07 Shopify API.
  • Improved Toast messages no longer hide behind the Shopify Sidekick panel.
  • Fixed Cancelling an order in Shopify did nothing when the Odoo sale order was locked.
  • Fixed A refund no longer rewrites the sale order. Credit notes are no longer a cent short.
  • Fixed The app no longer writes to an Odoo sale order that belongs to a different Shopify order (for example after switching to another Odoo database).
  • Fixed In barcode mode, the SKU no longer decides which product is matched on import from Odoo.
  • Fixed Product import now prefers the active product and skips matches that are only archived.
  • Fixed Image export no longer sends a whole gallery again as duplicates.
  • Fixed Discount and shipping lines now map to their own Odoo product.
  • Fixed Fulfillment updates that could not reach Odoo are now retried.
  • Fixed Order sync failed with "Invalid falsy real id" when Enable Fixed Tax Mapping was off.
  • Fixed The collection and tag pickers in product sync no longer duplicate your selection.

August 2026

  • New Date range filter on every manual sync (products, prices, images, inventory, customers), with presets such as Today, Yesterday and Last 7 days.
  • New Sync Odoo Incoming Qty To Shopify Incoming Qty and Shopify Target Type, in Inventory Settings.
  • New Real-time inventory sync through webhooks.
  • New Combine several Shopify locations into one Odoo warehouse when stock syncs from Shopify to Odoo.
  • New Tax rate mapping: Map Shopify Tax to Odoo Tax, in Additional Order Settings.
  • New Map refund credit notes to your configured sales journal.
  • New Odoo product attributes in Field Mapping.
  • New A Love this app? card that shows our other apps. You can dismiss it.
  • Improved Category filters now use the full category tree, and only show categories of the company you mapped.
  • Improved Order-create errors now show Odoo's real reason, not a generic error.
  • Improved If Odoo locks the login after repeated failures, the app stops trying and suggests using an API key.
  • Improved Pages load faster and move around less while loading.
  • Fixed Stopping a manual inventory sync now works.
  • Fixed Customer sync no longer sends your whole customer list again on every run, and no longer drops batches when Shopify slows it down.
  • Fixed Refund restocks now use the right delivery and keep the credit note's paid state.
  • Fixed Orders failed when an Odoo currency had been renamed.
  • Fixed The category picker could return nothing and hang on "Refreshing…".

July 2026

  • New Enable Invoice Sync Only: sync Shopify orders to Odoo as invoices, without sale orders. The dashboard shows Invoice only and Invoice pending badges for these orders.
  • New Refund status (Odoo → Shopify): Odoo credit notes become Shopify refunds.
  • New Map Shopify shipping methods to Odoo shipping products by SKU.
  • New Map Odoo Warehouse Based on Order Tags.
  • New Map Tariffs As Product Line Items, and an option to map all taxes to a single order line.
  • New Target Odoo Pricelist for Shopify to Odoo price sync, and sale price to compare-at price pricelist mapping.
  • New Add a fixed tax rate on top of prices synced from Odoo to Shopify.
  • New Quantity Forecasted as an inventory quantity type.
  • New Map Guest Orders Only for customer mapping.
  • New Note attributes in Field Mapping (Orders tab), and default sale order fields.
  • New Live progress bars with a Stop button for manual product, price, image and inventory syncs.
  • New The App Updates timeline and the Duplicate Orders - Odoo tab on the Logs page.
  • New Dashboard cards Orders Synced Today, Failed Orders, Last Order Synced and Sync Success Rate.
  • Improved Orders that stop half way through a sync are now picked up again automatically.
  • Improved Faster order sync when many orders arrive at once.
  • Improved The app layout on phones.
  • Fixed Invoice status did not change to paid for Shopify orders with "payment due later".
  • Fixed Invoice dates now follow your store's calendar date.
  • Fixed An inventory sync could set stock to zero for some locations.

June 2026

  • New Map Odoo pricelists to Shopify market catalogs.
  • New Create new and update existing products mode for Shopify to Odoo product sync.
  • New Sync Odoo POS categories as Shopify collections.
  • New Pricelist mapping on orders by customer or by currency.
  • New Field mapping for image URLs, all Shopify address types, and the eCommerce description.
  • Improved The dashboard shows Syncing instead of Failed for orders that are still being processed.
  • Improved Customers are matched by phone number digits, to avoid duplicate contacts.
  • Improved Small and manual product syncs now run before large ones.
  • Fixed Order sync failed on Odoo databases without the delivery module.
  • Fixed Price sync on stores with more than 2,000 products.
  • Fixed Fulfillment sync failed when a product identifier had spaces around it.

May 2026

  • New The app is available in Spanish, Japanese, Chinese and Hindi, next to English, French, German and Italian.
  • New Export settings and Import settings, to back up your app settings and restore them.
  • New Map Shopify shipping and billing addresses to Odoo delivery and invoice addresses when you map a default customer by order tag.
  • New Real-time inventory sync from Shopify to Odoo.
  • New Sales team mapping on invoices.
  • Improved The app works better on phones.
  • Improved Order sync handles large numbers of orders faster.
  • Fixed Wrong times on the dashboard and on invoices for some time zones.
  • Fixed Order log lines now link to the right order.
  • Fixed Duplicate addresses were created for new customers.

April 2026

  • New Field Mapping: map standard fields, metafields and images to Odoo standard or custom fields, for orders, products and customers, in either direction.
  • New Map Shopify shipping methods to Odoo carriers.
  • New Export Orders on the dashboard: download the orders as a CSV file. The old Shopify orders tab was removed.
  • New Multi-company setup: send orders, stock, products and customers to the right Odoo company.
  • New Sync Draft Products from Shopify to Odoo.
  • New Sync Shopify draft orders and orders to Odoo CRM leads, in Customer Settings.
  • New The app fetches orders again from Shopify when their webhook never arrived.
  • New Multi-language support for the app screens.
  • Improved Partial fulfillments and backorders now sync correctly from Shopify to Odoo.
  • Improved The dashboard loads faster.

March 2026

  • New Product Sync Status tab: a list of your products with their sync status, and a Sync button per product.
  • New Real-time fulfillment, payment and cancel updates from Odoo to Shopify through webhooks.
  • New Invoicing Policy in Odoo: option for products created from Shopify.
  • New Save and Discard buttons on settings pages.
  • Improved Image sync in both directions is faster and syncs all images.

February 2026

  • New Support for Odoo's new JSON-2 API.
  • New Payment status sync from Odoo to Shopify, with more options.
  • New Skip location mapping for inventory sync.
  • New Sync order tags to Odoo.
  • Improved Bulk product updates no longer overload your Odoo server.
  • Improved Customer sync from Shopify to Odoo is faster.

January 2026

  • New Order editing: changes to quantities, items and discounts in Shopify now sync to the Odoo sale order.
  • New Sync multiple product images in both directions.
  • New Enable Product Vendor Mapping and a tag filter for Shopify to Odoo product sync.
  • New Set products in draft state on import for new products (Odoo to Shopify).
  • New Custom times for the inventory sync frequency.
  • Improved The duplicate product check now also uses barcodes.
  • Improved Personalized Alert Mails moved to the dashboard, and Additional Order Settings got its own place in the app menu.
  • Improved Clearer error messages when an Odoo call fails.
19Help

Privacy & uninstall

9 min read

This topic lists the data the app reads from Shopify and Odoo, what it keeps on our servers, how customer privacy requests are handled, and what happens when you uninstall or reinstall the app.

What it does

The app copies data between your Shopify store and your Odoo database. To do that it reads data on one side and writes it on the other. It keeps only what it needs to remember which record belongs to which, your settings, and a history of sync actions.

Your products, orders, invoices and contacts live in Shopify and in Odoo, not in the app. Uninstalling the app does not delete them.

What the app reads in Shopify

When you install the app, Shopify asks you to approve these permissions:

Data Why the app needs it
Products, variants, collections and sales channels Create and update products, prices, images and stock in either direction, and publish new products.
Inventory and locations Read and set stock levels per location.
Orders, including abandoned checkouts Send orders to Odoo, update them when they change, and send abandoned checkouts to Odoo CRM.
Draft orders Send draft orders to Odoo CRM, and create Shopify orders from Odoo.
Fulfillments and fulfillment orders Mark orders as fulfilled with tracking numbers when Odoo ships them, and read fulfillments made in Shopify.
Customers Create and update customers in either direction.

Some features ask for extra permissions only when you turn them on. Shopify shows you the request and you approve it. For the full list of permissions, see Shopify permissions.

The app never sees payment card details. Shopify does not share them with apps.

What the app reads and writes in Odoo

The app uses the Odoo user you entered in Odoo Connection. It can only do what that user is allowed to do. It reads and writes:

  • Products, product categories, pricelists and taxes.
  • Warehouses, locations, stock levels and deliveries.
  • Sale orders, invoices, payments and credit notes.
  • Contacts (customers and their addresses).
  • CRM leads, if you turn on the CRM features.
  • Companies and journals, to fill the lists in the settings.
  • The custom field for the Shopify variant ID, if you choose that matching method. The app creates it for you if it does not exist.

What the app stores

The app keeps this data on our servers while it is installed:

Data What it is
Store details Your store address, the access key Shopify gives the app, the store owner's name and email, currency, time zone and plan status.
Odoo connection Server URL, Database Name, Username and Password / API Key, plus the Odoo version the app detected.
Settings Everything you set on the app's pages, including mappings and field mapping rules.
Product links Which Shopify variant matches which Odoo product.
Customer links Which Shopify customer matches which Odoo contact, with the customer's email and addresses as synced.
Order records Each synced order: its Shopify and Odoo numbers, sync status, error message, order lines and refunds. These feed the Dashboard.
Logs Each sync action with its result and message. Messages can include order numbers, product names and customer names. These feed the Logs page.
A secret token A code unique to your store that Odoo uses when it sends real-time updates to the app.

Our support team can look at your app settings and logs when they help you.

How your Odoo login is kept

  • Your Odoo login details are stored in the app's database on our servers. The app uses them only to connect to your Odoo.
  • The app never sends your password or API key back to your browser. The Password / API Key field shows dots in its place. To change it, clear the field and type the new one. If you leave the dots as they are, the app keeps the one it has.
  • The password or API key is never written to the app's logs.
  • The settings file from Export settings does not contain your password or API key.
  • The details are deleted when you uninstall the app.

To keep your Odoo safe:

  • Use an API key, not the user's password. You can delete an API key in Odoo at any time, and the app loses access right away. Your password stays private.
  • Create a separate Odoo user for the app. Give it only the rights the app needs.
  • If you think the key has leaked, delete it in Odoo (My Profile > Account Security), make a new one, and enter it in Configuration > Odoo Connection. Changing only the key keeps all your settings.

Customer privacy requests

Shopify has three privacy requests that it sends to every app. This is how the app handles them.

A customer asks for their data (customers/data_request):

  • Shopify tells the app about the request.
  • The app does not send an automatic report.
  • The app holds only the link data listed above. If you need it for a request, write to support@techmarbles.com.
  • The customer's full record is in Shopify and in Odoo. Export it from there.

A customer asks to be erased (customers/redact):

  • Shopify tells the app about the request. The app then deletes what it holds about that customer, on its own, within a few minutes:
    • the customer link record, with the customer's email and addresses;
    • their loyalty points balance and history in the app;
    • the customer's email and phone number wherever they appear in log messages and order error messages. They are replaced with [redacted].
  • The customer's orders stay on the Dashboard with their order numbers. They are no longer linked to a customer. Later updates to those orders still reach the right Odoo order.
  • The app does not change or delete anything in Odoo. Odoo is your own system. Delete or anonymize the contact, and their documents if your rules allow it, in Odoo yourself.

A store is erased (shop/redact):

  • Shopify sends this 48 hours after you uninstall the app.
  • The app deletes any data it still holds for your store: customer links, order records, product links, logs, settings, your Odoo login details and the store's log files.
  • Most of this is already gone, because the app deletes it at uninstall.
  • In the short record and usage summary it keeps (see What happens when you uninstall), the app removes the owner's name, every email address and the stored error messages. What stays is your store address, dates, plan and counts.
Important

Customers created by the app in Odoo stay in Odoo. Erasing a customer in Shopify does not erase them in Odoo. Handle privacy requests in Odoo too.

What happens when you uninstall

  1. 1
    You uninstall the app in your Shopify admin (Settings > Apps and sales channels).
  2. 2
    Shopify ends your app subscription and removes the app's Shopify webhooks.
  3. 3
    Within a few minutes, the app deletes your store's data: settings, mappings, field mapping rules, your Odoo login details, product and customer links, order records, logs and log files.
  4. 4
    The app sends an email to your store's email address to confirm the uninstall.

What is kept:

  • A short record of your store: store address, contact email, install and uninstall dates, plan and the date your free trial started. It stops the free trial from being given twice.
  • A usage summary for our own records: your plan, Odoo version, which features were on, how many orders, products and customers were synced, and the most common error messages.
  • 48 hours after the uninstall, when Shopify sends its store erasure request, the contact email, the owner's name and the error messages are removed from both.

What is not touched:

  • Nothing is deleted in Shopify. Products, orders, customers and fulfillments the app created stay.
  • Nothing is deleted in Odoo. Sale orders, invoices, payments, credit notes, contacts and products the app created stay.
Important

Uninstalling deletes all your app settings. If you might come back, click Export settings in Configuration > Backup & Restore Settings first, and keep the file.

Tidy up in Odoo after you uninstall:

  • Delete the API key the app used, or remove the Odoo user you made for the app.
  • If you set up Odoo automation rules for real-time updates to Shopify, turn them off. Otherwise Odoo keeps trying to send updates to the app.
  • If you matched products by Shopify Variant ID, the custom field stays on your Odoo products. Remove it if you no longer need it.

Reinstall the app

A reinstall starts fresh:

  1. 1
    Install the app again from the Shopify App Store and approve the permissions.
  2. 2
    Choose a plan. The free trial does not start over. It counts from your first install. See Plans & billing.
  3. 3
    Do the setup guide again. See Getting started.
  4. 4
    If you exported your settings, open Configuration > Backup & Restore Settings and click Import settings. If you connect the same Odoo database as before, everything is restored. If it is a different database, only the sync preferences are restored.
  5. 5
    Run a product sync. The app links products and customers again by SKU, barcode or variant ID.

Good to know:

  • The Dashboard and Logs start empty. Orders synced before the uninstall are still in Odoo, but they are not listed in the app.
  • Turn on order sync only when the setup is complete, so new orders are not sent with missing settings.

Disconnect without uninstalling

You can stop the app reaching Odoo and keep it installed. Delete the API key in Odoo or change the user's password. See Change or disconnect Odoo.

To stop only some syncs, turn them off on their settings pages and click Save.

FAQ

?
Does uninstalling delete my products or orders?

No. The app deletes only its own data. Everything in Shopify and Odoo stays.

?
Can I get my settings back after I uninstall?

Only if you exported them first with Export settings. The app deletes its copy of your settings at uninstall.

?
Does the app store my customers' card details?

No. Shopify never shares card details with apps.

?
Is my Odoo password included in the settings backup file?

No. The file holds your Odoo address and database name, but not the password or API key.

?
How do I stop the app using my Odoo account right now?

Delete the API key in Odoo, or change the password of the Odoo user. The app loses access at once.

Odoo Integration by Techmarbles · Shopify ↔ Odoo sync · Updated 26 Oct 2026 Back to top ↑