Approval Node

Overview

The Approval node pauses workflow execution and waits for human approval before continuing. It sends a notification (email or SMS) to an approver and resumes only when they approve or reject the request.

When to Use

Use an Approval node when you need to:

  • Require human oversight before proceeding
  • Get manager approval for high-value transactions
  • Confirm sensitive operations before execution
  • Collect additional information from a person
  • Implement approval workflows
  • Ensure compliance with review requirements

Configuration

Notification Type

Choose how to notify the approver:

  • Email: Sends approval request via email
  • SMS: Sends approval request via text message

Contact Information

For Email:

  • Email Address: The approver’s email address (can be literal or JSONPath)
  • Additional Recipients (CC): Optional CC recipients

For SMS:

  • Phone Number: The approver’s phone number in E.164 format (e.g., +1234567890)

Additional Recipients (Email Only)

Two modes for adding CC recipients:

Manual Mode:

  • Add individual email addresses
  • Each email can be a literal address or a JSONPath expression
  • Click “Add another email” to add more recipients

Template Mode:

  • Provide a single JSONPath expression pointing to an array of email addresses
  • Use when the recipient list is dynamic (e.g., from a previous node)

Message

The message sent to the approver explaining what needs approval. Supports:

  • Plain text
  • Dynamic data using {{results.nodeId.field}} syntax
  • Multi-line text

Data Required from Approver

Define a schema for data the approver must provide:

  • Add fields the approver needs to fill out
  • Supports text, number, boolean, and other field types
  • This data becomes available in the node’s output

Callback URL

Optional URL to call when the approval is granted or denied. Useful for:

  • Notifying external systems
  • Triggering additional workflows
  • Logging approval decisions

Examples

Example: Manager Approval for Purchase

Node ID: managerApproval Notification Type: Email Email Address: manager@company.com Message:

Please review and approve the following purchase request:

Item: {{results.trigger.itemName}}
Amount: ${{results.trigger.amount}}
Department: {{results.trigger.department}}

This request requires your approval to proceed.

Data Required:

  • approved (Boolean) - Whether the request is approved
  • comments (String) - Manager’s comments

Output:

$.results.managerApproval.approved
$.results.managerApproval.comments

Example: Dynamic Approver from Previous Node

Node ID: requestApproval Notification Type: Email Email Address: $.results.getDepartmentManager.email Message:

A new {{results.trigger.requestType}} request requires your review.

Submitted by: {{results.trigger.submitterName}}
Date: {{results.trigger.submittedDate}}

This uses the department manager’s email from a previous node.

Example: Multiple CC Recipients (Manual)

Node ID: budgetApproval Email Address: cfo@company.com Additional Recipients (Manual Mode):

  • finance-team@company.com
  • $.results.trigger.departmentHead
  • controller@company.com

Both the CFO and finance team receive the approval request, plus the department head from the trigger data.

Example: Dynamic CC List (Template)

Node ID: complianceApproval Email Address: compliance@company.com Additional Recipients (Template Mode):

  • $.results.getApprovalChain.reviewers

Where $.results.getApprovalChain.reviewers is an array like:

["legal@company.com", "audit@company.com", "risk@company.com"]

Example: SMS Approval

Node ID: urgentApproval Notification Type: SMS Phone Number: +15551234567 Message:

Urgent approval needed for {{results.trigger.orderType}} order #{{results.trigger.orderId}}.
Total: ${{results.trigger.total}}

Example: Collect Additional Information

Node ID: reviewSubmission Email Address: reviewer@company.com Message:

Please review the application and provide your assessment.

Applicant: {{results.trigger.applicantName}}
Application Type: {{results.trigger.applicationType}}

Data Required:

  • approved (Boolean) - Approval decision
  • priority (String) - Priority level (High/Medium/Low)
  • estimatedDays (Number) - Estimated days to complete
  • assignedTeam (String) - Team to assign to
  • notes (Text) - Reviewer notes

All of this data becomes available:

$.results.reviewSubmission.approved
$.results.reviewSubmission.priority
$.results.reviewSubmission.estimatedDays
$.results.reviewSubmission.assignedTeam
$.results.reviewSubmission.notes

Accessing Approval Data

After approval is granted, access the data:

// Approval decision (if included in schema)
$.results.<nodeId>.approved

// Any custom fields defined in output schema
$.results.<nodeId>.fieldName

// Example:
$.results.managerApproval.comments
$.results.reviewSubmission.priority

Best Practices

  • Clear Messages: Write clear, actionable approval messages
  • Include Context: Provide all information needed to make a decision
  • Dynamic Data: Use template syntax to include relevant data
  • Output Schema: Define what data you need from the approver
  • Fallback Plan: Set onFailure path for rejected approvals
  • Timeout Consideration: Be aware workflows pause until approval is received
  • CC Appropriately: Only CC people who need to be informed
  • Phone Format: Use E.164 format for phone numbers (+country code)

Approval Process

  1. Workflow Pauses: Execution stops at the approval node
  2. Notification Sent: Email or SMS is sent to the approver
  3. Awaits Response: Workflow remains paused until response
  4. Resume Execution: Upon approval/rejection, workflow continues
  5. Access Data: Approval data is available in subsequent nodes

Handling Approval Outcomes

Check Approval Decision

Use a Conditional node after the approval:

Approval: managerApproval
└─ Conditional: checkApproval
   ├─ Choice 1: approved = true → processOrder
   └─ Default: notifyRejection

Multiple Approvers

Use sequential approval nodes:

Approval: level1Approval
└─ Conditional: checkLevel1
   └─ Approved → Approval: level2Approval
      └─ Conditional: checkLevel2
         └─ Approved → finalizeRequest

Or parallel approvals:

Parallel: multiApproval
├─ Branch 1: Approval: managerApproval
├─ Branch 2: Approval: financeApproval
└─ Branch 3: Approval: complianceApproval

Common Patterns

Conditional Approval Based on Amount

Conditional: checkAmount
├─ Choice 1: amount > 10000
│  └─ Approval: seniorManagerApproval
└─ Choice 2: amount <= 10000
   └─ Approval: managerApproval

Approval with Escalation

Approval: initialApproval
└─ Conditional: checkResponse
   ├─ Approved → proceed
   ├─ Rejected → notifySubmitter
   └─ Timeout → Approval: escalatedApproval

Multi-Level Approval

Approval: level1
└─ Conditional: level1Check
   └─ Approved → Approval: level2
      └─ Conditional: level2Check
         └─ Approved → Approval: level3
            └─ Conditional: level3Check
               └─ Approved → execute

Email vs SMS

Use Email when:

  • Detailed information needs to be conveyed
  • Attachments or links are needed
  • Response can wait a bit longer
  • Formal approval trail is required

Use SMS when:

  • Quick response is critical
  • Approver is mobile
  • Simple yes/no decision
  • High urgency

Limitations

  • Workflow Pauses: Execution halts until response received
  • Timeout: Long-running workflows may hit execution limits
  • No Reminders: System doesn’t automatically send reminder notifications
  • Single Response: Each approval node accepts one response
  • No Edit: Approver cannot modify the approval request

Security Considerations

  • Verify Approver: Ensure approval requests go to authorized personnel
  • Sensitive Data: Be cautious about including sensitive information in messages
  • Callback Security: Secure callback URLs with proper authentication
  • Access Control: Ensure only intended recipients can approve
  • Audit Trail: Approval decisions are logged for compliance