workflow-architect
Skill32 starsChanged 7 months agoMITView on GitHub
Design production-grade n8n workflows from requirements. Use this skill whenever the user wants to build, design, architect, or plan an n8n workflow or automation — including phrases like "build me a workflow", "design an automation", "create an n8n flow", "how should I structure this in n8n", or any request involving connecting services (webhooks, APIs, databases, LLMs, email, WhatsApp, Stripe, Google Sheets, etc.) through n8n. Also use when the user describes a business process and wants it automated. Always use this skill before generating n8n workflow JSON or recommending node structures — do not rely on memory of n8n node names or expression syntax.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- magnus919/agent-skillstheir own version, first seen Jul 21, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- magnus919/agent-skills★ 172same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository4 other files it gives its agents.
- chain-llm-patternSkill
- debug-workflowSkill
- enrichment-waterfallSkill
- mysql-checkpointingSkill
The file
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 5 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 18
Idempotency by default: If the workflow could be retriggered (webhook, cron, polling), include a checkpoint — a MySQL/Postgres lookup on a …
- Very specific: line 20
Sub-workflows for reuse: If logic exceeds ~8 nodes or is called from multiple places (e.g., error handling, notifications), extract into an …
- Distinctive: line 24
Follow these steps in order.
- Distinctive: line 28
Ask (or infer) exactly ONE trigger type:
- Very specific: line 71
If using LLMs (Claude, OpenAI, Groq), reference the chain-llm-pattern skill for multi-step reasoning.
- Very specific: line 73
Use the LangChain nodes (AI Agent, Basic LLM Chain, Information Extractor) for structured outputs, NOT raw HTTP Request to the LLM API — …
- Very specific: line 91
Every node needs id (UUID), name (unique in workflow), type (exact n8n type), typeVersion (integer), position ([x, y]), and parameters …
- Very specific: line 93
Use typeVersion: 1 as a safe default unless you know a newer version is required.
- Distinctive: line 97
If the user asked for a description rather than importable JSON, produce a clean numbered list matching Step 2 format and offer to generate …
- Distinctive: line 101
Do NOT produce workflows that:
- Very specific: line 104
Use Function nodes for logic that has a purpose-built node (e.g., Split In Batches, Merge, Item Lists)
- Distinctive: line 110
Don't guess — ask ONE consolidated clarifying question covering:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
n8n Workflow Architect
You are designing a production n8n workflow, not a demo. The workflow must survive real data, real failures, and real volume.
Core principles (apply every time)
- Real node names, not guesses. n8n is strict about capitalization and spacing. Use
Google SheetsnotGooglesheets.HTTP RequestnotHttpRequest.Webhooknotwebhook trigger. If unsure, say so — don't invent. - Expression syntax is
={{ $json.field }}. The leading=marks the whole field as an expression. Without it, n8n treats the value as a literal string. This is the #1 hallucination source. - Every external call needs an error branch. Wrap API calls in an
IFor usecontinueOnFail: true+ a downstreamIFthat checks{{ $json.error }}. Never assume third parties don't fail. - Idempotency by default. If the workflow could be retriggered (webhook, cron, polling), include a checkpoint — a MySQL/Postgres lookup on a natural key, or a
Google Sheetsrow check. Reference themysql-checkpointingskill for the pattern. - Sub-workflows for reuse. If logic exceeds ~8 nodes or is called from multiple places (e.g., error handling, notifications), extract into an
Execute Workflowsub-workflow.
Workflow design process
Follow these steps in order. Skipping steps produces demo-quality output.
Step 1: Clarify the trigger
Ask (or infer) exactly ONE trigger type:
| Trigger | Use when |
Webhook | External system pushes events (Stripe, Meta, custom APIs) |
Schedule Trigger | Recurring jobs (daily reports, hourly polls) |
Manual Trigger | Admin-triggered, testing |
Form Trigger | User-facing intake |
Chat Trigger | Conversational agents |
Execute Workflow Trigger | Called by another workflow |
Webhooks in production need: signature verification (HMAC), idempotency key extraction, and a 200 response within 3s (use Respond to Webhook early, process async).
Step 2: Map the happy path
Draft the node sequence as a numbered list BEFORE writing JSON. Each node gets:
- Node type (exact n8n name)
- Purpose (one sentence)
- Key config (the one or two parameters that matter)
Example:
1. Webhook (POST /stripe-events) — receives Stripe events
2. Code — verify HMAC signature against STRIPE_SIGNING_SECRET header
3. IF — branch on signature valid
4. Respond to Webhook — return 200 immediately (no payload)
5. MySQL — SELECT from processed_webhooks WHERE event_id = {{ $('Webhook').item.json.body.id }}
...Step 3: Add error paths
For EACH external call node, answer:
- What failure modes exist? (timeout, 4xx, 5xx, rate limit, malformed response)
- What's the recovery? (retry with backoff, fallback vendor, dead-letter queue, alert)
Common patterns:
- Retry with backoff:
Waitnode (exponential: 2^n seconds) → loop back viaExecute Workflowcalling itself with a retry counter - Fallback vendor:
IFon error → alternative vendor node (e.g., WhatsApp fails → Twilio SMS) - Dead letter: Error →
MySQLinsert intofailed_jobstable with payload + error message
Step 4: Wire the LLM steps correctly
If using LLMs (Claude, OpenAI, Groq), reference the chain-llm-pattern skill for multi-step reasoning. Key rules:
- Use the LangChain nodes (
AI Agent,Basic LLM Chain,Information Extractor) for structured outputs, NOT rawHTTP Requestto the LLM API — the LangChain nodes handle JSON parsing, retries, and token accounting. - For JSON outputs, use
Information Extractorwith an explicit schema, not "please return JSON" in a system prompt. - Set
maxTokensexplicitly — n8n defaults can silently truncate. - Pin an example input during development (right-click node → "Pin Data") so downstream nodes have stable schemas to build against.
Step 5: Output
Produce the workflow as valid n8n workflow JSON. Structure:
{
"name": "Workflow Name",
"nodes": [...],
"connections": {...},
"settings": { "executionOrder": "v1" }
}Every node needs id (UUID), name (unique in workflow), type (exact n8n type), typeVersion (integer), position ([x, y]), and parameters (node-specific config).
Use typeVersion: 1 as a safe default unless you know a newer version is required.
For connections, main is the default output — branching nodes (IF, Switch) have multiple output indices.
If the user asked for a description rather than importable JSON, produce a clean numbered list matching Step 2 format and offer to generate JSON.
Anti-patterns to refuse
Do NOT produce workflows that:
- Store credentials inline (always use n8n credential references:
{{ $credentials.apiKey }}) - Poll an API every minute when a webhook exists
- Use
Functionnodes for logic that has a purpose-built node (e.g.,Split In Batches,Merge,Item Lists) - Return raw LLM output to end users without validation
- Assume a list/array is always populated (always handle empty arrays)
When the user's request is vague
Don't guess — ask ONE consolidated clarifying question covering:
- Trigger source + frequency
- External services involved
- What happens on failure (silent drop? alert? retry?)
- Data destination
One question, not five. Move fast.
Reference files
references/node-catalog.md— curated list of battle-tested nodes for common tasksreferences/expressions-cheatsheet.md— n8n expression syntax, common patterns, gotchas
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

