Portal Community

The Node Data Envelope

Every node's input and output — CollectionOperation's included — is shaped like this. Run metadata sits at the top level; the actual payload records live under items, each entry holding its record under "json":

{
  "timestamp": "2026-07-24T01:02:27.8652562Z",
  "triggerTime": "2026-07-24T01:02:27.8652562Z",
  "resource": "trigger",
  "operation": "manual-trigger",
  "status": "success",
  "portName": "main",
  "items": [
    {
      "json": {
        "timestamp": "2026-07-24T01:02:27.8652562Z",
        "triggerTime": "2026-07-24T01:02:27.8652562Z",
        "resource": "trigger",
        "operation": "manual-trigger",
        "status": "success",
        "portName": "main"
      }
    }
  ],
  "success": true
}

CollectionOperation's real collection is InputData["items"] — it unwraps each entry's "json" value into one array element. It never reads the outer envelope fields as data; those describe the upstream node's run.

inlineDataSource is a plain array, not the envelope

When you type test data into inlineDataSource, or reference data freshly fetched by an external API call, write a plain JSON array of elements — [{...}, {...}] — not the items/json wire shape. The node (via the shared ResolveSourceRecords helper) parses it and normalizes it into the standard shape itself before producing output.

Output Ports

PortConditionDescription
successOperation completed — including when some items failed under onError: "continue"Result available at output.NodeName.items. Always check errorCount even on this port to detect partial per-item failures.
errorCollection unresolvable, missing/invalid operation or expression, or error thresholds exceededError details in output.NodeName.error. See the three failure conditions below.
Three distinct ways the error port can fire

1) Structural: collection can't be resolved at all, operation is missing/unrecognized, or the operation's required expression is missing. 2) onError: "error" threshold: errorCount exceeded maxErrorCount. 3) Circuit breaker: maxErrorsToCollect was reached mid-operation — this fails the node regardless of onError, since the operation didn't finish processing every item.

Output Data Fields

FieldTypePresent ForDescription
statusstringAll operationsLiteral "success" on the success path.
successCountintegerAll operationsNumber of items that processed without error.
errorCountintegerAll operationsTotal items that failed, including any beyond the maxErrorsToCollect cap.
errorRecordsarrayAll operationsUp to maxErrorsToCollect failed items, each as {"item": <original>, "error": "<message>"}.
countintegerfilter, map, sort, distinct, reverseNumber of successful result records (equals successCount). Not present for reduce/count/first/last.
itemsarrayAll operationsList operations: one {"json": record} entry per successful result record. Scalar operations (reduce/count/first/last): a single item wrapping the scalar or element value.

Per-Operation Output Examples

// filter operation output (no errors):
{
  "status": "success",
  "successCount": 2,
  "errorCount": 0,
  "errorRecords": [],
  "count": 2,
  "items": [
    { "json": { "orderId": "ORD-001", "status": "active", "total": 100 } },
    { "json": { "orderId": "ORD-003", "status": "active", "total": 250 } }
  ]
}

// map operation output (extracting IDs):
{
  "status": "success",
  "successCount": 3,
  "errorCount": 0,
  "errorRecords": [],
  "count": 3,
  "items": [
    { "json": "ORD-001" },
    { "json": "ORD-003" },
    { "json": "ORD-005" }
  ]
}

// reduce operation output (sum) — single item, no "count" field:
{
  "status": "success",
  "successCount": 3,
  "errorCount": 0,
  "errorRecords": [],
  "items": [
    { "json": 580.50 }
  ]
}

// first operation output — single item, no "count" field:
{
  "status": "success",
  "successCount": 1,
  "errorCount": 0,
  "errorRecords": [],
  "items": [
    { "json": { "orderId": "ORD-001", "status": "pending", "total": 99.99 } }
  ]
}

// count operation output — single item holding the integer, no "count" field:
{
  "status": "success",
  "successCount": 1,
  "errorCount": 0,
  "errorRecords": [],
  "items": [
    { "json": 7 }
  ]
}

Accessing Results Downstream

ExpressionWhat It Returns
{@ output.FilterActiveOrders.items }The filtered array of {"json": ...} entries — active order objects
{@ output.SumOrderTotals.items[0].json }The numeric sum produced by reduce
{@ output.FilterActiveOrders.successCount }Number of active orders that matched (integer)
{@ output.FilterActiveOrders.errorCount }Number of items that failed evaluation — check this even on success
{@ output.FindFirstPending.items[0].json.orderId }The orderId of the first pending order