{
  "id": "NO1Jrg2IkMTiquxb",
  "meta": {
    "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": "Start Workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -540,
        20
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "54ce8605-f90e-4666-85e5-cdbc0dba8077",
      "name": "Google Sheet, Fetch Products",
      "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": {
          "name": "<your credential>"
        }
      },
      "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": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "2f350bac-d1d5-4d69-b18b-a2f802594599",
      "name": "If product exists",
      "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": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "65032b74-36a8-46ee-b1a1-eaddcec9be1b",
      "name": "Loop Over Items",
      "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": {
          "name": "<your credential>"
        }
      },
      "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": {
          "name": "<your credential>"
        }
      },
      "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": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "2b69fe40-d04e-4e60-b1e4-f19290b97edc",
      "name": "Finished",
      "type": "n8n-nodes-base.noOp",
      "position": [
        460,
        -220
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "44572b5d-e19b-48e3-b80d-6d6ec7ae0273",
      "name": "Sticky Note",
      "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": "Sticky Note1",
      "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": "Sticky Note2",
      "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,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "292ad12e-25e6-495f-9361-f63996ac146a",
  "connections": {
    "Start Workflow": {
      "main": [
        [
          {
            "node": "Shopify, GetLocations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Finished",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Shopify, ProductQuery",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If product exists": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Shopify, CreateProduct",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shopify, GetLocations": {
      "main": [
        [
          {
            "node": "Google Sheet, Fetch Products",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shopify, ProductQuery": {
      "main": [
        [
          {
            "node": "If product exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shopify, CreateProduct": {
      "main": [
        [
          {
            "node": "Shopify, Enable InventoryTracking",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shopify, Set InventoryLevel": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheet, Fetch Products": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shopify, Enable InventoryTracking": {
      "main": [
        [
          {
            "node": "Shopify, Set InventoryLevel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}