From n8n-mcp-skills
Provides 6 core architectural patterns for n8n workflows: webhook processing, HTTP API integration, database operations, AI agents, scheduled tasks, and batch processing. Guides pattern selection and optimization.
How this skill is triggered — by the user, by Claude, or both
Slash command
/n8n-mcp-skills:n8n-workflow-patternsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Proven architectural patterns for building n8n workflows.
Proven architectural patterns for building n8n workflows.
Based on analysis of real workflow usage:
Webhook Processing (Most Common)
Batch Processing (below)
Webhook Processing - Use when:
HTTP API Integration - Use when:
Database Operations - Use when:
AI Agent Workflow - Use when:
Scheduled Tasks - Use when:
Batch Processing - Use when:
All patterns share these building blocks:
When building ANY workflow, follow this checklist:
activateWorkflow operationBuilding the nodes is the start, not the finish. Before a workflow goes live, run it through four gates — and remember the headline rule: validation passing is necessary, not sufficient. A workflow can validate clean and still drop items, pick the wrong Merge input, or post Slack messages as plain text. Clean validation means the shapes are right, not that the logic is.
validate_workflow on the full JSON during build, or n8n_validate_workflow({ id }) once the workflow exists on the instance. Fix every error and re-validate. This catches schema, node-config, expression, and reference errors — the structural layer.n8n_get_workflow({ id }) and read the connections object directly. Validation confirms connections aren't broken; it doesn't confirm they're correct. This is where you catch the valid-but-wrong wiring: a Merge whose useDataOfInput doesn't line up with the connection slot, a Switch fallback that connects to nothing, a fan-out branch that was never wired onward, an error output that goes nowhere. (See the n8n Node Configuration skill's NODE_FAMILY_GOTCHAS.md for the silent ones.)n8n_test_workflow and inspect the output via n8n_executions. Confirm the output shape matches what consumers expect, fan-outs all produced data, and (for webhook APIs) the status/body/headers are right. Real side effects fire during a test — writes commit, messages send, external APIs are called. If any node has a user-visible side effect, confirm with the user before running, or test against safe data first.n8n_update_partial_workflow with the activateWorkflow operation. Don't activate straight off a clean validation; an active workflow that drops data or double-sends is worse than one that never started.Skipping any gate trades a few minutes now for debugging a live, possibly stateful, possibly traffic-bearing workflow later. The trade is never worth it.
Trigger → Transform → Action → End
Use when: Simple workflows with single path
Trigger → IF → [True Path]
└→ [False Path]
Use when: Different actions based on conditions
Trigger → [Branch 1] → Merge
└→ [Branch 2] ↗
Use when: Independent operations that can run simultaneously
Trigger → Split in Batches → Process → Loop (until done)
Use when: Processing large datasets in chunks
Main Flow → [Success Path]
└→ [Error Trigger → Error Handler]
Use when: Need separate error handling workflow
The SplitInBatches node splits a large dataset into smaller chunks for processing. Understanding its outputs is critical:
main[0] = done — fires ONCE after all batches completemain[1] = each batch — fires per batch (this is the loop body)Prepare Items → SplitInBatches → [main[1]: Process Batch] → (loops back)
[main[0]: Done] → Limit 1 → Aggregate
Always add a Limit 1 node after the done output.
A SplitInBatches loop re-runs its whole body once per iteration — ~0.8 ms/iteration of engine overhead plus the body's own cost — so total ≈ ⌈items / batchSize⌉ × (overhead + body). batchSize is a direct speed dial:
batchSize: 1 is the expensive extreme — one full engine pass per item. Use it only when you must act on a single item at a time (nested-loop control, or an API that takes exactly one id).After the loop, $('Node Inside Loop').all() returns ONLY the last batch's items. To accumulate across all iterations, use $getWorkflowStaticData('global') in a Code node inside the loop. See the n8n Code JavaScript skill for the full pattern.
When processing N categories × M items per category (where an API has a batch limit):
Define Categories (N items)
→ Outer Loop (SplitInBatches, batchSize=1)
→ Prepare category data
→ Inner Loop (SplitInBatches, batchSize=1000)
→ API Call → Verify → (loops back to Inner Loop via main[1])
→ Inner done[0] → Rate Limit Delay → back to Outer Loop
→ Outer done[0] → Limit 1 → Final Aggregate
Wiring gotcha: The inner done[0] must connect back to the OUTER loop input, not to the aggregate. The outer done[0] feeds the final aggregate.
For APIs without multi-ID filtering, use id_from + date windowing for efficient pagination:
Schedule → Set Date Window → Fetch Page → Process
→ IF has more? → [true] Update id_from → Fetch Page (loop)
→ [false] → Aggregate → Output
When testing with API write nodes disabled (for dry runs), downstream verification nodes receive the request body instead of the response. Make verification tolerant:
// In verification Code node
const body = $input.first().json;
const looksLikeRequest = body.method && body.parameters && !body.status;
if (looksLikeRequest) {
return [{ json: { status: 'SKIPPED', message: 'Upstream disabled for testing' }}];
}
// Normal response verification below...
When a workflow processes thousands of items with little I/O, its speed is set by how many times n8n crosses a per-item / per-iteration boundary — each crossing sets up an execution context and copies the items. Four architecture choices dominate:
But profile first. Most production workflows are I/O-bound — sequential HTTP / DB / Sheets calls (hundreds of ms each) dwarf all of the above. These rules matter when transform work is the floor, or when an anti-pattern (Each-Item Code, batchSize 1, long per-item chains) turns a cheap operation into a slow one. Below a few hundred items, none of it matters. The n8n Code JavaScript skill has the full measured model.
append on sheets with formula columns — it breaks formulas. Use Google Sheets API values.update (PUT) via HTTP Request node with a googleApi credentialADD() formulas. Use parseFloat() in a Code nodeconvertToGoogleDocument: true creates a Google Doc (text), NOT a Google Sheet — to upload a CSV for download, omit this option entirelyhttps://drive.google.com/uc?id={fileId}&export=download — use instead of /view linksWhen comparing values (prices, quantities, metrics), always check both directions:
// ❌ Only catches increases
if (diff > threshold) { flag(); }
// ✅ Catches both spikes AND crashes — both are data-quality signals
if (Math.abs(diff) > threshold) { flag(); }
Problem: Can't access webhook payload data
Solution: Data is nested under $json.body
❌ {{$json.email}}
✅ {{$json.body.email}}
See: n8n Expression Syntax skill
Problem: Node processes all input items, but I only want one
Solution: Use "Execute Once" mode or process first item only
{{$json[0].field}} // First item only
Problem: API calls failing with 401/403
Solution:
Problem: Nodes executing in unexpected order
Solution: Check workflow settings → Execution Order
Problem: Expressions showing as literal text
Solution: Use {{}} around expressions
These skills work together with Workflow Patterns:
n8n MCP Tools Expert - Use to:
tools_documentation({topic: "ai_agents_guide", depth: "full"}) for AI pattern guidancen8n_manage_datatablen8n Expression Syntax - Use to:
n8n Node Configuration - Use to:
n8n Validation Expert - Use to:
Common workflow patterns:
Most Common Triggers:
Most Common Transformations:
Most Common Outputs:
Average Workflow Complexity:
1. Webhook (path: "form-submit", POST)
2. Set (map form fields)
3. Slack (post message to #notifications)
1. Schedule (daily at 9 AM)
2. HTTP Request (fetch analytics)
3. Code (aggregate data)
4. Email (send formatted report)
5. Error Trigger → Slack (notify on failure)
1. Schedule (every 15 minutes)
2. Postgres (query new records)
3. IF (check if records exist)
4. MySQL (insert records)
5. Postgres (update sync timestamp)
1. Webhook (receive chat message)
2. AI Agent
├─ OpenAI Chat Model (ai_languageModel)
├─ HTTP Request Tool (ai_tool)
├─ Database Tool (ai_tool)
└─ Window Buffer Memory (ai_memory)
3. Webhook Response (send AI reply)
1. Manual Trigger (for testing)
2. HTTP Request (GET /api/users)
3. Split In Batches (process 100 at a time)
4. Set (transform user data)
5. Postgres (upsert users)
6. Loop (back to step 3 until done)
For comprehensive guidance on each pattern:
From n8n template library:
Template #2947: Weather to Slack
Webhook Processing: Most common pattern
HTTP API: Common pattern
Database Operations: Common pattern
AI Agents: Growing in usage
Use search_templates and get_template from n8n-mcp tools to find examples!
Key Points:
Next Steps:
Related Skills:
npx claudepluginhub czlonkowski/n8n-skills --plugin n8n-mcp-skillsProvides proven n8n workflow patterns for webhook processing, HTTP API integration, database operations, AI agents, and scheduled tasks. Use when building, designing, or architecting workflows.
Provides proven architectural patterns for n8n workflows including webhook processing, HTTP API integration, database operations, AI agents, and scheduled tasks. Useful for high-level workflow design before node-by-node building.
Designs visual n8n workflows with trigger selection, node mapping, data transformations, error handling, and webhook integration. Activates when users mention n8n workflows or automation.