Créer des produits Shopify à partir d'une feuille Google

Intermédiaire

Ceci est unCRMworkflow d'automatisation du domainecontenant 13 nœuds.Utilise principalement des nœuds comme If, Graphql, GoogleSheets, ManualTrigger, SplitInBatches. Création en masse de produits Shopify à partir de Google Sheets et gestion des stocks

Prérequis
  • Informations d'identification Google Sheets API

Catégorie

Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "NO1Jrg2IkMTiquxb",
  "meta": {
    "instanceId": "eeebdb47cbe0bf5bc137514a863458fd2f9ab992b2ebeb2c6062100cdade81e7",
    "templateCredsSetupCompleted": true
  },
  "name": "Create Shopify Products from Google Sheet",
  "tags": [
    {
      "id": "cWC39BXOsHlOhwEC",
      "name": "google-sheet",
      "createdAt": "2025-06-11T02:39:38.743Z",
      "updatedAt": "2025-06-11T02:39:38.743Z"
    },
    {
      "id": "vMF1giVsFs9aUam0",
      "name": "shopify",
      "createdAt": "2025-06-11T02:39:27.034Z",
      "updatedAt": "2025-06-11T02:39:27.034Z"
    }
  ],
  "nodes": [
    {
      "id": "0d76a8c0-fd78-47d8-899d-6a084317ab28",
      "name": "Démarrer le workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -540,
        20
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "54ce8605-f90e-4666-85e5-cdbc0dba8077",
      "name": "Google Sheet, Récupérer les produits",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -40,
        20
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1164444657,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1IxiuRiu6XKBkEa1NIUebBWn73jIKUrgE9Sqj4XtQgBk/edit#gid=1164444657",
          "cachedResultName": "Products"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1IxiuRiu6XKBkEa1NIUebBWn73jIKUrgE9Sqj4XtQgBk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1IxiuRiu6XKBkEa1NIUebBWn73jIKUrgE9Sqj4XtQgBk/edit?usp=drivesdk",
          "cachedResultName": "Shopify Test Store Data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "GQE41DhnGDDJ8Hfq",
          "name": "Google Sheets account"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.6
    },
    {
      "id": "c750de2c-71c4-4eed-a6d2-6f0fa8cfe114",
      "name": "Shopify, ProductQuery",
      "type": "n8n-nodes-base.graphql",
      "position": [
        500,
        40
      ],
      "parameters": {
        "query": "query Products ($handle: String! ) {\n    productByHandle(handle: $handle) {\n        id\n        title\n        variants(first:20) {\n            edges {\n                node {\n                    id\n                    title\n                    sku\n                    price \n                    inventoryItem {\n                        id\n                    }\n                }\n            }\n        }\n        updatedAt\n        createdAt\n    }\n}",
        "endpoint": "https://store99563.myshopify.com/admin/api/2025-04/graphql.json",
        "variables": "={\n    \"handle\" : \"{{ $json.slug }}\"\n}",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "mHtpN3u5aCWsxWih",
          "name": "Shopify GraphQL Header Auth account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "2f350bac-d1d5-4d69-b18b-a2f802594599",
      "name": "Si le produit existe",
      "type": "n8n-nodes-base.if",
      "position": [
        740,
        40
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "81228bbc-7111-40ec-8b37-3c9878945c4d",
              "operator": {
                "type": "object",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.data.productByHandle }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fe218fdb-6c58-49d5-b3c2-b34bbf14b54c",
      "name": "Shopify, CreateProduct",
      "type": "n8n-nodes-base.graphql",
      "position": [
        960,
        200
      ],
      "parameters": {
        "query": "mutation productCreate($product: ProductCreateInput!, $media: [CreateMediaInput!]) {\n  productCreate(product: $product, media: $media) {\n    product {\n     id\n      title\n      descriptionHtml\n      vendor\n      productType\n      status\n      handle\n      variants(first:10) {\n        edges {\n            node {\n                id\n                sku\n                displayName\n                inventoryItem {\n                    id\n                    sku\n                    tracked\n                    requiresShipping\n                }\n            }\n        }\n      }\n      media(first: 10) {\n        edges {\n            node {\n                alt\n                mediaContentType\n                status\n                id\n                preview {\n                    image {\n                        url\n                    }\n                    status\n                }\n            }\n        }\n      }\n      options {\n        id\n        name\n        position\n        optionValues {\n          id\n          name\n          hasVariants\n        }\n      }\n    }\n    userErrors {\n      field\n      message\n    }\n  }\n}",
        "endpoint": "https://store99563.myshopify.com/admin/api/2025-04/graphql.json",
        "variables": "={\n    \"product\": {\n        \"title\": \" {{ $('Loop Over Items').item.json.title }} \",\n        \"descriptionHtml\": \"{{ $('Loop Over Items').item.json.description }}\",\n        \"vendor\" : \"{{ $('Loop Over Items').item.json.company }}\",\n        \"productType\": \"{{ $('Loop Over Items').item.json.category }}\",\n        \"status\": \"{{ $('Loop Over Items').item.json.status }}\",\n        \"handle\": \"{{ $('Loop Over Items').item.json.slug }}\"\n    },\n    \"media\" : [{\n        \"alt\" : \"alt tag\",\n        \"mediaContentType\" : \"IMAGE\",\n        \"originalSource\" : \"https://placehold.co/800x600.png\"\n    }]\n}",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "mHtpN3u5aCWsxWih",
          "name": "Shopify GraphQL Header Auth account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "65032b74-36a8-46ee-b1a1-eaddcec9be1b",
      "name": "Boucler sur les éléments",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        240,
        20
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "099ed035-6a41-4abb-8bed-011d8a6e4cc5",
      "name": "Shopify, GetLocations",
      "type": "n8n-nodes-base.graphql",
      "position": [
        -280,
        20
      ],
      "parameters": {
        "query": "query {\n    locations(first:1, reverse:true) {\n        edges {\n            node {\n                id\n                name\n                address {\n                    address1\n                    address2\n                    city\n                    country\n                    zip\n                    province\n                }\n            }\n        }\n    }\n}",
        "endpoint": "https://store99563.myshopify.com/admin/api/2025-04/graphql.json",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "mHtpN3u5aCWsxWih",
          "name": "Shopify GraphQL Header Auth account"
        }
      },
      "executeOnce": true,
      "typeVersion": 1.1
    },
    {
      "id": "be29e4ea-51fb-4e8b-a2c2-b4b2e590fd2a",
      "name": "Shopify, Enable InventoryTracking",
      "type": "n8n-nodes-base.graphql",
      "position": [
        1160,
        200
      ],
      "parameters": {
        "query": "mutation inventoryItemUpdate($id: ID!, $input: InventoryItemInput!) {\n  inventoryItemUpdate(id: $id, input: $input) {\n    inventoryItem {\n      id\n      unitCost {\n        amount\n      }\n      tracked\n    }\n    userErrors {\n      message\n    }\n  }\n}",
        "endpoint": "https://store99563.myshopify.com/admin/api/2025-04/graphql.json",
        "variables": "={\n  \"id\": \"{{ $json.data.productCreate.product.variants.edges[0].node.inventoryItem.id }}\",\n  \"input\": {\n    \"tracked\": true,\n    \"requiresShipping\": true\n  }\n}",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "mHtpN3u5aCWsxWih",
          "name": "Shopify GraphQL Header Auth account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "a22761aa-b55d-41a6-b853-d165ae9aa89c",
      "name": "Shopify, Set InventoryLevel",
      "type": "n8n-nodes-base.graphql",
      "position": [
        1360,
        200
      ],
      "parameters": {
        "query": "mutation inventorySetOnHandQuantities($input: InventorySetOnHandQuantitiesInput!) {\n    inventorySetOnHandQuantities(input: $input) {\n        userErrors {\n            field\n            message\n        }\n    }\n}",
        "endpoint": "=https://store99563.myshopify.com/admin/api/2025-04/graphql.json",
        "variables": "={\n    \"input\" : {\n        \"reason\": \"correction\",\n        \"setQuantities\" :[{\n            \"inventoryItemId\":\"{{ $json.data.inventoryItemUpdate.inventoryItem.id }}\",\n            \"locationId\": \"{{ $('Shopify, GetLocations').item.json.data.locations.edges[0].node.id }}\",\n            \"quantity\" : {{ $('Loop Over Items').item.json.stock_on_hand }}\n        }]\n    }\n}",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "mHtpN3u5aCWsxWih",
          "name": "Shopify GraphQL Header Auth account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "2b69fe40-d04e-4e60-b1e4-f19290b97edc",
      "name": "Terminé",
      "type": "n8n-nodes-base.noOp",
      "position": [
        460,
        -220
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "44572b5d-e19b-48e3-b80d-6d6ec7ae0273",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -540,
        -680
      ],
      "parameters": {
        "width": 800,
        "height": 660,
        "content": "## Create Products in Shopify from a Google Sheet\n\nThis workflow creates products in your Shopify store from a google sheet. It also enables inventory tracking and sets the quantity of an inventory item at your store's default location. \n\nThis is a great way to get test data into test or staging stores to try out apps, update template or try out new designs. \n\nThis Automation will only import new products. It will skip existing products if the slug matches an existing product's handle (Shopify's term for a slug).\n \n### Setup Notes\n\nThe Google Sheet has the following columns\ntitle - free text\ndescription - free text\ncompany - free text\ncategory - free text\nstatus - ACTIVE, DRAFT or ARCHIVE\nslug - used in the product url, text with no spaces, can also use hyphen.\nprice - sale price of the products\ncompare_at_price - compare at price for products\nsku - unique code for each product\nstock_on_hand - quantity of this item available for purchase.\n\nUse those labels in the first row of your sheet and N8N will create one object per row with the column names as object fields. \n\n### Update GraphQL nodes with your Shopify store URL\n\n1) Replace the URL in all GraphQL nodes with the URL for your Shopify store. \n2) These GraphQL requests all use the Shopify 2025-04 GraphQL Admin API. \n"
      },
      "typeVersion": 1
    },
    {
      "id": "56b55c86-ec42-4154-a44f-c8cf50cbcc0f",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        420,
        -40
      ],
      "parameters": {
        "width": 480,
        "height": 340,
        "content": "## Check to see if product exists\n"
      },
      "typeVersion": 1
    },
    {
      "id": "1c3e5c1d-fad0-4059-9fe2-cc1ea3b9ca52",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        920,
        60
      ],
      "parameters": {
        "width": 600,
        "height": 400,
        "content": "## Create the Product\n- Create product.\n- Enable inventory tracking \n- Set inventory quantity"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "292ad12e-25e6-495f-9361-f63996ac146a",
  "connections": {
    "0d76a8c0-fd78-47d8-899d-6a084317ab28": {
      "main": [
        [
          {
            "node": "099ed035-6a41-4abb-8bed-011d8a6e4cc5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "65032b74-36a8-46ee-b1a1-eaddcec9be1b": {
      "main": [
        [
          {
            "node": "2b69fe40-d04e-4e60-b1e4-f19290b97edc",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "c750de2c-71c4-4eed-a6d2-6f0fa8cfe114",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2f350bac-d1d5-4d69-b18b-a2f802594599": {
      "main": [
        [
          {
            "node": "65032b74-36a8-46ee-b1a1-eaddcec9be1b",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "fe218fdb-6c58-49d5-b3c2-b34bbf14b54c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "099ed035-6a41-4abb-8bed-011d8a6e4cc5": {
      "main": [
        [
          {
            "node": "54ce8605-f90e-4666-85e5-cdbc0dba8077",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c750de2c-71c4-4eed-a6d2-6f0fa8cfe114": {
      "main": [
        [
          {
            "node": "2f350bac-d1d5-4d69-b18b-a2f802594599",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fe218fdb-6c58-49d5-b3c2-b34bbf14b54c": {
      "main": [
        [
          {
            "node": "be29e4ea-51fb-4e8b-a2c2-b4b2e590fd2a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a22761aa-b55d-41a6-b853-d165ae9aa89c": {
      "main": [
        [
          {
            "node": "65032b74-36a8-46ee-b1a1-eaddcec9be1b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "54ce8605-f90e-4666-85e5-cdbc0dba8077": {
      "main": [
        [
          {
            "node": "65032b74-36a8-46ee-b1a1-eaddcec9be1b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "be29e4ea-51fb-4e8b-a2c2-b4b2e590fd2a": {
      "main": [
        [
          {
            "node": "a22761aa-b55d-41a6-b853-d165ae9aa89c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire - CRM

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds13
Catégorie1
Types de nœuds7
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34