Understanding Power Automate flow performance

In this post I’m looking at performance of Power Automate flows. For some flows this may not really matter too much, however when you have a need to high performance flows the findings in this post may be quite important. To make your flows perform well, it is important to understand where time is wasted.

A simple flow

I will first have a look at the simplest of flows. A manual flow with a single action following a manual trigger.

Performance of a simple Power Automate flow
Performance of a simple Power Automate flow

When we run the above flow we ill see that the initial flow run is slow, nearly 0.5 seconds and following runs are faster. When updating the flow and then running the flow again there may also be a slight delay in running the flow. Running this flow however should take less than 0.1 seconds.

Flow runs showing flow runs taking 0.07 seconds
Flow runs showing flow runs taking 0.07 seconds

Functions

Now if we make our Compose action a bit more complicated then we will see that there is no real impact on the performance of our flow.

Using functions in actions
Using functions in actions

And even if we recreate the same as the above with three Compose actions rather than nested functions the performance will remain the same. The multiple actions is actually slightly faster, but nothing to really worry about.

Splitting the functions across multiple actions
Splitting the functions across multiple actions

When we have larger flows we might want to keep the number of actions down as there are Power Automate limits that we have to consider. However the limit of 500 actions per flow should be avoided anyway, if you want to keep your flow maintainable.

Calling a Child Flow

If we now add a Respond action to our flow we have a flow that can be used as a child flow.

A child flow
A child flow

Then as we create a parent flow that calls the above flow.

Flowchart diagram showing two actions: 'Manually trigger a flow' and 'Run a Child Flow', connected by an arrow.
Understanding Power Automate flow performance 1

We will now find that our parent flow runs within 0.25 seconds

Screenshot of a workflow management interface displaying details about the 'Parent Flow', including owner, status, creation and modified dates, type, and plan. It also shows a 28-day run history with durations and success status of various runs.
Understanding Power Automate flow performance 2

While the child flow runs within 0.07 seconds.

Log table displaying test start times, durations, and statuses, with successful tests highlighted.
Understanding Power Automate flow performance 3

As we now have two flows running to do the same thing as our original flow there is a slight delay. But from a maintainability perspective I would always recommend to use child flows where possible.

Apply to each

Now when we run the Child flow 100 times we will see some more interesting timeframes. When an apply to each runs 100 iterations where the same child flow is called again, our flow will run in about 25 seconds. While each child flows run time is 0.07 seconds. Therefore it looks like there are about 18 seconds getting lost in the Apply to each or the calling of the child flow.

Flowchart illustrating a process with steps: 'Manually trigger a flow', 'Apply to each', and 'Run a Child Flow', with time indicators for each step.
Understanding Power Automate flow performance 4

If we now run the same parent flow but rather than calling a child flow we will run a simple compose action then the flow runs in 11 seconds. The difference … Our Run a child flow action needs to call an API whereas the Compose just sets some data in memory which will be a lot faster.

A flowchart illustrating a process in a workflow automation tool. It shows a step to manually trigger a flow, followed by an 'Apply to each' action for a range of items (1 of 100), leading to a 'Compose' action.
Understanding Power Automate flow performance 5

Now we can improve the performance a bit here, by enabling the concurrency on the Apply to each step.

Settings panel for 'Apply to each' action in a flow, displaying options for concurrency control and degree of parallelism, alongside a visual representation of the flow with 'Manually trigger a flow' and 'Compose' actions.
Understanding Power Automate flow performance 6

This will result in the above flow running in 1 second.

Flowchart illustrating a process with a 'Manually trigger a flow' action followed by 'Apply to each' for a range of 1 to 100, concluding with a 'Compose' action.
Understanding Power Automate flow performance 7

That is 10 seconds gained very quickly. And do remember Pieter’s method if you want to run the above and generate an array. Although a single Select action can also often be a great option to make your data transformations be super fast.

Diagram showing two process blocks: one labeled 'Manually trigger a flow' with a check mark, and another labeled 'Select' also with a check mark.
Understanding Power Automate flow performance 8

Back to running a child flow in an apply to each step. With concurrency on that flow also runs within 1 second, running 100 iterations. As we saw earlier concurrency can really make a difference, however concurrency can also slow things down. Always review the connector limits for the actions used within the apply to each.

Using an API

The next thing to look at is APIs. So far I’ve limited the use of APIs. But in the following test I’m going to use the SharePoint connector which will use the SharePoint APIs to collect the lists on a site. I’ve disabled concurrency so that it is easier to measure the differences within my tests.

Flowchart illustrating a manual trigger followed by an 'Apply to each' action and a 'Get lists' action in a workflow automation tool.
Understanding Power Automate flow performance 9

Calling the SharePoint API 100 times takes 20 seconds. The first time the SharePoint action is called the action is a lot slower than any following SharePoint APIs. Does anybody remember the SharePoint warm-up scripts that we used in the on-premises versions of SharePoint?

Flow diagram showing the steps to manually trigger a flow, followed by an 'Apply to each' operation, and a 'Get lists' action with timing indicators.
Understanding Power Automate flow performance 10
Number of iterationstime (seconds)rate (iterations per second)
100254
10003113.2
1000048002

