> ## Documentation Index
> Fetch the complete documentation index at: https://university.triggr-app.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Approvals and manual steps

> Pause a Studio workflow until someone approves it or finishes a task by hand, then branch on the answer.

Human In The Loop pauses a run until someone approves or rejects it; Manual Step pauses it until someone marks a task done. This example asks a manager to approve a new starter's laptop, then gives the service desk a task to order it.

<Frame caption="Approvals and manual steps: a workflow that waits for a manager's approval, branches on the answer and hands the team a task, then approving and completing it (1:29).">
  <video controls preload="none" playsInline className="w-full aspect-video rounded-xl" poster="/images/videos/studio-approvals.jpg" src="https://mintcdn.com/triggr/GxrCQFDFNLmEMyJ1/images/videos/studio-approvals.mp4?fit=max&auto=format&n=GxrCQFDFNLmEMyJ1&q=85&s=c96d1e27e9d5846bbd85cd2f6a068367" data-path="images/videos/studio-approvals.mp4" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-workflow.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=c83022759c5d78d7c84c7c8a480750b3" width="560" alt="The Docs sample – approval workflow: Trigger, Manager approval, then a Condition that leads to Order laptop and Finish Workflow on one side, and Email service desk and Not approved on the other." data-path="images/studio/workflows/approval-workflow.png" />
</Frame>

## Ask for approval

<Steps>
  <Step title="Add the step">
    Drag **Human In The Loop** from Components > Approval below your trigger and rename it `Manager approval`: later steps read its answer by name.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-palette.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=0559f3d3ed6c9b9fd721428d6044012f" width="288" alt="The Components panel with the Approval group open, listing Approval With Logging, Determine Approval Type, Human In The Loop and Manual Step." data-path="images/studio/workflows/approval-palette.png" />
    </Frame>
  </Step>

  <Step title="Choose the approver and write the request">
    With Approval Type Single, pick the approver in **To**. Subject and Body are what they see.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-step-setup.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=9105e92caade8931bf4b70db46ce7790" width="384" alt="The Manager approval step with Approval Type Single, To Alex Morgan (alex@yourmsp.com), Subject Approve laptop for the first name, and a Body built from the starter's name, start date, laptop and cost, Response Type Approval and an empty Custom Reference." data-path="images/studio/workflows/approval-step-setup.png" />
    </Frame>

    For a team, choose **Group** and a User Group from Settings > User Groups; the first answer decides.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-group.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=d26f7a14c0bcc6c41f1740ea5863cd1e" width="384" alt="Approval Type set to Group and a User Group dropdown." data-path="images/studio/workflows/approval-group.png" />
    </Frame>
  </Step>

  <Step title="Branch on the answer">
    The step carries on either way, so add a **Condition** with Condition Language Javascript, the expression `ctx.steps['Manager approval'].approved === true`, the label `Approved` and Default Branch `Rejected`.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-condition.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=6a7c1c69ff041b813e97d247b741fee0" width="384" alt="A Condition with Condition 1 reading ctx.steps['Manager approval'].approved, Label Approved, Default Branch Rejected and Condition Language Javascript." data-path="images/studio/workflows/approval-condition.png" />
    </Frame>
  </Step>

  <Step title="Finish both paths">
    On Rejected, add a Send Email to your service desk and a Finish Workflow with Outcome Fail. Add the manual step below to Approved, then click Save.
  </Step>
</Steps>

## Add a manual step

Drag **Manual Step** from Approval onto the Approved path and fill in Title and Instructions. To collect details on completion, such as an order number, choose a Form (Optional).

<Frame>
  <img src="https://mintcdn.com/triggr/rFRD51HB_88hTzdJ/images/studio/workflows/manual-step-setup.png?fit=max&auto=format&n=rFRD51HB_88hTzdJ&q=85&s=4d1293bd7a09f1100ab6c6c2042c0793" width="384" alt="The Order laptop step with Title Order laptop for the starter's name, Instructions to order the laptop from your distributor before the start date, and an empty Form (Optional)." data-path="images/studio/workflows/manual-step-setup.png" />
</Frame>

## Test it

Click **Manual Trigger** and enter:

```json theme={null}
{ "firstName": "Sam", "lastName": "Taylor", "startDate": "2026-11-02", "laptop": "Dell Latitude 7450", "cost": 1150 }
```

The run stays Running at Manager approval until someone answers.

<Frame>
  <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-run-waiting.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=3b8df57ed673bb54f76ab85a22ae8a2a" width="600" alt="The run panel showing Running..., an Execution ID, Trigger in green and Manager approval in yellow." data-path="images/studio/workflows/approval-run-waiting.png" />
