LowCodeStacks™
Sign in

Canvas app performance: find what's slow and fix it at the source

The documented causes behind slow canvas app performance — OnStart bloat, N+1 queries, cross-screen references, collection abuse — how to find each with Monitor and App Checker, and the fix Microsoft recommends.

Power AppsFix a problem3 min read

Checked against Microsoft Learn · 5 sourcesPosted by the Maker DeskHow we write guides

Slow canvas apps are rarely slow for mysterious reasons — Microsoft's performance documentation names the same handful of patterns again and again. This guide maps symptom to cause to documented fix.

Measure first

Two built-in tools turn "it feels slow" into a diagnosis:

  • Monitor logs every data call and key activity as the app runs — including a session attached to a phone, so field-reported slowness can be seen rather than imagined.
  • Performance insights and App Checker in Studio flag known anti-patterns; cross-screen references surface under "Inefficient Delay Loading".

Fix what the trace shows, not what a checklist guesses — and when a fix lands, re-measure the same journey so the claim "it's faster now" belongs to evidence someone actually gathered.

Fix the start

App.OnStart is imperative: everything in it must finish, in order, before the first screen appears. Microsoft's guidance:

  • Move variable setup to named formulas, which load lazily and don't block the first paint.
  • Replace Navigate inside OnStart with App.StartScreen — declarative, and it lets the first screen show before OnStart completes.
  • Defer heavy data loading to a non-blocking step after the screen is visible.
powerfx
// Instead of:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))

// Declare the start screen and let it paint:
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)

Hunt the data patterns

The three documented heavyweights:

  • Select N+1: a gallery whose rows each fire a LookUp turns one screen into dozens of calls. Watch Monitor for repeated calls to the same source; fix by batching into one query, using a view that already includes the related columns, or reshaping the data so the join happens at the source. Microsoft's example case cut a five-minute load to under ten seconds by fixing the join at the source.
  • Collections as a crutch: ClearCollect of a large table blocks the UI until every row lands. Collections are for small data you compute against repeatedly (a basket, not a backlog); read-only data belongs directly in the gallery's Items, delegated to the source. Delegation itself is its own discipline — our delegation cheat sheet covers which functions push work to the server.
  • Power Automate as a data loader: each flow call costs roughly 0.6 seconds just to start, before any work happens. Microsoft is blunt that the worst-performing apps overuse this; query the source directly, or move server-side logic into Dataverse views or low-code plugins that return finished results.

Remove cross-screen references

A label on Screen A reading a control on Screen B forces Power Apps to load both screens before A appears — multiplied across an app, that's the "every screen is slow" signature. The documented cure: hold shared state in variables or collections, pass values through navigation parameters, and keep each screen self-contained. On phones this also fights memory-driven app restarts, which Microsoft ties directly to how the app is authored.

The performance loop
  1. Trace with Monitor
  2. Fix the top pattern
  3. Re-measure the same journey
  4. Repeat until the trace is boring

Don't

  • Don't Patch rows one by one in a loop — bulk-patch a collection of changes.
  • Don't ship media-heavy screens untested on the oldest device your users carry.

Sources

Did this fix it?

Comments

No comments yet. Share what worked for you.

Sign in to comment. Comments show under a display name you choose, never your email.