Connect steps and pass data between them
When you build a workflow, you connect steps to define the execution order and pass data between them. Each connection creates a path that the workflow engine follows at runtime, making upstream output available to downstream steps through expressions.
About this task
Draw connections between steps
You can connect steps in the workflow builder by using any of the following methods.
Use the add button on a step handle
Every unconnected output handle displays a + button. Click this button to open the Add step panel. When you select a step type, the system creates the new step and connects it to the source handle automatically.
You can also press and drag from the + button toward an existing step. Release the drag on the target step to create a connection between the two steps.
Drag from a handle
Drag from any output handle on a step to the input handle on another step. The builder displays a visible line that follows your cursor during the drag. You do not need perfect accuracy as the connection snaps to a nearby target handle when you release within range.
If you release the drag over an empty area of the canvas, the Add step panel opens at that position. The builder connects the new step to the source handle automatically.
Connection rules
The workflow builder enforces the following connection rules:
- You cannot connect a step to itself.
- A Loop step's Loop handle can have only one outgoing connection. This connection leads to the first step in the loop body.
- When you connect a step to a Loop step's Loop handle, the system automatically creates a return connection from the new step back to the loop, closing the loop cycle.
Reorganize the layout
If the canvas becomes cluttered after adding and connecting several steps, click the Reset layout button in the canvas controls (lower left of the canvas). The builder repositions all steps into an organized arrangement.
Understand data flow between steps
When you select a step in the workflow builder, the details panel opens with three panes:
| Pane | Position | Purpose |
|---|---|---|
| Input | Left | Displays the output data from upstream steps that feed into this step. |
| Parameters | Center | Contains the configuration fields for this step, organized into Parameters and Settings tabs. |
| Output | Right | Displays the output data from the most recent execution of this step. |
View upstream data in the Input pane
The Input pane shows data from steps that are connected upstream of the selected step. If multiple steps feed into this step, use the dropdown at the top of the pane to select which upstream step's output to view.
The Input pane has two expandable sections:
- Step output: The output fields from the selected upstream step. Before you run the step, the output shows the expected output fields. After you run the step, it shows the actual values.
- Variables and context: Workflow-level variables and built-in context values that are available to every step.
You can switch between three view modes: Schema (field types), Table (key-value pairs), and JSON (raw JSON).
Pass data
The Input pane displays each output field as a draggable item.
Procedure
Expression syntax reference
Steps reference data from other steps, workflow inputs, and built-in context values by using expressions inside ${...} syntax. The workflow engine resolves all expressions at runtime before each step executes.
Reference output from an earlier step
Use the step name and field path to reference output from any upstream step:
| Expression | Description |
|---|---|
${step_id.field} |
A direct output field from a step. |
${step_id.data.nested_field} |
A nested field within a structured output. |
For example, a step named gather_info with the id gather_info_id produces output that includes a status field. Reference it in a downstream step as ${gather_info_id.data.status}.
Reference built-in step fields
Every step exposes the following fields automatically, regardless of its type:
| Expression | Description |
|---|---|
${step_id.status} |
The execution state of the step: completed or failed. |
${step_id.error} |
The error message if the step status is failed. Empty for other statuses. |
You can use these fields to build conditions that branch based on whether a previous step succeeded or failed.
Reference workflow triggers
| Expression | Description |
|---|---|
${trigger.field} |
A field from the trigger event data. |
Reference loop variables
Inside a loop body, use the loop prefix to access iteration data:
| Expression | Description |
|---|---|
${loop.item} |
The current item in a For each loop. |
${loop.index} |
The zero-based iteration index in a For each loop. |
${loop.item.nested_field} |
A nested field within the current item. |
Reference built-in context values
The system provides built-in context values that are available to every step:
| Expression | Description |
|---|---|
${workflow_context.now} |
The current timestamp in ISO format, refreshed at each step execution. |
${workflow_context.today} |
The current date in YYYY-MM-DD format, refreshed at each step execution. |
${workflow_context.workflow.name} |
The name of the workflow. |
${workflow_context.workflow.id} |
The unique identifier of the workflow. |
${workflow_context.workflow.version} |
The version number of the workflow. |
${workflow_context.workflow.published} |
Whether the workflow has a published version. |
${workflow_context.workflow.author} |
The display name of the user who created the workflow. |
${workflow_context.execution.id} |
The unique identifier for this workflow run. |
${workflow_context.execution.mode} |
The execution mode (for example, standard). |
${workflow_context.execution.created_by} |
The display name of the user who started the run. |
${workflow_context.execution.created_at} |
The timestamp when the run was created. |
${workflow_context.execution.workflow_version_id} |
The workflow version identifier used for this run. |
Embed expressions in text
You can embed expressions within a larger text string. For example:
Server ${loop.item} completed with status ${check_status.result}When an expression is the entire value of a field, the system preserves the original data type (number, object, list). When an expression is embedded in a string with other text, each resolved value is converted to text.
Use the expression builder for conditions
Conditional, switch, and While loop steps include a dedicated expression builder with two modes:
- Visual expression builder: Build conditions using a form with dropdowns for operators and fields for values. The Field input displays variables wrapped in
${...}notation. - Custom expression: Write expressions directly in
${variable operator value}format, for example:${check_status.count} > 5.
icon (copy) next to any field in the