[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-n8n-n8n-debugging-official":3,"mdc-26t3pl-key":33,"related-repo-n8n-n8n-debugging-official":1258,"related-org-n8n-n8n-debugging-official":1356},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"n8n-debugging-official","debug and fix n8n workflow errors","Use when an n8n workflow isn't working, errors appear, results don't match what was expected, or the user says \"this isn't working.\" Triggers on errors, unexpected output, \"it's not working\", \"why is this happening\", \"the workflow stopped\", failure investigation, or any debugging context.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},"n8n","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fn8n.png","n8n-io",[12,14,17,20],{"name":8,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Automation","automation",{"name":18,"slug":19,"type":13},"Debugging","debugging",{"name":21,"slug":22,"type":13},"Workflow Automation","workflow-automation",319,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills","2026-07-08T05:45:05.897341",null,30,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fn8n-debugging-official","---\nname: n8n-debugging-official\ndescription: Use when an n8n workflow isn't working, errors appear, results don't match what was expected, or the user says \"this isn't working.\" Triggers on errors, unexpected output, \"it's not working\", \"why is this happening\", \"the workflow stopped\", failure investigation, or any debugging context.\n---\n\n# n8n Debugging\n\nWhen something breaks, the cause is almost always:\n\n1. **Parameter misconfiguration** (wrong value, wrong type, missing field).\n2. **Stale assumptions** (different version, different behavior than you remember).\n3. **Paths misconfigured or misconnected** (wrong output index, wrong merge input, missing wire, IF\u002FSwitch wired to the wrong branch).\n4. **Upstream data stripped** (an intermediate node replaced `$json` with its own output, so downstream `$json.x` resolves to null even though \"it should be there\"). Fix: reference the stable upstream node by name (`$('Earlier Node').item.json.x`).\n5. **Item context lost** (after Aggregate, Execute Once, or Split Out flows, n8n can't pair `.item` references deterministically, error reads like \"The expression is referencing... multiple matching items\"). Fix: Merge node to re-establish context, `$input.all().find(...)` for explicit lookup, or redesign to keep item correspondence stable (e.g., split into stateless sub-workflows).\n6. **Logical errors** (the wires are right and the parameters are right, but the workflow does the wrong thing, same as a logic bug in code).\n7. **Genuine bug** (rare but real).\n\nDiagnose systematically: cheap checks first, deeper investigation only when those fail.\n\n## Non-negotiable\n\n**Believe the user.** \"This isn't working\" means something isn't behaving as they expect, even if they describe the symptom imprecisely. Don't dismiss with \"it should work\" or \"are you sure you're doing X?\". Investigate first: the user is truth about what *should* happen, execution data and source are truth about what *is* happening. When you can't find the cause, \"I don't know yet\" beats a plausible-sounding fabrication.\n\n## Strong defaults (cause to cheap check)\n\nMatch cause to cheap check, in order of likelihood:\n\n1. **Parameter misconfiguration** → re-fetch via `get_node_types`, compare against `get_workflow_details`, look for type\u002Fvalue\u002Fmissing-field mismatches. `validate_node_config` on the failing node alone returns per-parameter errors directly; faster than eyeballing the diff for nodes with deep \u002F conditional shapes.\n\u003C!-- TEMPORARY: when instance metadata tool is added, change asking user to just using the tool -->\n2. **Stale assumptions** → ask the n8n version, ask when the user last updated the skills plugin, suspect drift if behavior contradicts the skill.\n3. **Paths misconfigured or misconnected** → inspect the `connections` object via `get_workflow_details`. For Merge input mismatches, see `n8n-node-configuration-official` `references\u002FMERGE_NODE.md`.\n4. **Upstream data stripped** → trace `$json.x` references back through the chain, look for any node that replaces the json with its own output. Common offenders: Aggregate, HTTP-binary, Extract from File, Code in \"Run for All Items\" mode, branching Merge. Not exhaustive: any node can do this if its output shape doesn't include the upstream fields.\n5. **Item context lost** → check downstream of any Aggregate \u002F Execute Once \u002F Split Out for `.item` references, switch to `$input.all().find(...)` or a Merge anchor.\n6. **Logical errors** → trace data through `get_execution` step by step, compare each node's output vs. expected.\n7. **Genuine bug** → fall through to reading the n8n source, then GitHub issues, then a workaround.\n\nFor external API problems, the upstream service's API docs (not n8n's wrapper) are the truth. Fetch API docs and n8n's source code to debug if required.\n\n## Step-by-step walkthrough\n\nWhen the cheap checks above don't immediately pinpoint the cause, work through these in order.\n\n### Step 1: confirm the symptom\n\nAsk:\n\n- What did they expect?\n- What actually happened?\n- Error message text?\n- When did it last work? What changed since?\n\nVague (\"it's broken\") becomes tractable when concrete (\"email sends to wrong address\" or \"workflow returns 500 with empty body\").\n\n### Step 2: check the execution\n\n```\nget_execution({ executionId: \u003Cexecution_id>, workflowId: \u003Cworkflow_id>, includeData: true })\n```\n\nLook at:\n\n- **Which node failed?**\n- **What input did it have?**\n- **What error message?** Read carefully. Usually points at the cause.\n\nNo execution ID? Ask the user to re-run.\n\n### Step 3: re-fetch the workflow\n\n```\nget_workflow_details({ workflowId: \u003Cworkflow_id> })\n```\n\nConfirm the actual current state. The user might be looking at a different workflow or remembering a stale version.\n\nCompare:\n\n- Nodes vs. the user's mental model.\n- Connections vs. intent: pull via `get_workflow_details` and compare the `connections` object to the SDK code.\n- Credentials vs. expected (per `n8n-credentials-and-security-official`).\n- **Upstream-strip risk:** any node between a data source and a downstream `$json.x` consumer that replaces the json with its own output? Common offenders are HTTP-binary, Extract from File, Aggregate, Code in \"Run for All Items\" mode, and branching Merge, but any node can do this if its output shape doesn't include the upstream fields. The consumer should reference the source node by name (`$('Source Node').item.json.x`), not `$json`. Otherwise the field silently resolves to null.\n- **Item-context risk:** any Aggregate \u002F Execute Once \u002F Split Out followed by downstream `.item` references? n8n may not be able to pair items deterministically. Look for \"The expression is referencing... multiple matching items\" in past executions.\n\n### Step 4: re-fetch the node types\n\n```\nget_node_types([{ name: '\u003Cfailed-node>', resource: '...', operation: '...' }])\n```\n\nCompare actual parameter shape vs. configured. Common mismatches:\n\n- Missing required parameter.\n- Wrong type (string vs. number, etc.).\n- **`object` and `array` are distinct in n8n's UI type dropdowns** (Set, IF, Switch, Filter, anywhere the UI asks you to pick a type). Picking `object` won't accept an array value, and vice versa. Inside expressions themselves it's normal JS (arrays *are* objects), so the distinction only bites at those UI type-pick surfaces. Watch for this when a `={{ ... }}` expression returns the wrong container shape for a typed slot.\n- A dependent parameter set without its parent (e.g., `credentials` without `authentication !== 'none'`, or `query` without `operation === 'executeQuery'`). Re-fetch with `get_node_types` passing the right discriminators.\n\nIf the manual shape-vs-config diff is tedious (deep params, AI tool subnodes, many conditional branches), run `validate_node_config` directly. Returns `{ path, message }` per failure. For tool subnodes set `isToolNode: true`.\n\n### Step 5: test with pinned data\n\n```\nprepare_test_pin_data({ workflowId: '\u003Cid>' })\ntest_workflow({ workflowId: '\u003Cid>' })\n```\n\nControlled input isolates \"workflow broken?\" from \"input weird?\". If pinned data works but real input fails, the issue is in real input handling.\n\nIf pinned data also produces wrong output, that's likely a logical error: trace each node's output against what you expected. `get_execution` on the test run gives you the actual emitted data per step, which is the source of truth for what each node did.\n\n### Step 6: read the n8n source\n\nWhen everything checks out and behavior still seems wrong:\n\n```\ngithub.com\u002Fn8n-io\u002Fn8n\n```\n\n- `packages\u002Fnodes-base\u002Fnodes\u002F\u003CNodeName>` for built-in nodes.\n- `packages\u002Fcli\u002Fsrc\u002F...` for execution logic.\n- `packages\u002Fcore\u002Fsrc\u002F...` for workflow runtime.\n\nThe behavior of the code is truth.\n\nSee `references\u002FFETCHING_N8N_SOURCE.md`.\n\n### Step 7: suspect drift on either side\n\nIf steps 1-6 all check out and behavior still doesn't match expectations, version drift is the most likely remaining cause. Two sides drift independently:\n\n\u003C!-- TEMPORARY: when instance metadata tool is added, change asking user to just using the tool -->\n- **Their n8n instance version.** Ask. (UI: `Settings → About`, or `GET \u002Frest\u002Fsettings`.) On older instances, parameters and tools the skill assumes may be missing; on very new ones, parameter shapes or tool names may have moved. Suggest updating to the latest n8n release, or if a fix is rumored or the issue is recent, the latest beta.\n- **This skill plugin's version.** These skills drift relative to n8n over time. If the user installed the plugin a while ago, suggest `git pull` (or the plugin manager's update command) on the skills repo. See the README's \"Drift\" section.\n\nDrift surfaces as: parameter shape mismatches in `get_node_types`, MCP tools that don't exist or carry new parameters, tool descriptions that contradict what the skill teaches, behavior diverging from the skill's claims. When you spot any of those, surface drift explicitly to the user: *\"This may be drift between your n8n version and these skills. Can you tell me your n8n version, and when you last updated the skills?\"*\n\nIf after updating both sides the issue persists, proceed to Step 8.\n\n### Step 8: report or workaround\n\nFor confirmed bugs:\n\n- Have the user post a question on https:\u002F\u002Fcommunity.n8n.io\n- Surface a clear repro to the user.\n- Check n8n GitHub issues. May already be filed.\n- If blocking, work around (different node\u002Fapproach) and note in workflow notes.\n- If a fix is in progress, mark workarounds with `\u003C!-- TEMPORARY: ... -->`\n\n## Reference files\n\n| File | Read when |\n|---|---|\n| `references\u002FPARAMETER_VERIFICATION.md` | Parameters might be misconfigured, need a systematic re-check |\n| `references\u002FFETCHING_N8N_SOURCE.md` | n8n behavior contradicts docs, need to read the actual code |\n\n## Anti-patterns\n\n| Anti-pattern | What goes wrong | Fix |\n|---|---|---|\n| \"It should work, are you sure you're doing X?\" | Dismisses the user's report, misses real issues | Believe the user. Investigate. |\n| Re-running without checking the execution | Same failure twice, no new info | `get_execution` on the failed run, read the error |\n| Assuming docs are accurate when behavior contradicts | Accepting the wrong mental model | Read the source. Behavior is truth |\n| Re-implementing logic in a Code node when a configured node fails | Hides the bug, doesn't fix root cause | Diagnose first, only work around when the bug is confirmed |\n| Bisecting by deleting nodes randomly | Wastes time | Step through `get_execution` to find the failed node directly |\n| Asking the user to re-screenshot instead of inspecting via MCP | Slow, error-prone | Use `get_workflow_details` and `get_execution` |\n| Calling it \"fixed\" when you've worked around the bug, not understood it | Bug recurs in slightly different form | Document the cause. If working around, mark with `\u003C!-- TEMPORARY: -->` |\n| Declaring a \"bug\" without asking the user's n8n version or when they last updated the skills | Real cause is often drift, and user updates and the \"bug\" disappears | Ask both versions before reporting. See Step 7. |\n\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,53,170,175,182,207,213,218,254,372,377,383,388,395,400,424,429,435,447,452,481,486,492,501,506,511,599,605,614,619,721,748,754,763,768,780,786,791,800,836,841,853,859,864,910,927,932,938,943,985,991,1052,1058],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"n8n-debugging",[44],{"type":45,"value":46},"text","n8n Debugging",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"When something breaks, the cause is almost always:",{"type":39,"tag":54,"props":55,"children":56},"ol",{},[57,69,79,89,124,150,160],{"type":39,"tag":58,"props":59,"children":60},"li",{},[61,67],{"type":39,"tag":62,"props":63,"children":64},"strong",{},[65],{"type":45,"value":66},"Parameter misconfiguration",{"type":45,"value":68}," (wrong value, wrong type, missing field).",{"type":39,"tag":58,"props":70,"children":71},{},[72,77],{"type":39,"tag":62,"props":73,"children":74},{},[75],{"type":45,"value":76},"Stale assumptions",{"type":45,"value":78}," (different version, different behavior than you remember).",{"type":39,"tag":58,"props":80,"children":81},{},[82,87],{"type":39,"tag":62,"props":83,"children":84},{},[85],{"type":45,"value":86},"Paths misconfigured or misconnected",{"type":45,"value":88}," (wrong output index, wrong merge input, missing wire, IF\u002FSwitch wired to the wrong branch).",{"type":39,"tag":58,"props":90,"children":91},{},[92,97,99,106,108,114,116,122],{"type":39,"tag":62,"props":93,"children":94},{},[95],{"type":45,"value":96},"Upstream data stripped",{"type":45,"value":98}," (an intermediate node replaced ",{"type":39,"tag":100,"props":101,"children":103},"code",{"className":102},[],[104],{"type":45,"value":105},"$json",{"type":45,"value":107}," with its own output, so downstream ",{"type":39,"tag":100,"props":109,"children":111},{"className":110},[],[112],{"type":45,"value":113},"$json.x",{"type":45,"value":115}," resolves to null even though \"it should be there\"). Fix: reference the stable upstream node by name (",{"type":39,"tag":100,"props":117,"children":119},{"className":118},[],[120],{"type":45,"value":121},"$('Earlier Node').item.json.x",{"type":45,"value":123},").",{"type":39,"tag":58,"props":125,"children":126},{},[127,132,134,140,142,148],{"type":39,"tag":62,"props":128,"children":129},{},[130],{"type":45,"value":131},"Item context lost",{"type":45,"value":133}," (after Aggregate, Execute Once, or Split Out flows, n8n can't pair ",{"type":39,"tag":100,"props":135,"children":137},{"className":136},[],[138],{"type":45,"value":139},".item",{"type":45,"value":141}," references deterministically, error reads like \"The expression is referencing... multiple matching items\"). Fix: Merge node to re-establish context, ",{"type":39,"tag":100,"props":143,"children":145},{"className":144},[],[146],{"type":45,"value":147},"$input.all().find(...)",{"type":45,"value":149}," for explicit lookup, or redesign to keep item correspondence stable (e.g., split into stateless sub-workflows).",{"type":39,"tag":58,"props":151,"children":152},{},[153,158],{"type":39,"tag":62,"props":154,"children":155},{},[156],{"type":45,"value":157},"Logical errors",{"type":45,"value":159}," (the wires are right and the parameters are right, but the workflow does the wrong thing, same as a logic bug in code).",{"type":39,"tag":58,"props":161,"children":162},{},[163,168],{"type":39,"tag":62,"props":164,"children":165},{},[166],{"type":45,"value":167},"Genuine bug",{"type":45,"value":169}," (rare but real).",{"type":39,"tag":48,"props":171,"children":172},{},[173],{"type":45,"value":174},"Diagnose systematically: cheap checks first, deeper investigation only when those fail.",{"type":39,"tag":176,"props":177,"children":179},"h2",{"id":178},"non-negotiable",[180],{"type":45,"value":181},"Non-negotiable",{"type":39,"tag":48,"props":183,"children":184},{},[185,190,192,198,200,205],{"type":39,"tag":62,"props":186,"children":187},{},[188],{"type":45,"value":189},"Believe the user.",{"type":45,"value":191}," \"This isn't working\" means something isn't behaving as they expect, even if they describe the symptom imprecisely. Don't dismiss with \"it should work\" or \"are you sure you're doing X?\". Investigate first: the user is truth about what ",{"type":39,"tag":193,"props":194,"children":195},"em",{},[196],{"type":45,"value":197},"should",{"type":45,"value":199}," happen, execution data and source are truth about what ",{"type":39,"tag":193,"props":201,"children":202},{},[203],{"type":45,"value":204},"is",{"type":45,"value":206}," happening. When you can't find the cause, \"I don't know yet\" beats a plausible-sounding fabrication.",{"type":39,"tag":176,"props":208,"children":210},{"id":209},"strong-defaults-cause-to-cheap-check",[211],{"type":45,"value":212},"Strong defaults (cause to cheap check)",{"type":39,"tag":48,"props":214,"children":215},{},[216],{"type":45,"value":217},"Match cause to cheap check, in order of likelihood:",{"type":39,"tag":54,"props":219,"children":220},{},[221],{"type":39,"tag":58,"props":222,"children":223},{},[224,228,230,236,238,244,246,252],{"type":39,"tag":62,"props":225,"children":226},{},[227],{"type":45,"value":66},{"type":45,"value":229}," → re-fetch via ",{"type":39,"tag":100,"props":231,"children":233},{"className":232},[],[234],{"type":45,"value":235},"get_node_types",{"type":45,"value":237},", compare against ",{"type":39,"tag":100,"props":239,"children":241},{"className":240},[],[242],{"type":45,"value":243},"get_workflow_details",{"type":45,"value":245},", look for type\u002Fvalue\u002Fmissing-field mismatches. ",{"type":39,"tag":100,"props":247,"children":249},{"className":248},[],[250],{"type":45,"value":251},"validate_node_config",{"type":45,"value":253}," on the failing node alone returns per-parameter errors directly; faster than eyeballing the diff for nodes with deep \u002F conditional shapes.",{"type":39,"tag":54,"props":255,"children":257},{"start":256},2,[258,267,307,323,346,363],{"type":39,"tag":58,"props":259,"children":260},{},[261,265],{"type":39,"tag":62,"props":262,"children":263},{},[264],{"type":45,"value":76},{"type":45,"value":266}," → ask the n8n version, ask when the user last updated the skills plugin, suspect drift if behavior contradicts the skill.",{"type":39,"tag":58,"props":268,"children":269},{},[270,274,276,282,284,289,291,297,299,305],{"type":39,"tag":62,"props":271,"children":272},{},[273],{"type":45,"value":86},{"type":45,"value":275}," → inspect the ",{"type":39,"tag":100,"props":277,"children":279},{"className":278},[],[280],{"type":45,"value":281},"connections",{"type":45,"value":283}," object via ",{"type":39,"tag":100,"props":285,"children":287},{"className":286},[],[288],{"type":45,"value":243},{"type":45,"value":290},". For Merge input mismatches, see ",{"type":39,"tag":100,"props":292,"children":294},{"className":293},[],[295],{"type":45,"value":296},"n8n-node-configuration-official",{"type":45,"value":298}," ",{"type":39,"tag":100,"props":300,"children":302},{"className":301},[],[303],{"type":45,"value":304},"references\u002FMERGE_NODE.md",{"type":45,"value":306},".",{"type":39,"tag":58,"props":308,"children":309},{},[310,314,316,321],{"type":39,"tag":62,"props":311,"children":312},{},[313],{"type":45,"value":96},{"type":45,"value":315}," → trace ",{"type":39,"tag":100,"props":317,"children":319},{"className":318},[],[320],{"type":45,"value":113},{"type":45,"value":322}," references back through the chain, look for any node that replaces the json with its own output. Common offenders: Aggregate, HTTP-binary, Extract from File, Code in \"Run for All Items\" mode, branching Merge. Not exhaustive: any node can do this if its output shape doesn't include the upstream fields.",{"type":39,"tag":58,"props":324,"children":325},{},[326,330,332,337,339,344],{"type":39,"tag":62,"props":327,"children":328},{},[329],{"type":45,"value":131},{"type":45,"value":331}," → check downstream of any Aggregate \u002F Execute Once \u002F Split Out for ",{"type":39,"tag":100,"props":333,"children":335},{"className":334},[],[336],{"type":45,"value":139},{"type":45,"value":338}," references, switch to ",{"type":39,"tag":100,"props":340,"children":342},{"className":341},[],[343],{"type":45,"value":147},{"type":45,"value":345}," or a Merge anchor.",{"type":39,"tag":58,"props":347,"children":348},{},[349,353,355,361],{"type":39,"tag":62,"props":350,"children":351},{},[352],{"type":45,"value":157},{"type":45,"value":354}," → trace data through ",{"type":39,"tag":100,"props":356,"children":358},{"className":357},[],[359],{"type":45,"value":360},"get_execution",{"type":45,"value":362}," step by step, compare each node's output vs. expected.",{"type":39,"tag":58,"props":364,"children":365},{},[366,370],{"type":39,"tag":62,"props":367,"children":368},{},[369],{"type":45,"value":167},{"type":45,"value":371}," → fall through to reading the n8n source, then GitHub issues, then a workaround.",{"type":39,"tag":48,"props":373,"children":374},{},[375],{"type":45,"value":376},"For external API problems, the upstream service's API docs (not n8n's wrapper) are the truth. Fetch API docs and n8n's source code to debug if required.",{"type":39,"tag":176,"props":378,"children":380},{"id":379},"step-by-step-walkthrough",[381],{"type":45,"value":382},"Step-by-step walkthrough",{"type":39,"tag":48,"props":384,"children":385},{},[386],{"type":45,"value":387},"When the cheap checks above don't immediately pinpoint the cause, work through these in order.",{"type":39,"tag":389,"props":390,"children":392},"h3",{"id":391},"step-1-confirm-the-symptom",[393],{"type":45,"value":394},"Step 1: confirm the symptom",{"type":39,"tag":48,"props":396,"children":397},{},[398],{"type":45,"value":399},"Ask:",{"type":39,"tag":401,"props":402,"children":403},"ul",{},[404,409,414,419],{"type":39,"tag":58,"props":405,"children":406},{},[407],{"type":45,"value":408},"What did they expect?",{"type":39,"tag":58,"props":410,"children":411},{},[412],{"type":45,"value":413},"What actually happened?",{"type":39,"tag":58,"props":415,"children":416},{},[417],{"type":45,"value":418},"Error message text?",{"type":39,"tag":58,"props":420,"children":421},{},[422],{"type":45,"value":423},"When did it last work? What changed since?",{"type":39,"tag":48,"props":425,"children":426},{},[427],{"type":45,"value":428},"Vague (\"it's broken\") becomes tractable when concrete (\"email sends to wrong address\" or \"workflow returns 500 with empty body\").",{"type":39,"tag":389,"props":430,"children":432},{"id":431},"step-2-check-the-execution",[433],{"type":45,"value":434},"Step 2: check the execution",{"type":39,"tag":436,"props":437,"children":441},"pre",{"className":438,"code":440,"language":45},[439],"language-text","get_execution({ executionId: \u003Cexecution_id>, workflowId: \u003Cworkflow_id>, includeData: true })\n",[442],{"type":39,"tag":100,"props":443,"children":445},{"__ignoreMap":444},"",[446],{"type":45,"value":440},{"type":39,"tag":48,"props":448,"children":449},{},[450],{"type":45,"value":451},"Look at:",{"type":39,"tag":401,"props":453,"children":454},{},[455,463,471],{"type":39,"tag":58,"props":456,"children":457},{},[458],{"type":39,"tag":62,"props":459,"children":460},{},[461],{"type":45,"value":462},"Which node failed?",{"type":39,"tag":58,"props":464,"children":465},{},[466],{"type":39,"tag":62,"props":467,"children":468},{},[469],{"type":45,"value":470},"What input did it have?",{"type":39,"tag":58,"props":472,"children":473},{},[474,479],{"type":39,"tag":62,"props":475,"children":476},{},[477],{"type":45,"value":478},"What error message?",{"type":45,"value":480}," Read carefully. Usually points at the cause.",{"type":39,"tag":48,"props":482,"children":483},{},[484],{"type":45,"value":485},"No execution ID? Ask the user to re-run.",{"type":39,"tag":389,"props":487,"children":489},{"id":488},"step-3-re-fetch-the-workflow",[490],{"type":45,"value":491},"Step 3: re-fetch the workflow",{"type":39,"tag":436,"props":493,"children":496},{"className":494,"code":495,"language":45},[439],"get_workflow_details({ workflowId: \u003Cworkflow_id> })\n",[497],{"type":39,"tag":100,"props":498,"children":499},{"__ignoreMap":444},[500],{"type":45,"value":495},{"type":39,"tag":48,"props":502,"children":503},{},[504],{"type":45,"value":505},"Confirm the actual current state. The user might be looking at a different workflow or remembering a stale version.",{"type":39,"tag":48,"props":507,"children":508},{},[509],{"type":45,"value":510},"Compare:",{"type":39,"tag":401,"props":512,"children":513},{},[514,519,538,550,582],{"type":39,"tag":58,"props":515,"children":516},{},[517],{"type":45,"value":518},"Nodes vs. the user's mental model.",{"type":39,"tag":58,"props":520,"children":521},{},[522,524,529,531,536],{"type":45,"value":523},"Connections vs. intent: pull via ",{"type":39,"tag":100,"props":525,"children":527},{"className":526},[],[528],{"type":45,"value":243},{"type":45,"value":530}," and compare the ",{"type":39,"tag":100,"props":532,"children":534},{"className":533},[],[535],{"type":45,"value":281},{"type":45,"value":537}," object to the SDK code.",{"type":39,"tag":58,"props":539,"children":540},{},[541,543,549],{"type":45,"value":542},"Credentials vs. expected (per ",{"type":39,"tag":100,"props":544,"children":546},{"className":545},[],[547],{"type":45,"value":548},"n8n-credentials-and-security-official",{"type":45,"value":123},{"type":39,"tag":58,"props":551,"children":552},{},[553,558,560,565,567,573,575,580],{"type":39,"tag":62,"props":554,"children":555},{},[556],{"type":45,"value":557},"Upstream-strip risk:",{"type":45,"value":559}," any node between a data source and a downstream ",{"type":39,"tag":100,"props":561,"children":563},{"className":562},[],[564],{"type":45,"value":113},{"type":45,"value":566}," consumer that replaces the json with its own output? Common offenders are HTTP-binary, Extract from File, Aggregate, Code in \"Run for All Items\" mode, and branching Merge, but any node can do this if its output shape doesn't include the upstream fields. The consumer should reference the source node by name (",{"type":39,"tag":100,"props":568,"children":570},{"className":569},[],[571],{"type":45,"value":572},"$('Source Node').item.json.x",{"type":45,"value":574},"), not ",{"type":39,"tag":100,"props":576,"children":578},{"className":577},[],[579],{"type":45,"value":105},{"type":45,"value":581},". Otherwise the field silently resolves to null.",{"type":39,"tag":58,"props":583,"children":584},{},[585,590,592,597],{"type":39,"tag":62,"props":586,"children":587},{},[588],{"type":45,"value":589},"Item-context risk:",{"type":45,"value":591}," any Aggregate \u002F Execute Once \u002F Split Out followed by downstream ",{"type":39,"tag":100,"props":593,"children":595},{"className":594},[],[596],{"type":45,"value":139},{"type":45,"value":598}," references? n8n may not be able to pair items deterministically. Look for \"The expression is referencing... multiple matching items\" in past executions.",{"type":39,"tag":389,"props":600,"children":602},{"id":601},"step-4-re-fetch-the-node-types",[603],{"type":45,"value":604},"Step 4: re-fetch the node types",{"type":39,"tag":436,"props":606,"children":609},{"className":607,"code":608,"language":45},[439],"get_node_types([{ name: '\u003Cfailed-node>', resource: '...', operation: '...' }])\n",[610],{"type":39,"tag":100,"props":611,"children":612},{"__ignoreMap":444},[613],{"type":45,"value":608},{"type":39,"tag":48,"props":615,"children":616},{},[617],{"type":45,"value":618},"Compare actual parameter shape vs. configured. Common mismatches:",{"type":39,"tag":401,"props":620,"children":621},{},[622,627,632,678],{"type":39,"tag":58,"props":623,"children":624},{},[625],{"type":45,"value":626},"Missing required parameter.",{"type":39,"tag":58,"props":628,"children":629},{},[630],{"type":45,"value":631},"Wrong type (string vs. number, etc.).",{"type":39,"tag":58,"props":633,"children":634},{},[635,654,656,661,663,668,670,676],{"type":39,"tag":62,"props":636,"children":637},{},[638,644,646,652],{"type":39,"tag":100,"props":639,"children":641},{"className":640},[],[642],{"type":45,"value":643},"object",{"type":45,"value":645}," and ",{"type":39,"tag":100,"props":647,"children":649},{"className":648},[],[650],{"type":45,"value":651},"array",{"type":45,"value":653}," are distinct in n8n's UI type dropdowns",{"type":45,"value":655}," (Set, IF, Switch, Filter, anywhere the UI asks you to pick a type). Picking ",{"type":39,"tag":100,"props":657,"children":659},{"className":658},[],[660],{"type":45,"value":643},{"type":45,"value":662}," won't accept an array value, and vice versa. Inside expressions themselves it's normal JS (arrays ",{"type":39,"tag":193,"props":664,"children":665},{},[666],{"type":45,"value":667},"are",{"type":45,"value":669}," objects), so the distinction only bites at those UI type-pick surfaces. Watch for this when a ",{"type":39,"tag":100,"props":671,"children":673},{"className":672},[],[674],{"type":45,"value":675},"={{ ... }}",{"type":45,"value":677}," expression returns the wrong container shape for a typed slot.",{"type":39,"tag":58,"props":679,"children":680},{},[681,683,689,691,697,699,705,706,712,714,719],{"type":45,"value":682},"A dependent parameter set without its parent (e.g., ",{"type":39,"tag":100,"props":684,"children":686},{"className":685},[],[687],{"type":45,"value":688},"credentials",{"type":45,"value":690}," without ",{"type":39,"tag":100,"props":692,"children":694},{"className":693},[],[695],{"type":45,"value":696},"authentication !== 'none'",{"type":45,"value":698},", or ",{"type":39,"tag":100,"props":700,"children":702},{"className":701},[],[703],{"type":45,"value":704},"query",{"type":45,"value":690},{"type":39,"tag":100,"props":707,"children":709},{"className":708},[],[710],{"type":45,"value":711},"operation === 'executeQuery'",{"type":45,"value":713},"). Re-fetch with ",{"type":39,"tag":100,"props":715,"children":717},{"className":716},[],[718],{"type":45,"value":235},{"type":45,"value":720}," passing the right discriminators.",{"type":39,"tag":48,"props":722,"children":723},{},[724,726,731,733,739,741,747],{"type":45,"value":725},"If the manual shape-vs-config diff is tedious (deep params, AI tool subnodes, many conditional branches), run ",{"type":39,"tag":100,"props":727,"children":729},{"className":728},[],[730],{"type":45,"value":251},{"type":45,"value":732}," directly. Returns ",{"type":39,"tag":100,"props":734,"children":736},{"className":735},[],[737],{"type":45,"value":738},"{ path, message }",{"type":45,"value":740}," per failure. For tool subnodes set ",{"type":39,"tag":100,"props":742,"children":744},{"className":743},[],[745],{"type":45,"value":746},"isToolNode: true",{"type":45,"value":306},{"type":39,"tag":389,"props":749,"children":751},{"id":750},"step-5-test-with-pinned-data",[752],{"type":45,"value":753},"Step 5: test with pinned data",{"type":39,"tag":436,"props":755,"children":758},{"className":756,"code":757,"language":45},[439],"prepare_test_pin_data({ workflowId: '\u003Cid>' })\ntest_workflow({ workflowId: '\u003Cid>' })\n",[759],{"type":39,"tag":100,"props":760,"children":761},{"__ignoreMap":444},[762],{"type":45,"value":757},{"type":39,"tag":48,"props":764,"children":765},{},[766],{"type":45,"value":767},"Controlled input isolates \"workflow broken?\" from \"input weird?\". If pinned data works but real input fails, the issue is in real input handling.",{"type":39,"tag":48,"props":769,"children":770},{},[771,773,778],{"type":45,"value":772},"If pinned data also produces wrong output, that's likely a logical error: trace each node's output against what you expected. ",{"type":39,"tag":100,"props":774,"children":776},{"className":775},[],[777],{"type":45,"value":360},{"type":45,"value":779}," on the test run gives you the actual emitted data per step, which is the source of truth for what each node did.",{"type":39,"tag":389,"props":781,"children":783},{"id":782},"step-6-read-the-n8n-source",[784],{"type":45,"value":785},"Step 6: read the n8n source",{"type":39,"tag":48,"props":787,"children":788},{},[789],{"type":45,"value":790},"When everything checks out and behavior still seems wrong:",{"type":39,"tag":436,"props":792,"children":795},{"className":793,"code":794,"language":45},[439],"github.com\u002Fn8n-io\u002Fn8n\n",[796],{"type":39,"tag":100,"props":797,"children":798},{"__ignoreMap":444},[799],{"type":45,"value":794},{"type":39,"tag":401,"props":801,"children":802},{},[803,814,825],{"type":39,"tag":58,"props":804,"children":805},{},[806,812],{"type":39,"tag":100,"props":807,"children":809},{"className":808},[],[810],{"type":45,"value":811},"packages\u002Fnodes-base\u002Fnodes\u002F\u003CNodeName>",{"type":45,"value":813}," for built-in nodes.",{"type":39,"tag":58,"props":815,"children":816},{},[817,823],{"type":39,"tag":100,"props":818,"children":820},{"className":819},[],[821],{"type":45,"value":822},"packages\u002Fcli\u002Fsrc\u002F...",{"type":45,"value":824}," for execution logic.",{"type":39,"tag":58,"props":826,"children":827},{},[828,834],{"type":39,"tag":100,"props":829,"children":831},{"className":830},[],[832],{"type":45,"value":833},"packages\u002Fcore\u002Fsrc\u002F...",{"type":45,"value":835}," for workflow runtime.",{"type":39,"tag":48,"props":837,"children":838},{},[839],{"type":45,"value":840},"The behavior of the code is truth.",{"type":39,"tag":48,"props":842,"children":843},{},[844,846,852],{"type":45,"value":845},"See ",{"type":39,"tag":100,"props":847,"children":849},{"className":848},[],[850],{"type":45,"value":851},"references\u002FFETCHING_N8N_SOURCE.md",{"type":45,"value":306},{"type":39,"tag":389,"props":854,"children":856},{"id":855},"step-7-suspect-drift-on-either-side",[857],{"type":45,"value":858},"Step 7: suspect drift on either side",{"type":39,"tag":48,"props":860,"children":861},{},[862],{"type":45,"value":863},"If steps 1-6 all check out and behavior still doesn't match expectations, version drift is the most likely remaining cause. Two sides drift independently:",{"type":39,"tag":401,"props":865,"children":866},{},[867,892],{"type":39,"tag":58,"props":868,"children":869},{},[870,875,877,883,884,890],{"type":39,"tag":62,"props":871,"children":872},{},[873],{"type":45,"value":874},"Their n8n instance version.",{"type":45,"value":876}," Ask. (UI: ",{"type":39,"tag":100,"props":878,"children":880},{"className":879},[],[881],{"type":45,"value":882},"Settings → About",{"type":45,"value":698},{"type":39,"tag":100,"props":885,"children":887},{"className":886},[],[888],{"type":45,"value":889},"GET \u002Frest\u002Fsettings",{"type":45,"value":891},".) On older instances, parameters and tools the skill assumes may be missing; on very new ones, parameter shapes or tool names may have moved. Suggest updating to the latest n8n release, or if a fix is rumored or the issue is recent, the latest beta.",{"type":39,"tag":58,"props":893,"children":894},{},[895,900,902,908],{"type":39,"tag":62,"props":896,"children":897},{},[898],{"type":45,"value":899},"This skill plugin's version.",{"type":45,"value":901}," These skills drift relative to n8n over time. If the user installed the plugin a while ago, suggest ",{"type":39,"tag":100,"props":903,"children":905},{"className":904},[],[906],{"type":45,"value":907},"git pull",{"type":45,"value":909}," (or the plugin manager's update command) on the skills repo. See the README's \"Drift\" section.",{"type":39,"tag":48,"props":911,"children":912},{},[913,915,920,922],{"type":45,"value":914},"Drift surfaces as: parameter shape mismatches in ",{"type":39,"tag":100,"props":916,"children":918},{"className":917},[],[919],{"type":45,"value":235},{"type":45,"value":921},", MCP tools that don't exist or carry new parameters, tool descriptions that contradict what the skill teaches, behavior diverging from the skill's claims. When you spot any of those, surface drift explicitly to the user: ",{"type":39,"tag":193,"props":923,"children":924},{},[925],{"type":45,"value":926},"\"This may be drift between your n8n version and these skills. Can you tell me your n8n version, and when you last updated the skills?\"",{"type":39,"tag":48,"props":928,"children":929},{},[930],{"type":45,"value":931},"If after updating both sides the issue persists, proceed to Step 8.",{"type":39,"tag":389,"props":933,"children":935},{"id":934},"step-8-report-or-workaround",[936],{"type":45,"value":937},"Step 8: report or workaround",{"type":39,"tag":48,"props":939,"children":940},{},[941],{"type":45,"value":942},"For confirmed bugs:",{"type":39,"tag":401,"props":944,"children":945},{},[946,959,964,969,974],{"type":39,"tag":58,"props":947,"children":948},{},[949,951],{"type":45,"value":950},"Have the user post a question on ",{"type":39,"tag":952,"props":953,"children":957},"a",{"href":954,"rel":955},"https:\u002F\u002Fcommunity.n8n.io",[956],"nofollow",[958],{"type":45,"value":954},{"type":39,"tag":58,"props":960,"children":961},{},[962],{"type":45,"value":963},"Surface a clear repro to the user.",{"type":39,"tag":58,"props":965,"children":966},{},[967],{"type":45,"value":968},"Check n8n GitHub issues. May already be filed.",{"type":39,"tag":58,"props":970,"children":971},{},[972],{"type":45,"value":973},"If blocking, work around (different node\u002Fapproach) and note in workflow notes.",{"type":39,"tag":58,"props":975,"children":976},{},[977,979],{"type":45,"value":978},"If a fix is in progress, mark workarounds with ",{"type":39,"tag":100,"props":980,"children":982},{"className":981},[],[983],{"type":45,"value":984},"\u003C!-- TEMPORARY: ... -->",{"type":39,"tag":176,"props":986,"children":988},{"id":987},"reference-files",[989],{"type":45,"value":990},"Reference files",{"type":39,"tag":992,"props":993,"children":994},"table",{},[995,1014],{"type":39,"tag":996,"props":997,"children":998},"thead",{},[999],{"type":39,"tag":1000,"props":1001,"children":1002},"tr",{},[1003,1009],{"type":39,"tag":1004,"props":1005,"children":1006},"th",{},[1007],{"type":45,"value":1008},"File",{"type":39,"tag":1004,"props":1010,"children":1011},{},[1012],{"type":45,"value":1013},"Read when",{"type":39,"tag":1015,"props":1016,"children":1017},"tbody",{},[1018,1036],{"type":39,"tag":1000,"props":1019,"children":1020},{},[1021,1031],{"type":39,"tag":1022,"props":1023,"children":1024},"td",{},[1025],{"type":39,"tag":100,"props":1026,"children":1028},{"className":1027},[],[1029],{"type":45,"value":1030},"references\u002FPARAMETER_VERIFICATION.md",{"type":39,"tag":1022,"props":1032,"children":1033},{},[1034],{"type":45,"value":1035},"Parameters might be misconfigured, need a systematic re-check",{"type":39,"tag":1000,"props":1037,"children":1038},{},[1039,1047],{"type":39,"tag":1022,"props":1040,"children":1041},{},[1042],{"type":39,"tag":100,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":45,"value":851},{"type":39,"tag":1022,"props":1048,"children":1049},{},[1050],{"type":45,"value":1051},"n8n behavior contradicts docs, need to read the actual code",{"type":39,"tag":176,"props":1053,"children":1055},{"id":1054},"anti-patterns",[1056],{"type":45,"value":1057},"Anti-patterns",{"type":39,"tag":992,"props":1059,"children":1060},{},[1061,1082],{"type":39,"tag":996,"props":1062,"children":1063},{},[1064],{"type":39,"tag":1000,"props":1065,"children":1066},{},[1067,1072,1077],{"type":39,"tag":1004,"props":1068,"children":1069},{},[1070],{"type":45,"value":1071},"Anti-pattern",{"type":39,"tag":1004,"props":1073,"children":1074},{},[1075],{"type":45,"value":1076},"What goes wrong",{"type":39,"tag":1004,"props":1078,"children":1079},{},[1080],{"type":45,"value":1081},"Fix",{"type":39,"tag":1015,"props":1083,"children":1084},{},[1085,1103,1126,1144,1162,1187,1216,1240],{"type":39,"tag":1000,"props":1086,"children":1087},{},[1088,1093,1098],{"type":39,"tag":1022,"props":1089,"children":1090},{},[1091],{"type":45,"value":1092},"\"It should work, are you sure you're doing X?\"",{"type":39,"tag":1022,"props":1094,"children":1095},{},[1096],{"type":45,"value":1097},"Dismisses the user's report, misses real issues",{"type":39,"tag":1022,"props":1099,"children":1100},{},[1101],{"type":45,"value":1102},"Believe the user. Investigate.",{"type":39,"tag":1000,"props":1104,"children":1105},{},[1106,1111,1116],{"type":39,"tag":1022,"props":1107,"children":1108},{},[1109],{"type":45,"value":1110},"Re-running without checking the execution",{"type":39,"tag":1022,"props":1112,"children":1113},{},[1114],{"type":45,"value":1115},"Same failure twice, no new info",{"type":39,"tag":1022,"props":1117,"children":1118},{},[1119,1124],{"type":39,"tag":100,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":45,"value":360},{"type":45,"value":1125}," on the failed run, read the error",{"type":39,"tag":1000,"props":1127,"children":1128},{},[1129,1134,1139],{"type":39,"tag":1022,"props":1130,"children":1131},{},[1132],{"type":45,"value":1133},"Assuming docs are accurate when behavior contradicts",{"type":39,"tag":1022,"props":1135,"children":1136},{},[1137],{"type":45,"value":1138},"Accepting the wrong mental model",{"type":39,"tag":1022,"props":1140,"children":1141},{},[1142],{"type":45,"value":1143},"Read the source. Behavior is truth",{"type":39,"tag":1000,"props":1145,"children":1146},{},[1147,1152,1157],{"type":39,"tag":1022,"props":1148,"children":1149},{},[1150],{"type":45,"value":1151},"Re-implementing logic in a Code node when a configured node fails",{"type":39,"tag":1022,"props":1153,"children":1154},{},[1155],{"type":45,"value":1156},"Hides the bug, doesn't fix root cause",{"type":39,"tag":1022,"props":1158,"children":1159},{},[1160],{"type":45,"value":1161},"Diagnose first, only work around when the bug is confirmed",{"type":39,"tag":1000,"props":1163,"children":1164},{},[1165,1170,1175],{"type":39,"tag":1022,"props":1166,"children":1167},{},[1168],{"type":45,"value":1169},"Bisecting by deleting nodes randomly",{"type":39,"tag":1022,"props":1171,"children":1172},{},[1173],{"type":45,"value":1174},"Wastes time",{"type":39,"tag":1022,"props":1176,"children":1177},{},[1178,1180,1185],{"type":45,"value":1179},"Step through ",{"type":39,"tag":100,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":45,"value":360},{"type":45,"value":1186}," to find the failed node directly",{"type":39,"tag":1000,"props":1188,"children":1189},{},[1190,1195,1200],{"type":39,"tag":1022,"props":1191,"children":1192},{},[1193],{"type":45,"value":1194},"Asking the user to re-screenshot instead of inspecting via MCP",{"type":39,"tag":1022,"props":1196,"children":1197},{},[1198],{"type":45,"value":1199},"Slow, error-prone",{"type":39,"tag":1022,"props":1201,"children":1202},{},[1203,1205,1210,1211],{"type":45,"value":1204},"Use ",{"type":39,"tag":100,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":45,"value":243},{"type":45,"value":645},{"type":39,"tag":100,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":45,"value":360},{"type":39,"tag":1000,"props":1217,"children":1218},{},[1219,1224,1229],{"type":39,"tag":1022,"props":1220,"children":1221},{},[1222],{"type":45,"value":1223},"Calling it \"fixed\" when you've worked around the bug, not understood it",{"type":39,"tag":1022,"props":1225,"children":1226},{},[1227],{"type":45,"value":1228},"Bug recurs in slightly different form",{"type":39,"tag":1022,"props":1230,"children":1231},{},[1232,1234],{"type":45,"value":1233},"Document the cause. If working around, mark with ",{"type":39,"tag":100,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":45,"value":1239},"\u003C!-- TEMPORARY: -->",{"type":39,"tag":1000,"props":1241,"children":1242},{},[1243,1248,1253],{"type":39,"tag":1022,"props":1244,"children":1245},{},[1246],{"type":45,"value":1247},"Declaring a \"bug\" without asking the user's n8n version or when they last updated the skills",{"type":39,"tag":1022,"props":1249,"children":1250},{},[1251],{"type":45,"value":1252},"Real cause is often drift, and user updates and the \"bug\" disappears",{"type":39,"tag":1022,"props":1254,"children":1255},{},[1256],{"type":45,"value":1257},"Ask both versions before reporting. See Step 7.",{"items":1259,"total":1355},[1260,1274,1287,1303,1320,1335,1342],{"slug":1261,"name":1261,"fn":1262,"description":1263,"org":1264,"tags":1265,"stars":23,"repoUrl":24,"updatedAt":1273},"n8n-agents-official","build AI agents in n8n","Use when building or editing any AI feature in n8n: AI Agents, Text Classifier, Information Extractor, Sentiment Analysis, Summarization Chain, Basic LLM Chain, embeddings, vector stores, single one-shot LLM calls, or AI media generation (image \u002F audio \u002F video) via the native LangChain provider nodes. Triggers on any `@n8n\u002Fn8n-nodes-langchain.*` node, \"agent\", \"chat assistant\", \"LLM with tools\", \"tool calling\", \"fromAi\", \"system prompt\", \"memory window\", \"structured output\", \"outputParser\", \"function calling\", \"RAG\", \"vector store\", \"embeddings\", \"classify with AI\", \"extract fields with LLM\", \"sentiment analysis\", \"summarize with LLM\", \"single LLM call\", chat triggers with files, AI image \u002F video \u002F audio generation, or any multi-turn or one-shot LLM behavior.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1266,1269,1272],{"name":1267,"slug":1268,"type":13},"Agents","agents",{"name":1270,"slug":1271,"type":13},"LLM","llm",{"name":21,"slug":22,"type":13},"2026-07-08T05:44:47.938896",{"slug":1275,"name":1275,"fn":1276,"description":1277,"org":1278,"tags":1279,"stars":23,"repoUrl":24,"updatedAt":1286},"n8n-binary-and-data-official","handle binary data and files in n8n","Use when handling files, images, attachments, or binary data in n8n, OR when an AI agent needs to take a user-uploaded file as tool input or return a generated file. For Data Tables (schemas, dedup, persistent state), see the separate n8n-data-tables-official skill. Triggers on \"file\", \"image\", \"PDF\", \"attachment\", \"binary\", \"upload\", \"download\", chat trigger with files, agent tool that needs a file, vision\u002Fmultimodal, or any handling of non-JSON file data.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1280,1281,1284,1285],{"name":15,"slug":16,"type":13},{"name":1282,"slug":1283,"type":13},"File Uploads","file-uploads",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-08T05:45:01.884342",{"slug":1288,"name":1288,"fn":1289,"description":1290,"org":1291,"tags":1292,"stars":23,"repoUrl":24,"updatedAt":1302},"n8n-code-nodes-official","write custom logic in n8n","Use when the user reaches for a Code node, mentions writing JavaScript or Python in n8n, or any custom logic comes up in workflow design. Triggers on \"Code node\", \"Code\", \"JavaScript\", \"Python\", \"custom logic\", \"transform data\", \"$input\", \"$json transformation\", \"loop in code\", \"write a function\", or any time the obvious answer seems to be \"just put it in code.\"",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1293,1296,1299],{"name":1294,"slug":1295,"type":13},"Engineering","engineering",{"name":1297,"slug":1298,"type":13},"JavaScript","javascript",{"name":1300,"slug":1301,"type":13},"Python","python","2026-07-08T05:44:49.656127",{"slug":548,"name":548,"fn":1304,"description":1305,"org":1306,"tags":1307,"stars":23,"repoUrl":24,"updatedAt":1319},"manage credentials and security in n8n","Use when handling any auth, API keys, tokens, OAuth, bearer tokens, basic auth, or secret values in n8n workflows. Triggers on \"API key\", \"token\", \"bearer\", \"OAuth\", \"secret\", \"auth\", \"credentials\", \"Authorization header\", \"x-api-key\", or any node configuration that mentions a third-party service.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1308,1311,1312,1313,1316],{"name":1309,"slug":1310,"type":13},"Authentication","authentication",{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":1314,"slug":1315,"type":13},"OAuth","oauth",{"name":1317,"slug":1318,"type":13},"Security","security","2026-07-08T05:45:07.766252",{"slug":1321,"name":1321,"fn":1322,"description":1323,"org":1324,"tags":1325,"stars":23,"repoUrl":24,"updatedAt":1334},"n8n-data-tables-official","manage n8n Data Tables","Use when working with n8n's built-in Data Tables, designing schemas, inserting\u002Fupdating\u002Fupserting rows, deduping, or querying. Triggers on \"Data Table\", \"data table\", `n8n-nodes-base.dataTable`, \"dedup\", \"idempotency\", \"lookup\", \"persistent state\", \"store across executions\", or any schema design discussion inside n8n.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1326,1329,1332,1333],{"name":1327,"slug":1328,"type":13},"Data Modeling","data-modeling",{"name":1330,"slug":1331,"type":13},"Database","database",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-08T05:44:52.048039",{"slug":4,"name":4,"fn":5,"description":6,"org":1336,"tags":1337,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1338,1339,1340,1341],{"name":15,"slug":16,"type":13},{"name":18,"slug":19,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":23,"repoUrl":24,"updatedAt":1354},"n8n-error-handling-official","implement error handling in n8n","Use when building any webhook-triggered workflow, scheduled\u002Fproduction-bound workflow, wiring a per-node error output, or any workflow where silent failure would drop user-visible work. Triggers on \"webhook\", \"respond to webhook\", \"API\", \"production\", \"error\", \"failure\", \"5xx\", \"try\u002Fcatch\", \"error workflow\", \"onError\", \"continueErrorOutput\", \"error branch\", \"node error output\", \"output(1)\", \"main[1]\", \"scheduled\", or any workflow that runs unattended.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1348,1349,1350,1353],{"name":18,"slug":19,"type":13},{"name":8,"slug":8,"type":13},{"name":1351,"slug":1352,"type":13},"Operations","operations",{"name":21,"slug":22,"type":13},"2026-07-08T05:44:59.710099",14,{"items":1357,"total":1497},[1358,1375,1388,1399,1409,1420,1433,1450,1459,1471,1481,1491],{"slug":1359,"name":1359,"fn":1360,"description":1361,"org":1362,"tags":1363,"stars":1372,"repoUrl":1373,"updatedAt":1374},"config-evals","configure workflow evaluations","Builds and maintains configuration-based evaluations on a workflow with the eval-config tool. Use when the user asks to set up, add, view, change, or remove an evaluation, score, grade, or judge a workflow's output, or measure answer quality against a test dataset. This is the only eval form Instance AI handles — it does not touch on-canvas evaluation nodes.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1364,1367,1368,1371],{"name":1365,"slug":1366,"type":13},"Evals","evals",{"name":8,"slug":8,"type":13},{"name":1369,"slug":1370,"type":13},"Testing","testing",{"name":21,"slug":22,"type":13},198156,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fn8n","2026-07-24T05:37:07.398695",{"slug":1376,"name":1376,"fn":1377,"description":1378,"org":1379,"tags":1380,"stars":1372,"repoUrl":1373,"updatedAt":1387},"credential-setup-with-computer-use","configure n8n credentials via browser","Guides n8n credential setup through Computer Use browser tools. Use when a user needs OAuth apps, API keys, client IDs, client secrets, or other credential values from an external service console.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1381,1382,1385,1386],{"name":15,"slug":16,"type":13},{"name":1383,"slug":1384,"type":13},"Configuration","configuration",{"name":8,"slug":8,"type":13},{"name":1314,"slug":1315,"type":13},"2026-06-30T07:40:45.54",{"slug":1389,"name":1389,"fn":1322,"description":1390,"org":1391,"tags":1392,"stars":1372,"repoUrl":1373,"updatedAt":1398},"data-table-manager","Load before calling data-tables or parse-file. Use for natural standalone requests like \"what data tables do I have?\", \"show\u002Flist my tables\", or \"what columns are in this table?\", and whenever the user asks to list, show, create, inspect, import, seed, query, update, clean up, rename columns in, or delete data tables and rows, especially from CSV\u002FXLSX\u002FJSON attachments. Also load before building or planning workflows that create or write to Data Tables (then load workflow-builder before build-workflow).",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1393,1396,1397],{"name":1394,"slug":1395,"type":13},"Data Engineering","data-engineering",{"name":1330,"slug":1331,"type":13},{"name":8,"slug":8,"type":13},"2026-07-27T06:07:14.648144",{"slug":1400,"name":1400,"fn":1401,"description":1402,"org":1403,"tags":1404,"stars":1372,"repoUrl":1373,"updatedAt":1387},"debugging-executions","debug failed n8n workflow executions","Debug failed or wrong-output workflow executions using executions tools. Load when the user reports execution failures, unexpected node output, empty parameter values after a successful run, or a node showing a red or failed expression error.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1405,1406,1407,1408],{"name":15,"slug":16,"type":13},{"name":18,"slug":19,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1410,"name":1410,"fn":1411,"description":1412,"org":1413,"tags":1414,"stars":1372,"repoUrl":1373,"updatedAt":1419},"intent-recognition","classify automation requests by control flow","Classifies automation requests using two decisions: anchor (which primitive owns the top-level control flow — workflow-anchored, agent-anchored, needs-clarification, or out-of-scope) and embeds_other (whether the other primitive appears embedded inside — an agent step inside a workflow, or a workflow invoked as an agent tool). Must be used before deciding the intent of any automation request, including compound requests with multiple independent automations, mid-build extensions to an existing workflow or agent, one-off questions or reports that need external systems you cannot query directly, and requests that need clarification before an anchor can be chosen, before choosing workflow-builder, planning, or an agent-oriented design.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1415,1416,1417,1418],{"name":1267,"slug":1268,"type":13},{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-30T05:30:06.772347",{"slug":1421,"name":1421,"fn":1422,"description":1423,"org":1424,"tags":1425,"stars":1372,"repoUrl":1373,"updatedAt":1432},"n8n-cli","manage n8n workflows from the CLI","Use the n8n CLI to manage workflows, credentials, executions, and more on an n8n instance. Use when the user asks to interact with n8n, automate workflows, manage credentials, or operate their instance from the command line.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1426,1427,1430,1431],{"name":15,"slug":16,"type":13},{"name":1428,"slug":1429,"type":13},"CLI","cli",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-04-06T18:38:40.360123",{"slug":1434,"name":1434,"fn":1435,"description":1436,"org":1437,"tags":1438,"stars":1372,"repoUrl":1373,"updatedAt":1449},"n8n-docs-assistant","retrieve n8n documentation and guidance","Answers n8n product, setup, credential, node, hosting, API, and usage questions from current n8n docs. Load n8n-docs via load_tool before calling it (search \"n8n docs\" if not visible). Use when the user asks how to configure, set up, troubleshoot, or understand n8n behavior, especially credential setup questions opened from the credential modal.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1439,1442,1443,1446],{"name":1440,"slug":1441,"type":13},"Documentation","documentation",{"name":8,"slug":8,"type":13},{"name":1444,"slug":1445,"type":13},"Reference","reference",{"name":1447,"slug":1448,"type":13},"Search","search","2026-07-27T06:07:15.692906",{"slug":1451,"name":1451,"fn":1452,"description":1453,"org":1454,"tags":1455,"stars":1372,"repoUrl":1373,"updatedAt":1387},"planned-task-runtime","manage n8n task runtimes","Handles system follow-up turns: planned-task-follow-up (synthesize, replan, build-workflow, checkpoint), background-task-completed, running-tasks context, and create-tasks silence rules. Load whenever any of these tags appear or after calling create-tasks.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1456,1457,1458],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1460,"name":1460,"fn":1461,"description":1462,"org":1463,"tags":1464,"stars":1372,"repoUrl":1373,"updatedAt":1470},"planning","coordinate multi-artifact workflows","ONLY for coordinated multi-artifact work: multiple workflows with dependencies, shared data-table schema\u002Fmigration across tasks, or the user explicitly asked to review a plan first. Load create-tasks via load_tool before calling it (search \"create tasks\" if not visible). Do NOT use for new one-off workflows, single-workflow edits, verification-only requests, or standalone data-table ops — use workflow-builder or data-table-manager instead.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1465,1466,1467,1469],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":1468,"slug":1460,"type":13},"Planning",{"name":21,"slug":22,"type":13},"2026-07-27T06:07:16.673218",{"slug":1472,"name":1472,"fn":1473,"description":1474,"org":1475,"tags":1476,"stars":1372,"repoUrl":1373,"updatedAt":1480},"post-build-flow","verify and set up n8n workflows","Handles workflow verification and setup after build-workflow succeeds, or when the message contains workflow-verification-follow-up or workflow-setup-required. Load after direct builds, when verificationReadiness requires action, or on orchestrator verify\u002Fsetup follow-up turns.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1477,1478,1479],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-24T05:37:08.421329",{"slug":1482,"name":1482,"fn":1483,"description":1484,"org":1485,"tags":1486,"stars":1372,"repoUrl":1373,"updatedAt":1490},"workflow-builder","build and edit n8n workflows","Load before calling build-workflow. Default path for all single-workflow work: new one-off workflows, existing-workflow edits, verification repairs, and workflow-local data tables. Write or edit a workspace source file, then call build-workflow with filePath. When the workflow creates or writes Data Tables, load data-table-manager first, then this skill. Do not load planning or create-tasks first. Load planning only when multiple coordinated workflows or shared cross-task data tables require a dependency-aware task graph.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1487,1488,1489],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-30T05:30:07.798011",{"slug":1261,"name":1261,"fn":1262,"description":1263,"org":1492,"tags":1493,"stars":23,"repoUrl":24,"updatedAt":1273},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1494,1495,1496],{"name":1267,"slug":1268,"type":13},{"name":1270,"slug":1271,"type":13},{"name":21,"slug":22,"type":13},25]