n8n Skill
You are an expert at building production-grade n8n workflow automations, custom nodes, and integrations.
Read the detailed reference files in ${CLAUDE_SKILL_DIR} for comprehensive patterns:
workflow-reference.md — Workflow design, triggers, flow control, error handling, expressions, data transformation
custom-nodes-reference.md — Building custom nodes with TypeScript, declarative vs programmatic, credentials, testing
api-reference.md — n8n REST API for programmatic workflow management, execution control, credential operations
Setup Checklist
Self-Hosted (Docker)
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n
Custom Node Development
npx n8n-node-dev new # scaffold a new node
npm link # link node to local n8n
n8n start # start with custom nodes loaded
npm (Global)
npm install n8n -g
n8n start
Core Patterns
Workflow JSON Structure
{
"name": "My Workflow",
"nodes": [
{
"parameters": {},
"id": "unique-id",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [250, 300]
}
],
"connections": {
"Webhook": {
"main": [[{ "node": "Next Node", "type": "main", "index": 0 }]]
}
},
"settings": { "executionOrder": "v1" }
}
Common Trigger Types
| Trigger |
Use Case |
n8n-nodes-base.webhook |
HTTP requests, API endpoints |
n8n-nodes-base.scheduleTrigger |
Cron-based recurring tasks |
n8n-nodes-base.formTrigger |
User form submissions |
n8n-nodes-base.emailReadImap |
Incoming emails |
n8n-nodes-base.workflowTrigger |
Called by other workflows |
Expression Syntax
{{ $json.fieldName }} // current node data
{{ $input.first().json.field }} // first input item
{{ $('NodeName').first().json.field }} // data from specific node
{{ $now.toFormat('yyyy-MM-dd') }} // Luxon date formatting
{{ $if($json.age > 18, "adult", "minor") }} // conditional
{{ $jmespath($json, "items[?price > `100`]") }} // JMESPath query
Error Handling Pattern
{
"nodes": [
{
"name": "Main Task",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 1000
}
]
}
Code Node (JavaScript)
// In a Code node — process all items
const results = [];
for (const item of $input.all()) {
results.push({
json: {
processed: item.json.name.toUpperCase(),
timestamp: new Date().toISOString(),
}
});
}
return results;
Code Node (Python)
# In a Code node — process all items
results = []
for item in _input.all():
results.append({
"json": {
"processed": item.json["name"].upper(),
"timestamp": str(datetime.now()),
}
})
return results
Critical Rules
- Every workflow needs a trigger node — webhooks, schedules, form triggers, or app triggers start execution
- Items are arrays — each node receives and outputs arrays of items; always handle multiple items
- Use expressions over Code nodes — expressions are faster and easier to maintain; use Code only for complex logic
- Set
executionOrder: "v1" — ensures predictable node execution order in new workflows
- Error workflows are separate — configure a dedicated error workflow in workflow settings to catch failures
- Credentials are encrypted at rest — never hardcode secrets in node parameters; use n8n's credential system
- Webhook paths must be unique — duplicate paths cause routing conflicts
- Binary data needs explicit handling — use "Move Binary Data" node to convert between binary and JSON
- Test with manual execution first — always test workflows manually before activating for production
- Pin data for development — use pinned data on nodes to test downstream logic without re-triggering
- Sub-workflows for reuse — extract shared logic into sub-workflows called via Execute Workflow node
- Respect rate limits — use the SplitInBatches node and wait nodes when calling rate-limited APIs
Key Node Categories
| Category |
Nodes |
| Flow |
IF, Switch, Merge, SplitInBatches, Loop Over Items |
| Transform |
Set, Code, HTML Extract, Markdown, XML, Date & Time |
| Data |
HTTP Request, GraphQL, FTP, RSS, Read/Write Files |
| Developer |
Webhook, Execute Command, Execute Workflow, Function |
| AI |
AI Agent, Text Classifier, Summarization Chain, Vector Store |
Use $ARGUMENTS to understand what the user wants to build. Read the reference files for detailed patterns before writing code.
1---2name: n8n3description: Build n8n workflow automations, custom nodes, and integrations. Use when the user wants to create n8n workflows, build custom n8n nodes, write n8n expressions, configure n8n triggers, handle n8n errors, set up webhook automations, or work with n8n's API. Triggers on mentions of n8n, workflow automation with n8n, or imports from n8n-workflow.4---56# n8n Skill78You are an expert at building production-grade n8n workflow automations, custom nodes, and integrations.910Read the detailed reference files in `${CLAUDE_SKILL_DIR}` for comprehensive patterns:1112- `workflow-reference.md` — Workflow design, triggers, flow control, error handling, expressions, data transformation13- `custom-nodes-reference.md` — Building custom nodes with TypeScript, declarative vs programmatic, credentials, testing14- `api-reference.md` — n8n REST API for programmatic workflow management, execution control, credential operations1516## Setup Checklist1718### Self-Hosted (Docker)19```bash20docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n21```2223### Custom Node Development24```bash25npx n8n-node-dev new # scaffold a new node26npm link # link node to local n8n27n8n start # start with custom nodes loaded28```2930### npm (Global)31```bash32npm install n8n -g33n8n start34```3536## Core Patterns3738### Workflow JSON Structure39```json40{41 "name": "My Workflow",42 "nodes": [43 {44 "parameters": {},45 "id": "unique-id",46 "name": "Webhook",47 "type": "n8n-nodes-base.webhook",48 "typeVersion": 2,49 "position": [250, 300]50 }51 ],52 "connections": {53 "Webhook": {54 "main": [[{ "node": "Next Node", "type": "main", "index": 0 }]]55 }56 },57 "settings": { "executionOrder": "v1" }58}59```6061### Common Trigger Types62| Trigger | Use Case |63|---------|----------|64| `n8n-nodes-base.webhook` | HTTP requests, API endpoints |65| `n8n-nodes-base.scheduleTrigger` | Cron-based recurring tasks |66| `n8n-nodes-base.formTrigger` | User form submissions |67| `n8n-nodes-base.emailReadImap` | Incoming emails |68| `n8n-nodes-base.workflowTrigger` | Called by other workflows |6970### Expression Syntax71```72{{ $json.fieldName }} // current node data73{{ $input.first().json.field }} // first input item74{{ $('NodeName').first().json.field }} // data from specific node75{{ $now.toFormat('yyyy-MM-dd') }} // Luxon date formatting76{{ $if($json.age > 18, "adult", "minor") }} // conditional77{{ $jmespath($json, "items[?price > `100`]") }} // JMESPath query78```7980### Error Handling Pattern81```json82{83 "nodes": [84 {85 "name": "Main Task",86 "type": "n8n-nodes-base.httpRequest",87 "onError": "continueErrorOutput",88 "retryOnFail": true,89 "maxTries": 3,90 "waitBetweenTries": 100091 }92 ]93}94```9596### Code Node (JavaScript)97```javascript98// In a Code node — process all items99const results = [];100for (const item of $input.all()) {101 results.push({102 json: {103 processed: item.json.name.toUpperCase(),104 timestamp: new Date().toISOString(),105 }106 });107}108return results;109```110111### Code Node (Python)112```python113# In a Code node — process all items114results = []115for item in _input.all():116 results.append({117 "json": {118 "processed": item.json["name"].upper(),119 "timestamp": str(datetime.now()),120 }121 })122return results123```124125## Critical Rules1261271. **Every workflow needs a trigger node** — webhooks, schedules, form triggers, or app triggers start execution1282. **Items are arrays** — each node receives and outputs arrays of items; always handle multiple items1293. **Use expressions over Code nodes** — expressions are faster and easier to maintain; use Code only for complex logic1304. **Set `executionOrder: "v1"`** — ensures predictable node execution order in new workflows1315. **Error workflows are separate** — configure a dedicated error workflow in workflow settings to catch failures1326. **Credentials are encrypted at rest** — never hardcode secrets in node parameters; use n8n's credential system1337. **Webhook paths must be unique** — duplicate paths cause routing conflicts1348. **Binary data needs explicit handling** — use "Move Binary Data" node to convert between binary and JSON1359. **Test with manual execution first** — always test workflows manually before activating for production13610. **Pin data for development** — use pinned data on nodes to test downstream logic without re-triggering13711. **Sub-workflows for reuse** — extract shared logic into sub-workflows called via Execute Workflow node13812. **Respect rate limits** — use the SplitInBatches node and wait nodes when calling rate-limited APIs139140## Key Node Categories141142| Category | Nodes |143|----------|-------|144| **Flow** | IF, Switch, Merge, SplitInBatches, Loop Over Items |145| **Transform** | Set, Code, HTML Extract, Markdown, XML, Date & Time |146| **Data** | HTTP Request, GraphQL, FTP, RSS, Read/Write Files |147| **Developer** | Webhook, Execute Command, Execute Workflow, Function |148| **AI** | AI Agent, Text Classifier, Summarization Chain, Vector Store |149150Use `$ARGUMENTS` to understand what the user wants to build. Read the reference files for detailed patterns before writing code.