How it works

Follow these 28 simple steps to start managing Shopify products from Odoo product updates automatically

odoo logo icon

Product Updated

App connector: Odoo • Time to complete: 0 minutes (Auto-configured)
Why this matters: This trigger monitors your Odoo products and kicks off the workflow whenever products get updated, catching inventory changes, price updates, and new variants so they flow to Shopify without manual replication.

This trigger checks your Odoo account hourly for any products that have been updated since the last check. When it detects changes to product records, it captures the product information including name, description, SKU, price, and variant count, then passes this data to the next step. The hourly schedule balances keeping data current with system performance.

Get Product By Title

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: Before creating or updating anything, you need to know if this Odoo product already exists in Shopify—this search uses the product title to find potential matches and prevent duplicate products.

This step queries Shopify's product database using the product name from Odoo. It searches for any products where the title matches and retrieves their IDs if found. The search results get passed to the next step for validation to make sure you're working with unique products only.

Filter: Check product title

App connector: Filter • Time to complete: 0 minutes (Auto-configured)
Why this matters: If multiple Shopify products have the same title, the workflow can't reliably determine which one to update—this filter stops processing when duplicate titles exist to prevent accidental data corruption.

This filter examines the search results from the previous step and only allows the workflow to continue if fewer than 2 products were found (meaning 0 or 1 product). If 2 or more products exist with the same title, the workflow stops here to avoid updating the wrong product. The comparison happens automatically using the result count from the search step.

Path - No Existing Shopify Product

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: This rule checks whether the Shopify search came back empty—if no product was found, you need to create a brand new product in Shopify rather than update an existing one.

This rule examines whether the product search returned any results by checking if the first product ID is empty. If no product was found in the search step, this path activates and sends the workflow to the Create Product step. The check happens automatically using the search results from the Get Product By Title step.

Create Product

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: New Odoo products need corresponding records in Shopify so customers can discover and purchase them—this step creates the base product with title, description, and initial SKU.

This step sends a request to Shopify to create a new product using the product name as title, description as body HTML, and default SKU code from Odoo. The product appears immediately in Shopify once created, though variants with pricing get added in subsequent steps. You can customize which fields get included by editing the body configuration if you track additional product attributes in Odoo.

Path - Has 1 Odoo Variant

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: Products with only one variant can be processed quickly with a single create operation—this path handles the simple case where no variant looping is needed.

This rule checks whether the Odoo product variant count equals exactly 1. If the product has only one variant, this path activates and sends the workflow to create a single product variant with pricing. The check happens automatically using the variant count from the Odoo product trigger data.

Create Product Variant

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: The base product needs at least one variant with pricing before customers can purchase it—this step adds that variant with the price from Odoo.

This step creates a single product variant in Shopify for the newly created product and sets the price from the Odoo list price. Since this is a simple single-variant product, only the price needs to be configured. The variant gets created immediately and customers can start purchasing the product.

Path - Has More Than 1 Odoo Variants

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: Products with multiple variants (like different sizes or colors) need special handling to create each variant individually—this path routes to the loop that processes each variant.

This rule checks whether the Odoo product variant count is greater than 1. If the product has multiple variants, this path activates and sends the workflow to loop through each Odoo variant and create corresponding Shopify variants. The check happens automatically using the variant count from the Odoo product data.

Loop: Get Odoo Product Variants

App connector: Loop • Time to complete: 1 minute
Why this matters: Each Odoo product variant needs to become a separate Shopify variant with its own SKU, title, and price—this loop processes them one at a time to create accurate variant records.

This loop step iterates through all the variant IDs from the Odoo product and processes each one individually. For each iteration, it passes the variant ID to subsequent steps that retrieve full variant details and create the Shopify variant. The loop continues until all Odoo variants have been processed and created in Shopify.

Retrieve Product Variant

App connector: Odoo • Time to complete: 0 minutes (Auto-configured)
Why this matters: The variant IDs from the loop don't include the detailed information needed to create Shopify variants—this step fetches the complete variant record including price, SKU, and display name.

This step queries Odoo for the full variant details using the variant ID from the loop. It retrieves the variant's list price, default SKU code, and display name which contains the variant title information. All of this data gets passed forward to extract the variant name and create the Shopify variant with accurate details.

Custom: Extract Odoo Variant Title

App connector: Code • Time to complete: 1 minute
Why this matters: Odoo stores variant names within parentheses in the display name field—this code extracts just the variant title (like "Blue" or "Large") needed for the Shopify variant option.

