Introduction
This article explores a multi-flow design approach to resolving approval dependencies, where one flow initiates the approval process and another waits for and reacts to the approval result. By separating responsibilities and orchestrating communication between flows, this pattern enables better scalability, more apparent logic, and easier troubleshooting. Through this approach, you can build approval workflows that are more reusable and easier to extend as business requirements evolve.
Scenario Overview
An employee submits a leave request that requires manager approval. Based on the approval decision:
If approved, the employee's leave balance is updated, and the leave is confirmed.
If rejected: The request is marked as rejected, and the status gets updated accordingly.
At the same time, specific actions - such as logging the request and updating team calendars - need to happen immediately after submission.
Problem
In a traditional single-flow design, the workflow must wait for the manager's approval response before moving to the next step. This waiting behaviour creates a Blockage.
Solution: Multi-Flow Design
To address this, the process is divided into multiple flows with clear responsibilities:
Flow 1 (Submission & Parallel Tasks)
This flow is triggered when a leave request is submitted. It immediately:
Flow 2 (Approval Handling)
This flow is dedicated to handling the manager's approval response. Once the decision is made:
If approved, it updates the leave balance and finalizes the request.
If rejected, it marks the request as rejected .
By separating approval handling from other tasks, the system continues to operate efficiently without being blocked by approval delays. This multi-flow design results in better performance.
Prerequisites
Before implementing this , ensure the following:
Below are the steps for Multi-Flow Design:
Flow 1:
Triggered when a new item is added to the Employee Leave Requests list, starts the approval process, and logs the request in the Leave Request Logs list.
Step 1. Trigger: When an item is created in Employee Leave Requests list
[Note: Your flow can be triggered in different ways: when a user creates a request in the list, when Power Apps calls the flow with an Employee ID, or when Power Apps creates a list entry that triggers the flow.]
![18-12-2025-05-04-06]()
Step 2. Create an approval: Initiating the approval process
Approval type: Select the approval type according to your requirement. Here, I am choosing 'First to respond' because I want the flow to take action as soon as any one approver responds.
Title: Enter the email subject.
Assigned to: Add manager email(s), separated by commas if multiple.
Details: Include info about the leave request, like employee name, ID, and leave type.
Employee Name: Select Employee Name from the trigger's dynamic content.
triggerOutputs()?['body/Title']
triggerOutputs()?['body/EmployeeID']
triggerOutputs()?['body/LeaveType/Value']
triggerOutputs()?['body/{Link}']
![18-12-2025-05-04-44]()
Step 3. Create item: Create entry in the Leave Request Logs list
Site Address: Enter the site containing your list.
List Name: Choose your log list.
Employee Name: Select Employee Name from the trigger's dynamic content.
triggerOutputs()?['body/Title']
triggerOutputs()?['body/EmployeeID']
triggerOutputs()?['body/LeaveType/Value']
outputs('Create_an_approval')?['body/name']
![18-12-2025-05-05-23]()
Flow 2:
When a new log is created, wait for approval, then update the request in both Leave Request Logs and Employee Leave Requests lists.
Step 1. Trigger: When an item is created in Leave Request Logs list
![18-12-2025-05-06-01]()
Step 2. Wait for an approval: Waits for the approval response
triggerBody()?['ApprovalID']
![18-12-2025-05-06-29]()
Step 3. Update item: Updates the Leave Request Logs list with approval details, such as who, when, what is outcome and comments of approval.
Site Address: Enter the site containing your list.
List Name: Choose your log list.
ID: Select ID from the trigger's dynamic content.
triggerOutputs()?['body/ID']
concat('i:0#.f|membership|',first(outputs('Wait_for_an_approval')?['body/responses'])?['responder/email'])
utcNow()
if(equals(outputs('Wait_for_an_approval')?['body/outcome'],'Approve'),'Approved','Rejected')
first(outputs('Wait_for_an_approval')?['body/responses'])?['comments']
![18-12-2025-05-06-47]()
Step 4. Get item: Gets the requester's employee ID
Site Address: Enter the site containing your list.
List Name: Choose your request list.
Filter Query: Added a filter query for the requested employee's ID. Use the internal column name that stores the Employee ID.
EmployeeID eq '@{outputs('Update_item')?['body/EmployeeID']}'
![18-12-2025-05-07-23]()
Step 5. Update item: Updates the Employee Leave Requests list with approval details, such as who, when, what is outcome and comments of approval.
Site Address: Enter the site containing your list.
List Name: Choose your request list.
ID: Gets the ID of the first item from the 'Get items' action.
first(outputs('Get_items')?['body/value'])?['ID']
concat('i:0#.f|membership|',first(outputs('Wait_for_an_approval')?['body/responses'])?['responder/email'])
if(equals(outputs('Wait_for_an_approval')?['body/outcome'],'Approve'),true,false)
utcNow()
if(equals(outputs('Wait_for_an_approval')?['body/outcome'],'Approve'),'Approved','Rejected')
first(outputs('Wait_for_an_approval')?['body/responses'])?['comments']
![18-12-2025-05-07-50]()
Conclusion
A multi-flow design processes leave requests efficiently, running parallel tasks immediately and handling approvals separately.