Skip to content

Referencing data

The five roots Flero understands inside an expression, in detail: $node, $trigger, $input, $workflow and $env.


$node["Name"]: another node's output

{{ $node["Get Customer"].output.email }}
  • The key is the node's display name, exactly as it appears on the canvas. It is case-sensitive.
  • Double or single quotes both work: $node["Get Customer"] or $node['Get Customer'].
  • .output and .json are the same, and both are optional.
  • $node["X"].output on its own returns the node's whole output.
  • $nodes["…"] is accepted as a synonym.

Multi-item outputs. When a node outputs several items, its output has the first item's fields at the top, plus _items (every item) and _count:

{{ $node["List Orders"].output.id }}            // first item
{{ $node["List Orders"].output._items[3].id }}  // fourth item
{{ $node["List Orders"].output._count }}        // how many items

Where the data sits depends on the node. Two you'll use often:

Node Read
HTTP Request output.response.body (plus response.statusCode, response.headers)
AI Agent output.content (or output.parsedContent with an output parser)

Open a node's output after a test run to see its exact shape.

What if the node hasn't run?

You get an [EXPR-ERROR: …] marker that names the problem and lists the node names it could find. Common causes:

  • A typo in the name.
  • The node is on a branch that didn't run (the If went false, and the node is on the true path).
  • The node is downstream. You can only reference nodes that have already run.

$trigger: the data that started the run

{{ $trigger.payload.userId }}

The shape depends on how the run started:

Started by $trigger contains
API/Webhook Trigger payload (the parsed body), headers (lower-case names), query, method, path, payloadType, triggerTime
Form Trigger payload (one key per form field), formTitle, triggerTime
Scheduler triggerTime, plus each key of the node's payload setting
A parent Sub-Workflow node The parent's input mapping, or with no mapping, everything that arrived at the Sub-Workflow node
A run that resumed after an approval The original trigger data, plus _approvalResponse
Connector trigger Read the trigger node's output instead: {{ $node["Slack Trigger"].output.<field> }}

When there is no trigger data, $trigger is an empty object.

Webhook example:

{
  "payload": { "userId": "abc", "action": "signup" },
  "headers": { "content-type": "application/json", "x-request-id": "…" },
  "query": {},
  "method": "POST",
  "path": "/signup"
}

Read a header as {{ $trigger.headers.x-request-id }}.


$input: the data arriving at this node

{{ $input.firstName }} {{ $input.lastName }}

$input is the data flowing into this node. When several items arrive, they are merged into one object, and the earliest item wins when two have the same key. With no input (a trigger node), $input is an empty object, not an error.

Inside a Loop body, the current element is {{ $input.item }} (or the Loop's outputFieldName), and its position is {{ $input._loopIteration.current }}. _loopIteration also has total, index, isFirst and isLast.

In a simple chain, $input.field and $node["<previous node>"].output.field read the same value. $input is shorter.


$workflow: the workflow's fields and variables

{{ $workflow.id }}
{{ $workflow.name }}
{{ $workflow.variables.region }}
Path What it returns
$workflow.id The workflow's id
$workflow.name Its name
$workflow.variables.<key> A workflow variable

Workflow variables are set in the workflow's settings, on the Variables tab. They are fixed values for this workflow, the same in every run. $workflow.<key> reads the same value as $workflow.variables.<key>.

There is no $workflow.version, $workflow.settings or $workflow.metadata. A reference to them resolves to null.


$env: workspace variables

{{ $env.API_BASE_URL }}
{{ $env.STRIPE_KEY }}

$env.NAME reads a workspace variable. Manage them under Settings → Workspace → Variables. Every workflow in the workspace can use them, and their values never appear in workflow JSON. $env["NAME"] also works.

  • Secret variables can be read only through $env, never through $workflow.
  • An unset variable fails the node before it runs, with "Workspace variable "NAME" is not set." You won't get a broken URL or an empty value.

Good uses: base URLs, environment names, settings shared by many workflows, and keys a node needs as plain text (for example a signing key in Encryption & Hashing). For credentials that a connector or the HTTP Request node uses, prefer a saved credential.


Combining references

Use any number of references in one field:

{{ $env.API_HOST }}/users/{{ $trigger.payload.userId }}/orders/{{ $node["Lookup"].output.orderId }}

And go as deep as you need:

{{ $node["Process payments"].output.results[0].transactions[0].amount }}


Found something out of date? This page lives in the Flero docs content set.