Awesome-omni-skill n8n-workflow
Create, modify, and understand n8n automation workflows. Use when building n8n workflow JSON files, configuring nodes (HTTP Request, Code, IF, Merge, Webhook, Schedule), writing expressions with {{ $json }}, or implementing flow logic (conditionals, loops, error handling). Triggers for requests involving n8n, workflow automation, or node-based pipeline creation.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/n8n-workflow" ~/.claude/skills/diegosouzapw-awesome-omni-skill-n8n-workflow-c87f10 && rm -rf "$T"
skills/development/n8n-workflow/SKILL.mdn8n Workflow Creator
This skill provides guidance for creating valid n8n workflow JSON files.
🚨 Critical: Webhook Data Structure
Most common mistake: Webhook data is nested under
.body, NOT at root!
// ❌ WRONG - Returns undefined {{ $json.email }} // ✅ CORRECT - Webhook data is under .body {{ $json.body.email }}
This applies to expressions AND Code nodes.
Workflow Structure
{ "name": "Workflow Name", "nodes": [...], "connections": {...}, "active": false, "settings": { "executionOrder": "v1" } }
The 5 Core Patterns
- Webhook Processing - Webhook → Validate → Transform → Respond
- HTTP API Integration - Trigger → HTTP Request → Transform → Action
- Database Operations - Schedule → Query → Transform → Write → Verify
- AI Agent Workflow - Trigger → AI Agent (Model + Tools) → Output
- Scheduled Tasks - Schedule → Fetch → Process → Deliver → Log
See patterns.md for complete examples.
Essential Nodes
| Node | Type | Use Case |
|---|---|---|
| Manual Trigger | | Test execution |
| Schedule | | Cron-based runs |
| Webhook | | HTTP endpoints |
| HTTP Request | | API calls |
| Code | | JavaScript/Python |
| Set | | Modify/create fields |
| IF | | Conditional branching |
| Merge | | Combine branches |
| Loop Over Items | | Batch processing |
See nodes.md for full configurations.
Expression Syntax
Expressions use
{{ }} syntax:
{{ $json.fieldName }} // Current item {{ $json.body.email }} // Webhook data (under .body!) {{ $('NodeName').item.json.field }} // Other node's output {{ $now }} // Current timestamp
❌ Don't use
in:{{ }}
- Code nodes (use JavaScript directly)
- Webhook paths
- Credential fields
See expressions.md for advanced patterns.
Code Node - Critical Rules
ALWAYS return array with
property:json
// ✅ CORRECT const items = $input.all(); return items.map(item => ({ json: { ...item.json, processed: true } })); // ✅ CORRECT - Single item return [{ json: { result: 'success' } }]; // ❌ WRONG - No return const data = $input.first(); // forgot return! // ❌ WRONG - Object instead of array return { json: { result: 'success' } };
Best practices:
- Validate input:
if (!items || items.length === 0) return []; - Use null checks:
item.json?.user?.email || 'default' - Try-catch for API calls
- Filter early, process late
Common Gotchas
| Problem | Solution |
|---|---|
| Can't access webhook data | Use , not |
| Expression shows as text | Wrap in |
| Unexpected node order | Check Settings → Execution Order (use v1) |
| Code node returns nothing | Add statement |
| API returns 401/403 | Use Credentials section, not parameters |
Connections Format
"connections": { "Source Node": { "main": [[{ "node": "Target Node", "type": "main", "index": 0 }]] } }
IF node outputs:
index: 0 = True, index: 1 = False
Best Practices
✅ Do:
- Use descriptive node names ("Fetch Users", not "HTTP Request 1")
- Set
for resilienceonError: "continueRegularOutput" - Test incrementally, node by node
- Document complex workflows with notes
- Handle empty data cases
❌ Don't:
- Build workflows in one shot (iterate!)
- Skip error handling
- Hardcode credentials in parameters
- Use Code node when built-in nodes suffice
- Deploy without testing
Reference Documentation
- nodes.md - Node configurations
- expressions.md - Expression syntax
- patterns.md - Workflow patterns
- json-structure.md - JSON schema