AutomationFlowsWeb Scraping › Sync Shopify Products to Odoo in Real Time for Create and Update Events

Sync Shopify Products to Odoo in Real Time for Create and Update Events

Bykhaled yasser @khaledyasser01 on n8n.io

What Problem Does It Solve? Keeping product data consistent between Shopify and Odoo is a major operational challenge. Manually creating new products in Odoo every time they are added to Shopify is slow and leads to Barcode errors. Prices and titles change frequently; failing to…

Event trigger★★★★☆ complexity14 nodesShopify TriggerOdooHTTP Request
Web Scraping Trigger: Event Nodes: 14 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #14899 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "sticky-main-overview",
      "name": "Sticky Note - Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -350,
        -100
      ],
      "parameters": {
        "color": 6,
        "width": 300,
        "height": 300,
        "content": "## Shopify to Odoo Sync\n\n### How it works\n1. Listens for new products in Shopify, downloads images, and creates them in Odoo.\n2. Listens for product updates in Shopify and syncs changes to Odoo.\n\n### Setup steps\n- [x] Configure Shopify Webhooks\n- [x] Configure Odoo API Credentials\n- [x] Verify Category mapping"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-create-flow",
      "name": "Sticky Note - Create Flow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -50,
        20
      ],
      "parameters": {
        "color": 7,
        "width": 2050,
        "height": 220,
        "content": "## 1. Product Creation Flow\nChecks if the product exists in Odoo by barcode. If not found, fetches the category, downloads the image, and creates the new product."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-update-flow",
      "name": "Sticky Note - Update Flow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -50,
        320
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 200,
        "content": "## 2. Product Update Flow\nFinds the existing product in Odoo by barcode and syncs the updated title and price."
      },
      "typeVersion": 1
    },
    {
      "id": "a28a68e9-d2eb-4ec7-9f97-3119b457230a",
      "name": "When Product Created",
      "type": "n8n-nodes-base.shopifyTrigger",
      "position": [
        0,
        100
      ],
      "parameters": {
        "topic": "products/create",
        "authentication": "oAuth2"
      },
      "credentials": {
        "shopifyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "643c0a73-d9c1-4d1c-aa1e-77dd829f2d91",
      "name": "Search Product by Barcode",
      "type": "n8n-nodes-base.odoo",
      "position": [
        250,
        100
      ],
      "parameters": {
        "limit": 1,
        "options": {},
        "resource": "custom",
        "operation": "getAll",
        "filterRequest": {
          "filter": [
            {
              "value": "={{ $json.variants[0].barcode }}",
              "fieldName": "barcode"
            }
          ]
        },
        "customResource": "product.template"
      },
      "credentials": {
        "odooApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "9a696458-7d18-4e88-a477-d10e055675cd",
      "name": "Process Search Result",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        500,
        100
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "63e7934d-a954-4a75-b815-f593a557b0d5",
      "name": "If Product Not Found",
      "type": "n8n-nodes-base.if",
      "position": [
        750,
        100
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a2443748-c30b-4e4e-b1c4-4bd120e6e40a",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.3,
      "alwaysOutputData": true
    },
    {
      "id": "9bb92bcc-9dfc-4c72-ab2a-983c7348e1ec",
      "name": "Get Product Category",
      "type": "n8n-nodes-base.odoo",
      "position": [
        1000,
        100
      ],
      "parameters": {
        "limit": 1,
        "options": {},
        "resource": "custom",
        "operation": "getAll",
        "filterRequest": {
          "filter": [
            {
              "value": "={{ $('When Product Created').item.json.vendor }}",
              "fieldName": "name"
            }
          ]
        },
        "customResource": "product.category"
      },
      "credentials": {
        "odooApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "b003f1b6-0ef8-447f-aff7-7c722626a83d",
      "name": "Download Product Image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1250,
        100
      ],
      "parameters": {
        "url": "={{ $('When Product Created').item.json.images[0].src }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.3,
      "alwaysOutputData": true
    },
    {
      "id": "58f6830d-4ffe-4f6e-98b1-0c9c75cb0423",
      "name": "Convert Image to Base64",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        1500,
        100
      ],
      "parameters": {
        "options": {},
        "operation": "binaryToPropery",
        "destinationKey": "final_image"
      },
      "typeVersion": 1.1
    },
    {
      "id": "9ad5f2a0-2ee7-4255-b323-bbce475496da",
      "name": "Create Product in Odoo",
      "type": "n8n-nodes-base.odoo",
      "position": [
        1750,
        100
      ],
      "parameters": {
        "resource": "custom",
        "customResource": "product.template",
        "fieldsToCreateOrUpdate": {
          "fields": [
            {
              "fieldName": "name",
              "fieldValue": "={{ $('When Product Created').item.json.title }}"
            },
            {
              "fieldName": "list_price",
              "fieldValue": "={{ $('When Product Created').item.json.variants[0].price }}"
            },
            {
              "fieldName": "barcode",
              "fieldValue": "={{ $('When Product Created').item.json.variants[0].barcode }}"
            },
            {
              "fieldName": "taxes_id",
              "fieldValue": "={{ [] }}"
            },
            {
              "fieldName": "supplier_taxes_id",
              "fieldValue": "={{ [] }}"
            },
            {
              "fieldName": "categ_id",
              "fieldValue": "={{ $('Get Product Category').item.json.id }}"
            },
            {
              "fieldName": "image_1920",
              "fieldValue": "={{ $json.final_image }}"
            }
          ]
        }
      },
      "credentials": {
        "odooApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7bb0a595-51b0-4bd3-ace5-8f9b10a88ab0",
      "name": "When Product Updated",
      "type": "n8n-nodes-base.shopifyTrigger",
      "position": [
        0,
        400
      ],
      "parameters": {
        "topic": "products/update",
        "authentication": "oAuth2"
      },
      "credentials": {
        "shopifyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "66180fab-5e6a-480e-b9d4-47063fd45af2",
      "name": "Find Product to Update",
      "type": "n8n-nodes-base.odoo",
      "position": [
        250,
        400
      ],
      "parameters": {
        "limit": 1,
        "options": {},
        "resource": "custom",
        "operation": "getAll",
        "filterRequest": {
          "filter": [
            {
              "value": "={{ $json.variants[0].barcode }}",
              "fieldName": "barcode"
            }
          ]
        },
        "customResource": "product.template"
      },
      "credentials": {
        "odooApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "2e364f57-33bd-4a2d-9530-998a04213bd7",
      "name": "Update Product in Odoo",
      "type": "n8n-nodes-base.odoo",
      "position": [
        500,
        400
      ],
      "parameters": {
        "resource": "custom",
        "operation": "update",
        "customResource": "product.template",
        "customResourceId": "={{ $json.id }}",
        "fieldsToCreateOrUpdate": {
          "fields": [
            {
              "fieldName": "name",
              "fieldValue": "={{ $('When Product Updated').item.json.title }}"
            },
            {
              "fieldName": "list_price",
              "fieldValue": "={{ $('When Product Updated').item.json.variants[0].price }}"
            }
          ]
        }
      },
      "credentials": {
        "odooApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Get Product Category": {
      "main": [
        [
          {
            "node": "Download Product Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Product Not Found": {
      "main": [
        [],
        [
          {
            "node": "Get Product Category",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Product Created": {
      "main": [
        [
          {
            "node": "Search Product by Barcode",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Product Updated": {
      "main": [
        [
          {
            "node": "Find Product to Update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Search Result": {
      "main": [
        [],
        [
          {
            "node": "If Product Not Found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Product Image": {
      "main": [
        [
          {
            "node": "Convert Image to Base64",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find Product to Update": {
      "main": [
        [
          {
            "node": "Update Product in Odoo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert Image to Base64": {
      "main": [
        [
          {
            "node": "Create Product in Odoo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Product by Barcode": {
      "main": [
        [
          {
            "node": "Process Search Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

What Problem Does It Solve? Keeping product data consistent between Shopify and Odoo is a major operational challenge. Manually creating new products in Odoo every time they are added to Shopify is slow and leads to Barcode errors. Prices and titles change frequently; failing to…

Source: https://n8n.io/workflows/14899/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t

Execute Command, Read Write File, HTTP Request +3
Web Scraping

[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.

HTTP Request, GitHub, Stop And Error +1
Web Scraping

[](https://youtu.be/c7yCZhmMjtI)

HTTP Request, GitHub, Stop And Error +1
Web Scraping

This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man

Google Drive, HTTP Request, Time Saved
Web Scraping

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.

HTTP Request