</Frame>

## Approve or reject

<Steps>
  <Step title="Find the request">
    A Single approver gets an email from `app@triggr-app.com` with a View Approval Request button. Every request is also on Approvals and under Pending Approvals on the Dashboard.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approvals-list.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=3ebb8e6b177b00fe35b4c50d9a286745" alt="The Approvals page searched for Approve laptop, with an All Statuses filter and one Pending request, Approve laptop for Sam Taylor, approver alex@yourmsp.com, with a View button." width="2332" height="580" data-path="images/studio/workflows/approvals-list.png" />
    </Frame>

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/dashboard-pending-approvals.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=6e01abc2756a263073daa1887dff9792" width="564" alt="The Dashboard's Pending Approvals card listing Approve laptop for Priya Shah, approver alex@yourmsp.com, Pending, with a View All link." data-path="images/studio/workflows/dashboard-pending-approvals.png" />
    </Frame>
  </Step>

  <Step title="Open it">
    Click **View**.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-details.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=1e598215dcf16e670b2085186c438cbc" alt="Approval Details with a Pending status, Approve and Reject buttons, the Subject and Body of the request, its Created time and Approver, and a Workflow Execution card showing Running and the execution ID." width="2356" height="1388" data-path="images/studio/workflows/approval-details.png" />
    </Frame>
  </Step>

  <Step title="Approve">
    Click **Approve**, then Approve to confirm.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-approve-dialog.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=6efe842eda3c7312aea80cf415556292" width="448" alt="The Approve dialog: Are you sure you want to approve this request? with Cancel and Approve buttons." data-path="images/studio/workflows/approval-approve-dialog.png" />
    </Frame>
  </Step>

  <Step title="Or reject">
    Click **Reject**, enter a Reason and click Reject.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-reject-dialog.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=49a3c91ea027330aa6a6b31d6475c5ca" width="448" alt="The Reject dialog with the Reason Over budget. Order the standard Latitude 5450 instead., and Cancel and Reject buttons." data-path="images/studio/workflows/approval-reject-dialog.png" />
    </Frame>

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-rejected.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=4a6ff70f06df06e62f1d1f2cbccb35e1" alt="A Rejected request showing Rejected By Alex Morgan, the Reason, Updated At, and the Workflow Execution card." width="2356" height="854" data-path="images/studio/workflows/approval-rejected.png" />
    </Frame>
  </Step>
</Steps>

Only the person named in the To field, signed in with that email, or a member of the group can decide, and decisions are final.

## What the workflow gets back

Later steps read `ctx.steps['Manager approval'].<field>`:

| Field | Holds |
| - | - |
| `approved` | `true` or `false` |
| `approvedByUserName`, `approvedByUserEmail` | Who decided |
| `rejectionReason` | The Reason, when rejected |
| `approvals` | Each approver's `status` and `response` |

<Frame>
  <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-output-rejected.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=616c356f9c14104928e7997eaf7d36f5" width="600" alt="The Manager approval step's Output in a run: approved false, an approvals list with status rejected and the response, totalApprovals 1, rejectionReason, and approvedByUserName Alex Morgan with approvedByUserEmail alex@yourmsp.com." data-path="images/studio/workflows/approval-output-rejected.png" />
</Frame>

A rejected run takes the Rejected branch and ends Failed at Not approved.

<Frame>
  <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-rejected-run.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=b6950e484478cfe95909bb6de18b328a" alt="A Failed run whose Execution Timeline lists Trigger, Manager approval, Condition, Email service desk and Not approved, all green." width="2880" height="1146" data-path="images/studio/workflows/approval-rejected-run.png" />
</Frame>

## Complete a manual step