As we increase the concurrency and the number of iterations in the apply to each, I’m going to push the SharePoint API a bit more.

As we can see in the above table the longer an apply to each runs the slower it becomes. But this could be part of the API slowing us down. Even though we don’t get any 429 errors in any of the above flow runs.

Sequential vs Parallel

Now we can still put the API further under pressure by building parallel branches. With a concurrency of 50 on each of the below branches, we are running up to 150 SharePoint actions at the same time.

Flow diagram showing a manual trigger at the top, leading to three separate branches labeled 'Apply to each', each executing a 'Get lists' action.
Understanding Power Automate flow performance 11
Number of iterationstime (seconds)rate (iterations per second)
3x 100012242.45
1x 2002100
3x 2005120
6x 2003084 (some 429s occured)
9x 2006093 (more 429 error

The throttling limits for the SharePoint connector are well documented. You can only run 600 calls within 60 seconds. If you make more than 600 calls within 60 seconds you are likely to receive 429 throttling errors and when the flow doesn’t slow down you will see some503 failures too. In the above example I created a flow with three parallel branches, but you could create the same issues by calling many child flows. Many flow runs that run at the same time will have a similar affect.

From the above examples you can se that processing more calls in parallel will improve the performance, however once the throttling limits are hit we get a strong slow down of the process. Always try to avoid the throttling in your processes. However it is not always straight forward.

Flowchart illustrating a process with a manual trigger and two parallel branches accessing different lists.
Understanding Power Automate flow performance 12

Child flows however do give you the opportunity to debug/rerun a single flow run. Hence it may help to split the heavy load across child flows.

Local vs global

When you create a Power Platform environment you can create this is various locations across the world. Imagine that you tenant lives within the UK and you create a flow in an environment in Australia. The data will have to travel further.

Now it might be obvious When you access SharePoint data but how about other connectors? where does your cloud based data really need to come from?

Similar as before, I created a flow in an environment located in Japan while my tenant is in the UK. The action that took earlier very little time, now doesn’t complete in less than 1 second. rather than a tenth of that time.

Flow diagram showing two steps: 'Manually trigger a flow' and 'Get lists', with arrows indicating the process flow and time indicators for each step.
Understanding Power Automate flow performance 13

Payload

The next set of texts are about the amount of data that we are receiving form a connector. I’m going ot use the get items action in the SharePoint connector. In my flow below I’m going to collect 200 times the items from a list.

Flowchart illustrating a process with a 'Manually trigger a flow' action, followed by an 'Apply to each' action, which leads to a 'Get items' action.
Understanding Power Automate flow performance 14

The Get items will return 100 items by default. The performance that you may get will depends on the type of content that you are collecting. A list with 200 columns will be slow than a list with one column of course. In the following test I am varying the number of items by setting the count within the action.

Items returnedTime ( seconds)Rate ( items per second)
200x 10036666
200x 1000728571
200x 20001040000

So if you need to read a lot of items reading them in one go is faster than reading the items in multiple goes. In general reducing the number of API calls will help to make your flow perform better.

If however you read all items before using filter array to get the required item(s) then you are wasting a lot of time.

Delegation

Delegation is a big subject in Power Apps. Power Apps even gives you clear warnings when you make delegation errors. How about delegation in Power Automate?

I’m going to start with a simple query to collect a limited set of items from my actions list.

Screenshot of a Power Automate flow configuration showing parameters for 'Get items' action, including site address, list name, filter query, order by, and other advanced settings.
Understanding Power Automate flow performance 15

So the flow is now returning 200x 1 item with a concurrency set to 50. This happens in about 2 seconds. This shows again that payload is hardly making a difference. returning 1 item or 100 items takes the same amount of time. Making a larger number of API calls is really what is slowing our flows down.

I’m going to set my concurrency back to 1 and the apply to each is going to only run 100 times.

QueryTime (seconds)Comment
No query set172Returns 2500 items.
Title eq ‘…’24 This only returns 1 item
Title ne ‘…’167Returns 2500 items.
ContentType eq ‘Item’ (According to the documentation this is not delegable)170Returns 2500 items.

So far I’ve not hit the delegation limits, even when I repeat the above tests on lists with over 5000 items. However using a flow to collect data for Power Apps may not be a good idea as you will need to pull all that data into the app.

Summary

Findings so far:

  • Reduce the number of API calls where possible. This is both through a connector and directly towards the API.
  • Be careful not to his throttling limits, either by running too many parallel branches or multiple flows.
  • Be aware of actions that have slow API calls and fast API calls.
  • Keep your environments local to your data
  • Finally, a lot may be trial and error. So don’t be afraid to try out various options.

Where do you find that your flows are performing slowly? Any overnight flows that run out of time?

Avatar of Pieter Veenstra

Is your business still running on paper trails, sprawling Excel files, or ageing Access databases? There's a better way — and I can show you exactly what it looks like. I'm the Technical Director of Vantage 365, a Microsoft solutions consultancy working with clients across the UK, the Netherlands, and worldwide. For over 30 years I've been turning messy, manual business processes into clean, automated systems that save time, reduce errors, and give teams the visibility they need to make better decisions. You can contact me using contact@sharepains.com

Related Posts

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from SharePains

Subscribe now to keep reading and get access to the full archive.

Continue reading