Power Automate Multi-Stage Approval Bug: Fix Incorrect “Fully Approved” Email
👨💻 Introduction
While helping a colleague troubleshoot a Power Automate approval flow, I ran into a very common issue with multi-stage approval workflows.
If you are designing approval processes in Power Platform, this is something you will likely encounter at some point.
This post explains the problem and shows the correct pattern to fix it.
While helping a colleague troubleshoot a Power Automate approval flow, I ran into a very common issue with multi-stage approval workflows.
If you are designing approval processes in Power Platform, this is something you will likely encounter at some point.
This post explains the problem and shows the correct pattern to fix it.
🐞 Problem Statement
In a two-stage approval workflow:
- Stage 1 approver approves ✅
- Stage 2 approver rejects ❌
But the system still sends:
"The document has been fully approved"
This creates confusion and breaks trust in the approval process.
In a two-stage approval workflow:
- Stage 1 approver approves ✅
- Stage 2 approver rejects ❌
But the system still sends:
"The document has been fully approved"
This creates confusion and breaks trust in the approval process.
🔍 How This Issue Happens
This issue usually occurs when:
- Only Stage 1 outcome is validated
- The flow does not check Stage 2 approval result
- The final email is configured outside the correct condition scope
In some cases, the flow may also throw an error when referencing approval outputs incorrectly due to scope issues.
This issue usually occurs when:
- Only Stage 1 outcome is validated
- The flow does not check Stage 2 approval result
- The final email is configured outside the correct condition scope
In some cases, the flow may also throw an error when referencing approval outputs incorrectly due to scope issues.
📝 Note on Approval Design
This solution applies to sequential approvals, where:
- Stage 1 must complete before Stage 2 starts
If you are using parallel approvals, where multiple approvers act at the same time, you will need a different design approach.
This solution applies to sequential approvals, where:
- Stage 1 must complete before Stage 2 starts
If you are using parallel approvals, where multiple approvers act at the same time, you will need a different design approach.
✅ Solution Overview
To fix this issue, you must:
✔ Validate each approval stage separately
✔ Place conditions in the correct execution scope
✔ Send the final email only after all approvals are validated
To fix this issue, you must:
✔ Validate each approval stage separately
✔ Place conditions in the correct execution scope
✔ Send the final email only after all approvals are validated
🛠️ Step-by-Step Fix
✅ Step 1: Rename Your Actions
Clear naming reduces confusion and avoids mistakes.
Rename your approval steps like this:
Start and wait for an approval → Approval_Stage_1Start and wait for an approval 1 → Approval_Stage_2
Clear naming reduces confusion and avoids mistakes.
Rename your approval steps like this:
Start and wait for an approval→ Approval_Stage_1Start and wait for an approval 1→ Approval_Stage_2
✅ Step 2: Add Condition for Stage 1
Use the following expression in your condition:
equals(outputs('Approval_Stage_1')?['body/outcome'], 'Approve')
Make sure:
- There is only one condition row
- No empty or unused conditions remain
Use the following expression in your condition:
Make sure:
- There is only one condition row
- No empty or unused conditions remain
✅ Step 3: Add Condition After Stage 2
This is the most important fix.
Add a second condition immediately after Stage 2 approval:
equals(outputs('Approval_Stage_2')?['body/outcome'], 'Approve')
This is the most important fix.
Add a second condition immediately after Stage 2 approval:
equals(outputs('Approval_Stage_2')?['body/outcome'], 'Approve')
✅ Correct Flow Design
📷 Prefer a Visual Walkthrough?
If you would like to follow along with detailed screenshots of each step in the flow, I have created a separate step-by-step guide:
👉 Step-by-Step Power Automate Multi-Stage Approval Setup (Screenshots Guide)
This includes the full configuration for each action, condition, and approval stage.
--
Follow this structure for a proper multi-stage approval flow:
Trigger
↓
Get Response Details
↓
Approval_Stage_1
↓
Condition: Stage 1 Approved?
↓ YES
Approval_Stage_2
↓
Condition: Stage 2 Approved?
↓ YES → Send "Fully Approved" email
↓ NO → Send "Rejected" email
↓ NO → Send "Rejected" email
If you would like to follow along with detailed screenshots of each step in the flow, I have created a separate step-by-step guide:
👉 Step-by-Step Power Automate Multi-Stage Approval Setup (Screenshots Guide)
This includes the full configuration for each action, condition, and approval stage.
--
Follow this structure for a proper multi-stage approval flow:
Trigger
↓
Get Response Details
↓
Approval_Stage_1
↓
Condition: Stage 1 Approved?
↓ YES
Approval_Stage_2
↓
Condition: Stage 2 Approved?
↓ YES → Send "Fully Approved" email
↓ NO → Send "Rejected" email
↓ NO → Send "Rejected" email⚠️ Common Mistakes to Avoid
- Sending emails outside the approval condition blocks
- Referencing approval outputs outside their scope
- Using default action names without renaming
- Leaving extra condition rows in the logic
- Assuming that approval stages automatically validate each other
- Sending emails outside the approval condition blocks
- Referencing approval outputs outside their scope
- Using default action names without renaming
- Leaving extra condition rows in the logic
- Assuming that approval stages automatically validate each other
✅ Important Note on Outcome Values
Depending on the template used, the Outcome field may return:
- "Approve"
- "Approved"
This can cause condition checks to fail unexpectedly.
Depending on the template used, the Outcome field may return:
- "Approve"
- "Approved"
This can cause condition checks to fail unexpectedly.
✅ Bonus: Make Your Flow More Robust
To avoid issues with variations in the outcome value, use this safer expression:
equals(toLower(outputs('Approval_Stage_2')?['body/outcome']), 'approve')
Or a more flexible version:
contains(toLower(outputs('Approval_Stage_2')?['body/outcome']), 'approve')
To avoid issues with variations in the outcome value, use this safer expression:
equals(toLower(outputs('Approval_Stage_2')?['body/outcome']), 'approve')
Or a more flexible version:
contains(toLower(outputs('Approval_Stage_2')?['body/outcome']), 'approve')
🎯 Final Outcome
Scenario Result Stage 1 Reject Rejection email Stage 1 Approve and Stage 2 Reject Rejection email Both stages approve Fully approved email
| Scenario | Result |
|---|---|
| Stage 1 Reject | Rejection email |
| Stage 1 Approve and Stage 2 Reject | Rejection email |
| Both stages approve | Fully approved email |
🚀 Conclusion
This is a very common issue when building approval workflows in Power Automate.
The key lessons are simple:
- Always validate each approval stage independently
- Keep conditions inside the correct scope
- Ensure final actions depend on all required approvals
Designing flows this way makes your solutions more reliable and easier to maintain.
This is a very common issue when building approval workflows in Power Automate.
The key lessons are simple:
- Always validate each approval stage independently
- Keep conditions inside the correct scope
- Ensure final actions depend on all required approvals
Designing flows this way makes your solutions more reliable and easier to maintain.
👏 Acknowledgment
This solution was created while helping resolve a real-world Power Automate workflow issue. Sharing it here so others can avoid the same problem and build better approval processes.
This solution was created while helping resolve a real-world Power Automate workflow issue. Sharing it here so others can avoid the same problem and build better approval processes.
Post a Comment