📦 deps(thirdparty): update snapshots
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "agentic-bundle-aas-automation-builder",
|
||||
"version": "14.2.0",
|
||||
"version": "14.3.1",
|
||||
"description": "Editorial \"AAS Automation Builder\" bundle for Claude Code from Agentic Awesome Skills.",
|
||||
"author": {
|
||||
"name": "sickn33 and contributors",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "aasb-aas-automation-builder",
|
||||
"version": "14.2.0",
|
||||
"version": "14.3.1",
|
||||
"description": "Install the \"AAS Automation Builder\" workflow plugin from Agentic Awesome Skills.",
|
||||
"author": {
|
||||
"name": "sickn33 and contributors",
|
||||
|
||||
-528
@@ -1,528 +0,0 @@
|
||||
---
|
||||
name: n8n-expression-syntax
|
||||
description: Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, troubleshooting expression errors, or working with webhook data in workflows.
|
||||
risk: unknown
|
||||
source: community
|
||||
---
|
||||
|
||||
# n8n Expression Syntax
|
||||
|
||||
Expert guide for writing correct n8n expressions in workflows.
|
||||
|
||||
## When to Use
|
||||
- You need to write or debug n8n expressions using `{{ ... }}` syntax.
|
||||
- The task involves `$json`, `$node`, webhook payloads, or expression-related workflow errors.
|
||||
- You want syntax-correct dynamic values inside n8n nodes and parameters.
|
||||
|
||||
---
|
||||
|
||||
## Expression Format
|
||||
|
||||
All dynamic content in n8n uses **double curly braces**:
|
||||
|
||||
```
|
||||
{{expression}}
|
||||
```
|
||||
|
||||
**Examples**:
|
||||
```
|
||||
✅ {{$json.email}}
|
||||
✅ {{$json.body.name}}
|
||||
✅ {{$node["HTTP Request"].json.data}}
|
||||
❌ $json.email (no braces - treated as literal text)
|
||||
❌ {$json.email} (single braces - invalid)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Core Variables
|
||||
|
||||
### $json - Current Node Output
|
||||
|
||||
Access data from the current node:
|
||||
|
||||
```javascript
|
||||
{{$json.fieldName}}
|
||||
{{$json['field with spaces']}}
|
||||
{{$json.nested.property}}
|
||||
{{$json.items[0].name}}
|
||||
```
|
||||
|
||||
### $node - Reference Other Nodes
|
||||
|
||||
Access data from any previous node:
|
||||
|
||||
```javascript
|
||||
{{$node["Node Name"].json.fieldName}}
|
||||
{{$node["HTTP Request"].json.data}}
|
||||
{{$node["Webhook"].json.body.email}}
|
||||
```
|
||||
|
||||
**Important**:
|
||||
- Node names **must** be in quotes
|
||||
- Node names are **case-sensitive**
|
||||
- Must match exact node name from workflow
|
||||
|
||||
### $now - Current Timestamp
|
||||
|
||||
Access current date/time:
|
||||
|
||||
```javascript
|
||||
{{$now}}
|
||||
{{$now.toFormat('yyyy-MM-dd')}}
|
||||
{{$now.toFormat('HH:mm:ss')}}
|
||||
{{$now.plus({days: 7})}}
|
||||
```
|
||||
|
||||
### $env - Environment Variables
|
||||
|
||||
Access environment variables:
|
||||
|
||||
```javascript
|
||||
{{$env.API_KEY}}
|
||||
{{$env.DATABASE_URL}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚨 CRITICAL: Webhook Data Structure
|
||||
|
||||
**Most Common Mistake**: Webhook data is **NOT** at the root!
|
||||
|
||||
### Webhook Node Output Structure
|
||||
|
||||
```javascript
|
||||
{
|
||||
"headers": {...},
|
||||
"params": {...},
|
||||
"query": {...},
|
||||
"body": { // ⚠️ USER DATA IS HERE!
|
||||
"name": "John",
|
||||
"email": "john@example.com",
|
||||
"message": "Hello"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Correct Webhook Data Access
|
||||
|
||||
```javascript
|
||||
❌ WRONG: {{$json.name}}
|
||||
❌ WRONG: {{$json.email}}
|
||||
|
||||
✅ CORRECT: {{$json.body.name}}
|
||||
✅ CORRECT: {{$json.body.email}}
|
||||
✅ CORRECT: {{$json.body.message}}
|
||||
```
|
||||
|
||||
**Why**: Webhook node wraps incoming data under `.body` property to preserve headers, params, and query parameters.
|
||||
|
||||
---
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Access Nested Fields
|
||||
|
||||
```javascript
|
||||
// Simple nesting
|
||||
{{$json.user.email}}
|
||||
|
||||
// Array access
|
||||
{{$json.data[0].name}}
|
||||
{{$json.items[0].id}}
|
||||
|
||||
// Bracket notation for spaces
|
||||
{{$json['field name']}}
|
||||
{{$json['user data']['first name']}}
|
||||
```
|
||||
|
||||
### Reference Other Nodes
|
||||
|
||||
```javascript
|
||||
// Node without spaces
|
||||
{{$node["Set"].json.value}}
|
||||
|
||||
// Node with spaces (common!)
|
||||
{{$node["HTTP Request"].json.data}}
|
||||
{{$node["Respond to Webhook"].json.message}}
|
||||
|
||||
// Webhook node
|
||||
{{$node["Webhook"].json.body.email}}
|
||||
```
|
||||
|
||||
### Combine Variables
|
||||
|
||||
```javascript
|
||||
// Concatenation (automatic)
|
||||
Hello {{$json.body.name}}!
|
||||
|
||||
// In URLs
|
||||
https://api.example.com/users/{{$json.body.user_id}}
|
||||
|
||||
// In object properties
|
||||
{
|
||||
"name": "={{$json.body.name}}",
|
||||
"email": "={{$json.body.email}}"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## When NOT to Use Expressions
|
||||
|
||||
### ❌ Code Nodes
|
||||
|
||||
Code nodes use **direct JavaScript access**, NOT expressions!
|
||||
|
||||
```javascript
|
||||
// ❌ WRONG in Code node
|
||||
const email = '={{$json.email}}';
|
||||
const name = '{{$json.body.name}}';
|
||||
|
||||
// ✅ CORRECT in Code node
|
||||
const email = $json.email;
|
||||
const name = $json.body.name;
|
||||
|
||||
// Or using Code node API
|
||||
const email = $input.item.json.email;
|
||||
const allItems = $input.all();
|
||||
```
|
||||
|
||||
### ❌ Webhook Paths
|
||||
|
||||
```javascript
|
||||
// ❌ WRONG
|
||||
path: "{{$json.user_id}}/webhook"
|
||||
|
||||
// ✅ CORRECT
|
||||
path: "user-webhook" // Static paths only
|
||||
```
|
||||
|
||||
### ❌ Credential Fields
|
||||
|
||||
```javascript
|
||||
// ❌ WRONG
|
||||
apiKey: "={{$env.API_KEY}}"
|
||||
|
||||
// ✅ CORRECT
|
||||
Use n8n credential system, not expressions
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Validation Rules
|
||||
|
||||
### 1. Always Use {{}}
|
||||
|
||||
Expressions **must** be wrapped in double curly braces.
|
||||
|
||||
```javascript
|
||||
❌ $json.field
|
||||
✅ {{$json.field}}
|
||||
```
|
||||
|
||||
### 2. Use Quotes for Spaces
|
||||
|
||||
Field or node names with spaces require **bracket notation**:
|
||||
|
||||
```javascript
|
||||
❌ {{$json.field name}}
|
||||
✅ {{$json['field name']}}
|
||||
|
||||
❌ {{$node.HTTP Request.json}}
|
||||
✅ {{$node["HTTP Request"].json}}
|
||||
```
|
||||
|
||||
### 3. Match Exact Node Names
|
||||
|
||||
Node references are **case-sensitive**:
|
||||
|
||||
```javascript
|
||||
❌ {{$node["http request"].json}} // lowercase
|
||||
❌ {{$node["Http Request"].json}} // wrong case
|
||||
✅ {{$node["HTTP Request"].json}} // exact match
|
||||
```
|
||||
|
||||
### 4. No Nested {{}}
|
||||
|
||||
Don't double-wrap expressions:
|
||||
|
||||
```javascript
|
||||
❌ {{{$json.field}}}
|
||||
✅ {{$json.field}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
For complete error catalog with fixes, see COMMON_MISTAKES.md
|
||||
|
||||
### Quick Fixes
|
||||
|
||||
| Mistake | Fix |
|
||||
|---------|-----|
|
||||
| `$json.field` | `{{$json.field}}` |
|
||||
| `{{$json.field name}}` | `{{$json['field name']}}` |
|
||||
| `{{$node.HTTP Request}}` | `{{$node["HTTP Request"]}}` |
|
||||
| `{{{$json.field}}}` | `{{$json.field}}` |
|
||||
| `{{$json.name}}` (webhook) | `{{$json.body.name}}` |
|
||||
| `'={{$json.email}}'` (Code node) | `$json.email` |
|
||||
|
||||
---
|
||||
|
||||
## Working Examples
|
||||
|
||||
For real workflow examples, see EXAMPLES.md
|
||||
|
||||
### Example 1: Webhook to Slack
|
||||
|
||||
**Webhook receives**:
|
||||
```json
|
||||
{
|
||||
"body": {
|
||||
"name": "John Doe",
|
||||
"email": "john@example.com",
|
||||
"message": "Hello!"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**In Slack node text field**:
|
||||
```
|
||||
New form submission!
|
||||
|
||||
Name: {{$json.body.name}}
|
||||
Email: {{$json.body.email}}
|
||||
Message: {{$json.body.message}}
|
||||
```
|
||||
|
||||
### Example 2: HTTP Request to Email
|
||||
|
||||
**HTTP Request returns**:
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"items": [
|
||||
{"name": "Product 1", "price": 29.99}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**In Email node** (reference HTTP Request):
|
||||
```
|
||||
Product: {{$node["HTTP Request"].json.data.items[0].name}}
|
||||
Price: ${{$node["HTTP Request"].json.data.items[0].price}}
|
||||
```
|
||||
|
||||
### Example 3: Format Timestamp
|
||||
|
||||
```javascript
|
||||
// Current date
|
||||
{{$now.toFormat('yyyy-MM-dd')}}
|
||||
// Result: 2025-10-20
|
||||
|
||||
// Time
|
||||
{{$now.toFormat('HH:mm:ss')}}
|
||||
// Result: 14:30:45
|
||||
|
||||
// Full datetime
|
||||
{{$now.toFormat('yyyy-MM-dd HH:mm')}}
|
||||
// Result: 2025-10-20 14:30
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Data Type Handling
|
||||
|
||||
### Arrays
|
||||
|
||||
```javascript
|
||||
// First item
|
||||
{{$json.users[0].email}}
|
||||
|
||||
// Array length
|
||||
{{$json.users.length}}
|
||||
|
||||
// Last item
|
||||
{{$json.users[$json.users.length - 1].name}}
|
||||
```
|
||||
|
||||
### Objects
|
||||
|
||||
```javascript
|
||||
// Dot notation (no spaces)
|
||||
{{$json.user.email}}
|
||||
|
||||
// Bracket notation (with spaces or dynamic)
|
||||
{{$json['user data'].email}}
|
||||
```
|
||||
|
||||
### Strings
|
||||
|
||||
```javascript
|
||||
// Concatenation (automatic)
|
||||
Hello {{$json.name}}!
|
||||
|
||||
// String methods
|
||||
{{$json.email.toLowerCase()}}
|
||||
{{$json.name.toUpperCase()}}
|
||||
```
|
||||
|
||||
### Numbers
|
||||
|
||||
```javascript
|
||||
// Direct use
|
||||
{{$json.price}}
|
||||
|
||||
// Math operations
|
||||
{{$json.price * 1.1}} // Add 10%
|
||||
{{$json.quantity + 5}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Advanced Patterns
|
||||
|
||||
### Conditional Content
|
||||
|
||||
```javascript
|
||||
// Ternary operator
|
||||
{{$json.status === 'active' ? 'Active User' : 'Inactive User'}}
|
||||
|
||||
// Default values
|
||||
{{$json.email || 'no-email@example.com'}}
|
||||
```
|
||||
|
||||
### Date Manipulation
|
||||
|
||||
```javascript
|
||||
// Add days
|
||||
{{$now.plus({days: 7}).toFormat('yyyy-MM-dd')}}
|
||||
|
||||
// Subtract hours
|
||||
{{$now.minus({hours: 24}).toISO()}}
|
||||
|
||||
// Set specific date
|
||||
{{DateTime.fromISO('2025-12-25').toFormat('MMMM dd, yyyy')}}
|
||||
```
|
||||
|
||||
### String Manipulation
|
||||
|
||||
```javascript
|
||||
// Substring
|
||||
{{$json.email.substring(0, 5)}}
|
||||
|
||||
// Replace
|
||||
{{$json.message.replace('old', 'new')}}
|
||||
|
||||
// Split and join
|
||||
{{$json.tags.split(',').join(', ')}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Debugging Expressions
|
||||
|
||||
### Test in Expression Editor
|
||||
|
||||
1. Click field with expression
|
||||
2. Open expression editor (click "fx" icon)
|
||||
3. See live preview of result
|
||||
4. Check for errors highlighted in red
|
||||
|
||||
### Common Error Messages
|
||||
|
||||
**"Cannot read property 'X' of undefined"**
|
||||
→ Parent object doesn't exist
|
||||
→ Check your data path
|
||||
|
||||
**"X is not a function"**
|
||||
→ Trying to call method on non-function
|
||||
→ Check variable type
|
||||
|
||||
**Expression shows as literal text**
|
||||
→ Missing {{ }}
|
||||
→ Add curly braces
|
||||
|
||||
---
|
||||
|
||||
## Expression Helpers
|
||||
|
||||
### Available Methods
|
||||
|
||||
**String**:
|
||||
- `.toLowerCase()`, `.toUpperCase()`
|
||||
- `.trim()`, `.replace()`, `.substring()`
|
||||
- `.split()`, `.includes()`
|
||||
|
||||
**Array**:
|
||||
- `.length`, `.map()`, `.filter()`
|
||||
- `.find()`, `.join()`, `.slice()`
|
||||
|
||||
**DateTime** (Luxon):
|
||||
- `.toFormat()`, `.toISO()`, `.toLocal()`
|
||||
- `.plus()`, `.minus()`, `.set()`
|
||||
|
||||
**Number**:
|
||||
- `.toFixed()`, `.toString()`
|
||||
- Math operations: `+`, `-`, `*`, `/`, `%`
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ Do
|
||||
|
||||
- Always use {{ }} for dynamic content
|
||||
- Use bracket notation for field names with spaces
|
||||
- Reference webhook data from `.body`
|
||||
- Use $node for data from other nodes
|
||||
- Test expressions in expression editor
|
||||
|
||||
### ❌ Don't
|
||||
|
||||
- Don't use expressions in Code nodes
|
||||
- Don't forget quotes around node names with spaces
|
||||
- Don't double-wrap with extra {{ }}
|
||||
- Don't assume webhook data is at root (it's under .body!)
|
||||
- Don't use expressions in webhook paths or credentials
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **n8n MCP Tools Expert**: Learn how to validate expressions using MCP tools
|
||||
- **n8n Workflow Patterns**: See expressions in real workflow examples
|
||||
- **n8n Node Configuration**: Understand when expressions are needed
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**Essential Rules**:
|
||||
1. Wrap expressions in {{ }}
|
||||
2. Webhook data is under `.body`
|
||||
3. No {{ }} in Code nodes
|
||||
4. Quote node names with spaces
|
||||
5. Node names are case-sensitive
|
||||
|
||||
**Most Common Mistakes**:
|
||||
- Missing {{ }} → Add braces
|
||||
- `{{$json.name}}` in webhooks → Use `{{$json.body.name}}`
|
||||
- `{{$json.email}}` in Code → Use `$json.email`
|
||||
- `{{$node.HTTP Request}}` → Use `{{$node["HTTP Request"]}}`
|
||||
|
||||
For more details, see:
|
||||
- COMMON_MISTAKES.md - Complete error catalog
|
||||
- EXAMPLES.md - Real workflow examples
|
||||
|
||||
---
|
||||
|
||||
**Need Help?** Reference the n8n expression documentation or use n8n-mcp validation tools to check your expressions.
|
||||
|
||||
## Limitations
|
||||
- Use this skill only when the task clearly matches the scope described above.
|
||||
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
|
||||
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
|
||||
+423
@@ -0,0 +1,423 @@
|
||||
---
|
||||
name: n8n-workflow-patterns
|
||||
description: "Proven architectural patterns for building n8n workflows."
|
||||
risk: unknown
|
||||
source: community
|
||||
---
|
||||
|
||||
# n8n Workflow Patterns
|
||||
|
||||
Proven architectural patterns for building n8n workflows.
|
||||
|
||||
## When to Use
|
||||
- You need to choose an architectural pattern for an n8n workflow before building it.
|
||||
- The task involves webhook processing, API integration, scheduled jobs, database sync, or AI-agent workflow design.
|
||||
- You want a high-level workflow structure rather than node-by-node troubleshooting.
|
||||
|
||||
---
|
||||
|
||||
## The 5 Core Patterns
|
||||
|
||||
Based on analysis of real workflow usage:
|
||||
|
||||
1. **Webhook Processing** (Most Common)
|
||||
- Receive HTTP requests → Process → Output
|
||||
- Pattern: Webhook → Validate → Transform → Respond/Notify
|
||||
|
||||
2. **[HTTP API Integration]**
|
||||
- Fetch from REST APIs → Transform → Store/Use
|
||||
- Pattern: Trigger → HTTP Request → Transform → Action → Error Handler
|
||||
|
||||
3. **Database Operations**
|
||||
- Read/Write/Sync database data
|
||||
- Pattern: Schedule → Query → Transform → Write → Verify
|
||||
|
||||
4. **AI Agent Workflow**
|
||||
- AI agents with tools and memory
|
||||
- Pattern: Trigger → AI Agent (Model + Tools + Memory) → Output
|
||||
|
||||
5. **Scheduled Tasks**
|
||||
- Recurring automation workflows
|
||||
- Pattern: Schedule → Fetch → Process → Deliver → Log
|
||||
|
||||
---
|
||||
|
||||
## Pattern Selection Guide
|
||||
|
||||
### When to use each pattern:
|
||||
|
||||
**Webhook Processing** - Use when:
|
||||
- Receiving data from external systems
|
||||
- Building integrations (Slack commands, form submissions, GitHub webhooks)
|
||||
- Need instant response to events
|
||||
- Example: "Receive Stripe payment webhook → Update database → Send confirmation"
|
||||
|
||||
**HTTP API Integration** - Use when:
|
||||
- Fetching data from external APIs
|
||||
- Synchronizing with third-party services
|
||||
- Building data pipelines
|
||||
- Example: "Fetch GitHub issues → Transform → Create Jira tickets"
|
||||
|
||||
**Database Operations** - Use when:
|
||||
- Syncing between databases
|
||||
- Running database queries on schedule
|
||||
- ETL workflows
|
||||
- Example: "Read Postgres records → Transform → Write to MySQL"
|
||||
|
||||
**AI Agent Workflow** - Use when:
|
||||
- Building conversational AI
|
||||
- Need AI with tool access
|
||||
- Multi-step reasoning tasks
|
||||
- Example: "Chat with AI that can search docs, query database, send emails"
|
||||
|
||||
**Scheduled Tasks** - Use when:
|
||||
- Recurring reports or summaries
|
||||
- Periodic data fetching
|
||||
- Maintenance tasks
|
||||
- Example: "Daily: Fetch analytics → Generate report → Email team"
|
||||
|
||||
---
|
||||
|
||||
## Common Workflow Components
|
||||
|
||||
All patterns share these building blocks:
|
||||
|
||||
### 1. Triggers
|
||||
- **Webhook** - HTTP endpoint (instant)
|
||||
- **Schedule** - Cron-based timing (periodic)
|
||||
- **Manual** - Click to execute (testing)
|
||||
- **Polling** - Check for changes (intervals)
|
||||
|
||||
### 2. Data Sources
|
||||
- **HTTP Request** - REST APIs
|
||||
- **Database nodes** - Postgres, MySQL, MongoDB
|
||||
- **Service nodes** - Slack, Google Sheets, etc.
|
||||
- **Code** - Custom JavaScript/Python
|
||||
|
||||
### 3. Transformation
|
||||
- **Set** - Map/transform fields
|
||||
- **Code** - Complex logic
|
||||
- **IF/Switch** - Conditional routing
|
||||
- **Merge** - Combine data streams
|
||||
|
||||
### 4. Outputs
|
||||
- **HTTP Request** - Call APIs
|
||||
- **Database** - Write data
|
||||
- **Communication** - Email, Slack, Discord
|
||||
- **Storage** - Files, cloud storage
|
||||
|
||||
### 5. Error Handling
|
||||
- **Error Trigger** - Catch workflow errors
|
||||
- **IF** - Check for error conditions
|
||||
- **Stop and Error** - Explicit failure
|
||||
- **Continue On Fail** - Per-node setting
|
||||
|
||||
---
|
||||
|
||||
## Workflow Creation Checklist
|
||||
|
||||
When building ANY workflow, follow this checklist:
|
||||
|
||||
### Planning Phase
|
||||
- [ ] Identify the pattern (webhook, API, database, AI, scheduled)
|
||||
- [ ] List required nodes (use search_nodes)
|
||||
- [ ] Understand data flow (input → transform → output)
|
||||
- [ ] Plan error handling strategy
|
||||
|
||||
### Implementation Phase
|
||||
- [ ] Create workflow with appropriate trigger
|
||||
- [ ] Add data source nodes
|
||||
- [ ] Configure authentication/credentials
|
||||
- [ ] Add transformation nodes (Set, Code, IF)
|
||||
- [ ] Add output/action nodes
|
||||
- [ ] Configure error handling
|
||||
|
||||
### Validation Phase
|
||||
- [ ] Validate each node configuration (validate_node)
|
||||
- [ ] Validate complete workflow (validate_workflow)
|
||||
- [ ] Test with sample data
|
||||
- [ ] Handle edge cases (empty data, errors)
|
||||
|
||||
### Deployment Phase
|
||||
- [ ] Review workflow settings (execution order, timeout, error handling)
|
||||
- [ ] Activate workflow using `activateWorkflow` operation
|
||||
- [ ] Monitor first executions
|
||||
- [ ] Document workflow purpose and data flow
|
||||
|
||||
---
|
||||
|
||||
## Data Flow Patterns
|
||||
|
||||
### Linear Flow
|
||||
```
|
||||
Trigger → Transform → Action → End
|
||||
```
|
||||
**Use when**: Simple workflows with single path
|
||||
|
||||
### Branching Flow
|
||||
```
|
||||
Trigger → IF → [True Path]
|
||||
└→ [False Path]
|
||||
```
|
||||
**Use when**: Different actions based on conditions
|
||||
|
||||
### Parallel Processing
|
||||
```
|
||||
Trigger → [Branch 1] → Merge
|
||||
└→ [Branch 2] ↗
|
||||
```
|
||||
**Use when**: Independent operations that can run simultaneously
|
||||
|
||||
### Loop Pattern
|
||||
```
|
||||
Trigger → Split in Batches → Process → Loop (until done)
|
||||
```
|
||||
**Use when**: Processing large datasets in chunks
|
||||
|
||||
### Error Handler Pattern
|
||||
```
|
||||
Main Flow → [Success Path]
|
||||
└→ [Error Trigger → Error Handler]
|
||||
```
|
||||
**Use when**: Need separate error handling workflow
|
||||
|
||||
---
|
||||
|
||||
## Common Gotchas
|
||||
|
||||
### 1. Webhook Data Structure
|
||||
**Problem**: Can't access webhook payload data
|
||||
|
||||
**Solution**: Data is nested under `$json.body`
|
||||
```javascript
|
||||
❌ {{$json.email}}
|
||||
✅ {{$json.body.email}}
|
||||
```
|
||||
See: n8n Expression Syntax skill
|
||||
|
||||
### 2. Multiple Input Items
|
||||
**Problem**: Node processes all input items, but I only want one
|
||||
|
||||
**Solution**: Use "Execute Once" mode or process first item only
|
||||
```javascript
|
||||
{{$json[0].field}} // First item only
|
||||
```
|
||||
|
||||
### 3. Authentication Issues
|
||||
**Problem**: API calls failing with 401/403
|
||||
|
||||
**Solution**:
|
||||
- Configure credentials properly
|
||||
- Use the "Credentials" section, not parameters
|
||||
- Test credentials before workflow activation
|
||||
|
||||
### 4. Node Execution Order
|
||||
**Problem**: Nodes executing in unexpected order
|
||||
|
||||
**Solution**: Check workflow settings → Execution Order
|
||||
- v0: Top-to-bottom (legacy)
|
||||
- v1: Connection-based (recommended)
|
||||
|
||||
### 5. Expression Errors
|
||||
**Problem**: Expressions showing as literal text
|
||||
|
||||
**Solution**: Use {{}} around expressions
|
||||
- See n8n Expression Syntax skill for details
|
||||
|
||||
---
|
||||
|
||||
## Integration with Other Skills
|
||||
|
||||
These skills work together with Workflow Patterns:
|
||||
|
||||
**n8n MCP Tools Expert** - Use to:
|
||||
- Find nodes for your pattern (search_nodes)
|
||||
- Understand node operations (get_node)
|
||||
- Create workflows (n8n_create_workflow)
|
||||
- Deploy templates (n8n_deploy_template)
|
||||
- Use ai_agents_guide for AI pattern guidance
|
||||
|
||||
**n8n Expression Syntax** - Use to:
|
||||
- Write expressions in transformation nodes
|
||||
- Access webhook data correctly ({{$json.body.field}})
|
||||
- Reference previous nodes ({{$node["Node Name"].json.field}})
|
||||
|
||||
**n8n Node Configuration** - Use to:
|
||||
- Configure specific operations for pattern nodes
|
||||
- Understand node-specific requirements
|
||||
|
||||
**n8n Validation Expert** - Use to:
|
||||
- Validate workflow structure
|
||||
- Fix validation errors
|
||||
- Ensure workflow correctness before deployment
|
||||
|
||||
---
|
||||
|
||||
## Pattern Statistics
|
||||
|
||||
Common workflow patterns:
|
||||
|
||||
**Most Common Triggers**:
|
||||
1. Webhook - 35%
|
||||
2. Schedule (periodic tasks) - 28%
|
||||
3. Manual (testing/admin) - 22%
|
||||
4. Service triggers (Slack, email, etc.) - 15%
|
||||
|
||||
**Most Common Transformations**:
|
||||
1. Set (field mapping) - 68%
|
||||
2. Code (custom logic) - 42%
|
||||
3. IF (conditional routing) - 38%
|
||||
4. Switch (multi-condition) - 18%
|
||||
|
||||
**Most Common Outputs**:
|
||||
1. HTTP Request (APIs) - 45%
|
||||
2. Slack - 32%
|
||||
3. Database writes - 28%
|
||||
4. Email - 24%
|
||||
|
||||
**Average Workflow Complexity**:
|
||||
- Simple (3-5 nodes): 42%
|
||||
- Medium (6-10 nodes): 38%
|
||||
- Complex (11+ nodes): 20%
|
||||
|
||||
---
|
||||
|
||||
## Quick Start Examples
|
||||
|
||||
### Example 1: Simple Webhook → Slack
|
||||
```
|
||||
1. Webhook (path: "form-submit", POST)
|
||||
2. Set (map form fields)
|
||||
3. Slack (post message to #notifications)
|
||||
```
|
||||
|
||||
### Example 2: Scheduled Report
|
||||
```
|
||||
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)
|
||||
```
|
||||
|
||||
### Example 3: Database Sync
|
||||
```
|
||||
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)
|
||||
```
|
||||
|
||||
### Example 4: AI Assistant
|
||||
```
|
||||
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)
|
||||
```
|
||||
|
||||
### Example 5: API Integration
|
||||
```
|
||||
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)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Detailed Pattern Files
|
||||
|
||||
For comprehensive guidance on each pattern:
|
||||
|
||||
- **webhook_processing.md** - Webhook patterns, data structure, response handling
|
||||
- **http_api_integration** - REST APIs, authentication, pagination, retries
|
||||
- **database_operations.md** - Queries, sync, transactions, batch processing
|
||||
- **ai_agent_workflow.md** - AI agents, tools, memory, langchain nodes
|
||||
- **scheduled_tasks.md** - Cron schedules, reports, maintenance tasks
|
||||
|
||||
---
|
||||
|
||||
## Real Template Examples
|
||||
|
||||
From n8n template library:
|
||||
|
||||
**Template #2947**: Weather to Slack
|
||||
- Pattern: Scheduled Task
|
||||
- Nodes: Schedule → HTTP Request (weather API) → Set → Slack
|
||||
- Complexity: Simple (4 nodes)
|
||||
|
||||
**Webhook Processing**: Most common pattern
|
||||
- Most common: Form submissions, payment webhooks, chat integrations
|
||||
|
||||
**HTTP API**: Common pattern
|
||||
- Most common: Data fetching, third-party integrations
|
||||
|
||||
**Database Operations**: Common pattern
|
||||
- Most common: ETL, data sync, backup workflows
|
||||
|
||||
**AI Agents**: Growing in usage
|
||||
- Most common: Chatbots, content generation, data analysis
|
||||
|
||||
Use `search_templates` and `get_template` from n8n-mcp tools to find examples!
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ Do
|
||||
|
||||
- Start with the simplest pattern that solves your problem
|
||||
- Plan your workflow structure before building
|
||||
- Use error handling on all workflows
|
||||
- Test with sample data before activation
|
||||
- Follow the workflow creation checklist
|
||||
- Use descriptive node names
|
||||
- Document complex workflows (notes field)
|
||||
- Monitor workflow executions after deployment
|
||||
|
||||
### ❌ Don't
|
||||
|
||||
- Build workflows in one shot (iterate! avg 56s between edits)
|
||||
- Skip validation before activation
|
||||
- Ignore error scenarios
|
||||
- Use complex patterns when simple ones suffice
|
||||
- Hardcode credentials in parameters
|
||||
- Forget to handle empty data cases
|
||||
- Mix multiple patterns without clear boundaries
|
||||
- Deploy without testing
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**Key Points**:
|
||||
1. **5 core patterns** cover 90%+ of workflow use cases
|
||||
2. **Webhook processing** is the most common pattern
|
||||
3. Use the **workflow creation checklist** for every workflow
|
||||
4. **Plan pattern** → **Select nodes** → **Build** → **Validate** → **Deploy**
|
||||
5. Integrate with other skills for complete workflow development
|
||||
|
||||
**Next Steps**:
|
||||
1. Identify your use case pattern
|
||||
2. Read the detailed pattern file
|
||||
3. Use n8n MCP Tools Expert to find nodes
|
||||
4. Follow the workflow creation checklist
|
||||
5. Use n8n Validation Expert to validate
|
||||
|
||||
**Related Skills**:
|
||||
- n8n MCP Tools Expert - Find and configure nodes
|
||||
- n8n Expression Syntax - Write expressions correctly
|
||||
- n8n Validation Expert - Validate and fix errors
|
||||
- n8n Node Configuration - Configure specific operations
|
||||
|
||||
## Limitations
|
||||
- Use this skill only when the task clearly matches the scope described above.
|
||||
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
|
||||
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
|
||||
Reference in New Issue
Block a user