Architecting Long-Running Approvals in Power Automate (No 30-Day Limit)
Separate approval creation from outcome collection with two cooperating flows to support indefinite wait periods.
Every Power Automate approval that uses the Wait for an approval action has a hard 30-day limit. If the approver does not respond in that window, the flow times out and the approval is left in an indeterminate state. This limitation is well documented in the service’s duration limits.
The workaround is deceptively simple: break the approval into two separate flows. The first flow creates the approval record and ends immediately. The second flow never waits on the approval; it only fires when the approval is completed (Approved or Rejected) by listening to changes in Dataverse’s Approvals table. Because no flow action waits longer than a few seconds, the 30-day limit is irrelevant.
This article walks you through a complete implementation based on a real‑world scenario.
Scenario: Equipment Funding Approvals
A manufacturing company requires formal approval for any capital expense over $10,000. These requests can take several months because they must pass through multiple committees. A single flow would fail after 30 days, so we use the two‑flow pattern.
All requests are stored in a SharePoint list named EquipmentFundingRequests with the following columns:
| Column Name | Type | Purpose |
|---|---|---|
| Title | Single line of text | Short description of the equipment |
| Amount | Currency | Total cost |
| Requester | Person or Group | The person who submitted the request |
| RequestStatus | Choice (InReview, Approved, Declined) | Tracks the lifecycle of the request |
| ApprovalIdentifier | Single line of text | Links the SharePoint item to its Dataverse approval record |
Only the Title and Amount are required when an item is created. The other columns are written by the flows.
Flow 1 – Approval Creation
This flow runs immediately when a new item is added to the EquipmentFundingRequests list.
Trigger – When an item is created
Action 1 – Create an approval Use the Start and wait for an approval action, but never let the flow actually wait. Wait – that sounds contradictory. The key is that the flow will not wait here because we are going to end the flow right after this action. In the approval configuration, supply the Title, Amount, and Requester from the SharePoint item.
Action 2 – Update SharePoint item
Set RequestStatus to InReview and copy the Approval ID (the unique identifier created by the approval action) into the ApprovalIdentifier field. This gives us a persistent link between the SharePoint row and the approval record.
Action 3 – Tag the approval source (Dataverse)
Use the Update a row action on the Dataverse Approvals table to set the msdyn_flow_approval_source column to EquipmentFunding. This source tag will be used by the second flow to filter only the approvals that originated from this process.
That’s it – the first flow finishes in a few seconds. The approval now lives in Dataverse, and the SharePoint item has its identifier.
Flow 2 – Approval Outcome Collection
The second flow is triggered by changes to the Approvals table. It never waits; it simply reacts when an approval is completed.
Trigger – When a row is added, modified or deleted (Dataverse)
- Table: Approvals
- Scope: Organization
- Select columns:
statuscode,msdyn_flow_approval_source,msdyn_flow_approvalid - Filter rows:
The valuetextFilter condition for completed approvals
msdyn_flow_approval_source eq 'EquipmentFunding' and statuscode eq 192350004
192350004is the option set ID for Completed. (The exact number may vary in your environment – verify it by inspecting the Approvals table schema.)
Action – Get items from SharePoint Use the Get items action on the EquipmentFundingRequests list with the filter query:
ApprovalIdentifier eq '@{triggerOutputs()?['body/msdyn_flow_approvalid']}'This retrieves the exact SharePoint item that owns the completed approval.
Condition – Approve or Reject Inside the Apply to each loop (required because Get items returns an array), check the approval outcome.
If the approval result is Approve:
- Update the SharePoint item using its ID:
SettextGet the SharePoint item ID
first(outputs('Get_items')?['body/value'])?['ID']RequestStatusto Approved.
If the result is Reject:
- Set
RequestStatusto Declined.
The second flow now finishes. The entire approval lifecycle has been handled without ever exceeding the 30-day timeout.
Testing the Solution
-
Create a new item in the SharePoint list, e.g.:
- Title: CNC Machine Upgrade
- Amount: $45,000
- Requester: John Doe
-
The first flow triggers instantly, creates the approval, and writes the identifier back to the list item. The approval appears in the Approvals Center under the recipient’s pending items.
-
Wait – days, weeks, or months – then approve or reject the request.
-
As soon as the approval is completed, the second flow runs, reads the matching SharePoint item, and updates the status accordingly.
Common Mistakes & Troubleshooting
- Missing source tag – If you forget to update
msdyn_flow_approval_sourcein Flow 1, the filter in Flow 2 will never match and the second flow won’t run. - Wrong statuscode value – The option set ID for Completed (
192350004) can differ between environments. Always check the actual value in the Approvals table. - Column selection omitted – The Dataverse trigger requires you to explicitly select
statuscode,msdyn_flow_approval_source, andmsdyn_flow_approvalidin the “Select columns” field. Omitting them will cause the filter to fail. - SharePoint filter not returning rows – Ensure the
ApprovalIdentifiercolumn is a single line of text and that the value in the filter is a plain string. The dynamic expressiontriggerOutputs()?['body/msdyn_flow_approvalid']returns a GUID, so it should match exactly.
The SharePoint Get items filter on a text column is delegated, so this pattern works even with large lists. No delegation issues here.
Recommendation
Use the two‑flow pattern whenever your approval process can realistically exceed 30 days. It is simple, uses only standard connectors (SharePoint, Dataverse, Approvals), and imposes no artificial time limits. The only additional work is maintaining a source tag to link the two flows together.
References
- Original article that inspired this approach: Extend A Power Automate Approval Over The 30 Day Limit – Matthew Devaney
- Microsoft documentation on Power Automate limits: Limits and configuration
- Approvals table schema (Dataverse): Microsoft Learn – Approvals table reference (verify the link for your environment)