This custom JavaScript step parses the Odoo variant display name and extracts the text inside parentheses, which represents the variant title. For example, if the display name is "[SKU123] T-Shirt (Blue)", it extracts "Blue" as the variant title. This extracted title gets used in the next step to properly label the Shopify variant.

const Mesa = require('vendor/Mesa.js');

/**
 * A MESA Script exports a class with a script() method.
 */
module.exports = new class {

  /**
   * MESA Script
   *
   * @param {object} prevResponse The response from the previous step
   * @param {object} context Additional context about this task
   */
  script = (prevResponse, context) => {

    // Retrieve the Variables Available to this step
    const vars = context.steps;
    // For storing response
    let response = {};
    // Get Odoo product variant
    const odooProductVariant = vars.odoo_1;
    // Get display name
    let displayNameProductVariant = vars.odoo_1.display_name;

    // Extracting variant title
    let variantTitle = this.extractVariantTitle(displayNameProductVariant);

    // Add to response
    response.variant_title = variantTitle;

    // Call the next step in this workflow
    // response will be the Variables Available from this step
    Mesa.output.next(response);
  }

  /**
   * Extract the variant title
   *
   * @param {string} displayName
   */
  extractVariantTitle = (displayName) => {
    // Matches text inside parentheses. Example: Extract Blue from [TESTPRODUCTBLUE] Test Product (Blue)
    const match = displayName.match(/\(([^)]+)\)/);
    // Returns the matched text or null if no match
    return match ? match[1] : null;
  }
}

Create Product Variant

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: Each Odoo variant needs to exist in Shopify with its specific title, price, and SKU so customers can select and purchase the exact option they want.

This step creates a Shopify product variant using the extracted variant title as option1, the list price from Odoo, and the default SKU code. The variant gets created for the product that was created in step 6, and all the variant details come from the Odoo variant data retrieved and processed in the previous steps.

Path - Has Existing Shopify Product

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: This rule handles the opposite scenario—when a product already exists in Shopify, triggering updates to that product instead of creating a duplicate.

This rule checks whether the product search returned a product ID, meaning the Odoo product already exists in your Shopify store. If a matching product was found in the search step, this path activates and routes to retrieve and update the existing product. The logic runs automatically based on the search results.

Retrieve Product

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: You need the complete product record including all variants before updating it—this step fetches the full Shopify product data so updates can be applied accurately.

This step queries Shopify for the complete product record using the product ID found in the search step. It retrieves all product details including title, description, variants, and their associated data. This complete product information gets used in subsequent steps to update the product and manage variants intelligently.

Update Product

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: When an Odoo product changes, those updates need to flow to Shopify to keep your storefront accurate—this step overwrites the Shopify product with current information from Odoo.

This step sends updated product information to Shopify and overwrites the existing product's title, description, and base SKU with the current values from Odoo. You can add or remove fields to sync by editing the body configuration—for example, you might add vendor, product type, or tags if those fields exist in both systems. The product ID from the retrieve step tells Shopify exactly which product to update.

Path - Has 1 Odoo Variant

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: Products with only one variant can be updated quickly with a single operation—this path handles the simple case where no variant matching or looping is needed.

This rule checks whether the Odoo product variant count equals exactly 1. If the product has only one variant, this path activates and sends the workflow to update the single Shopify product variant with current pricing. The check happens automatically using the variant count from the Odoo product trigger data.

Update Product Variant

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: The existing Shopify variant needs current pricing from Odoo so customers see accurate costs—this step updates just the price without affecting other variant properties.

This step updates the first (and only) variant of the Shopify product with the current list price from Odoo. It uses the variant ID from the retrieved product data to target the exact variant to update. Since this is a single-variant product, only the price needs updating—title and SKU remain unchanged.

Path - Has More Than 1 Odoo Variants

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: Products with multiple variants need complex matching between Odoo and Shopify to update existing variants and create new ones—this path routes to the variant synchronization logic.

This rule checks whether the Odoo product variant count is greater than 1. If the product has multiple variants, this path activates and sends the workflow to retrieve both Odoo and Shopify variants, match them by SKU, then update or create variants as needed. The check happens automatically using the variant count from the Odoo product data.

List Product Variants

App connector: Odoo • Time to complete: 0 minutes (Auto-configured)
Why this matters: You need the complete list of Odoo variants with all their details before you can match them to Shopify variants—this step retrieves every variant associated with the Odoo product.

