> ## Documentation Index
> Fetch the complete documentation index at: https://kb.mspprocess.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.

<video controls preload="none" playsInline 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" />

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).

![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.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-workflow.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=c83022759c5d78d7c84c7c8a480750b3)

## Ask for approval

**1. 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.

![The Components panel with the Approval group open, listing Approval With Logging, Determine Approval Type, Human In The Loop and Manual Step.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-palette.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=0559f3d3ed6c9b9fd721428d6044012f)

**2. Choose the approver and write the request**

With Approval Type Single, pick the approver in **To**. Subject and Body are what they see.

![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.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-step-setup.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=9105e92caade8931bf4b70db46ce7790)

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

![Approval Type set to Group and a User Group dropdown.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-group.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=d26f7a14c0bcc6c41f1740ea5863cd1e)

**3. 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`.

![A Condition with Condition 1 reading ctx.steps\['Manager approval'\].approved, Label Approved, Default Branch Rejected and Condition Language Javascript.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-condition.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=6a7c1c69ff041b813e97d247b741fee0)

**4. 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.

## 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).

![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).](https://mintcdn.com/triggr/rFRD51HB_88hTzdJ/images/studio/workflows/manual-step-setup.png?fit=max\&auto=format\&n=rFRD51HB_88hTzdJ\&q=85\&s=4d1293bd7a09f1100ab6c6c2042c0793)

## 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.

![The run panel showing Running..., an Execution ID, Trigger in green and Manager approval in yellow.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-run-waiting.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=3b8df57ed673bb54f76ab85a22ae8a2a)

## Approve or reject

**1. 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.

![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.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approvals-list.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=3ebb8e6b177b00fe35b4c50d9a286745)

![The Dashboard's Pending Approvals card listing Approve laptop for Priya Shah, approver alex@yourmsp.com, Pending, with a View All link.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/dashboard-pending-approvals.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=6e01abc2756a263073daa1887dff9792)

**2. Open it**

Click **View**.

![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.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-details.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=1e598215dcf16e670b2085186c438cbc)

**3. Approve**

Click **Approve**, then Approve to confirm.

![The Approve dialog: Are you sure you want to approve this request? with Cancel and Approve buttons.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-approve-dialog.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=6efe842eda3c7312aea80cf415556292)

**4. Or reject**

Click **Reject**, enter a Reason and click Reject.

![The Reject dialog with the Reason Over budget. Order the standard Latitude 5450 instead., and Cancel and Reject buttons.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-reject-dialog.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=49a3c91ea027330aa6a6b31d6475c5ca)

![A Rejected request showing Rejected By Alex Morgan, the Reason, Updated At, and the Workflow Execution card.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-rejected.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=4a6ff70f06df06e62f1d1f2cbccb35e1)

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` |

![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.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-output-rejected.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=616c356f9c14104928e7997eaf7d36f5)

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

![A Failed run whose Execution Timeline lists Trigger, Manager approval, Condition, Email service desk and Not approved, all green.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/approval-rejected-run.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=b6950e484478cfe95909bb6de18b328a)

## Complete a manual step

**1. 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.

![The Manual Steps page searched for Order laptop, with one Pending task, Order laptop for Priya Shah, and a View button.](https://mintcdn.com/triggr/rFRD51HB_88hTzdJ/images/studio/workflows/manual-steps-list.png?fit=max\&auto=format\&n=rFRD51HB_88hTzdJ\&q=85\&s=669e273c1a894f937fccd428f19925ad)

![The Dashboard's Pending Manual Steps card listing Order laptop for Priya Shah as Pending.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/dashboard-pending-manual-steps.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=9032c0bba723650b92941c3d21647412)

**2. Do the task**

Click **View** and follow the Instructions.

![Manual Step Details with a Pending status, a Complete Step button, and the Title, Instructions and Created time.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-details.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=1b008905877d649dd08cba980689f075)

**3. Mark it complete**

Click **Complete Step**, then Complete Step to confirm. With a form, click **Complete Form** and submit it instead.

![The Complete Step dialog: Are you sure you want to mark this step as complete? with Cancel and Complete Step buttons.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-complete-dialog.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=e5861b6c3e1a6ce06334c6ae252dbdbe)

**4. Check it's done**

The task shows who completed it, and the run moves on.

![The Status card showing Completed, Completed At and Completed By Alex Morgan (alex@yourmsp.com).](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-completed.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=ecd67c53acf58b3cb35d4ffe6dbc1ff5)

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

![The Order laptop step's Output in a run: completed true, updatedAt, completedBy, manualStepId, completedByName Alex Morgan and completedByEmail alex@yourmsp.com.](https://mintcdn.com/triggr/XztmSfsoAUpshfIO/images/studio/workflows/manual-step-output.png?fit=max\&auto=format\&n=XztmSfsoAUpshfIO\&q=85\&s=3510a414a33b4e1ff07468e299282d45)

## 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

> [accordion] “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] “Cannot approve or reject request because the workflow execution is not running”
>
> The run has ended or was terminated. Start a new run.

> [accordion] 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] 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](https://kb.mspprocess.com/studio/forms/introduction.md).

> [accordion] Do requests expire or send reminders?
>
> No. To withdraw one, click Terminate Run on the run; the request then shows Expired.

> [accordion] 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] 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] Can someone reject a manual step?
>
> No, only complete it. To stop the run instead, click Terminate Run.

> [accordion] 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](https://kb.mspprocess.com/studio/settings/api-and-webhooks.md).

To find out why a run failed, see [Debug a failed run](https://kb.mspprocess.com/studio/workflows/debugging.md).


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