Automate itLesson 5 of 5

Wait for a person: approval steps

Some steps should not happen until a person says yes: a refund over a threshold, a mass e-mail, a deploy. An Approval step pauses the flow right there. The run waits — holding no worker — until someone approves (the same run continues, with any values they filled in) or rejects (the run ends Rejected). In this lesson you build a discount that a manager approves and can change.

What you will learn
  • Add an Approval step with a message and fields the approver fills in
  • Choose who can decide, the time limit and what happens when it runs out
  • Decide in the run view or from Runs → Waiting for you
  • Use the decision in later steps through output.values

What happens at an approval

When a run reaches an Approval step, it stops and its status becomes Waiting for approval. Nothing after the step runs, and no worker is held while it waits — a flow can wait two days at no cost. The step shows a card with the message, the fields and who can decide.

The run stops at the Approval step and waits; the steps below stay grey until someone decides.
DecisionWhat the run does
ApproveThe same run continues after the step. Steps that already finished are not run again; the flow version it started with is kept.
RejectThe run ends Rejected. It is a decision, not a failure: the flow’s On error step does not run.
Time runs outWhat When time runs out says: Reject (the default), Approve, or Fail the run. The card says Approval timed out.

Only the first decision counts: if two people press at the same moment, the second sees Already decided by ….

Add an Approval step

  1. Insert it

    On the flow canvas, click the + where the pause belongs and pick Approval. A new approval waits up to 48 hours, rejects when time runs out, lets anyone who can run the flow decide, and sends no e-mail.

  2. Write the message

    Message is what the approver reads. It is an input like any other, so it can be a fixed text or bound to an earlier step’s result.

  3. Add fields

    Under Fields the approver fills in, press Add field: a Field name, a Label, the type — Text, Number, Yes / no or Choice (options separated by commas) — and Required. With no fields, the approver only approves or rejects.

  4. Who, how long, notify

    Who can decide: Anyone who can run this flow, or Chosen people from the project’s members. Time limit in hours or days, and When time runs out. Email the approvers sends them a message through the project’s e-mail connection; its link opens the decision in the app and asks them to sign in.

Deciding

A person who can decide finds the request in three places: the run on the flow canvas (the approval card on the step), the step’s run panel, and the Runs page, where the Waiting for you filter shows only the runs waiting for your decision, each with Review. The card shows the message, Who can decide · …, Expires in …, the fields, an optional Comment, and Approve / Reject.

Waiting for approvalapproval
Run againOpen on flow page
Duration174 ms
Started07:14:22
Triggered by ana@shop.dev
Waiting for approval Expires in 1 d 18 h
Send a reminder to 3 customers? Who can decide · Anyone who can run this flow
ApproveReject
DataSteps3LogsTimeline
The approval card: message, fields to fill, who can decide, the time left, and Approve or Reject.

Using the decision

After approval, the step’s output is {approved, by, at, comment, values}. Later steps bind to it like any step: Later steps read them as output.values.<name>.

Expected outputSuccessAn approval step’s output
{
  "approved": true,
  "by": "Ana Souza",
  "at": "2026-10-16T14:02:11Z",
  "comment": "ok, loyal customer",
  "values": {
    "discount": 15
  }
}

Turn on Allow decisions by link in the step’s Decisions by link section, and a script step before it can call waiso.resume_urls() (TypeScript/JavaScript await resumeUrls(), C waiso_resume_urls, C++ waiso::resume_urls()). It returns {resume, cancel, approvalPage, approvalId, expiresAt}: a POST to resume approves (its JSON body becomes values), a POST to cancel rejects, and approvalPage is a page where a person decides with no account. Opening a link in a browser only shows a confirmation, so a mail scanner never decides.

Rules and limits

  • Not inside a loop: approval_in_loop — An approval can’t be inside a loop — add it before the loop.
  • Not inside a parallel branch: approval_in_branch — a branch waiting for a person would hold all the others.
  • A subflow that waits makes its parent wait too (Waiting for approval in the subflow); both resume together.
  • A synchronous API call to a flow that reaches an approval answers 202 with the run at once, instead of holding the call.
  • E-mail notices need the project’s e-mail connection; without one, approvers find the request in the app only.
5 / 5