This step queries Odoo for all variants that belong to the product being processed. It uses the variant IDs from the Odoo product to search and retrieve complete variant records including SKU, price, and display names. This complete Odoo variant data gets matched against Shopify variants in subsequent steps to determine which need updating and which need creating.

Get List of Product Variants

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: You need the current Shopify variants to compare against Odoo variants—this step retrieves all existing variants so the workflow can match them by SKU and determine what needs updating.

This step queries Shopify for all variants associated with the product being updated. It retrieves variant IDs, SKUs, prices, and other details for each variant. This Shopify variant data gets matched against the Odoo variants in the next step to identify which variants already exist and which are new.

Custom - Match Odoo to Shopify Product Variants

App connector: Code • Time to complete: 0 minutes (Auto-configured)
Why this matters: Before updating or creating variants, you need to know which Odoo variants already exist in Shopify—this code matches them by SKU and flags each Odoo variant with its corresponding Shopify ID if found.

This custom JavaScript step compares the Odoo variant list against the Shopify variant list using SKU as the matching field. For each Odoo variant, it searches for a Shopify variant with the same SKU and adds flags indicating whether a match exists plus the Shopify variant ID if found. This enriched data gets passed to the loop which processes each variant appropriately.

const Mesa = require('vendor/Mesa.js');

/**
 * A MESA Script exports a class with a script() method.
 */
module.exports = new class {

  /**
   * MESA Script
   *
   * @param {object} prevResponse The response from the previous step
   * @param {object} context Additional context about this task
   */
  script = (prevResponse, context) => {

    // Retrieve the Variables Available to this step
    const vars = context.steps;
    
    // For storing response
    let response = {};

    // Find a matching Shopify item based on SKU
    // Add has_shopify_match and Shopify variant ID and product ID if a match is found
    let updatedOdooProductVariants = vars.odoo_2.map(odooItem => {
      let shopifyMatch = vars.shopify_7.find(shopifyItem => shopifyItem.sku === odooItem.default_code);

      return {
        ...odooItem,
        has_shopify_match: shopifyMatch ? "yes" : "no",
        shopify_variant_id: shopifyMatch ? shopifyMatch.id : null,
        shopify_product_id: shopifyMatch ? shopifyMatch.product_id : null
      };
    });

    // Add to response
    response.updated_odoo_product_variants = updatedOdooProductVariants;

    // Call the next step in this workflow
    // response will be the Variables Available from this step
    Mesa.output.next(response);
  }
}

Loop: Get Odoo Product Variants

App connector: Loop • Time to complete: 0 minutes (Auto-configured)
Why this matters: Each Odoo variant needs to be processed individually to either update an existing Shopify variant or create a new one—this loop handles them one at a time based on the matching data.

This loop step iterates through all the enriched Odoo variants from the matching code step and processes each one individually. For each iteration, it checks whether a Shopify match exists and routes to either create a new variant or update the existing one. The loop continues until all Odoo variants have been synchronized to Shopify.

Path - No Shopify Match

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: When an Odoo variant doesn't exist in Shopify yet, it needs to be created as a new variant—this path handles variants that are new to your Shopify store.

This rule checks whether the has_shopify_match field equals "no" for the current variant in the loop. If no matching Shopify variant was found by SKU, this path activates and sends the workflow to extract the variant title and create a new Shopify variant. The check happens automatically using the matching data from the custom code step.

Code - Extract Odoo Variant Title

App connector: Code • Time to complete: 1 minute
Why this matters: Odoo stores variant names within parentheses in the display name field—this code extracts just the variant title needed for creating the new Shopify variant option.

This custom JavaScript step parses the Odoo variant display name from the loop and extracts the text inside parentheses, which represents the variant title. The extracted title gets used in the next step to properly label the new Shopify variant being created.

const Mesa = require('vendor/Mesa.js');

/**
 * A MESA Script exports a class with a script() method.
 */
module.exports = new class {

  /**
   * MESA Script
   *
   * @param {object} prevResponse The response from the previous step
   * @param {object} context Additional context about this task
   */
  script = (prevResponse, context) => {

    // Retrieve the Variables Available to this step
    const vars = context.steps;

    let response = {};
    // Get Odoo product variant
    const odooProductVariant = vars.loop_2;
    // Get display name
    let displayNameProductVariant = vars.loop_2.display_name;

    // Extracting variant title
    let variantTitle = this.extractVariantTitle(displayNameProductVariant);

    // Add to response
    response.variant_title = variantTitle;

    // Call the next step in this workflow
    // response will be the Variables Available from this step
    Mesa.output.next(response);
  }

  /**
   * Extract the variant title
   *
   * @param {string} displayName
   */
  extractVariantTitle = (displayName) => {
    const match = displayName.match(/\(([^)]+)\)/); // Matches text inside parentheses
    return match ? match[1] : null; // Returns the matched text or null if no match
  }
}

