Workflows
Templates and variables
Pass data between blocks with {{input.x}}, {{steps.id.output}} and {{last.output}}, including paths into JSON.
Reference1 min readUpdated 23 October 2026
Any text setting on a block (a message, a URL, a JSON body, an email subject) can include variables in double curly braces. They are filled in when the block runs.
The three forms
| Variable | Means |
|---|---|
{{input.<field>}} | A field of the run's input, as defined on the Start block (or sent in the webhook body) |
{{steps.<blockId>.output}} | The output of an earlier block, by its id |
{{steps.<blockId>.output.<key>}} | A key inside that output when it is JSON, for example an Extract field or an HTTP response field |
{{last.output}} | The output of the block that ran just before this one |
Customer {{input.email}} wrote:{{input.message}}Category: {{steps.classify_1.output}}Order: {{steps.extract_1.output.order_id}}Previous step: {{last.output}}Reading into JSON
Add .key segments to walk into objects, and numbers to pick list items: {{input.order.items.0.sku}} reads the first item's SKU from a webhook body. Extract blocks always output JSON, so their fields are {{steps.extract_1.output.order_id}}. HTTP request blocks pass the response on; when it is JSON you can read it by key the same way.
Input rules
- Start fields are text. Numbers and true/false are turned into text; an object or a list in a Start field is refused.
- Required fields can't be empty. The run stops with an error like
Fill in "message" to run this workflow. - Webhook runs keep extra keys that aren't Start fields, so you can read nested JSON, up to 5 levels deep and 500 values.
- All of a run's input together is at most 32,000 characters.
Tip
Open a finished test run in Runs: each block's input and output is shown, which is the quickest way to find the exact path to use in the next block.
Still stuck?
Email us with what you tried and any request id. A person replies.