{"workflow":{"id":13290,"name":"Monitor scheduled workflow health in n8n with automatic trigger checks","views":118,"recentViews":0,"totalViews":118,"createdAt":"2026-02-10T16:52:55.834Z","description":"Automatically detect when your scheduled or polling-trigger workflows stop running. Unlike error handlers that catch failures when workflows execute, this catches the silent killer: workflows that simply never trigger at all — broken schedules, accidental deactivation, or trigger node bugs.\n\nNo hardcoded workflow list needed. It auto-discovers every active scheduled workflow and infers the expected run frequency from their trigger configuration.\n\n## How it works\n\n1. Fetches all active workflows via the n8n API\n2. Filters to those with a Schedule Trigger or polling trigger (Outlook, Gmail, Google Sheets, IMAP, etc.)\n3. Parses cron expressions and interval settings to calculate the maximum allowed time since last execution\n4. Fetches the latest execution for each discovered workflow\n5. Raises an error listing any workflows that are overdue — pair with an Error Workflow for Slack, email, or other alerts\n\nThe max age calculation adds safety margins automatically: daily workflows get 48 hours (to survive weekends), weekly gets 8 days, monthly gets 35 days, and so on.\n\n## Setup\n\n1. Import the workflow and add your **n8n API credential** to the two n8n nodes (\"Fetch All Active Workflows\" and \"Get Latest Execution\")\n2. Tag this workflow with `skip-monitoring` so it doesn't try to monitor itself\n3. Optionally set `PROJECT_ID` in the \"Discover Scheduled Workflows\" code node to limit monitoring to a specific n8n project\n4. Set an **Error Workflow** in the workflow settings to receive alerts (e.g. a workflow that sends Slack messages or emails on error)\n5. Activate the workflow\n\n## Customization\n\n- **Schedule**: Default is daily at 9am. Adjust the Schedule Trigger to your preference.\n- **Project scope**: Set `PROJECT_ID` to monitor only one project, or leave empty to monitor all.\n- **Exclude workflows**: Tag any workflow with `skip-monitoring` to opt it out.\n- **Sensitivity**: The cron parser handles minutes, hours, days, weeks, months, weekday-only schedules, and every-N-day patterns. Adjust the `parseCronMaxAge` function if you need different thresholds.","workflow":{"name":"Monitor - Scheduled Workflow Health","nodes":[{"name":"Test Run","type":"n8n-nodes-base.manualTrigger","position":[-464,-304],"parameters":{},"typeVersion":1},{"name":"Daily Check at 9am","type":"n8n-nodes-base.scheduleTrigger","position":[-464,-496],"parameters":{"rule":{"interval":[{"field":"hours"}]}},"typeVersion":1.2},{"name":"Fetch All Active Workflows","type":"n8n-nodes-base.n8n","position":[-224,-400],"parameters":{"filters":{},"requestOptions":{}},"typeVersion":1},{"name":"Discover Scheduled Workflows","type":"n8n-nodes-base.code","position":[32,-400],"parameters":{"jsCode":"// ============================================================\n// CONFIG — Adjust these values to fit your setup\n// ============================================================\n\n// Optional: restrict to a specific n8n project ID.\n// Leave empty to monitor ALL active workflows.\nconst PROJECT_ID = '';\n\n// Tag name to exclude workflows from monitoring.\nconst SKIP_TAG = 'skip-monitoring';\n\n// ============================================================\n// AUTO-DISCOVERY — No changes needed below\n// ============================================================\n\nconst workflows = $input.all().map(i => i.json);\nconst results = [];\n\nfor (const wf of workflows) {\n  if (wf.isArchived) continue;\n\n  // Project filter\n  if (PROJECT_ID) {\n    const wfProject = wf.shared?.[0]?.projectId;\n    if (wfProject !== PROJECT_ID) continue;\n  }\n\n  // Tag filter\n  const tags = (wf.tags || []).map(t => (t.name || t).toString().toLowerCase());\n  if (tags.includes(SKIP_TAG)) continue;\n\n  // Find trigger nodes\n  const nodes = wf.nodes || [];\n  const scheduleTrigger = nodes.find(n => n.type === 'n8n-nodes-base.scheduleTrigger');\n  const pollingTrigger = nodes.find(n =>\n    n.type.includes('Trigger') &&\n    n.type !== 'n8n-nodes-base.manualTrigger' &&\n    n.type !== 'n8n-nodes-base.executeWorkflowTrigger' &&\n    n.type !== 'n8n-nodes-base.errorTrigger' &&\n    n.type !== 'n8n-nodes-base.scheduleTrigger' &&\n    n.parameters?.pollTimes\n  );\n\n  if (!scheduleTrigger && !pollingTrigger) continue;\n\n  // Calculate max allowed age before alerting\n  let maxAgeHours = 48; // safe default\n\n  if (scheduleTrigger) {\n    const interval = scheduleTrigger.parameters?.rule?.interval?.[0];\n    if (interval) {\n      if (interval.field === 'cronExpression' && interval.expression) {\n        maxAgeHours = parseCronMaxAge(interval.expression);\n      } else if (interval.field === 'minutes') {\n        const mins = interval.minutesInterval || 30;\n        maxAgeHours = Math.max(2, Math.ceil(mins * 8 / 60));\n      } else if (interval.field === 'hours') {\n        maxAgeHours = 48;\n      } else if (interval.field === 'weeks') {\n        maxAgeHours = 192; // 8 days\n      } else if (interval.field === 'months') {\n        maxAgeHours = 840; // 35 days\n      } else {\n        maxAgeHours = 48;\n      }\n    }\n  }\n\n  results.push({ json: { workflowId: wf.id, name: wf.name, maxAgeHours } });\n}\n\nfunction parseCronMaxAge(expr) {\n  const parts = expr.trim().split(/\\s+/);\n  if (parts.length < 5) return 48;\n  const [min, hour, dom, month, dow] = parts;\n\n  // Monthly (e.g. \"0 9 1 * *\")\n  if (dom !== '*' && !dom.startsWith('*/')) return 840;\n  // Weekday-only (e.g. \"0 8,13,18 * * 1-5\") — 48h covers weekends\n  if (dow !== '*') return 48;\n  // Every N days (e.g. \"0 9 */2 * *\")\n  if (dom.startsWith('*/')) {\n    const n = parseInt(dom.split('/')[1]) || 1;\n    return Math.max(48, n * 36);\n  }\n  // Sub-hourly (e.g. \"*/15 8-17 * * *\")\n  if (min.startsWith('*/')) return 48;\n  // Daily\n  return 48;\n}\n\nreturn results;"},"typeVersion":2},{"name":"Get Latest Execution","type":"n8n-nodes-base.n8n","onError":"continueRegularOutput","position":[272,-400],"parameters":{"limit":1,"filters":{"workflowId":{"__rl":true,"mode":"id","value":"={{ $json.workflowId }}"}},"options":{},"resource":"execution","requestOptions":{}},"typeVersion":1,"alwaysOutputData":true},{"name":"Check for Stale Workflows","type":"n8n-nodes-base.code","position":[512,-400],"parameters":{"jsCode":"const executions = $input.all().map(i => i.json);\nconst config = $('Discover Scheduled Workflows').all().map(i => i.json);\n\n// Build lookup: workflowId -> latest execution\nconst execMap = {};\nfor (const exec of executions) {\n  if (exec.workflowId) execMap[exec.workflowId] = exec;\n}\n\nconst stale = [];\nconst ok = [];\n\nfor (const c of config) {\n  const exec = execMap[c.workflowId];\n  if (!exec || !exec.startedAt) {\n    stale.push({ name: c.name, reason: 'No execution found' });\n  } else {\n    const ageHours = (Date.now() - new Date(exec.startedAt).getTime()) / (1000 * 60 * 60);\n    if (ageHours > c.maxAgeHours) {\n      stale.push({\n        name: c.name,\n        reason: `Last ran ${Math.round(ageHours)}h ago (max: ${c.maxAgeHours}h)`,\n        lastRun: exec.startedAt\n      });\n    } else {\n      ok.push(c.name);\n    }\n  }\n}\n\nreturn [{ json: { stale, staleCount: stale.length, okCount: ok.length, checkedCount: config.length } }];"},"typeVersion":2},{"name":"Any Stale?","type":"n8n-nodes-base.if","position":[752,-400],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"1","operator":{"type":"number","operation":"gt"},"leftValue":"={{ $json.staleCount }}","rightValue":0}]}},"typeVersion":2},{"name":"Alert — Workflows Missed Schedule","type":"n8n-nodes-base.stopAndError","position":[992,-496],"parameters":{"errorMessage":"={{ $json.staleCount }} scheduled workflow(s) missed their schedule:\n{{ $json.stale.map(s => '• ' + s.name + ' — ' + s.reason).join('\\n') }}"},"typeVersion":1},{"name":"All Healthy","type":"n8n-nodes-base.noOp","position":[992,-304],"parameters":{},"typeVersion":1},{"name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1072,-752],"parameters":{"color":4,"width":524,"height":798,"content":"## Monitor — Scheduled Workflow Health\n\nAutomatically detects when scheduled or polling-trigger workflows stop running. No hardcoded config needed — it auto-discovers all active scheduled workflows and calculates expected run frequency from their trigger settings.\n\n### How it works\n1. Fetches all active workflows via the n8n API\n2. Filters to those with a Schedule Trigger or polling trigger (e.g. Outlook, Gmail, Google Sheets)\n3. Parses cron expressions and interval settings to calculate max allowed age\n4. Fetches the latest execution for each and flags any that are overdue\n5. Raises an error for stale workflows — pair with an Error Workflow for Slack/email alerts\n\n### Setup steps\n1. Add your **n8n API credential** to the two n8n nodes\n2. Set this workflow as **not monitored** by adding a `skip-monitoring` tag to it\n3. Optionally set `PROJECT_ID` in the \"Discover Scheduled Workflows\" code node to limit to one project\n4. Connect an **Error Workflow** (in workflow settings) to get notified on failures\n5. Activate the workflow\n\n### Customization\n- Change the schedule (default: daily 9am)\n- Change `SKIP_TAG` to use a different tag name for excluding workflows\n- The max age calculation adds generous margins (e.g. 48h for daily workflows to survive weekends)"},"typeVersion":1},{"name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-272,-480],"parameters":{"width":480,"height":260,"content":"## Discovery"},"typeVersion":1},{"name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[224,-480],"parameters":{"width":720,"height":260,"content":"## Staleness Check"},"typeVersion":1},{"name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[960,-544],"parameters":{"width":480,"height":380,"content":"## Alert or OK"},"typeVersion":1}],"settings":{"executionOrder":"v1"},"connections":{"Test Run":{"main":[[{"node":"Fetch All Active Workflows","type":"main","index":0}]]},"Any Stale?":{"main":[[{"node":"Alert — Workflows Missed Schedule","type":"main","index":0}],[{"node":"All Healthy","type":"main","index":0}]]},"Daily Check at 9am":{"main":[[{"node":"Fetch All Active Workflows","type":"main","index":0}]]},"Get Latest Execution":{"main":[[{"node":"Check for Stale Workflows","type":"main","index":0}]]},"Check for Stale Workflows":{"main":[[{"node":"Any Stale?","type":"main","index":0}]]},"Fetch All Active Workflows":{"main":[[{"node":"Discover Scheduled Workflows","type":"main","index":0}]]},"Discover Scheduled Workflows":{"main":[[{"node":"Get Latest Execution","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":13,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.n8n":{"count":2},"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.noOp":{"count":1},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.stopAndError":{"count":1},"n8n-nodes-base.manualTrigger":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Julian Kaiser","username":"jksr","bio":"Freelance engineer specializing in Document AI, Voice AI, and workflow automation.","verified":true,"links":["https://kaiserlich.dev"],"avatar":"https://gravatar.com/avatar/b8108390ad4740aaba8fd05c203fc1d9418524cebf94cc2b9966a28b52120563?r=pg&d=retro&size=200"},"nodes":[{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"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/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"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-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"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/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"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/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"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-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"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.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":26,"icon":"fa:arrow-right","name":"n8n-nodes-base.noOp","codex":{"data":{"alias":["nothing"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"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/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"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/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at 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-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"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.noop/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"organization\"]","defaults":{"name":"No Operation, do nothing","color":"#b0b0b0"},"iconData":{"icon":"arrow-right","type":"icon"},"displayName":"No Operation, do nothing","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":528,"icon":"fa:exclamation-triangle","name":"n8n-nodes-base.stopAndError","codex":{"data":{"alias":["Throw error","Error","Exception"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.stopanderror/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"input\"]","defaults":{"name":"Stop and Error","color":"#ff0000"},"iconData":{"icon":"exclamation-triangle","type":"icon"},"displayName":"Stop and Error","typeVersion":1,"nodeCategories":[{"id":7,"name":"Utility"},{"id":9,"name":"Core Nodes"}]},{"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":826,"icon":"file:n8n.svg","name":"n8n-nodes-base.n8n","codex":{"data":{"alias":["Workflow","Execution"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.n8n/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/api/authentication/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Other Trigger Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"n8n"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMzAgMTIwIj48cGF0aCBmaWxsPSIjRUE0QjcxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yMDQgNDhjLTExLjE4MyAwLTIwLjU4LTcuNjQ5LTIzLjI0NC0xOGgtMjcuNTA4YTEyIDEyIDAgMCAwLTExLjgzNiAxMC4wMjdsLS45ODcgNS45MTlBMjMuOTQgMjMuOTQgMCAwIDEgMTMyLjYyNiA2MGEyMy45NCAyMy45NCAwIDAgMSA3Ljc5OSAxNC4wNTRsLjk4NyA1LjkxOUExMiAxMiAwIDAgMCAxNTMuMjQ4IDkwaDMuNTA4QzE1OS40MiA3OS42NDkgMTY4LjgxNyA3MiAxODAgNzJjMTMuMjU1IDAgMjQgMTAuNzQ1IDI0IDI0cy0xMC43NDUgMjQtMjQgMjRjLTExLjE4MyAwLTIwLjU4LTcuNjQ5LTIzLjI0NC0xOGgtMy41MDhjLTExLjczMiAwLTIxLjc0NC04LjQ4Mi0yMy42NzMtMjAuMDU0bC0uOTg3LTUuOTE5QTEyIDEyIDAgMCAwIDExNi43NTIgNjZoLTkuNTA4QzEwNC41OCA3Ni4zNTEgOTUuMTgzIDg0IDg0IDg0cy0yMC41OC03LjY0OS0yMy4yNDQtMThINDcuMjQ0QzQ0LjU4IDc2LjM1MSAzNS4xODMgODQgMjQgODQgMTAuNzQ1IDg0IDAgNzMuMjU1IDAgNjBzMTAuNzQ1LTI0IDI0LTI0YzExLjE4MyAwIDIwLjU4IDcuNjQ5IDIzLjI0NCAxOGgxMy41MTJDNjMuNDIgNDMuNjQ5IDcyLjgxNyAzNiA4NCAzNnMyMC41OCA3LjY0OSAyMy4yNDQgMThoOS41MDhhMTIgMTIgMCAwIDAgMTEuODM2LTEwLjAyN2wuOTg3LTUuOTE5QzEzMS41MDQgMjYuNDgyIDE0MS41MTYgMTggMTUzLjI0OCAxOGgyNy41MDhDMTgzLjQyIDcuNjQ5IDE5Mi44MTcgMCAyMDQgMGMxMy4yNTUgMCAyNCAxMC43NDUgMjQgMjRzLTEwLjc0NSAyNC0yNCAyNG0wLTEyYzYuNjI3IDAgMTItNS4zNzMgMTItMTJzLTUuMzczLTEyLTEyLTEyLTEyIDUuMzczLTEyIDEyIDUuMzczIDEyIDEyIDEyTTI0IDcyYzYuNjI3IDAgMTItNS4zNzMgMTItMTJzLTUuMzczLTEyLTEyLTEyLTEyIDUuMzczLTEyIDEyIDUuMzczIDEyIDEyIDEybTcyLTEyYzAgNi42MjctNS4zNzMgMTItMTIgMTJzLTEyLTUuMzczLTEyLTEyIDUuMzczLTEyIDEyLTEyIDEyIDUuMzczIDEyIDEybTk2IDM2YzAgNi42MjctNS4zNzMgMTItMTIgMTJzLTEyLTUuMzczLTEyLTEyIDUuMzczLTEyIDEyLTEyIDEyIDUuMzczIDEyIDEyIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4="},"displayName":"n8n","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"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":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"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":16,"name":"DevOps"}],"image":[]}}