How to Create a Multi-Step Approval Workflow

Build a workflow with sequential human approvals.

What This Integration Does

Many high-stakes processes - large purchase orders, contract approvals, refunds above a threshold, new vendor onboarding - need sign-off from more than one person before they're acted on. Doing this in email or chat threads is slow, hard to audit, and easy to lose. Spojit's Human node pauses the workflow at each stage, notifies the right approvers, and waits for a decision before continuing. Approvers act in the Approvals inbox, and the execution log gives you a clean audit trail of who approved what and when.

The workflow is triggered by whatever event creates the request (a webhook from your ERP, a form submission, a chat message), gathers the data the approvers need to make a decision, then walks through each approval gate in series. Because a Human node halts the workflow when an approver rejects, putting the gates in sequence means a rejection at any stage stops everything after it. The final stage performs the action once everyone has signed off.

Prerequisites

  • A defined approval chain - the users, roles, or teams who sign off at each stage (these become Human node approval slots), plus the threshold or condition that puts a request into this workflow.
  • A way to keep stakeholders informed - the built-in Send Email node, or a slack connection for chat notifications.
  • Connector access for the final action (e.g. a netsuite, stripe, or other system connection).
  • A trigger source - typically a webhook from your ERP or finance system.

Step 1: Webhook Trigger Receives the Request

Drop a Trigger node, set type to Webhook, and copy the generated URL into your upstream system (for example a purchase-order tool that calls out when a PO exceeds a threshold). The request payload should include the requester, amount, line items, and any context the approvers need to make a decision.

Step 2: Validate and Enrich the Request

Add a Condition node that confirms the request actually needs approval (e.g. {{ trigger.amount }} > 10000) and routes anything below the threshold straight through. Then add a Connector node calling your HR or directory system to look up the approvers in the requester's manager chain. The Human node assigns approval slots by user, role, or team, so resolving the right people up front keeps the later approval steps clear.

Step 3: First Approval - Manager

Add a Human node for the requester's manager. Set the Label and Message so they show the key details (requester, amount, line items, link to the original record). Add an Approval slot with an atom for the manager (a specific user, or a role such as Admin). Fill in the Notification title and Notification body (both accept {{ variables }}), set Urgency to High for time-sensitive requests, and turn on Email approvers if you want the slot members emailed. Set a Timeout (minutes) value (e.g. 2880 for 48 hours) so stalled approvals time out rather than pending forever. The manager reviews and decides in the Approvals inbox at /approvals; the node continues only when the slot is approved.

Step 4: Second Approval - Finance

Wire a second Human node directly after the manager step for the finance team. You do not need to branch on rejection: when the manager rejects, the first Human node halts the workflow with outcome APPROVAL_NOT_APPROVED, so the finance step never runs. Give this node its own Approval slot targeting a finance role or team, and include the manager's name and approval timestamp from {{ manager_approval.approvalId }} in the Message and Notification body so finance can see the chain. Approval completes only when every slot is satisfied.

Step 5: Execute the Action

After both approvals, add a Connector node to perform the action - for a PO that might be netsuite create-record with the purchase-order record type, or stripe create-invoice for a payment request. Wrap the action in a Condition to verify it succeeded; if it errors, alert the team rather than leaving the approvals stranded.

Step 6: Notify and Audit

End with a Send Email node (or slack send-message) to the requester confirming the approval chain completed and the action was taken. Include both approvers' decisions and timestamps in the body. The workflow's execution log already records the full audit trail, but pushing a notification keeps stakeholders informed without forcing them to dig through Spojit.

Tips

  • Turn on Email approvers on each Human node so slot members get a heads-up to open the Approvals inbox; raise Urgency to High for the most time-sensitive gates.
  • Include a deep link to the source record (the PO, contract, refund request) in the Message so approvers can verify context before deciding.
  • Use the date connector's format tool to render approval timestamps in a readable timezone for the audit notification.
  • For very long chains, consider extracting each approval gate into a Subworkflow so you can change one step without touching the others.

Common Pitfalls

  • No timeout - a Human node with a blank Timeout (minutes) waits forever if the approver is on leave. Always set one; a timeout is treated as a rejection and halts the workflow.
  • Missing context in the message - approvers ignore requests that don't tell them what they're approving. Put the amount, requester, and a link in the Message and notification body.
  • Expecting a reject branch - a Human node has no "on reject" output. A rejection halts the workflow, so order your gates in series and let the halt do the work; do not try to wire a downstream branch for the rejected path.
  • Empty approval slots - Approval slots is the only required Human field. Every slot must be satisfied to continue, so a slot with no reachable approver leaves the run stuck until it times out.

Testing

Trigger the workflow with a test payload and assign yourself to every approval slot first, then approve at each stage from the Approvals inbox to confirm the action runs at the end. Run it again and reject at stage one to confirm the workflow halts before the finance gate and the final action never fires. Once both paths behave, hand a test request to a real approver to confirm the notification copy and links land cleanly before you point production traffic at it.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.