Portal Community

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.

ScenarioValue
Named node has run and returned a non-null outputThe output object
Named node has run and returned null outputnull
Named node has NOT run yet (downstream or on a different branch)null
nodeId does not exist in the workflownull (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 does not guarantee the node ran successfully. If a node failed and the engine skipped it (depending on error handling config), $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.