Create Product Variant

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: New Odoo variants that don't exist in Shopify yet need to be created so customers can select and purchase all available options.

This step creates a Shopify product variant using the extracted variant title as option1, the list price from the Odoo variant data in the loop, and the default SKU code. The variant gets created for the existing product being updated, expanding the available options customers can purchase.

Path - Has Shopify Match

App connector: Paths • Time to complete: 0 minutes (Auto-configured)
Why this matters: When an Odoo variant already exists in Shopify, it needs to be updated with current information rather than creating a duplicate—this path handles existing variant updates.

This rule checks whether the has_shopify_match field equals "yes" for the current variant in the loop. If a matching Shopify variant was found by SKU, this path activates and sends the workflow to extract the current variant title and update the existing Shopify variant. The check happens automatically using the matching data from the custom code step.

Code - Extract Odoo Variant Title

App connector: Code • Time to complete: 0 minutes (Auto-configured)
Why this matters: Even when updating existing variants, you need the current variant title from Odoo to make sure the Shopify variant label stays accurate—this code extracts that title.

This custom JavaScript step parses the Odoo variant display name from the loop and extracts the text inside parentheses, which represents the current variant title. The extracted title gets used in the next step to update the Shopify variant with current naming from Odoo.

Shopify logo icon

Update Product Variant

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: Existing Shopify variants need current pricing, titles, and SKUs from Odoo to keep your storefront accurate—this step overwrites the variant with updated information.

This step updates an existing Shopify product variant using the Shopify variant ID from the matching code step. It overwrites the variant's option1 with the extracted title, price with the current Odoo list price, and SKU with the Odoo default code. The variant gets updated immediately with current information from Odoo.

Make it your own

Customize this workflow even further:

Add product images from Odoo to Shopify
Extend the Create Product and Update Product steps to include image URLs from Odoo, automatically syncing product photos so your Shopify store displays current imagery without manual uploads.
Filter by product category or tags
Add a Filter step after the trigger to only sync products from specific Odoo categories or with certain tags, focusing your automation on particular product lines or brands.
Send Slack notifications for sync errors
Add error handling with a Slack notification step to alert your team when products fail to sync due to missing required fields or duplicate title issues, helping you maintain data quality.
Store sync history in MESA Tables
Add a Table step at the end of the workflow to log each product sync with timestamp, product ID, and whether it was created or updated, creating an audit trail for troubleshooting and reporting.

Frequently asked questions

What happens if I change a product title in Odoo after it's already synced?
The workflow searches Shopify by title, so if you change the product name in Odoo, it will appear as a new product and get created again in Shopify rather than updating the original. To avoid duplicates, maintain consistent product titles across systems or add a custom field to track the relationship between Odoo and Shopify product IDs.
How does the workflow handle variants with the same SKU in both systems?
The matching code uses SKU as the unique identifier to connect Odoo variants with Shopify variants. If SKUs match, the workflow updates the existing Shopify variant. If you have duplicate SKUs in either system, the matching may produce unexpected results—make sure SKUs are unique across all variants.
Can this workflow delete variants from Shopify when they're removed from Odoo?
No, the current workflow only creates and updates variants but doesn't delete them. If you remove a variant from Odoo, the corresponding Shopify variant will remain until you manually delete it. You could extend the workflow with additional logic to compare variant counts and remove extras, but that requires custom code to safely identify which variants to delete.
What is a template?
Templates are pre-made workflows by our team of experts. Instead of building a workflow from scratch, these have all the steps needed to complete the task.
Can I personalize a template?
Yes! Every step can be customized to meet your exact requirements. Additionally, you can even add more steps and make it more sophisticated.
Are templates free?
Yes! Our entire library containing hundreds of templates are free to use and customize to your exact needs.

Ready to start managing Shopify products from Odoo product updates automatically?

Join thousands who've automated their work and saved an average of 3.5 hours every week.

Start with this template — It's free
7-day free trial • 28 min setup • Cancel anytime