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.