#PowerPlatformTip 117: 'Optimize Parallel Object Processing'
TL;DR: “Apply to each” runs at most 50 iterations in parallel. To go beyond that, hand each item to a child flow that responds right at its start, or write the items to a table and let a second flow process each new row in its own run.
💡 Challenge
Processing many items in Power Automate’s “Apply to each” can be slow. Even with concurrency on, you’re capped at 50 parallel iterations, so later items wait for a slot to free up.
✅ Solution
Move the slow work out of the loop into separate flow runs. Either call a child flow per item that answers immediately with “Respond to a PowerApp or flow” and then keeps working, or write each item to a database table and let a second flow process every new row.
flowchart LR
subgraph O1["Option 1: child flow per item"]
A1["Apply to each item"] --> A2["Run a Child Flow"] --> A3["Child responds first,<br/>then processes the item"]
end
subgraph O2["Option 2: database fan-out"]
B1["Apply to each item"] --> B2["Write item to a table"] --> B3["Second flow triggers<br/>on each new row"]
end
🔧 How It’s Done
1. Turn on concurrency in the loop
🔸 In Apply to each > Settings, turn on Concurrency control and set the degree of parallelism (default 1, maximum 50).
2. Option 1: a child flow that responds first
🔸 Create a child flow in the same solution with the Manually trigger a flow trigger and an input for the item (for example its ID).
🔸 Put Respond to a PowerApp or flow directly after the trigger, before the time-consuming steps. Actions after the response keep running in the child’s run.
🔸 In the parent loop, call it with Run a Child Flow. Each iteration ends as soon as the child has responded, so the loop moves on and many child runs work at the same time.
🔸 If the child flow uses connections other than built-in actions or Dataverse, set Run only users to Use this connection for each of them; child flows only support embedded connections.
3. Option 2: write to a table, process per row
🔸 Inside the loop, only write each item to a table (Dataverse or a SharePoint list), with a status column such as Pending.
🔸 A second flow with When a row is added (or When an item is created) processes each item in its own run and sets the status to Done or Failed. Leave the trigger’s concurrency control off unless you need to limit it; when on, it allows 1 to 100 parallel runs (default 25).
🔸 The table doubles as a log: failed items stay visible and can be processed again.
🎉 Result
The parent flow finishes its loop quickly, and the items are processed in many parallel runs instead of at most 50 at a time.
🌟 Key Advantages
🔸 Speed: far less time to process large item counts.
🔸 Scale: parallel processing beyond the 50 parallel iterations of a loop.
🔸 Control: with the table approach, every item has a status you can check and retry.
⚠️ Good to Know
🔸 Throttling still applies. More parallel runs means more requests at the same time. Connectors have their own limits per connection (for example 100 calls per 60 seconds for OneDrive for Business, see the connector’s Throttling Limits section), and your license sets the Power Platform requests per 24 hours. Flows that are consistently throttled for 14 days are turned off.
🔸 Licensing: a child flow doesn’t inherit Process license capacity from its parent’s flow group. Add both to the same flow group if you rely on that capacity.
🔸 No result in the parent: after an early response, the parent only gets what the child returned at that moment, not the final outcome. Use Option 2 or a status table if the parent needs to know when all items are done.
🎥 Video Tutorial
🛠️ FAQ
1. How do I set concurrency in Apply to each?
In the Apply to each action, open Settings, turn on Concurrency control and set the degree of parallelism. The default is 1, the maximum is 50.
2. Does a child flow per item bypass the 50-iteration limit?
Only if the child flow answers early. The parent waits in each iteration until the child responds, so with Respond to a PowerApp or flow at the start of the child, the iteration finishes right away and the child keeps working in its own run.
3. How do I handle errors in child flows?
Once the child has responded, the parent no longer sees its errors. Use scopes and configure run-after settings inside the child flow, log failures to a table or send a notification, and resubmit failed runs later.
🔗 Related Tips
- #PowerPlatformTip 75: Boost Efficiency with Concurrency Control, tune the Apply to each concurrency setting.
- #PowerPlatformTip 131: ForAll & Patch Optimization in PowerApps, optimise bulk item operations.
This tip is by Marcel Lehmann, Microsoft MVP (Business Applications) and founder of the Power Platform Academy – live Power Platform workshops, free or CHF 49. Join the workshop waitlist to get notified about new dates. For companies that want this implemented for them, see KMUpower – Power Platform consulting & automation for SMEs (DACH).