N8n Expression Syntax
davila7/claude-code-templates
Validate n8n expression syntax and fix common errors. An agent skill from davila7/claude-code-templates.
Wires n8n workflows so failures are visible and recoverable: per-node error outputs, retries, error workflows and correct 4xx and 5xx webhook responses.
$ npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install czlonkowski/n8n-skills n8n-error-handling --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/czlonkowski/n8n-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/n8n-error-handling .claude/skills/n8n-error-handling && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "n8n-error-handling" agent skill from https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handling into .claude/skills/n8n-error-handling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "n8n-error-handling", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handlingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install czlonkowski/n8n-skills n8n-error-handling --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/czlonkowski/n8n-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/n8n-error-handling .agents/skills/n8n-error-handling && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "n8n-error-handling" agent skill from https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handling into .agents/skills/n8n-error-handling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "n8n-error-handling", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install czlonkowski/n8n-skills n8n-error-handling --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/czlonkowski/n8n-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/n8n-error-handling .cursor/skills/n8n-error-handling && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "n8n-error-handling" agent skill from https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handling into .cursor/skills/n8n-error-handling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "n8n-error-handling", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/czlonkowski/n8n-skills.git --path skills/n8n-error-handling--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install czlonkowski/n8n-skills n8n-error-handling --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/czlonkowski/n8n-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/n8n-error-handling .gemini/skills/n8n-error-handling && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "n8n-error-handling" agent skill from https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handling into .gemini/skills/n8n-error-handling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "n8n-error-handling", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install czlonkowski/n8n-skills n8n-error-handlingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/czlonkowski/n8n-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/n8n-error-handling .github/skills/n8n-error-handling && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "n8n-error-handling" agent skill from https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handling into .github/skills/n8n-error-handling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "n8n-error-handling", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install czlonkowski/n8n-skills n8n-error-handling --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/czlonkowski/n8n-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/n8n-error-handling .opencode/skills/n8n-error-handling && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "n8n-error-handling" agent skill from https://github.com/czlonkowski/n8n-skills/tree/main/skills/n8n-error-handling into .opencode/skills/n8n-error-handling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "n8n-error-handling", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
n8n-error-handlingWires n8n workflows so failures are visible and recoverable: per-node error outputs, retries, error workflows and correct 4xx and 5xx webhook responses.
By default a failing n8n node stops the whole workflow, which is fine while you watch a manual run but wrong for webhooks, cron jobs, queue workers and agent tools, where the caller sees a timeout or an empty 500 and nobody gets an alert. This skill sets out how to make those failures loud, structured and, where possible, self-healing.
Two mechanisms do most of the work. A per-node error output takes two steps: set onError to continueErrorOutput on the node, which creates the second output, then wire that output to a real handler, because doing only one of them swallows the error. A workflow-level error workflow, started by an Error Trigger, catches whatever escapes, such as timeouts and unwired failures. A table says when this is required: always for webhook and API workflows, and for unattended ones together with retryOnFail on network nodes; it is optional for one-off runs you watch yourself.
Supporting files cover API workflows, error workflows, node error outputs and response shapes, including which status code should accompany which failure cause in a Respond to Webhook node.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 19cd793. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript and json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
n8n Error Handling loads about 5.1k tokens when it runs. Until then it costs about 142 tokens; SKILL.md has 2,541 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from czlonkowski/n8n-skills at commit 19cd793, republished under its MIT licence (© czlonkowski). 2,541 words, ~5,111 tokens.
.claude/skills/n8n-error-handling/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.By default, when an n8n node throws, the whole workflow halts. For an interactive run you're watching, that's fine — you see the red node and fix it. For anything unattended (a webhook API, a cron job, a queue worker, an agent tool), it's the wrong default: the caller gets a timeout or an empty 500, the operator gets no alert, and the symptom is "the integration just stopped working" with no log and no clue.
This skill is about making failures loud, structured, and recoverable — and, best case, self-healing so transient blips never reach a human at all.
The two ideas that prevent most silent failures:
| Workflow shape | Error handling posture |
|---|---|
Webhook / API (anything with Respond to Webhook) | Required. Every fallible node's error output wired; status code matches cause. |
| Scheduled / cron / queue worker / agent tool (unattended) | Required. A workflow-level error workflow, plus retryOnFail on network nodes. |
| Internal one-off you run and watch yourself | Optional. Default onError: "stopWorkflow" is fine — you'll see the red node and re-run. |
The dividing line: if anyone other than you sees the output — a downstream system, an end user, an on-call engineer — the failure has to be handled, not swallowed. If you're the only watcher and the cost of failure is "I notice and re-run", looser is fine.
This is the single most common way an n8n workflow "handles" errors while actually swallowing them. Routing a node's failure to a handler takes two changes, and doing only one looks complete but misbehaves:
onError: "continueErrorOutput" on the node. This is what creates the second output. Without it, main[1] doesn't exist no matter what you wire.connections.<node>.main[1], i.e. sourceIndex: 1) to a real handler. Without a target, the error data is emitted into the void.Get one without the other and you hit a failure mode:
| What you did | What happens at runtime |
|---|---|
onError set, error output not wired | Error data is silently discarded. Downstream doesn't fire. The dashboard shows the run as succeeded. Worst case — no error logged anywhere. |
Error output wired, onError not set | The slot never fires; the handler is unreachable. On failure the workflow just halts (default stopWorkflow). |
| Both done | Failure routes down main[1] to your handler. ✅ |
n8n_update_partial_workflow// 1) Turn on the error output (creates main[1])
{ type: "updateNode", nodeName: "HTTP Request",
changes: { onError: "continueErrorOutput" } }
// 2) Wire the error output to a handler. sourceIndex: 1 = the error output.
{ type: "addConnection",
source: "HTTP Request",
target: "Handle Error",
sourceIndex: 1 }sourceIndex: 0 is the success path, sourceIndex: 1 is the error path. (For IF nodes the aliases branch: "true"/"false" map to index 0/1; for a generic fallible node, use the explicit sourceIndex: 1.)
Then verify. This trap doesn't surface in validate_workflow — a half-wired error output validates clean. Pull the workflow with n8n_get_workflow and confirm both halves:
onError is "continueErrorOutput".connections["HTTP Request"].main[1] contains your handler.Valid onError values:
| Value | Effect |
|---|---|
"stopWorkflow" (default) | Error halts the whole workflow. |
"continueRegularOutput" | Error item flows out the normal output. Rare, usually wrong — downstream gets error-shaped data and keeps going. |
"continueErrorOutput" | Error item flows out the separate error output (main[1]). The one you wire. |
Full failure-mode catalog, fan-in/fan-out shapes, and verification: NODE_ERROR_OUTPUTS.md.
A correctly wired error output still misses whole classes of failure. Verified on n8n 2.38.5:
| Failure | With continueErrorOutput | With continueRegularOutput |
|---|---|---|
JS error inside {{ }} (TypeError on a missing path, JSON.parse on bad input, a thrown Error, a JMESPath syntax error) | nothing fires; the field is null and items take the success path | same |
Python Code node rejected before running (blocked import, dunder access: Security violations detected) or bad return shape (list in each-item mode) | node marked failed, but the unchanged input items leave through the success output; main[1] stays empty and the execution shows success | unchanged input items pass through |
Exception while code runs (raise/throw, KeyError, NameError) | routed to main[1] as { error } ✅ | { error } item on the main output |
So an error branch alone can't guard these:
{{ $json.total !== undefined && $json.total !== null }})
and send the miss down the error path yourself.nulls.onError).retryOnFail before you wire error pathsBefore you build error branches, absorb the transient failures so they never reach those branches. On any node that calls a network service — HTTP Request, comms (Gmail/Slack/Discord), databases, AI nodes, third-party integrations — set node-level retry:
{ type: "updateNode", nodeName: "HTTP Request",
changes: {
retryOnFail: true,
maxTries: 3,
waitBetweenTries: 5000 // ms
} }Why this comes first: a 429 or a brief upstream hiccup will retry and usually succeed on its own. The error output then fires only on real, persistent failures — so your 5xx responses and on-call alerts reflect actual problems instead of noise.
Engine limits to know: retry fires on any error (there's no per-status-code filter), maxTries caps at 5, and waitBetweenTries caps at 5000ms — so 5000 is both the max and a sensible default. See n8n-node-configuration (NODE_FAMILY_GOTCHAS.md) for node-specific notes.
A webhook-triggered workflow that responds to its caller has one rule that overrides everything else: no hanging branches. Every path — success and every error — must end at a Respond to Webhook, or the caller sits there until it times out.
Webhook (responseMode: "responseNode")
├── validate input → process → Respond (200, body)
└── (any fallible node's error output → sourceIndex 1)
→ Respond (4xx/5xx, structured error body)
→ optional: log full error privately / notifyThree things make this work:
main[1] to a single Respond node. Keeps the graph readable.responseCode defaults to 200 — even on error branches. This is its own silent trap (see RESPONSE_SHAPES.md and n8n-node-configuration NODE_FAMILY_GOTCHAS.md): an error branch that returns 200 with an error body looks like success to the caller's HTTP client, so their error handling never fires. Set responseCode explicitly on every Respond node.For any endpoint doing structured input validation, run the check as an IIFE inside a single Set node rather than a chain of IF/Switch nodes per field. One node validates the whole payload, returns { valid, validationError, details, requiredSchema }, and an IF branches on valid → your logic (200) or a 400 Respond that echoes the schema back so the caller can self-correct. It's also dramatically faster than a recursive validator in a Code node + sub-workflow. The full pattern, the constraint cookbook, and the expression-escaping gotchas live in API_WORKFLOWS.md.
A 5xx with text/plain "Internal Server Error" is technically an error response and practically useless. And not every failure is a 5xx. Match the status code to why the request failed, because the caller branches on it: their monitoring alerts on 5xx (your fault) but not 4xx (their fault), and 5xx suggests "retry" while 4xx suggests "don't".
The common mistake: wiring everything — including bad input — to one Respond that returns 500 internal_error. Now the caller can't tell their bug from your outage, and your error rates can't separate real incidents from client noise.
| Cause | Status | error code | Where it's handled |
|---|---|---|---|
| Required field missing / wrong type | 400 | validation_error | Upstream check (schema validator / IF), not error output |
| Auth missing or invalid | 401 | unauthorized | Upstream check |
| Authenticated but not allowed | 403 | forbidden | Upstream check |
| Resource ID valid in request, absent in your data | 404 | not_found | Branch on the lookup result, not its error |
| Conflicts with current state (duplicate, race) | 409 | conflict | Detect with logic |
| Caller exceeded rate limit | 429 | rate_limit_exceeded | Set Retry-After header |
| Node threw, cause unknown | 500 | internal_error | Error output path |
| Third-party API returned an error | 502 | upstream_error | Error output of the HTTP node |
| Can't process right now (downstream down) | 503 | service_unavailable | Detect specific error, hint retry |
| Third-party API timed out | 504 | upstream_timeout | Error output filtered by message |
So there are two distinct flows: 4xx is decided before the work (IF/Switch + dedicated Respond), 5xx comes out of error outputs ("we tried, it broke").
One Respond, expression-driven code. When error paths differ only by number and message (same body shape, same headers), don't fan out to N Respond nodes through a Switch. The Respond node accepts expressions in both Response Code and body — compute the code inline:
// Response Code field on a single Respond to Webhook:
{{ (() => {
const msg = $json.error?.message || $json.message || '';
if (msg.includes('INVALID_ID')) return 400;
if (/429|too many/i.test(msg)) return 429;
if (/timeout/i.test(msg)) return 504;
if (/upstream|llm|api/i.test(msg)) return 502;
return 500;
})() }}Reserve Switch + multiple Responds for paths that diverge structurally (different headers, different body shapes, redirects). Same shape with a different number is one expression-driven Respond.
The default envelope is { "error": "<code>", "message": "<human text>" } — the HTTP status already says success-vs-failure, so no ok: false flag. Never leak internals (stack traces, SQL, upstream bodies, tokens) into the response — log those privately, return a sanitized message. Correlation IDs, retry_after, validation details, and the full do-not-leak list are in RESPONSE_SHAPES.md.
Per-node outputs handle the failures you anticipated on the nodes you remembered to wire. An error workflow catches everything else: a node you forgot to wire, a crash between nodes, a whole-workflow timeout, a trigger failure. For unattended workflows this is the safety net that turns "it silently stopped" into "an alert arrived".
Build it as a separate workflow starting with an Error Trigger node. n8n invokes it with the failure context:
{
"execution": { "id": "...", "url": "...", "lastNodeExecuted": "Fetch order",
"error": { "name": "NodeApiError", "message": "...", "timestamp": 1715000000000 } },
"workflow": { "id": "...", "name": "Sync Stripe customers" }
}Minimal version — capture → notify:
Error Trigger → Set (build alert from execution + error) → Slack/email (post to #incidents)A good alert includes the workflow name, a link to the editor and a link to the failed execution, the failed node name, and the real error message (not "Workflow failed"). Field expressions and the optional "fetch the failing input via the n8n node" upgrade are in ERROR_WORKFLOWS.md.
Two traps worth flagging up front:
What the community MCP can't do: assigning the error workflow (instance default or per-workflow override) is an n8n UI setting — Workflow Settings → Error Workflow. There is no MCP tool to set it. Build the error workflow with the MCP, then tell the user the exact UI step to wire it up, and to repeat it (or set the instance default) for every unattended workflow.
| Want to do | Reality |
|---|---|
| Set a workflow's Error Workflow setting | UI only (Workflow Settings → Error Workflow). No MCP tool. Build the workflow, then hand the user the UI step. |
| Toggle other workflow settings (Save Execution Data, timezone, timeout, caller policy) | UI only. n8n_update_partial_workflow has updateSettings, but the error-workflow assignment is not reliably exposed — confirm in the UI. |
| Enable instance-wide error logging (Sentry, server logs) | Instance config, outside n8n workflows entirely. |
What the MCP can do: build the error workflow, set onError/retryOnFail on nodes (updateNode/patchNodeField), wire error outputs (addConnection with sourceIndex: 1), validate (validate_workflow, n8n_validate_workflow), auto-fix common issues (n8n_autofix_workflow), test (n8n_test_workflow), and inspect failures (n8n_executions).
| Anti-pattern | What goes wrong | Fix |
|---|---|---|
onError set but error output unwired | Error silently discarded; run shows as succeeded | Wire sourceIndex: 1 to a real handler, or revert onError to stopWorkflow so it's loud |
Error output wired but onError not set | Slot never fires; handler unreachable; workflow halts on failure | Set onError: "continueErrorOutput" |
| Webhook → process → respond, no error branch | Caller gets a timeout or n8n's generic 500 | Wire every fallible node's error output to a Respond |
Error branch returns 200 with an {error} body | Caller's client reads success; their error handling never fires | Set responseCode to 4xx/5xx explicitly on error Responds |
One 500 internal_error for everything | Caller can't tell their bad input from your outage | Map cause → status (4xx caller, 5xx you) |
| Catching errors in a Code node and returning them as data | Downstream processes error-shaped data and continues | Let it throw; use onError: "continueErrorOutput" + wired path |
Network node with no retryOnFail | Every transient 429/blip surfaces as a 5xx; alerts fire on noise | retryOnFail: true, maxTries: 3, waitBetweenTries: 5000 |
| Switch → N Responds differing only by status code | 5 nodes for what's one Respond | Compute the code inline in one expression-driven Respond |
| Unattended workflow with no error workflow | A genuine failure goes nowhere | Build an Error Trigger workflow + assign it in the UI |
| Error workflow notifies the same channel the workflows monitor | Channel down → error workflow also fails → error vanishes | Use a different channel + a Data Table fallback |
Leaking $json.error (stack/SQL/tokens) into the response | Exposes internals to callers/attackers | Log privately, return a sanitized message |
| File | Read when |
|---|---|
| NODE_ERROR_OUTPUTS.md | Wiring a per-node error output on individual fallible nodes |
| API_WORKFLOWS.md | Building/reviewing a webhook → Respond workflow, including the schema validator |
| RESPONSE_SHAPES.md | Defining response body conventions, status codes, and what not to leak |
| ERROR_WORKFLOWS.md | Setting up the workflow-level catch-all for unattended workflows |
onError/retryOnFail are node config; NODE_FAMILY_GOTCHAS.md covers the Webhook/Respond response-code traps in depth.Response Code and the alert-message expressions rely on correct {{ }} syntax and $json.error access.For an API / webhook workflow:
responseMode: "responseNode"onError: "continueErrorOutput" and main[1] wiredretryOnFail: true, maxTries: 3, waitBetweenTries: 5000responseCode{ error, message } — no stack traces, SQL, or tokensn8n_get_workflow: both onError and main[1] present on each fallible nodeFor an unattended (scheduled/cron/queue) workflow:
retryOnFail configuredRemember: the default is silence. Error handling is two moves — make the failure route (per-node onError + wired output, or a catch-all error workflow) and make it speak (a status code and body that tell the truth). Half a move is worse than none, because it looks done.
© czlonkowski, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files in skills/n8n-error-handling of czlonkowski/n8n-skills.
Open the folder on GitHubat commit 19cd793
n8n Error Handling next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| n8n Error Handling this skillczlonkowski/n8n-skills | 6.4k | — | ~5.1k | Automated safety check: Pass | MIT | |
| N8n Expression Syntaxdavila7/claude-code-templates | 32k | 4 repos | ~2.4k | Automated safety check: Pass | MIT | |
| N8n Workflowsvibeeval/vibecosystem | 531 | — | ~3.3k | Automated safety check: Pass | MIT | |
| N8n Error Handlingsickn33/agentic-awesome-skills | 47k | 1 repos | ~4.9k | Automated safety check: Pass | MIT | |
| N8n Workflow Patternsdavila7/claude-code-templates | 32k | 1 repos | ~2.8k | Automated safety check: Pass | MIT | |
| Openclaw N8n OrchestratorLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.1k | Automated safety check: Notes | MIT |
davila7/claude-code-templates
Validate n8n expression syntax and fix common errors. An agent skill from davila7/claude-code-templates.
vibeeval/vibecosystem
n8n otomasyon workflow'lari. An agent skill from vibeeval/vibecosystem.
sickn33/agentic-awesome-skills
Design visible, structured, recoverable n8n failures using error outputs, retries, Error Trigger workflows, and HTTP error responses.
davila7/claude-code-templates
Proven workflow architectural patterns from real n8n workflows.
LeoYeAI/openclaw-master-skills
When the user wants to connect an OpenClaw agent to n8n workflows, create n8n webhook skills for OpenClaw, route agent API calls through n8n for credential isolation, build bidirectional…
aiskillstore/marketplace
n8n workflow automation patterns and API integration. An agent skill from aiskillstore/marketplace.
czlonkowski/n8n-skills
Explains how n8n keeps file bytes in $binary apart from structured $json data, and how to read, write and preserve binary across nodes, agent tools and chat.
czlonkowski/n8n-skills
Guides writing JavaScript in n8n Code nodes: picking an execution mode, reading input data, returning items, using built-in helpers and avoiding common errors.
czlonkowski/n8n-skills
Explains how to write native Python in n8n Code nodes, including the two input variables, blocked imports and fixes for common errors.
czlonkowski/n8n-skills
Explains the n8n Custom Code Tool's actual runtime contract so an AI-agent-callable tool doesn't get written like a regular workflow Code node.
czlonkowski/n8n-skills
Keeps an n8n MCP session pointed at the right n8n instance, with rules for discovering, switching and verifying the target before credential writes and for recovering from misroutes.
czlonkowski/n8n-skills
Explains how to configure n8n nodes correctly: which fields each operation requires, how property dependencies show or hide fields, and which get_node detail level to use.
Works with
Categories
Wires n8n workflows so failures are visible and recoverable: per-node error outputs, retries, error workflows and correct 4xx and 5xx webhook responses. By default a failing n8n node stops the whole workflow, which is fine while you watch a manual run but wrong for webhooks, cron jobs, queue workers and agent tools, where the caller sees a timeout or an empty 500 and nobody gets an alert. This skill sets out how to make those failures loud, structured and, where possible, self-healing.
n8n Error Handling fits situations like: building a webhook or API workflow that must return correct error codes; making an unattended scheduled workflow alert someone when it fails; fixing a workflow that fails silently; adding retries to nodes that call flaky external services.
Run `npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a claude-code`. Or copy the skill folder (skills/n8n-error-handling in czlonkowski/n8n-skills) into .claude/skills/n8n-error-handling in your project. Claude Code loads it when a task matches its description.
Run `npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a codex`. Or copy the skill folder (skills/n8n-error-handling in czlonkowski/n8n-skills) into .agents/skills/n8n-error-handling in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add czlonkowski/n8n-skills --skill n8n-error-handling -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/n8n-error-handling, .gemini/skills/n8n-error-handling, .github/skills/n8n-error-handling and .opencode/skills/n8n-error-handling in your project.
SKILL.md names no scripts, command-line tools or credentials: n8n Error Handling is instructions for the agent only. Our summary lists: An n8n instance with the workflow to change.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
n8n Error Handling is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with n8n Error Handling: N8n Expression Syntax (davila7/claude-code-templates, 32k stars), N8n Workflows (vibeeval/vibecosystem, 531 stars), N8n Error Handling (sickn33/agentic-awesome-skills, 47k stars) and N8n Workflow Patterns (davila7/claude-code-templates, 32k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
czlonkowski (a GitHub user) maintains it in czlonkowski/n8n-skills, which has 6,396 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on September 16, 2026.
Source: czlonkowski/n8n-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.