| 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 d |
| category | Document Processing |
| source | antigravity |
| tags | ["javascript","node","api","mcp","ai","workflow","document"] |
| url | https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/n8n-expression-syntax |
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:
{{$json.fieldName}}
{{$json['field with spaces']}}
{{$json.nested.property}}
{{$json.items[0].name}}
$node - Reference Other Nodes
Access data from any previous node:
{{$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:
{{$now}}
{{$now.toFormat('yyyy-MM-dd')}}
{{$now.toFormat('HH:mm:ss')}}
{{$now.plus({days: 7})}}
$env - Environment Variables
Access environment variables:
{{$env.API_KEY}}
{{$env.DATABASE_URL}}
🚨 CRITICAL: Webhook Data Structure
Most Common Mistake: Webhook data is NOT at the root!
Webhook Node Output Structure
{
"headers": {...},
"params": {...},
"query": {...},
"body": {
"name": "John",
"email": "john@example.com",
"message": "Hello"
}
}
Correct Webhook Data Access
❌ 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
{{$json.user.email}}
{{$json.data[0].name}}
{{$json.items[0].id}}
{{$json['field name']}}
{{$json['user data']['first name']}}
Reference Other Nodes
{{$node["Set"].json.value}}
{{$node["HTTP Request"].json.data}}
{{$node["Respond to Webhook"].json.message}}
{{$node["Webhook"].json.body.email}}
Combine Variables
Hello {{$json.body.name}}!
https:
{
"name": "={{$json.body.name}}",
"email": "={{$json.body.email}}"
}
When NOT to Use Expressions
❌ Code Nodes
Code nodes use direct JavaScript access, NOT expressions!
const email = '={{$json.email}}';
const name = '{{$json.body.name}}';
const email = $json.email;
const name = $json.body.name;
const email = $input.item.json.email;
const allItems = $input.all();
❌ Webhook Paths
path: "{{$json.user_id}}/webhook"
path: "user-webhook"
❌ Credential Fields
apiKey: "={{$env.API_KEY}}"
Use n8n credential system, not expressions
Validation Rules
1. Always Use {{}}
Expressions must be wrapped in double curly braces.
❌ $json.field
✅ {{$json.field}}
2. Use Quotes for Spaces
Field or node names with spaces require bracket notation:
❌ {{$json.field name}}
✅ {{$json['field name']}}
❌ {{$node.HTTP Request.json}}
✅ {{$node["HTTP Request"].json}}
3. Match Exact Node Names
Node references are case-sensitive:
❌ {{$node["http request"].json}}
❌ {{$node["Http Request"].json}}
✅ {{$node["HTTP Request"].json}}
4. No Nested {{}}
Don't double-wrap expressions:
❌ {{{$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:
{
"body": {
"name": "John Doe",
"email":