{"workflow":{"id":14440,"name":"Send vendor follow-up emails for overdue POs with Google Sheets and Gmail","views":4,"recentViews":1,"totalViews":4,"createdAt":"2026-03-29T12:37:59.937Z","description":"Chasing vendors for overdue Purchase Orders (POs) is a manual, repetitive task that eats up hours of procurement time. This workflow automates that entire process—intelligently.\n\nIt doesn't just send emails; it batches multiple overdue orders into a single message per vendor and includes a 7-day \"anti-spam\" cooldown to ensure you aren't nagging your suppliers every single day.\n\n🎯 The Problem\nManually checking spreadsheets for overdue dates is slow.\n\nSending individual emails for every single PO is annoying for vendors.\n\nIt’s hard to track when you last asked for an update.\n\n🚀 The Solution\nThis workflow:\n\nSyncs your PO Log with your Vendor Contact database.\n\nFilters for orders that are past due, incomplete, and haven't been followed up on in the last week.\n\nAggregates all overdue items for one vendor into a single, professional email.\n\nLogs the follow-up date back to your Google Sheet automatically.\n\n🛠️ How to Set Up\n1. Google Sheets Preparation\nYou need two sheets (or two tabs):\n\nPO Log: Must contain columns for PO Number, Vendor ID, Delivery Date, Delivery Status, and Last Follow-up Date.\n\nVendor Base: Must contain Vendor ID, Supplier Name, and Supplier Email.\n\n2. Node Configuration\nRead PO / Read Vendors: Connect your Google Sheets account and select your specific spreadsheet files.\n\nFilter + Normalize: This Javascript node handles different date formats. If your sheet uses a specific format (e.g., DD/MM/YYYY), ensure it matches the logic in this node.\n\nSend Email: Connect your Gmail account. You can customize the Subject and Body in the Group by Vendor node logic.\n\nUpdate PO Sheet: Ensure the \"Matching Column\" is set to PO Number so the workflow knows which row to update after the email is sent.\n\n3. Schedule\nThe Trigger is set to 9:00 AM daily. You can change this to weekly or a specific day depending on your procurement cycle.\n\n💡 Customization Tips\nCooldown Period: Change the 7 in the Filter + Normalize code to 3 or 14 if you want more or less frequent follow-ups.\n\nEmail Branding: Add your company signature or a CC to your own procurement inbox in the Send Email node.\n\nSlack Integration: Instead of Gmail, you could easily swap the final node for a Slack or Microsoft Teams message if you communicate with vendors via shared channels.\n\n📦 Requirements\nGoogle Sheets account.\n\nGmail account (or any SMTP/Email provider).\n\nColumns in your sheets must match the names used in the Merge and Code nodes.","workflow":{"id":"V65pgMismecPnp55","meta":{"instanceId":"c82b47207d29d6bbd16f8c3d5109171507d277c02ef0bea2da2ba7e318714d85","templateCredsSetupCompleted":true},"name":"Automated Vendor Follow-up & PO Tracker","tags":[],"nodes":[{"id":"a3553b21-5120-430e-b93e-54a53a49c7c2","name":"Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-544,-32],"parameters":{"rule":{"interval":[{"triggerAtHour":9}]}},"typeVersion":1},{"id":"0f9a7f55-d2f1-4b15-85ad-127abe34c0f3","name":"Read PO","type":"n8n-nodes-base.googleSheets","position":[-304,-112],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1-5B5R9TrFjr8qO0S2dOoloJcGTVWWLxqb1sTFHMmIS4","cachedResultName":"Purchase Order log Book"}},"credentials":{"googleSheetsOAuth2Api":{"id":"2m4ZiLAfCt0fxDWU","name":"Google Sheets account"}},"typeVersion":4},{"id":"b08b50af-e1a4-4f6e-bb95-1c8e3e195697","name":"Filter + Normalize","type":"n8n-nodes-base.code","position":[-80,-112],"parameters":{"jsCode":"const now = DateTime.now();\nconst sevenDaysAgo = now.minus({ days: 7 });\n\nfunction parseDate(dateStr) {\n  if (!dateStr) return null;\n  let dt = DateTime.fromISO(dateStr);\n  if (!dt.isValid) dt = DateTime.fromFormat(dateStr, 'yyyy-MM-dd');\n  if (!dt.isValid) dt = DateTime.fromFormat(dateStr, 'dd/MM/yyyy');\n  if (!dt.isValid) dt = DateTime.fromFormat(dateStr, 'M/d/yyyy');\n  return dt.isValid ? dt : null;\n}\n\nreturn items\n  .map(item => {\n    const delivery = parseDate(item.json['Delivery Date']);\n    const follow = parseDate(item.json['Last Follow-up Date']);\n    return {\n      json: {\n        ...item.json,\n        deliveryDateParsed: delivery,\n        followUpParsed: follow\n      }\n    };\n  })\n  .filter(item => {\n    const d = item.json.deliveryDateParsed;\n    const f = item.json.followUpParsed;\n    const status = item.json['Delivery Status'];\n    if (!d) return false;\n    const isDue = d <= now;\n    const notComplete = status !== 'Complete';\n    const followMissing = !f;\n    const followOld = f && f < sevenDaysAgo;\n    return isDue && notComplete && (followMissing || followOld);\n  });"},"typeVersion":2},{"id":"45123449-2ed4-4bc5-a7cc-f1e2eb35d552","name":"Read Vendors","type":"n8n-nodes-base.googleSheets","position":[-304,96],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1mM9qa1DJVLK4olhtJodt3F8PlENewVRIbqx2p_fRg6I","cachedResultName":"Vendor Base"}},"credentials":{"googleSheetsOAuth2Api":{"id":"2m4ZiLAfCt0fxDWU","name":"Google Sheets account"}},"typeVersion":4},{"id":"f1b20f6b-ee5b-4905-a3d9-74c6da01ea8b","name":"Group by Vendor","type":"n8n-nodes-base.code","position":[416,-112],"parameters":{"jsCode":"// 1. Check if there is even data coming in\nif (items.length === 0) return [];\n\nconst map = {};\n\nfor (const item of items) {\n  const data = item.json;\n  \n  // 2. Flexible property lookup (handles \"supplierEmail\", \"Supplier Email\", \"Email\", etc.)\n  const email = data.supplierEmail || data['Supplier Email'] || data['Email'];\n  const vendorId = data['Vendor ID'] || data.vendorId;\n  const vendorName = data.supplierName || data['Supplier Name'] || data['Vendor Name'] || 'Vendor';\n\n  // 3. Skip if we don't have an email or a Vendor ID\n  if (!email || !vendorId) continue;\n\n  if (!map[vendorId]) {\n    map[vendorId] = {\n      name: vendorName,\n      email: email,\n      pos: []\n    };\n  }\n\n  map[vendorId].pos.push(data);\n}\n\n// 4. Transform the map into n8n items\nconst result = Object.values(map).map(v => {\n  const poLines = v.pos\n    .map(p => {\n      const poNum = p['PO Number'] || p.poNumber;\n      const dueDate = p['Delivery Date'] || p.deliveryDate;\n      return `• PO ${poNum} | Due: ${dueDate}`;\n    })\n    .join('\\n');\n\n  return {\n    json: {\n      email: v.email,\n      poNumbers: v.pos.map(p => p['PO Number'] || p.poNumber),\n      subject: `Follow-up: ${v.pos.length} overdue PO(s)`,\n      body: `Dear ${v.name},\\n\\nThe following POs are overdue:\\n\\n${poLines}\\n\\nPlease share an update.\\n\\nThanks.`\n    }\n  };\n});\n\n// 5. If result is still empty, throw a descriptive error or return a warning\nif (result.length === 0) {\n    throw new Error(\"No matches found. Check if 'Vendor ID' and 'Supplier Email' exist in the input data.\");\n}\n\nreturn result;"},"typeVersion":2},{"id":"b66e3ba5-ff49-4f15-8c59-dda7c85c0a0f","name":"Send Email","type":"n8n-nodes-base.gmail","position":[640,-112],"webhookId":"dfdbb982-45dc-456e-ac17-899c0d87eafc","parameters":{"sendTo":"={{ $json.email }}","message":"={{ $json.body }}","options":{},"subject":"={{ $json.subject }}"},"credentials":{"gmailOAuth2":{"id":"bl2sbOVKmphdW7Lu","name":"Gmail account"}},"typeVersion":2},{"id":"f09bb165-7559-4d7b-b204-40cedf9fbff9","name":"Merge","type":"n8n-nodes-base.merge","position":[176,-32],"parameters":{"mode":"combine","options":{},"fieldsToMatchString":"['Vendor ID']"},"typeVersion":3},{"id":"2cf5e7e2-7ae5-48b5-a0e2-f25e393d1578","name":"Update PO Sheet","type":"n8n-nodes-base.googleSheets","position":[416,80],"parameters":{"columns":{"value":{"Vendor ID":"={{ $json['Vendor ID'] }}","Last Follow-up Date":"={{ $today.format('yyyy-MM-dd') }}"},"schema":[{"id":"PO Number","type":"string","display":true,"removed":true,"required":false,"displayName":"PO Number","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Vendor ID","type":"string","display":true,"removed":false,"required":false,"displayName":"Vendor ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Delivery Date","type":"string","display":true,"removed":true,"required":false,"displayName":"Delivery Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Delivery Status","type":"string","display":true,"removed":true,"required":false,"displayName":"Delivery Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Last Follow-up Date","type":"string","display":true,"required":false,"displayName":"Last Follow-up Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"number","display":true,"removed":true,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Vendor ID"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-5B5R9TrFjr8qO0S2dOoloJcGTVWWLxqb1sTFHMmIS4/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1-5B5R9TrFjr8qO0S2dOoloJcGTVWWLxqb1sTFHMmIS4","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-5B5R9TrFjr8qO0S2dOoloJcGTVWWLxqb1sTFHMmIS4/edit?usp=drivesdk","cachedResultName":"Purchase Order log Book"}},"credentials":{"googleSheetsOAuth2Api":{"id":"2m4ZiLAfCt0fxDWU","name":"Google Sheets account"}},"typeVersion":4},{"id":"f54200cf-3ccf-486c-aee0-907667cdb3d6","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1072,-304],"parameters":{"width":400,"height":688,"content":"How it works\nChasing vendors manually is a time-sink. This workflow automates the \"nagging\" so you don't have to. Every morning at 9:00 AM, the system scans your Purchase Order Log to find orders that are past their delivery date and not yet marked as \"Complete.\"\n\nTo keep your vendors happy, it includes an \"anti-spam\" filter: it only sends a follow-up if the Last Follow-up Date is empty or more than 7 days old. Before sending, it merges your PO data with your Vendor Base to get the right email addresses. Finally, it groups all overdue POs for a single vendor into one consolidated email and updates your spreadsheet with today’s date so you don't double-email them tomorrow.\n\nSetup\nGoogle Sheets: Connect your Google account. In the Read PO and Read Vendors nodes, select your specific spreadsheets. Ensure your column headers (like Vendor ID, Delivery Date, and Supplier Email) match the names used in the Code nodes.\n\nGmail: Authenticate your Gmail account in the Send Email node.\n\nDate Formats: The workflow uses Luxon to parse dates. If your spreadsheet uses a non-standard date format, you may need to adjust the parseDate function in the Filter + Normalize node.\n\nTesting: Run the workflow manually once to ensure the \"Update PO Sheet\" node correctly writes back to your spreadsheet."},"typeVersion":1},{"id":"108c5f02-19ae-485d-a2eb-27cda499d26e","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-384,-288],"parameters":{"color":7,"width":208,"height":576,"content":"1. Data Retrieval\nThis section triggers the daily run and pulls the raw data from both your Purchase Order logs and your Vendor contact database."},"typeVersion":1},{"id":"284549f3-4694-4bd8-a1cc-76b13a11b1f2","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-96,-256],"parameters":{"color":7,"width":384,"height":544,"content":"2. Validation & Merging\nHere, the workflow filters out completed orders and checks the \"7-day rule.\" It then joins the PO data with vendor emails using the Vendor ID."},"typeVersion":1},{"id":"42307d7e-d7bd-4f0c-a609-94605900ac00","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[368,-288],"parameters":{"color":7,"width":448,"height":528,"content":"3. Communication & Tracking\nThis final stage batches multiple POs into a single professional email and \"checks the box\" in your spreadsheet by logging the follow-up date."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"binaryMode":"separate","availableInMCP":false,"executionOrder":"v1"},"versionId":"a7ca01c5-de7f-4d7e-b225-c59c3170d344","connections":{"Merge":{"main":[[{"node":"Group by Vendor","type":"main","index":0},{"node":"Update PO Sheet","type":"main","index":0}]]},"Read PO":{"main":[[{"node":"Filter + Normalize","type":"main","index":0}]]},"Trigger":{"main":[[{"node":"Read PO","type":"main","index":0},{"node":"Read Vendors","type":"main","index":0}]]},"Read Vendors":{"main":[[{"node":"Merge","type":"main","index":1}]]},"Group by Vendor":{"main":[[{"node":"Send Email","type":"main","index":0}]]},"Filter + Normalize":{"main":[[{"node":"Merge","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":12,"nodeTypes":{"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.googleSheets":{"count":3},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Bhautik Trambadia","username":"bhautik","bio":"","verified":true,"links":["www.linkedin.com/in/bhautik-trambadia"],"avatar":"https://gravatar.com/avatar/ef29d19eb3352872c64808aee2b6b0195dc7ebc7153209ca473140ee575cca71?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":356,"icon":"file:gmail.svg","name":"n8n-nodes-base.gmail","codex":{"data":{"alias":["email","human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"transform\"]","defaults":{"name":"Gmail"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"},"displayName":"Gmail","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":35,"name":"Document Extraction"}],"image":[]}}