Learn how to build a complete approval workflow in Power Automate from scratch — sending approval requests, capturing the decision, and automatically emailing the outcome while posting a Teams notification. No coding required, and every concept is explained from first principles.

Picture this: your team has a purchase request process where anyone can submit a request, but a manager has to sign off before anything gets ordered. Right now, that process probably looks like a chain of forwarded emails, a sticky note on someone's desk, or a Slack message that got buried under 47 other conversations. The requester has no idea if their request was approved, rejected, or simply forgotten. The manager is drowning in ad-hoc requests with no consistent format. And when something goes wrong, nobody can reconstruct what happened.
This is exactly the kind of repetitive, human-dependent, error-prone process that Power Automate was built to handle. By the end of this lesson, you'll have a working end-to-end approval flow that accepts a request, routes it to an approver, collects their decision, and then automatically notifies the original requester via Outlook email — plus posts a summary to a Microsoft Teams channel for visibility. You won't just copy-paste steps; you'll understand why each piece of the flow works the way it does.
What you'll learn:
Before you dive in, make sure you have:
You do not need to know how to write code or expressions to complete this lesson. We'll introduce one simple expression near the end, and we'll explain it fully.
Before you build anything, it's worth understanding what Power Automate is doing when it sends an approval request. This mental model will save you from a lot of confusion later.
When your flow hits the Start and wait for an approval action, Power Automate does three things simultaneously:
When the approver clicks Approve or Reject (either in the email or in the Approvals hub inside Teams), the Approvals service wakes the flow back up and passes in the response data. From that point, your flow has access to fields like the outcome, the approver's name, and any comments they typed before submitting.
Key insight
The "wait" behavior is what makes approvals different from regular actions. A standard action like "Send an email" completes in milliseconds. The Start and wait for an approval action might sit dormant for hours or days. Power Automate handles this gracefully — you don't have to do anything special to manage it.
This is also why building approval workflows with Power Automate is genuinely beginner-friendly: the platform handles all the scheduling, notification, and state management for you. Your job is just to define what happens before and after the decision.
For this lesson, we'll use an Instant (manual) trigger so you can test the flow easily without needing a form or SharePoint list. Once you understand the pattern, you can swap in any trigger you like — a Microsoft Forms submission, a SharePoint item creation, anything.
Here's how to create the flow:
Purchase Request Approval - Test. Good naming habits matter more than you'd think; see Power Automate Best Practices: Master Flow Naming, Testing, and Monitoring for guidance.You'll land in the flow designer with a single action: the manual trigger. Now let's add inputs to simulate a real purchase request.
Click on the Manually trigger a flow card to expand it. You'll see an option to add inputs. Click Add an input and add the following three fields:
Requester NameItem RequestedEstimated CostThese inputs simulate what would normally come from a form or a SharePoint list. When you test the flow manually, you'll fill these in yourself. When this flow is connected to a real data source later, these values will be populated automatically.
Tip
In a production scenario, you'd typically trigger this flow from a Microsoft Forms submission or a new SharePoint list item. The approval logic you're building right now is completely reusable — you'd just swap the trigger. Check out Automating Microsoft Forms Responses to see how that hookup works.
Click the + New step button below your trigger. In the search box that appears, type Approvals. From the results, select the Approvals connector. You'll see several actions — choose Start and wait for an approval.
The action card will appear with several fields to fill in:
Leave this as Approve/Reject - First to respond. This means if you assign multiple approvers, whoever responds first locks in the decision. For this lesson we're using a single approver, so the type doesn't change the behavior — but it's good to know what it means.
This is the subject line the approver sees. Make it descriptive. Click in the Title field, then click Add dynamic content (the lightning bolt icon) and select Item Requested from the trigger outputs. Before it, type some static text. Your result should look like:
Purchase Request: [Item Requested]
The [Item Requested] part will be replaced by the dynamic content token you inserted, so an approver might see "Purchase Request: Ergonomic Chair" in their email.
Type the email address of the person who should approve requests. For testing, use your own email address — that way you can approve it yourself and see the full flow end-to-end.
This is the body of the approval request email. Write something meaningful here:
Requester: [Requester Name]
Item: [Item Requested]
Estimated Cost: $[Estimated Cost]
Please review and approve or reject this purchase request.
Replace each bracket placeholder with the corresponding dynamic content token from the trigger. The approver will see this exact text in their email, so the clearer you make it, the better.
These are optional but useful. You can leave them blank for now. In a real flow, you'd link directly to the SharePoint item or the form response so the approver can see supporting documentation with one click.
Warning
The Assigned To field must contain a valid email address from your Microsoft 365 tenant. If you type a personal Gmail address or a misspelled address, the approval email will fail to send — and importantly, the flow itself might not throw an obvious error. Always test with a known-good address first.
After the approval action, your flow needs to ask a question: did the approver say yes or no? This is where a Condition action comes in. A Condition is Power Automate's version of an if/then/else statement — it evaluates something as true or false and routes your flow accordingly.
Click + New step and search for Condition. Select the Condition control.
The Condition card has three zones: a left value, an operator dropdown, and a right value.
Approve or Reject depending on what the approver clicked.Approve exactly — with a capital A, no extra spaces. This has to match precisely.Your condition now reads: "If the approval outcome is equal to Approve, do one thing. Otherwise (else), do something different."
You'll see two branches appear below: If yes (the left branch) and If no (the right branch). Everything in the "If yes" branch runs when the request is approved. Everything in the "If no" branch runs when it's rejected.
For a deeper look at how Conditions work in Power Automate, including nested conditions and more complex logic, see Working with Conditions, Loops, and Variables in Power Automate.
Click the Add an action button inside the If yes branch. Search for Send an email and choose Send an email (V2) from the Office 365 Outlook connector.
Fill in the email fields:
To: This is where you'd normally put the requester's email. Since we're using a manual trigger for testing, type your own email address here. In a real flow connected to a SharePoint list, you'd use a dynamic content field like Created By Email.
Subject:
✅ Your purchase request has been approved
Body: Use the rich text editor to compose something like this — inserting dynamic content tokens where indicated:
Hi [Requester Name],
Great news! Your purchase request has been approved.
Details:
- Item: [Item Requested]
- Estimated Cost: $[Estimated Cost]
- Approved by: [Approver name from the approval]
- Approver comments: [Comments from the approval]
You can proceed with the purchase. Please follow standard procurement procedures.
Thanks,
Automated Procurement System
For the Approver name, use the dynamic content token called Responders Approver name (it's listed under the approval action's outputs). For Comments, use the Responders Comments token.
Note
The "Responders" tokens are nested outputs because the Approvals connector supports multiple approvers. Even with one approver, Power Automate wraps the response in an array. If you see these tokens appear inside an "Apply to each" loop automatically, that's expected behavior — Power Automate adds the loop because it's accounting for the possibility of multiple responses.
Click Add an action inside the If no branch. Add another Send an email (V2) action.
To: Same as above — your email for testing.
Subject:
❌ Your purchase request was not approved
Body:
Hi [Requester Name],
Unfortunately, your purchase request has not been approved at this time.
Details:
- Item: [Item Requested]
- Estimated Cost: $[Estimated Cost]
- Reviewed by: [Approver name]
- Reason provided: [Comments]
If you have questions about this decision, please follow up directly with your manager.
Thanks,
Automated Procurement System
The dynamic content tokens are identical to the approved branch — same Responders fields, just presented in a rejection context.
Now for the Teams piece. You want to post a summary to a channel whenever any purchase request is resolved — both approved and rejected — so the team has visibility. This action goes outside both branches of the Condition, below the entire If yes / If no block.
Scroll below the Condition block and click + New step. Search for Post a message in a chat or channel and select it from the Microsoft Teams connector.
Tip
The Teams connector has several posting actions. "Post a message in a chat or channel" is the most flexible — it lets you post as yourself or as the Flow bot. For automated notifications, "Flow bot" is cleaner because it doesn't make the message appear to come from a human account.
Fill in the fields:
📋 Purchase Request Update
Item: [Item Requested]
Requested by: [Requester Name]
Estimated Cost: $[Estimated Cost]
Decision: [Outcome]
Decided by: [Approver name]
Comments: [Comments]
Use dynamic content tokens for all the bracketed fields. The Outcome token will show either "Approve" or "Reject" — if you want friendlier display text like "Approved" or "Rejected," you can use an expression. Here's a simple one you can paste into the Outcome field by switching to expression mode:
if(equals(outputs('Start_and_wait_for_an_approval')?['body/outcome'], 'Approve'), 'Approved ✅', 'Rejected ❌')
Don't worry if expressions feel foreign right now — this is a single, readable statement that says "if the outcome is Approve, show 'Approved ✅', otherwise show 'Rejected ❌'." You can learn more about building these kinds of expressions in Mastering Dynamic Expressions and the Power Automate Formula Language.
For more on using Teams in automation scenarios, including posting adaptive cards with richer formatting, see Using Power Automate with Microsoft Teams: Automate Notifications, Approvals, and Channel Messages.
Click Save in the top-right corner of the designer. Power Automate will validate your flow and flag any obvious errors — if you see a red exclamation mark on any action card, click it to see what's wrong.
Once saved, click Test (also top-right). Choose Manually and click Run flow. A panel will appear asking you to fill in the trigger inputs you defined earlier:
Click Run flow. Power Automate will confirm the flow has started. Now switch to your email inbox — within a minute or two, you should receive the approval request email. Open it, read the details you entered, then click Approve.
Head back to Power Automate. In the left navigation, go to My flows, find your flow, and click on it to see its run history. Click the most recent run to see the execution trace. You should see every action listed with a green checkmark, and you can expand each one to see its inputs and outputs.
Also check your email inbox again — you should have received the "approved" outcome email. And check your Teams channel for the bot message.
Warning
If you don't receive the approval email within a few minutes, the most common cause is that the Assigned To email address isn't recognized by the Microsoft Approvals service. Double-check that you used a valid Microsoft 365 account email, not a personal Gmail or external address. You can also check the flow run details by visiting Using Power Automate Run History and Flow Checker to Debug and Fix Failing Flows.
Now that you've built the basic flow, extend it with these challenges:
Challenge 1 — Test the rejection path. Run the flow again with the same inputs, but this time click Reject in the approval email instead of Approve. Add a comment in the rejection dialog (something like "Over budget for Q4"). Verify that the rejection email arrives and that it includes your comment in the body.
Challenge 2 — Add a subject line that includes the cost. Modify both the approved and rejected email subjects to include the estimated cost. For example: ✅ Purchase request approved: $285 for Standing desk converter. You'll need to use a dynamic content token inside a static text string.
Challenge 3 — Personalize the Teams message. Change the Teams notification so that it only appears when the outcome is Reject. Move the "Post a message" action inside the If no branch, and change the message text to include a note that this request needs follow-up from the requester.
Challenge 4 — Add a second approver. In the Start and wait for an approval action, add a second email address to the Assigned To field, separated by a semicolon. Change the approval type to Approve/Reject - Everyone must approve. Test the flow and observe what changes about the approval email behavior.
The "Outcome" comparison fails even though the approver clicked Approve.
This almost always comes down to a capitalization or spacing issue in the Condition. The Outcome value returned by the Approvals service is Approve (capital A, no trailing space) and Reject. If you typed approved or APPROVE, the condition will never match. Double-check both the dynamic content and your static comparison string.
The approval email never arrives. Check two things: First, verify the Assigned To field contains a valid Microsoft 365 email address. Second, look in the flow run history and expand the "Start and wait for an approval" action — if there's an error, the details will be there. The Approvals service can also occasionally delay emails by a few minutes, especially in new tenants.
Dynamic content tokens from the approval don't appear in the email. If you added the "Send an email" action before you added the approval action, the approval outputs won't appear in dynamic content. Delete the email action and re-add it — Power Automate's dynamic content panel only surfaces outputs from actions that appear before the current step in the flow.
An "Apply to each" loop appeared around my email action automatically. This is normal when you use tokens from the "Responses" section of the approval outputs (like "Responders Approver name"). Power Automate wraps the action in a loop because approvals can have multiple responders. You don't need to fight this — just make sure your email content is inside the loop and it will work correctly.
The Teams message appears but shows "Approve" instead of "Approved ✅".
If you didn't use the expression version of the Outcome field, it will show the raw value. Go back to the Teams action, click into the Message field where you placed Outcome, delete the dynamic content token, switch to Expression mode, and paste the if(equals(...)) expression from earlier in this lesson.
You've built something real: a complete end-to-end approval flow that handles request submission, routes to an approver, branches on the decision, sends tailored outcome emails, and posts a Teams notification — all automatically, without anyone having to remember to follow up.
Here's what you've learned:
Where to go from here:
If you want to handle more complex routing — like sending requests to different approvers based on cost thresholds or department — read Building a Dynamic Multi-Condition Approval Flow in Power Automate.
To add sequential or parallel multi-stage approvals (for example, manager approval followed by finance approval), see Designing Multi-Stage Approval Chains in Power Automate.
And if you want to handle the scenario where an approver never responds, Automating Recurring Approval Reminders in Power Automate covers escalation, reminders, and auto-closing stale requests.