Portal Community
The Approval node has no conventional input in the data sense — it reads its configuration properties (actors, title, message, etc.) which can use workflow variables via expressions. Its outputs carry the decision data returned by the approver when the workflow resumes from suspension.

Output Ports

The Approval node exposes six output ports. Exactly one port fires per execution instance. Downstream nodes connected to a given port receive the node's output data object automatically.

Port Fires When Output Data Available
waiting Immediately after Phase 1 — the approval request has been created and the workflow is now suspended. This port fires synchronously before the suspension takes effect. No decision data. Only the session_id of the created EngageSession is available.
approved An actor submitted an Approve decision. In single-approval mode, fires as soon as the first actor approves. In multi-approval mode, fires only after all actors have approved. Full decision data object (see schema below).
rejected An actor submitted a Reject decision. In multi-approval mode, fires immediately on the first rejection regardless of other actors. Full decision data object including rejection comments.
escalated An actor explicitly escalated, OR the timeout_minutes period elapsed without a response. Full decision data object. If timeout-triggered, approver_id will be null and decision will be "timeout".
abstained An actor submitted an Abstain decision. Full decision data object. comments typically contains the actor's reason for abstaining.
error A system-level error occurred — for example, the actor list resolved to empty, or the EngageSession could not be created. Standard error object with error_message and error_code.

Output Data Schema

On ports approved, rejected, escalated, and abstained, the following data object is available to downstream nodes as the node's output:

FieldTypeDescription
approver_id string | null The user ID of the actor who submitted the decision. Null when timeout-triggered escalation occurs.
actor_name string | null Display name of the approver (resolved from the user directory). Null on timeout escalation.
decision string The decision submitted. One of: "approved", "rejected", "escalated", "abstained", "timeout".
decision_time datetime (ISO 8601) UTC timestamp of when the decision was submitted. For timeout escalation, this is the time the timeout fired.
comments string | null Free-text comments provided by the approver at decision time. May be null if the actor did not add a comment.
session_id string The EngageSession identifier created during Phase 1. Useful for audit trail lookups.

Output Data Example

JSON output available to downstream nodes when the approved port fires:

{
  "approver_id": "user:jdoe-001",
  "actor_name": "Jane Doe",
  "decision": "approved",
  "decision_time": "2025-03-14T09:22:34Z",
  "comments": "Approved — within quarterly budget allocation. Please proceed.",
  "session_id": "engage-sess-8f3a2c91"
}

JSON output when the rejected port fires:

{
  "approver_id": "user:cfo-mbrown",
  "actor_name": "Michael Brown",
  "decision": "rejected",
  "decision_time": "2025-03-14T10:05:18Z",
  "comments": "Rejected — vendor not on approved supplier list. Please use vendor ABC Corp.",
  "session_id": "engage-sess-8f3a2c91"
}

JSON output when the escalated port fires due to timeout:

{
  "approver_id": null,
  "actor_name": null,
  "decision": "timeout",
  "decision_time": "2025-03-14T14:00:00Z",
  "comments": null,
  "session_id": "engage-sess-8f3a2c91"
}

Accessing Output in Downstream Nodes

Use the following expression syntax to access Approval node output in subsequent nodes. Replace approval_po_review with your node's ID:

// Access decision
$nodes.approval_po_review.decision

// Access who approved/rejected and when
$nodes.approval_po_review.approver_id
$nodes.approval_po_review.actor_name
$nodes.approval_po_review.decision_time

// Access comments for rejection notification
$nodes.approval_po_review.comments

// Store in workflow variable
$var.approval_result = $nodes.approval_po_review.decision

Data Flow Example

A typical purchase order approval workflow data flow:

Webhook Trigger — receives PO data (po_number, amount, vendor, requester)
Set Variables — stores PO fields as workflow variables
If Condition — checks if amount > 10000
↓ (true)
Approval Node — suspends; creates inbox item for CFO
↓ (approved port)
Update ERP — receives approver_id, decision_time, comments from Approval output
Slack Notification — message uses $nodes.approval_po_review.actor_name and $nodes.approval_po_review.comments
Waiting port behaviour: The waiting port fires before the workflow suspends. Any nodes connected to the waiting port execute synchronously in the same execution pass as Phase 1. Use it for logging or sending a "request submitted" acknowledgement notification — not for long-running operations.