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.
- 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.
| Decision | What the run does |
|---|---|
| Approve | The same run continues after the step. Steps that already finished are not run again; the flow version it started with is kept. |
| Reject | The run ends Rejected. It is a decision, not a failure: the flow’s On error step does not run. |
| Time runs out | What 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
- 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.
- 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.
- 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.
- 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.
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>.
{
"approved": true,
"by": "Ana Souza",
"at": "2026-10-16T14:02:11Z",
"comment": "ok, loyal customer",
"values": {
"discount": 15
}
}Deciding by link
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
202with 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.