AutomationFlowsEmail & Gmail › Productos

Productos

Productos. Uses httpRequest, googleSheets, gmail. Event-driven trigger; 17 nodes.

Event trigger★★★★☆ complexity17 nodesHTTP RequestGoogle SheetsGmail
Email & Gmail Trigger: Event Nodes: 17 Complexity: ★★★★☆ Added:

This workflow follows the Gmail → Google Sheets recipe pattern — see all workflows that pair these two integrations.

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
{
  "name": "Productos",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -1088,
        -288
      ],
      "id": "d120f327-c064-4fdf-b0d4-351beedf26fa",
      "name": "Click"
    },
    {
      "parameters": {
        "url": "=https://api.escuelajs.co/api/v1/products/{{ $json.ID }}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -96,
        -48
      ],
      "id": "afa7ae9f-3da9-4484-a235-bf11d7711ca8",
      "name": "Obtener informaci\u00f3n pokemon"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "e789b922-4d59-43a3-88bd-300f531f38b2",
              "name": "name",
              "value": "={{ $json.title }}",
              "type": "string"
            },
            {
              "id": "b1dcf023-a006-4d6d-a95a-4f8a8734c9d7",
              "name": "id",
              "value": "={{ $json.id }}",
              "type": "number"
            },
            {
              "id": "aa1355f8-56de-4ae3-a6ba-5a3dcfb69d66",
              "name": "description",
              "value": "={{ $json.description }}",
              "type": "string"
            },
            {
              "id": "8c2a3865-4b91-4fea-b85a-1586d8adff0c",
              "name": "images[0]",
              "value": "={{ $json.images[0] }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        112,
        -48
      ],
      "id": "68fc6dc2-6920-488f-b2ba-40a5009ddd2d",
      "name": "Extraer datos del pok\u00e9mon",
      "disabled": true
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "164gZ0MoXqnnZvBfTc4ydYQ8NUsfemH-msyj1U5DiX4U",
          "mode": "list",
          "cachedResultName": "Pokemon tabla",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/164gZ0MoXqnnZvBfTc4ydYQ8NUsfemH-msyj1U5DiX4U/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Pokemons-ID-Sheet",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pLKMJdXI6pKzrxB6kKkxu5_-EkXyZvYgWUbAFC-Bnpo/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "ID": "={{ $json.id }}",
            "description": "={{ $json.description }}",
            "image": "={{ $json.images[0] }}",
            "name": "={{ $json.title }}"
          },
          "matchingColumns": [
            "ID"
          ],
          "schema": [
            {
              "id": "ID",
              "displayName": "ID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "name",
              "displayName": "name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "description",
              "displayName": "description",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "image",
              "displayName": "image",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        416,
        -48
      ],
      "id": "867486f6-f757-407b-ab47-9f8c3ecb3071",
      "name": "Actualizar informaci\u00f3n de Pokemons",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Google Sheet\nObtener Datos de los Productos\n",
        "height": 256,
        "width": 272,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -144
      ],
      "typeVersion": 1,
      "id": "78eea43f-c8ef-453a-9184-862407d513b0",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "f3e41c07-16bb-4c26-998c-3a8c64c21083",
              "leftValue": "={{ $json.ID}}",
              "rightValue": "",
              "operator": {
                "type": "number",
                "operation": "exists",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        -400,
        -48
      ],
      "id": "2f029930-327f-4c74-9aa6-f9055c10dcbc",
      "name": "Filtrar pokemons a buscar"
    },
    {
      "parameters": {
        "content": "## Google Sheet\nGuardar informaci\u00f3n en el documento",
        "height": 320,
        "width": 320,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        -160
      ],
      "typeVersion": 1,
      "id": "86476fb2-1081-43a1-9b3e-5db46ddb75b7",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## Filtro\n\u00danicamente pasan los que tienen ID",
        "height": 256,
        "width": 304,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -496,
        -144
      ],
      "id": "cecc6b3e-7b91-4eec-b573-cd38d4149254",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## HTTP\nTraer informaci\u00f3n de los Productos de la API\n",
        "height": 272,
        "width": 416
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -144,
        -144
      ],
      "id": "9b8e6ea1-fe31-4e67-ad94-86d11da096db",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "sendTo": "gabik077@gmail.com",
        "subject": "El proceso de migraci\u00f3n termin\u00f3",
        "message": "={{ $json.emailBody }}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1392,
        -64
      ],
      "id": "96a4c349-01bf-426b-b884-ae313df35dc7",
      "name": "Enviar correo de resultado del proceso",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "name"
            },
            {
              "fieldToAggregate": "ID"
            },
            {
              "fieldToAggregate": "description"
            },
            {
              "fieldToAggregate": "image"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        736,
        -48
      ],
      "id": "a82e116e-b360-4d3d-a79f-b67b48b8ee5b",
      "name": "Agrupar resultados"
    },
    {
      "parameters": {
        "content": "## Agrupar\nDatos de salida",
        "height": 288,
        "width": 224
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        672,
        -144
      ],
      "id": "dd58ab33-dc61-4a3a-86cc-6037e432d623",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "## Enviar correo\nCon el resumen del proceso",
        "height": 288,
        "width": 358,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1280,
        -144
      ],
      "id": "96ed0af9-7c0b-4357-b8c9-e770908078f5",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 1
            },
            {}
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -1072,
        -64
      ],
      "id": "bb9ecbfb-764a-4d8f-b041-a2fd6aabafd1",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "164gZ0MoXqnnZvBfTc4ydYQ8NUsfemH-msyj1U5DiX4U",
          "mode": "list",
          "cachedResultName": "Pokemon tabla",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/164gZ0MoXqnnZvBfTc4ydYQ8NUsfemH-msyj1U5DiX4U/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "Hoja 1",
          "mode": "name"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        -752,
        -48
      ],
      "id": "1f98245f-eaa6-47ca-a1a1-22bd87b466ae",
      "name": "Obtener ids de Productos",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Accedemos al primer y \u00fanico \u00edtem de entrada\nconst inputData = $input.first().json; \n\n// Extraemos los arreglos de datos\nconst ids = inputData.ID;\nconst names = inputData.name;\nconst descriptions = inputData.description;\n\n// Determinamos el n\u00famero real de productos\nconst productCount = ids ? ids.length : 0; \nlet tableRows = '';\n\nif (productCount > 0) {\n    // 1. Iteramos sobre los productos usando el \u00edndice (i)\n    for (let i = 0; i < productCount; i++) {\n        const id = ids[i] || ''; // Usamos || '' para evitar 'undefined' si hay un error\n        const name = names[i] || '';\n        const description = descriptions[i] || '';\n\n        // Construimos la fila de la tabla para el producto actual\n        tableRows += `\n            <tr>\n                <td>${id}</td>\n                <td>${name}</td>\n                <td>${description}</td>\n            </tr>\n        `;\n    }\n} else {\n    tableRows = '<tr><td colspan=\"3\">No se encontraron nuevos productos.</td></tr>';\n}\n\n// 2. Construimos la estructura completa del cuerpo del correo\nconst emailBody = `\n    <h1>Proceso termin\u00f3</h1>\n\n    <h2>Nuevos Productos: (${productCount})</h2>\n\n    <table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" style=\"width:100%; border-collapse: collapse;\">\n        <thead>\n            <tr style=\"background-color: #f2f2f2;\">\n                <th>ID</th>\n                <th>Nombre</th>\n                <th>Descripci\u00f3n</th>\n            </tr>\n        </thead>\n        <tbody>\n            ${tableRows}\n        </tbody>\n    </table>\n    <br/>\n`;\n\n// 3. Devolvemos la cadena HTML completa en una nueva variable 'emailBody'\nreturn [\n    { json: { emailBody: emailBody } }\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1024,
        -48
      ],
      "id": "63f8a59c-54a5-4156-9d15-2b8a73f82579",
      "name": "Code in JavaScript"
    },
    {
      "parameters": {
        "content": "## Script de armado de tabla\nToma el json y arma una tabla en html",
        "height": 288,
        "width": 288,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        928,
        -160
      ],
      "typeVersion": 1,
      "id": "899f74b4-5bdf-480d-8585-17dce4d9e5a6",
      "name": "Sticky Note6"
    }
  ],
  "connections": {
    "Click": {
      "main": [
        [
          {
            "node": "Obtener ids de Productos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Obtener informaci\u00f3n pokemon": {
      "main": [
        [
          {
            "node": "Extraer datos del pok\u00e9mon",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extraer datos del pok\u00e9mon": {
      "main": [
        [
          {
            "node": "Actualizar informaci\u00f3n de Pokemons",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filtrar pokemons a buscar": {
      "main": [
        [
          {
            "node": "Obtener informaci\u00f3n pokemon",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Actualizar informaci\u00f3n de Pokemons": {
      "main": [
        [
          {
            "node": "Agrupar resultados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Agrupar resultados": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        []
      ]
    },
    "Obtener ids de Productos": {
      "main": [
        [
          {
            "node": "Filtrar pokemons a buscar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enviar correo de resultado del proceso": {
      "main": [
        []
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Enviar correo de resultado del proceso",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "879c0241-34a8-4962-8546-a5f3944fbcf4",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "rbEz8vPpEHxtbAjq",
  "tags": [
    {
      "createdAt": "2025-10-23T22:51:14.465Z",
      "updatedAt": "2025-10-23T22:51:14.465Z",
      "id": "0u9XUElL7ygBGoSN",
      "name": "products"
    }
  ]
}

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

Productos. Uses httpRequest, googleSheets, gmail. Event-driven trigger; 17 nodes.

Source: https://github.com/Gabik077/n8n_workflows/blob/5e07c91327d10de3860996aac6ff3ca0c6b25aa5/workflows/Productos.json — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

This workflow ingests proof-of-delivery and completion documents from Gmail or a webhook, extracts key fields with an OpenRouter vision model, reconciles them against Google Sheets dispatch data, arch

Gmail Trigger, HTTP Request, Google Sheets +2
Email & Gmail

Splitout Code. Uses manualTrigger, httpRequest, stickyNote, splitOut. Event-driven trigger; 46 nodes.

HTTP Request, Execute Workflow Trigger, Gmail +1
Email & Gmail

Automate CSV imports into HubSpot without the mess. Powered by n8n. Supercharged by Pollup AI.

HTTP Request, Execute Workflow Trigger, Gmail +1
Email & Gmail

AICARE Email Blast System. Uses googleDrive, httpRequest, googleSheets, gmail. Event-driven trigger; 39 nodes.

Google Drive, HTTP Request, Google Sheets +2
Email & Gmail

Tiktok to video copy (paylaşılacak). Uses httpRequest, googleDrive, googleSheets, gmail. Event-driven trigger; 39 nodes.

HTTP Request, Google Drive, Google Sheets +1