Data between steps
Every step of a Flow can access the results of the previous ones. That's the basic principle: the trigger delivers data, the first action works with it, the second uses its result.
Inserting values
In a step's settings, Use values from previous steps leads to the selection of available data. A click places the value at the cursor; alternatively, drag it to the desired spot in the text field.
An inserted value appears as a colored chip. Clicking it opens the expression editor — there the value can be processed further, for example converted or given a fallback value.
Mixing fixed text and values
You don't have to choose. An email subject can read: Your registration for followed by the Event field from the trigger. This applies to recipient, subject, body, and most other input fields.
Keyboard shortcut in the JavaScript step and the HTML block
These two have a code editor instead of chips. There, Ctrl + Space inserts Grid fields:
Press Ctrl + Space to insert Grid fields
What the trigger delivers
| Trigger | Available data |
|---|---|
| New entry | The newly created entry with all fields |
| Entry was changed | The changed entry with all fields |
| Entry via form | The created entry |
| Entry changed via form | The changed entry |
| Webhook | The submitted JSON data |
| Show page | The values entered on the page |
All fields are available
Even fields that weren't asked for on the triggering form are available — the Flow gets the complete entry, not just the form inputs.
What actions deliver
Every action passes on a result that later steps can use:
| Action | Result |
|---|---|
| Load all entries | A list of entries |
| Create entry | The newly created entry |
| QR Code | The generated code |
| PDF to text | The extracted text |
| Import CSV file | The read-in rows |
| JavaScript | The return value of the code |
| Create link to page | A link to the running instance |
| Prefilled form link | An editing link |
Lists need "Parallel"
A list is not yet a repetition
If a step delivers a list — such as Load all entries — the following steps still only run once.
Only the Parallel helper turns it into individual runs per element. → Router and Parallel
Load all entries → list
↓
Parallel → once per element
↓
Email → a single entry is available hereInside Parallel, you refer to the current element, not the whole list anymore.
With Merge runs, the parallel section ends: after that the Flow runs once again, and you no longer refer to a single element. → Router and Parallel
Values from the JavaScript step
The JavaScript step receives the previous step's data as input and passes it on with return:
const data = input
data.status = 'processed'
return dataFor transformations no step covers
If an outside system expects a specific format, or values need to be converted, this is the way to do it — without running a service of your own.
Data from pages
If a Flow shows a page, the values entered there become available afterward. Access happens via the key of the respective input block.
Set the key before referencing it
If you change the key afterward, existing references point to nothing — without an error message. → Input blocks
For HTML blocks with form fields, an additional rule applies: input fields without a name or id attribute are not passed through.
When values arrive empty
| Symptom | Cause |
|---|---|
| Empty value in the email | The field wasn't filled in the entry |
| Reference to a later step | Only previous steps are available |
| After a Router | The other branch was taken, its data is missing |
| After a page | The key doesn't match, or was changed |
| From an HTML block | name or id attribute is missing |
Look instead of guess
Via Show details on a step, you can see its actual input and output data from a real run. That clears up almost every "why is this empty" question faster than thinking about it.