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 Slack threads is slow, hard to audit, and easy to lose. Spojit's Human node pauses the workflow at each stage, sends a notification to the right approver, and waits for a decision before continuing. 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. Approvals run in series so that a rejection at any stage short-circuits the rest. The final stage actually performs the action once everyone has signed off.

Prerequisites

  • A defined approval chain - who approves at each stage, and the threshold or condition that puts a request into this workflow.
  • A notification connector to reach approvers - slack, resend, smtp, or the built-in Send Email node.
  • 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 each approver's email and Slack handle from the requester's manager chain. Storing the resolved approver IDs on the workflow state makes the later steps easier to read.

Step 3: First Approval - Manager

Add a Human node configured to notify the requester's manager. Set the prompt text so it shows the key details (requester, amount, line items, link to the original record) and the approve/reject buttons. Configure the notification channel - a slack send-message direct message to {{ manager.slackId }} works well because the approver can act inline. Set a sensible timeout (e.g. 48 hours) so stalled approvals get escalated rather than pending forever.

Step 4: Second Approval - Finance

Add a Condition node after the manager step. On reject, branch to a notification path that emails the requester via resend send-email and stops the workflow. On approve, route to a second Human node configured for the finance team. Include the manager's name and approval timestamp in the finance prompt so they can see the chain.

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

  • Send Human notifications as Slack direct messages with action buttons - approvers don't have to leave Slack to respond.
  • Include a deep link to the source record (the PO, contract, refund request) in every notification so approvers can verify context.
  • Use the date connector's format tool to render timestamps in the approver's timezone in notifications.
  • 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 - Human nodes without a timeout pause forever if the approver is on leave. Always set one and route to an escalation path.
  • Missing context in the prompt - approvers ignore notifications that don't tell them what they're approving. Include amount, requester, and a link.
  • Acting before all gates clear - branch on reject after every Human node, not just the last one, or a manager reject won't stop a finance auto-approve.
  • Replaying executions - re-running a completed approval workflow re-fires the action. Use idempotency keys on the final Connector call so the same request can't be double-actioned.

Testing

Trigger the workflow with a test payload and approve at each stage from your own Slack account first. Then run it again and reject at stage one to confirm the workflow short-circuits and notifies the requester. Once both paths work, 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.