Power Automate Approval Workflow
Power Automate Approval Workflow: The Complete Step‑by‑Step Guide (2025)
Table of Contents
- Introduction: Why a Power Automate Approval Workflow Matters
- Glossary & Concepts: Approvals in Power Automate, at a Glance
- Planning Checklist: Requirements, Roles, Data, and SLAs
- Environment Prep: SharePoint List, Dataverse Table, or Microsoft Forms
- Build #1 (Beginner): First‑to‑Respond Approval Flow — End‑to‑End
- 5.1 Create the automated cloud flow
- 5.2 Configure the trigger (SharePoint example)
- 5.3 Start and wait for an approval (V2): setup
- 5.4 Branching logic on outcome
- 5.5 Notifications, updates, logging
- 5.6 Test, validate, and iterate
- Build #2 (Core): Everyone‑Must‑Approve Flow — End‑to‑End
- 6.1 Add trigger and context
- 6.2 Configure unanimous approval
- 6.3 Capture and store every response
- 6.4 Handle rejection paths and resubmission
- 6.5 Reminders, deadlines, escalation
- Build #3 (Intermediate): Two‑Stage (Manager → Finance) Multi‑Level Approval
- Build #4 (Advanced): Conditional and Parallel Approvals with Thresholds
- Build #5 (Teams‑First): Approvals with Adaptive Cards in Microsoft Teams
- Escalations & Delegations: Patterns that Avoid Stalls
- Timeouts, Retries, and Error Handling: Robustness by Design
- Auditing & Compliance: Dataverse or SharePoint for Immutable Trails
- Reporting & Analytics: Excel + Power BI Dashboards for Approvals
- Performance & Limits: Throughput, Concurrency, and Pagination
- Security, Governance & ALM: DLP, Connections, Solutions, and Pipelines
- Testing Playbook: Unit Tests, Edge Cases, and Run History Forensics
- Troubleshooting Cookbook: 25 Common Issues Fixed
- Optimization Tips: UX, Content Design, and Localization
- SEO Implementation Notes: Yoast Rules, Schema, and Internal Linking
- FAQs: Short Answers to Frequent Approval Questions
- Conclusion & Next Steps: From Prototype to Production
Image Alt‑Text Guidance: Each screenshot should include alt text with the keyphrase once where appropriate (e.g., “Power Automate approval workflow — create automated cloud flow”).
1) Introduction: Why a Power Automate Approval Workflow Matters
A power automate approval workflow streamlines decision‑making by routing requests to the right people, collecting decisions, and documenting outcomes automatically. Teams adopt approvals to reduce email chaos, speed up purchases, increase transparency, and maintain compliance. In this guide, you’ll build five production‑ready patterns—from First to respond and Everyone must approve to multi‑stage, conditional, and Teams‑first approvals—using clear steps, checklists, reusable expressions, and robust error handling.
You’ll also learn how to design escalation rules, track every response for audits, and surface approval metrics in Power BI. The result is a resilient approval platform that scales from a single department to the entire organization.
What you’ll build and learn:
- Two core approval types: First to respond and Everyone must approve
- Two‑stage multi‑level approvals with manager and finance
- Conditional/parallel approvals with amount thresholds
- Teams adaptive card approvals for a chat‑native experience
- Escalations, reminders, and delegations to avoid stalls
- Dataverse/SharePoint auditing + Power BI reporting
- Resilience: timeouts, retries, error handling, and governance
Pro tip: Keep sentences short, use active voice, and apply consistent labels in screens, emails, and Teams cards. Clear content design improves response time.
2) Glossary & Concepts: Approvals in Power Automate, at a Glance
- Approvals connector: The service that creates approval requests and waits for outcomes.
- Start and wait for an approval (V2): The recommended action that both creates the approval and pauses the flow.
- Approval types:
- Approve/Reject – First to respond: The first decision finalizes the outcome.
- Approve/Reject – Everyone must approve: All listed approvers must approve.
- Custom responses: Optional multi‑choice outcomes (e.g., “Approve/Needs Info/Reject”).
- Outcome: Final decision string (e.g.,
Approve
,Reject
). - Comments: Approver‑provided note captured with the decision.
- Responses: Array of individual decisions (useful in “Everyone must approve”).
- Item link: Deep link to the record being approved (SharePoint item, Dataverse row, etc.).
- Escalation: Reassignment or additional approver added after a time limit.
- SLA: Deadline targets for approvals (e.g., 24 hours to respond).
3) Planning Checklist: Requirements, Roles, Data, and SLAs
Before you open the flow editor, clarify the following. Use this list in workshops.
Business goals & scope
- What decision are we trying to automate? (purchase, leave, contract, access)
- What does “approved” unlock? (next process step)
- Who must be informed? (requester, stakeholders)
Actors & roles
- Requester (creates the item)
- Approver(s) (manager, finance, legal)
- Escalation approver (optional)
- Flow owner (maintainer)
Data & context
- Source (SharePoint list, Dataverse, Forms)
- Mandatory fields: Title, Requester, Amount, Category, Due date, Link
- Confidentiality (sensitive data labels, access controls)
Rules & thresholds
- Which approval type per scenario? (first or unanimous)
- Amount thresholds (e.g., ≤$500 auto‑approve; $500–$2500 manager; >$2500 finance)
- Deadlines and escalations (24h reminder, 48h escalate)
Audit & reporting
- Where do we store outcomes? (SharePoint/Dataverse)
- Which KPIs matter? (cycle time, approval rate, bottlenecks)
Governance
- Environment and solution strategy (Dev/Test/Prod)
- DLP and connectors
- Owner succession plan
Decision matrix: Keep “Everyone must approve” for sensitive changes; use “First to respond” for operational speed when any approver has authority.
4) Environment Prep: SharePoint List, Dataverse Table, or Microsoft Forms
You need a data source to trigger and describe the request. Start with a SharePoint list if you’re new to Power Automate.
SharePoint list fields (example):
- Title (Single line of text)
- RequestedBy (Person)
- Amount (Currency/Number)
- Category (Choice: Travel, Hardware, Software, Other)
- NeededBy (Date)
- Status (Choice: New, Pending Approval, Approved, Rejected)
- LinkToDocs (Hyperlink)
Optional Dataverse table columns:
- RequestId (Autonumber)
- Stage (Text)
- SLADeadline (DateTime)
- ApproverComments (Multiline)
Microsoft Forms: Use for simple intake; store long‑term records in SharePoint/Dataverse via the flow.
5) Build #1 (Beginner): First‑to‑Respond Approval Flow — End‑to‑End
5.1 Create the automated cloud flow
- Go to make.powerautomate.com → Create → Automated cloud flow.
- Name it: SP – First to Respond Approval.
- Choose trigger: When an item is created (SharePoint).
- Click Create.
Alt text for screenshot: Power Automate approval workflow — create automated cloud flow.
5.2 Configure the trigger (SharePoint)
- Site Address: your site.
- List Name: the list you prepared.
- Save the flow once to surface dynamic content.
Quality checklist
- Verify mandatory fields exist.
- Ensure requesters have rights to create items.
5.3 Start and wait for an approval (V2): setup
- + New step → search Approvals → Start and wait for an approval (V2).
- Approval type: Approve/Reject – First to respond.
- Title:
Approval needed: @{triggerOutputs()?['body/Title']}
- Assigned to: manager emails or
RequestedBy Email
dynamic content. - Details: Provide a compact summary:
Requester: @{triggerOutputs()?['body/RequestedBy/DisplayName']} Amount: @{triggerOutputs()?['body/Amount']} Category: @{triggerOutputs()?['body/Category/Value']} Needed by: @{triggerOutputs()?['body/NeededBy']}
- Item link: the SharePoint item link; Item link description: “Open request”.
Why this matters: This action creates the approval and automatically pauses the flow until the first decision arrives.
5.4 Branching logic on outcome
- + New step → Control → Condition.
- Left value: Outcome (from the approval action).
- Operator:
is equal to
. - Right value:
Approve
.
- If yes (Approved):
- Update item → set Status = Approved; write ApproverComments if you log comments.
- Notify requester via Send an email (V2) or Post message in a chat or channel (Teams).
- If no (Rejected):
- Update item → Status = Rejected.
- Notify requester with the reason using
@{outputs('Start_and_wait_for_an_approval')?['body/comments']}
if available.
5.5 Notifications, updates, logging
- Include the approval outcome, approver, timestamp, and comments in notifications.
- Write a record to an Audit list/table with: RequestId, Outcome, Approver, Date, Comments.
5.6 Test, validate, and iterate
- Use Test → Manually and create a sample SharePoint item.
- Inspect Run history → open each action → confirm inputs/outputs.
- Adjust field mappings and phrasing for clarity.
Success criterion: A new list item triggers the approval, the first responder sets the outcome, and recipients receive clear messages.
6) Build #2 (Core): Everyone‑Must‑Approve Flow — End‑to‑End
6.1 Add trigger and context
- Repeat Build #1 trigger steps or reuse the same list with a separate flow.
- Set Status = Pending Approval upon item creation for visibility.
6.2 Configure unanimous approval
- Start and wait for an approval (V2).
- Approval type: Approve/Reject – Everyone must approve.
- Assigned to: Enter all approvers (comma‑separated) or provide an array.
- Provide a clear Details block outlining the SLA and consequences of each choice.
6.3 Capture and store every response
- Use dynamic content Responses, Responses Approver, Responses Comments to store per‑approver logs.
- Example SharePoint fields: Approver1, Decision1, Comments1; Approver2…
- Alternatively, append to an Audit table where each approval response is a row.
6.4 Handle rejection paths and resubmission
- Condition on Outcome == Approve → proceed; else mark Rejected and notify.
- If Rejected, provide a Resubmit button or a Power Apps form to capture changes, then create a new item.
6.5 Reminders, deadlines, escalation
- Parallel branch with a Delay (e.g., PT24H). If no outcome yet, send reminders.
- After 48 hours, Create an approval to an escalation approver or Reassign.
Audit tip: Log every reminder and escalation with timestamps.
7) Build #3 (Intermediate): Two‑Stage (Manager → Finance) Multi‑Level Approval
Goal: Manager approves first; if approved and Amount > threshold, Finance approves next.
Steps
- Trigger: SharePoint item created.
- Stage 1 – Manager approval using First to respond with one approver (the manager).
- Condition A: If Outcome == Approve → check
Amount
. - Condition B: If
Amount > 2500
→ Stage 2 – Finance approval using Everyone must approve (Finance leads). - If Finance approves → set Status = Approved; else Rejected.
- Notifications after each stage with clear context.
Expressions
- Threshold check in a Condition:
int(triggerOutputs()?['body/Amount']) > 2500
- Compose a stage label:
concat('Stage: ', if(greater(int(triggerBody()?['Amount']),2500),'Finance','Manager'))
Data design
- Fields: Stage, Stage1Outcome, Stage2Outcome, FinalOutcome, FinanceDueDate.
- Store who approved at each stage for audits.
8) Build #4 (Advanced): Conditional and Parallel Approvals with Thresholds
Scenario: Requests split into parallel branches by Category. Hardware goes to IT + Finance in parallel; Travel goes to Manager only.
Outline
- Trigger: Item created.
- Switch on
Category
. - Case: Hardware → Parallel branch:
- Branch A: IT approval (Everyone must approve if more than one approver).
- Branch B: Finance approval (First to respond for speed).
- Case: Travel → Manager approval only.
- Join results with Conditions to set final Status.
Parallel patterns
- Use Configure run after to wait for both branches to finish and then evaluate.
- Store intermediate outcomes in variables (e.g., Var_ITOutcome, Var_FinOutcome).
9) Build #5 (Teams‑First): Approvals with Adaptive Cards in Microsoft Teams
Why: Approvers live in Teams. Bring the request to where they work.
Steps
- Ensure the Approvals app is installed in Teams.
- In your flow, after Start and wait for an approval, add Post adaptive card and wait for a response (for a user or in a channel).
- Map fields (Title, Details, Amount, NeededBy) to card sections.
- Provide Approve/Reject buttons; capture comments.
- On submit, continue the flow and branch on the card’s response.
Card design tips
- Front‑load key facts: requester, amount, deadline, link.
- Use concise labels and helpful descriptions.
- Include SLA text: “Please respond within 24 hours.”
10) Escalations & Delegations: Patterns that Avoid Stalls
Patterns
- Time‑based reminder: After 24h, send reminder to all pending approvers.
- Deadline‑based escalation: After 48h, reassign to an escalation approver or manager.
- Delegation: Allow approvers to designate alternates during leave.
Implementation
- Parallel branch → Delay → Get approval details → if still pending, send reminder.
- Use Update item to set Escalated = Yes and record EscalationDate.
Expressions
- ISO 8601 delay:
PT24H
(24 hours),PT15M
(15 minutes).
11) Timeouts, Retries, and Error Handling: Robustness by Design
Timeouts
- In long‑running approvals, consider a maximum wait by wrapping the approval in a scope that can Terminate if overdue and notify stakeholders.
Retries
- Many connectors have retry policies. For idempotent updates (e.g., logging), keep operations safe to retry.
Error handling
- Use Scope actions named Try, Catch, Finally.
- Configure Run after for the Catch scope on has failed, has timed out.
- Log error details and notify admins.
12) Auditing & Compliance: Dataverse or SharePoint for Immutable Trails
What to log
- Request metadata (Requester, Amount, Category)
- Approval type and stage
- Approver identities
- Outcome, comments, timestamps
- Reminders and escalations
Where to log
- Dataverse for enterprise‑grade tables and relationships
- SharePoint for lightweight teams and quick analytics in Excel
Retention
- Apply retention labels and backup strategies based on policy.
13) Reporting & Analytics: Excel + Power BI Dashboards for Approvals
KPIs
- Average cycle time from request to final outcome
- Approval rate vs. rejection rate
- Approvals by category, amount bands, requester
- SLA breaches and escalations
Pipeline
- Export audit table to Excel or connect Power BI directly to Dataverse/SharePoint.
- Build visuals: trend lines for cycle time, funnel for stages, matrix by department.
14) Performance & Limits: Throughput, Concurrency, and Pagination
Considerations
- Batch notifications where possible.
- Use environment variables for emails, thresholds.
- Keep payloads compact in Details sections.
Limits (subject to change)
- Connector throttling per environment/connection.
- Flow run duration caps in standard plans.
Tip: Split monolith flows into modular child flows for maintainability.
15) Security, Governance & ALM: DLP, Connections, Solutions, and Pipelines
- Place production flows in Solutions with connection references.
- Use Deployment pipelines (Dev → Test → Prod).
- Define DLP policies to control connectors.
- Restrict who can edit production flows; set an owner group.
16) Testing Playbook: Unit Tests, Edge Cases, and Run History Forensics
Unit tests
- Happy path approval
- Rejection path
- No‑response + escalation
- Amount threshold boundary (e.g., exactly 2500)
Forensics
- In Run history, expand each action, download inputs/outputs for root cause analysis.
- Correlate timestamps with SLA breaches.
17) Troubleshooting Cookbook: 25 Common Issues Fixed
- Approval emails not received → Check spam; verify mailbox licenses; use Teams cards as fallback.
- Approvals stuck in Pending → Ensure approvers are valid; check tenant restrictions; verify action configured correctly.
- Duplicate approvals → Debounce triggers; ensure “Create” vs “Create or modify” logic.
- Item link broken → Use dynamic item URL tokens; test across environments.
- Wrong approver → Resolve manager via Azure AD or Entra ID attributes; cache in a table.
- Timeouts → Implement reminders; add escalation; design for long waits.
- Comments lost → Store
comments
output into a dedicated field. - Array parsing errors → Initialize arrays; check for
empty()
before iterating. - Expression failures → Add
coalesce()
and type casts (int()
,string()
). - Flow ownership gaps → Add owner group; document recovery steps.
- SLA not enforced → Use a scheduled flow to sweep for overdue approvals.
- Teams card fails → Validate app permissions; post as user vs in channel.
- Permissions on list → Unique item permissions for confidentiality.
- Audit table growth → Archive to cold storage after 12 months.
- Environment sprawl → Adopt ALM and solutions; standardize naming.
- Hard‑coded emails → Replace with environment variables and lookup tables.
- Localization → Store templates per language; choose based on requester locale.
- HTML formatting issues → Use Compose to build clean HTML fragments.
- Link preview clutter → Keep Details concise; attach only essential links.
- Nondeterministic outcomes → Avoid racing branches; use single source of truth.
- Parallel branch deadlocks → Join using variables and a final decision scope.
- Over‑notification → Batch updates; suppress duplicates.
- Data type mismatches → Normalize to strings for messages; cast for comparisons.
- Owner left the company → Use groups; document ownership transfer.
- Connection expiration → Monitor and refresh credentials proactively.
18) Optimization Tips: UX, Content Design, and Localization
- Front‑load facts: requester, amount, date, link at the top of emails/cards.
- Short labels and action language (“Approve purchase request”).
- Consistent subject lines for inbox scanning.
- Localization: provide translated templates and date formats.
- Accessibility: alt text for all images, adequate contrast, and descriptive links.
19) SEO Implementation Notes: Yoast Rules, Schema, and Internal Linking
Yoast SEO targets (editor’s checklist):
- Primary keyphrase in title, first paragraph, and several H2s/H3s.
- Keyphrase density ~1–1.5% across body copy without stuffing.
- Subheadings at least every 300 words.
- Short sentences and active voice.
- Internal links to related tutorials: Creating variables and composing outputs, Conditions (if/else logic), Manipulating strings, dates, and numbers, Cloud flows triggers and actions, Collections in Power Apps.
- External links: Microsoft Learn docs (open in new tab,
rel="noopener"
). - Image filenames and alt text include descriptive phrases with the keyphrase where natural.
Schema: Add FAQPage JSON‑LD (see §20) and HowTo for Build #1 and #2.
Snippet settings
- Slug:
power-automate-approval-workflow-step-by-step
- Meta description (from top of article).
20) FAQs: Short Answers to Frequent Approval Questions
Q1. Which approval type should I choose?
If speed matters and any approver has authority, choose First to respond. If every approver must consent, choose Everyone must approve.
Q2. Can I mix both types?
Yes. Use multi‑stage flows (e.g., manager first → finance unanimous).
Q3. How do I handle non‑responses?
Set reminders and escalations with Delay + Condition logic. Mark overdue items and reassign to alternates.
Q4. Where do I store audit trails?
Use Dataverse for robust relational logging, or SharePoint for lightweight tracking.
Q5. How do Teams approvals work?
Post an adaptive card with Approve/Reject actions; handle the card response to continue the flow.
Q6. Can I auto‑approve under a threshold?
Yes. Add a Condition that auto‑approves when Amount ≤ X
, and route larger requests to approvals.
Q7. How do I move from Dev to Prod?
Build flows in Solutions with connection references and deploy via pipelines.
Q8. How do I report on approvals?
Connect your audit store to Power BI to visualize cycle time, volume, and SLA breaches.
21) Conclusion & Next Steps: From Prototype to Production
You now have a complete playbook for building a power automate approval workflow that scales—from quick First to respond scenarios to rigorous Everyone must approve and multi‑stage processes. You learned step‑by‑step builds, robust escalation patterns, audit logging, and analytics that prove value.
Next steps
- Ship the Beginner and Core builds to a Test environment.
- Add thresholds, multi‑stage logic, and Teams cards.
- Wire Dataverse auditing and a Power BI dashboard.
- Operationalize governance with Solutions and DLP policies.
When you’re ready, clone the pattern across departments. Your users will experience faster decisions, fewer emails, and clearer accountability—exactly what a modern Power Automate approval workflow should deliver.
Appendix A: Reusable Expressions & Snippets
- Safe display names:
coalesce(triggerOutputs()?['body/RequestedBy/DisplayName'],'Unknown')
- Safe numbers:
int(coalesce(triggerBody()?['Amount'],0))
- Date formatting:
formatDateTime(triggerBody()?['NeededBy'],'yyyy-MM-dd')
- Compose decision lines:
concat( 'Outcome: ', outputs('Start_and_wait_for_an_approval')?['body/outcome'], '\n', 'Approver: ', outputs('Start_and_wait_for_an_approval')?['body/responder/email'], '\n', 'Comments: ', coalesce(outputs('Start_and_wait_for_an_approval')?['body/comments'],'(none)') )
Appendix B: Naming Conventions
- Flows:
SP-Approvals-FirstToRespond
/SP-Approvals-AllMustApprove
- Variables:
Var_Stage
,Var_ITOutcome
,Var_FinOutcome
- Environments:
Contoso-Approvals-Dev/Test/Prod
Appendix C: HowTo Schema (example)
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "Build a Power Automate approval workflow (first to respond)",
"step": [
{"@type": "HowToStep", "name": "Create automated flow", "text": "Go to make.powerautomate.com and create an Automated cloud flow."},
{"@type": "HowToStep", "name": "Configure trigger", "text": "Select SharePoint trigger and set Site and List."},
{"@type": "HowToStep", "name": "Start and wait for an approval", "text": "Add Approvals action and choose First to respond."},
{"@type": "HowToStep", "name": "Branch on outcome", "text": "Use Condition on Outcome = Approve to route actions."}
]
}