Portal Community

Rejection Semantics by Strategy

StrategyWhen is Rejection Final?
AnyOnly when ALL actors have rejected — one rejection alone is not final
AllImmediately when ANY actor rejects
QuorumWhen remaining approvals are mathematically insufficient to meet quorum

Routing on Rejection

Connect an edge from the rejected output port to a notification node, a remediation workflow, or an end node:

// Example: rejection routing pattern in a workflow
[Approval Node]
  ├─ approved → [Continue Process Node]
  ├─ rejected → [Send Rejection Email Node] → [End Node]
  └─ timeout  → [Escalate Node]

Rejection Output Data

// Rejection output available in downstream nodes via $output.approvalNode1
{
  "aggregateDecision": "Rejected",
  "decisions": [
    {
      "actorId"   : "user-finance-head",
      "decision"  : "Rejected",
      "comment"   : "Budget limit exceeded — reduce to $50k.",
      "decidedAt" : "2026-05-25T10:30:00Z"
    },
    {
      "actorId"   : "user-legal-team",
      "decision"  : "Approved",
      "comment"   : "Terms acceptable.",
      "decidedAt" : "2026-05-25T11:00:00Z"
    }
  ],
  "strategy"    : "All",
  "completedAt" : "2026-05-25T10:30:00Z"
}

Sending Rejection Notification

// Using $output in a downstream Email node's body expression
$output.approvalNode1.decisions
  .filter(d => d.decision === 'Rejected')
  .map(d => d.actorId + ': ' + d.comment)
  .join('\n')
No automatic rejection email: The engine does not send notifications on rejection. You must explicitly route the rejected port to a notification node. This is by design — notification content and channels are workflow concerns, not engine concerns.