Tracking Down Sprawl in Power Automate Flows
How to make uncontrolled Power Automate sprawl visible again using inventory, analytics, and the CoE Starter Kit.
Three levers for faster Power Automate flows: targeted parallelism, fewer actions, and the right connector choice, according to Microsoft's documentation.
A Power Automate flow that takes minutes for a task that could really be done in seconds doesn't just cost time. It burns through unnecessarily many of your plan's limited action requests, drives up timeout errors in downstream systems, and makes troubleshooting harder because every run has to work through more steps. The good news: most performance problems in Power Automate come down to three levers, which Microsoft documents in detail in its own coding guidelines. As of: July 2026.
This article summarizes how targeted parallelism, cutting unnecessary actions, and the right connector and data choices help you build noticeably faster flows, based on the official Microsoft documentation for Power Automate. That way you stay in control of which lever has the biggest effect on your specific flow, instead of randomly turning dials that barely change anything.
Before you optimize, it's worth looking at the root cause. According to the guidance on Discovering performance issues many slowed-down flows simply hit their daily Power Automate limits. The action analytics in "My flows" show you how many action requests a flow actually consumes, and Power Automate even emails owners when a flow repeatedly runs into action limits. Just as important: the connected services themselves also enforce protection limits, which show up in your flow as error 429 (too many requests) or 5xx (timeout). These limits differ by connector and service, which is why the exact same flow logic can perform very differently on SharePoint than on Dataverse or an external API.
According to the guidance on parallel execution and parallelism parallel branches pay off whenever two or more actions don't depend on each other and each individually takes longer than five seconds. According to Microsoft, typical use cases are non-blocking approval requests, quorum-based approval processes, simultaneously creating or updating records across multiple systems, and initializing multiple variables in parallel.
The effect becomes even clearer in loops. By default, an Apply to each loop works sequentially, item by item. The documentation shows, using a test array with four entries, just how much this shortens with parallelism:
You can set the degree of parallelism between 1 and 50. Important: a high number doesn't automatically make everything faster, because splitting up the work, queuing additional threads, and delays from the called endpoint itself create overhead of their own. Nested Apply to each loops also always run sequentially — according to Microsoft, the parallelism setting only applies at the top level of the cloud flow.
At the trigger level, you can additionally enable a concurrency control which sets how many instances of a flow may run at the same time; it's off by default. It helps with data sources that have limited throughput and prevents so-called dirty reads, where a flow keeps working with stale data because a parallel run changed the record in the meantime. However, Microsoft explicitly recommends caution: once enabled, the setting can't be reversed — only by recreating the trigger. As a best practice, the documentation recommends applying concurrency control only to a dedicated child flow with as few actions as possible, rather than to the entire main flow.
The guide on anti-patterns in cloud flows names nested Apply to each loops as one of the most expensive traps. Two loops with ten iterations each work out to 100 runs; with larger data volumes, this number grows exponentially and quickly hits the limits for iterations and total execution time. The documented alternative: use OData query expansion to load related records within a single query, instead of fetching them in a second, inner loop. A parameter like Products($select=ProductName,Price) replaces the entire inner loop with a single additional RetrieveMultiple call to Dataverse.
Many flows start on every change to a data source, even though only a fraction of the runs are actually relevant. A trigger condition, checked directly at the trigger, prevents these superfluous runs from happening in the first place, instead of catching them with an internal condition only after the flow has already started. That saves not just time, but also the action requests that would otherwise be consumed on every irrelevant run.
According to the documentation, if you need to create or update hundreds or thousands of records, you shouldn't process each record individually in a for-each loop. Batch operations combine several requests into a single HTTP request, while bulk operation web APIs in Dataverse go a step further: instead of many individual "Create row" actions, a single call to the CreateMultiple web API with 100 prepared records counts as just one action.
According to the guide Work only with relevant data the amount of data processed can be limited both at the trigger and at individual actions. For Dataverse sources, the parameters Select columns, Filter rows and Row count reduce the result set directly at the source. For SharePoint, Filter query, Top count and Limit columns by view serve the same purpose. This matters because so-called throughput limits cap how much data volume a cloud flow may read and write from its run history within a given period. If this limit is exceeded continuously for 14 days, Power Automate automatically turns the flow off.
Choosing the right connector also means not automatically reaching for the most resource-intensive action for the same task. For example, data operations like Filter array, Select or Join process arrays directly and reduce the amount of data flowing through subsequent steps, often much more efficiently than an extra loop with conditions. Where a service offers native filter or selection parameters in the connector itself, Microsoft's documentation says it's more efficient to filter there instead of first loading the entire data volume into the flow and then reducing it with a separate data operation.
The fastest way to find the actual root cause is with a fixed checklist. First, open the action analytics for the affected flow and check whether it's running close to its daily limits. Then check the run history for individual actions with unusually long runtimes — these are usually loops without parallelism, or actions loading unnecessarily large amounts of data. Also check whether errors of type 429 or 5xx show up, which point to limits from a connected service rather than Power Automate itself. For larger flow landscapes with several environments, structured Power Automate consulting is often worthwhile, going through parallelism, data volume, and connector choice systematically for all critical flows at once, instead of optimizing each flow individually.
There's no universal best value — Microsoft allows a degree of parallelism between 1 and 50. In the documented example measurement with four items, a parallelism of 4 already delivered the maximum speedup; increasing it further to 6 made no further difference to the runtime. In practice, it pays to start with a moderate value like 5 to 10 and watch the runtime in the run history, rather than setting the maximum value right away, because excessive parallelism can itself create delays caused by the called endpoint.
Not automatically — Microsoft actually recommends restraint. The default setting without concurrency control allows as many simultaneous runs as the system can handle, which is already performant enough for most scenarios. Concurrency control mainly makes sense when a connected resource can only handle limited throughput or when dirty reads need to be prevented, not as a general speed-up measure. Since the setting can't be reversed, you should only apply it deliberately to a small, dedicated flow.
Because the number of runs multiplies instead of adding up. Two loops nested inside each other, each with ten items, result in 100 individual runs; with larger data volumes, this number keeps growing exponentially. That not only costs time, it also quickly pushes the flow toward the limits for iterations and total execution time, which in the worst case leads to flow errors or throttling.
Connectors often offer filter and selection parameters with different levels of granularity directly at the data source. A connector that already supports filtering, column selection, and a maximum row count at the trigger or action reduces the amount of data processed before it even reaches the flow. That has a direct effect on the throughput limits and lowers the risk that a flow gets throttled because of excessive data volume, or even automatically turned off after a sustained breach.
A look at the error codes in the run history gives you the answer. Errors of type 429 or timeouts in the 5xx range point to protection limits of the connected service, which vary by connector. If, on the other hand, Power Automate itself reaches its daily action requests, the action analytics in "My flows" show this clearly, and owners also receive an automatic notification with tips on reducing the number of actions.
Founder of NordFlux. Spent four years automating processes at enterprise scale at Dräger, and now brings that depth to the mid-market — pragmatic and with full data sovereignty.
Certifications
How to make uncontrolled Power Automate sprawl visible again using inventory, analytics, and the CoE Starter Kit.
A minimal documentation standard for Power Automate flows: description, naming conventions, and notes, so knowledge doesn't depend on one person.
How to reliably back up and restore Power Automate flows via solution export, according to Microsoft's documentation.
Parallelism, unnecessary actions, or the wrong connector choice noticeably slow down many flows. NordFlux analyzes your slow flows in a targeted way and applies the right levers so processes run in the expected time again.