$output.{nodeId} — Named Node Output
$output.{nodeId} provides stable access to the output of any node in the workflow by its ID. Unlike $input, it is not affected by rewiring — it always reads from the named node, regardless of the current node's position in the graph.
Syntax
// $output.{nodeId}.{field}
$output.fetch-customer.customerId
$output.fetch-customer.tierLevel
$output.validate-order.isValid
$output.validate-order.errorMessages[0]
// Accessing the entire output object (when the downstream node needs the full object)
$output.parse-json // Returns the full output of the parse-json node
How nodeId Maps to Memory
The expression engine resolves $output.{nodeId} by calling ExecutionMemory.GetNodeOutput(nodeId). The nodeId in the expression must exactly match the nodeId set in the workflow canvas. Node IDs are case-sensitive.
// ExpressionContext.cs (simplified)
"$output" => nodeId => _executionMemory.GetNodeOutput(nodeId)
// So $output.fetch-customer.tierLevel resolves as:
var node = _executionMemory.GetNodeOutput("fetch-customer"); // dynamic lookup
var result = node?.tierLevel; // property navigation
Fan-In Pattern — Multiple Upstream Nodes
$output.{nodeId} is the correct choice when a node has multiple upstream connections and needs to reference specific ones by identity.
// MergeNode configuration — referencing two specific upstream nodes by ID
{
"leftDataset" : "{{$output.left-transform}}",
"rightDataset" : "{{$output.right-transform}}",
"mergeKey" : "customerId"
}
// Condition node — decision based on outputs from two non-adjacent nodes
$output.credit-check.approved == true && $output.fraud-score.riskLevel == "low"
Null Semantics
$output.{nodeId} returns null if the named node has not yet run. This is the most common source of silent expression errors in branching workflows.
| Scenario | Value |
|---|---|
| Named node has run and returned a non-null output | The output object |
| Named node has run and returned null output | null |
| Named node has NOT run yet (downstream or on a different branch) | null |
| nodeId does not exist in the workflow | null (no error — silent miss) |
Naming Node IDs in Flow Studio
Workflow designers set node IDs in the node configuration panel in Flow Studio. A meaningful, stable ID is critical for reliable $output references. Default IDs like node-1 are fragile.
// Best practice — use descriptive, hyphen-separated IDs
$output.fetch-customer // Good — clear and stable
$output.validate-order // Good
$output.node-1 // Bad — meaningless, fragile if node is moved/replaced
$output.FetchCustomer // Acceptable — camelCase is also supported
$output.{nodeId} returns null — the same as if the node had never run. Guard against null when referencing nodes that could be skipped or have conditional execution.