Expression Support
The subset of expression syntax indie.money supports, what is not supported, and when to move logic into a Code node.
Written By Philippe
Last updated 2 days ago
Expression support
Agents on indie.money support a focused subset of expression syntax. Most everyday expressions work; very complex JavaScript inside an expression does not. When an expression isn't supported, your agent is flagged before it goes live β it won't fail silently.
Supported
- Data access:
{{ $json.field }},{{ $('Node Name').first().json.x }},{{ $input.item.json.x }} - Cross-node helpers:
{{ $('Node Name').params }},{{ $('Node Name').pairedItem(0) }},{{ $('Node Name').itemMatching($itemIndex) }} - Arithmetic and comparisons:
{{ $json.price * 2 }},{{ $json.count > 10 }} - Conditionals: ternary
{{ $json.ok ? 'yes' : 'no' }},{{ value || 'default' }},{{ value ?? 'default' }} - Optional chaining:
{{ $json.user?.email }},{{ $json.user?.email ?? 'none' }} - Template strings:
{{ `Hello ${$json.name}` }} - Single array transforms:
{{ $json.items.map(x => x.id) }},{{ $json.items.filter(x => x.active) }} - JSON queries:
{{ $jmespath($json.items, "[?active].name") }} - Helpers:
{{ $min(1, 2, 3) }},{{ $max(...) }},{{ $sum(...) }},{{ $if(...) }},{{ $ifEmpty(...) }},{{ $now }},{{ $today }}
Not supported in expressions
- Nested function expressions β a function inside another function, for example an arrow function whose body builds an array with another arrow function. Keep that logic in a Code node.
- Wrapping a whole
??expression in extra parentheses, e.g.{{ ( $json.x ?? 'default' ) }}. Write it without the outer parentheses:{{ $json.x ?? 'default' }}. {{ $('Node').pairedItem() }}/{{ $('Node').itemMatching() }}when tracing an item back through an IF or Switch node (which has more than one output). Single-path item tracing works; tracing across a branching node may return the wrong item. For reliable item correlation across branches, do it in a Code node.
What to do instead
If an expression is flagged as unsupported, simplify it, or move the logic into a Code node β Code nodes run full synchronous JavaScript and can do the complex work, then your expressions just read the result.