Tutorials/Power Automate/Architecting Long-Running Approvals in Power Automate (No 30-Day Limit)
Power Automateintermediate

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.

NA
Narmer Abader
@narmer · Published June 3, 2026

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 NameTypePurpose
TitleSingle line of textShort description of the equipment
AmountCurrencyTotal cost
RequesterPerson or GroupThe person who submitted the request
RequestStatusChoice (InReview, Approved, Declined)Tracks the lifecycle of the request
ApprovalIdentifierSingle line of textLinks 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.

TriggerWhen 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.

TriggerWhen a row is added, modified or deleted (Dataverse)

  • Table: Approvals
  • Scope: Organization
  • Select columns: statuscode, msdyn_flow_approval_source, msdyn_flow_approvalid
  • Filter rows:
    textFilter condition for completed approvals
    msdyn_flow_approval_source eq 'EquipmentFunding' and statuscode eq 192350004
    The value 192350004 is 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:

textFilter by Approval ID
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:
    textGet the SharePoint item ID
    first(outputs('Get_items')?['body/value'])?['ID']
    Set RequestStatus to Approved.

If the result is Reject:

  • Set RequestStatus to Declined.

The second flow now finishes. The entire approval lifecycle has been handled without ever exceeding the 30-day timeout.

Testing the Solution

  1. Create a new item in the SharePoint list, e.g.:

    • Title: CNC Machine Upgrade
    • Amount: $45,000
    • Requester: John Doe
  2. 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.

  3. Wait – days, weeks, or months – then approve or reject the request.

  4. 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_source in 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, and msdyn_flow_approvalid in the “Select columns” field. Omitting them will cause the filter to fail.
  • SharePoint filter not returning rows – Ensure the ApprovalIdentifier column is a single line of text and that the value in the filter is a plain string. The dynamic expression triggerOutputs()?['body/msdyn_flow_approvalid'] returns a GUID, so it should match exactly.
Delegation

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