The Output node is the workflow endpoint that returns the response to the caller. Always reference the previous node by label—never use $input.
Overview
| Property | Value |
|---|---|
| Inputs | 1 |
| Outputs | 1 (optional, for async post-processing) |
| Output | Returns message to caller |
Parameters
| Parameter | Type | Description |
|---|---|---|
label | string | Node identifier (camelCase) |
message | expression | Output value. Must reference previous node: $previousNodeLabel.field |
allowDownstream | boolean | If true, nodes after output run asynchronously after response is sent |
Agent tool usage
When an Output node is connected to an Agent Node as a canvas node tool, the message field can be marked as agent-provided with the bot icon. The agent then supplies the message when it calls the tool. If the Output node is not connected as an agent tool, the bot icon is hidden.
Critical Rule
Never use $input in the output node. Always use the previous node's label:
- ❌
"message": "$input.text" - ✅
"message": "$processData.text"(whereprocessDatais the previous node's label)
Async Post-Processing
When allowDownstream: true, the response is returned immediately. Nodes connected after the output run in the background (e.g. Slack notifications, logging).
Example
{
"type": "output",
"data": {
"label": "apiResponse",
"message": "$generateResponse.text"
}
}Example – With Async
{
"type": "output",
"data": {
"label": "apiResponse",
"message": "$generateResponse.text",
"allowDownstream": true
}
}Then connect a Telegram, Slack, or other node after the output for fire-and-forget notifications.
Related
- JSON output mapper – Root JSON body without
resultwrapping when sole terminal - Node Types – Overview of all node types
- Expression DSL – Referencing node output
- Expression Evaluation Dialog – Expandable editor with live backend preview for message
- Workflow Structure – JSON format