Portal Community

Node Configuration Schema

// ApprovalNodeSettings (stored in node data)
{
  "title"          : "Vendor Contract Approval",
  "instruction"    : "Review and approve the vendor contract attached.",
  "approvers"      : [
    { "actorId": "user-finance-head",  "actorType": "User"  },
    { "actorId": "user-legal-team",    "actorType": "User"  },
    { "actorId": "group-cxo-pool",     "actorType": "Group" }
  ],
  "strategy"       : "All",       // "Any" | "All" | "Quorum"
  "quorumCount"    : null,        // set for Quorum (e.g., 2)
  "quorumPercent"  : null,        // set for Quorum % (e.g., 0.67 for 67%)
  "timeoutDuration": "P1D",       // ISO 8601 duration — 1 day
  "timeoutBehavior": "Escalate",  // "Escalate" | "AutoApprove" | "AutoReject" | "Fail"
  "escalationActorId": "user-ceo",
  "allowComment"   : true,
  "requireComment" : false        // require comment on reject
}

Approver Types

Actor TypeBehaviourCount Toward Quorum
UserSpecific user receives one HIL task1 vote
GroupAll group members receive the task — first decision from any member counts1 vote (not one per member)
Dynamic (expression)$output.assignActorNode.userId — resolved at runtime1 vote

Node Output Ports

The Approval node has three output ports:

PortConditionisTimeoutPort
approvedConsensus reached with Approved decisionfalse
rejectedConsensus reached with Rejected decisionfalse
timeoutTimeout elapsed and timeoutBehavior is not AutoDecide/Failtrue

Dynamic Approvers Using Expressions

// Approver resolved from a previous node's output
{
  "approvers": [
    {
      "actorId"  : "$output.getManagerNode.managerId",
      "actorType": "User"
    }
  ]
}
Design-time validation: The node configuration form validates that at least one approver is defined and that the quorumCount does not exceed the approver list length. Misconfigured nodes show an error badge on the canvas.