<Steps>
  <Step title="Find the task">
    Pending tasks are on Manual Steps and under Pending Manual Steps on the Dashboard. Nobody is assigned or emailed: add a Send Email before the step if someone should be told.

    <Frame>
      <img src="https://mintcdn.com/triggr/rFRD51HB_88hTzdJ/images/studio/workflows/manual-steps-list.png?fit=max&auto=format&n=rFRD51HB_88hTzdJ&q=85&s=669e273c1a894f937fccd428f19925ad" alt="The Manual Steps page searched for Order laptop, with one Pending task, Order laptop for Priya Shah, and a View button." width="2332" height="580" data-path="images/studio/workflows/manual-steps-list.png" />
    </Frame>

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/dashboard-pending-manual-steps.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=9032c0bba723650b92941c3d21647412" width="564" alt="The Dashboard's Pending Manual Steps card listing Order laptop for Priya Shah as Pending." data-path="images/studio/workflows/dashboard-pending-manual-steps.png" />
    </Frame>
  </Step>

  <Step title="Do the task">
    Click **View** and follow the Instructions.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-details.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=1b008905877d649dd08cba980689f075" width="673" alt="Manual Step Details with a Pending status, a Complete Step button, and the Title, Instructions and Created time." data-path="images/studio/workflows/manual-step-details.png" />
    </Frame>
  </Step>

  <Step title="Mark it complete">
    Click **Complete Step**, then Complete Step to confirm. With a form, click **Complete Form** and submit it instead.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-complete-dialog.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=e5861b6c3e1a6ce06334c6ae252dbdbe" width="448" alt="The Complete Step dialog: Are you sure you want to mark this step as complete? with Cancel and Complete Step buttons." data-path="images/studio/workflows/manual-step-complete-dialog.png" />
    </Frame>
  </Step>

  <Step title="Check it's done">
    The task shows who completed it, and the run moves on.

    <Frame>
      <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-completed.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=ecd67c53acf58b3cb35d4ffe6dbc1ff5" width="647" alt="The Status card showing Completed, Completed At and Completed By Alex Morgan (alex@yourmsp.com)." data-path="images/studio/workflows/manual-step-completed.png" />
    </Frame>
  </Step>
</Steps>

The step outputs `completed`, `completedByName`, `completedByEmail` and `manualStepId`, plus `formSubmissionId` and the answers in `submission` when it has a form.

<Frame>
  <img src="https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-output.png?fit=max&auto=format&n=XztmSfsoAUpshfIO&q=85&s=3510a414a33b4e1ff07468e299282d45" width="600" alt="The Order laptop step's Output in a run: completed true, updatedAt, completedBy, manualStepId, completedByName Alex Morgan and completedByEmail alex@yourmsp.com." data-path="images/studio/workflows/manual-step-output.png" />
</Frame>

## Other approval steps

| Step | Use it to |
| - | - |
| Approval With Logging | Ask for approval with Approved and Rejected branches. Log pending approval, Log on approved and Log on rejected add notes to the run's PSA ticket, from Create Ticket or Set Ticket ID. |
| Determine Approval Type | Branch Internal, External or None for the run's client, with overrides for chosen clients. It sends nothing itself. |

## FAQ

<AccordionGroup>
  <Accordion title="“You are not the designated approver for this request”">
    Only the person named in the To field can decide, signed in with that email. For a group it reads “You are not a member of the group that can approve this request”: add them in Settings > User Groups.
  </Accordion>

  <Accordion title="“Cannot approve or reject request because the workflow execution is not running”">
    The run has ended or was terminated. Start a new run.
  </Accordion>

  <Accordion title="The approver didn't get an email">
    Group requests aren't emailed: members find them on Approvals or the Dashboard. For Single, check spam for mail from `app@triggr-app.com`.
  </Accordion>

  <Accordion title="Can a client or someone outside Studio approve?">
    Approvers sign in to Studio. For a client's sign-off, send them a form with an Await Form Submission step (Forms), which emails the form and waits for the answers. See [Introduction to forms](/studio/forms/introduction).
  </Accordion>

  <Accordion title="Do requests expire or send reminders?">
    No. To withdraw one, click Terminate Run on the run; the request then shows Expired.
  </Accordion>

  <Accordion title="Validate warns “Field path 'approved' not found in observed output of step …”">
    Validate only knows the output of an approval that's still waiting. Ignore it for `approved`, `approvedByUserName`, `approvedByUserEmail` and `rejectionReason`.
  </Accordion>

  <Accordion title="Why is my manual step green while the run is still running?">
    A manual step shows its waiting output, `"status": "pending"`, straight away. The run stays Running until someone completes it.
  </Accordion>

  <Accordion title="Can someone reject a manual step?">
    No, only complete it. To stop the run instead, click Terminate Run.
  </Accordion>

  <Accordion title="Can I approve or complete from another system?">
    Yes, with a Public API key that has the Act on running work (`executions:manage`) scope: `POST /api/v1/approvals/<id>/approve` or `/reject` with `{ "actor": { "name": "Alex Morgan" }, "response": "…" }`, and `POST /api/v1/manual-steps/<id>/complete`. See [API keys and webhooks](/studio/settings/api-and-webhooks).
  </Accordion>
</AccordionGroup>

To find out why a run failed, see [Debug a failed run](/studio/workflows/debugging).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.