Crear productos de Shopify desde una hoja de cálculo de Google
Este es unCRMflujo de automatización del dominio deautomatización que contiene 13 nodos.Utiliza principalmente nodos como If, Graphql, GoogleSheets, ManualTrigger, SplitInBatches. Creación masiva de productos de Shopify desde Google Sheets y gestión de inventario
- •Credenciales de API de Google Sheets
Nodos utilizados (13)
Categoría
{
"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": "Iniciar flujo de trabajo",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-540,
20
],
"parameters": {},
"typeVersion": 1
},
{
"id": "54ce8605-f90e-4666-85e5-cdbc0dba8077",
"name": "Google Sheet, Obtener productos",
"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, Consultar producto",
"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 el producto 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, Crear producto",
"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": "Iterar sobre elementos",
"type": "n8n-nodes-base.splitInBatches",
"position": [
240,
20
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "099ed035-6a41-4abb-8bed-011d8a6e4cc5",
"name": "Shopify, Obtener ubicaciones",
"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, Habilitar seguimiento de inventario",
"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, Establecer nivel de inventario",
"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": "Finalizado",
"type": "n8n-nodes-base.noOp",
"position": [
460,
-220
],
"parameters": {},
"typeVersion": 1
},
{
"id": "44572b5d-e19b-48e3-b80d-6d6ec7ae0273",
"name": "Nota adhesiva",
"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": "Nota adhesiva1",
"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": "Nota adhesiva2",
"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
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - CRM
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Richard Uren
@elrichoCompartir este flujo de trabajo