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 approvedcomments(String) - Manager’s comments
Output:
$.results.managerApproval.approved
$.results.managerApproval.commentsExample: 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.departmentHeadcontroller@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 decisionpriority(String) - Priority level (High/Medium/Low)estimatedDays(Number) - Estimated days to completeassignedTeam(String) - Team to assign tonotes(Text) - Reviewer notes
All of this data becomes available:
$.results.reviewSubmission.approved
$.results.reviewSubmission.priority
$.results.reviewSubmission.estimatedDays
$.results.reviewSubmission.assignedTeam
$.results.reviewSubmission.notesAccessing 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.priorityBest 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
- Workflow Pauses: Execution stops at the approval node
- Notification Sent: Email or SMS is sent to the approver
- Awaits Response: Workflow remains paused until response
- Resume Execution: Upon approval/rejection, workflow continues
- 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: notifyRejectionMultiple Approvers
Use sequential approval nodes:
Approval: level1Approval
└─ Conditional: checkLevel1
└─ Approved → Approval: level2Approval
└─ Conditional: checkLevel2
└─ Approved → finalizeRequestOr parallel approvals:
Parallel: multiApproval
├─ Branch 1: Approval: managerApproval
├─ Branch 2: Approval: financeApproval
└─ Branch 3: Approval: complianceApprovalCommon Patterns
Conditional Approval Based on Amount
Conditional: checkAmount
├─ Choice 1: amount > 10000
│ └─ Approval: seniorManagerApproval
└─ Choice 2: amount <= 10000
└─ Approval: managerApprovalApproval with Escalation
Approval: initialApproval
└─ Conditional: checkResponse
├─ Approved → proceed
├─ Rejected → notifySubmitter
└─ Timeout → Approval: escalatedApprovalMulti-Level Approval
Approval: level1
└─ Conditional: level1Check
└─ Approved → Approval: level2
└─ Conditional: level2Check
└─ Approved → Approval: level3
└─ Conditional: level3Check
└─ Approved → executeEmail 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