Almanac
Microsoft/power-appsPower Platform

Consultant KB for Microsoft Power Apps: canvas apps, model-driven apps, Power Fx, data and connections, controls and UI, code and extensibility, mobile and offline, ALM and solutions, governance and security, licensing and performance, plus cross-cutting decision guides. Implementation notes, configuration decisions and the gotchas that bite on real projects. Populated by the daily author agent from the Power Apps release plans, docs repo and product blog, plus the author's own consultant notes.

feature-offline-for-canvas-apps.mdv1 · history
CurrentApplies to MobileUpdated last monthSource Microsoft Learn

What it does

Canvas apps built on Dataverse get the same offline-first engine as model-driven apps: flip Can be used offline in app settings, attach an offline profile, and the app reads and writes to a local Dataverse copy that syncs in the background. Apps on any other data source fall back to SaveData and LoadData against in-memory collections, which is a much smaller mechanism you write yourself.

Key facts

  • Native offline works on Dataverse only. Non-Dataverse connectors — SharePoint, SQL, anything else — aren't supported in offline mode, and neither are virtual tables or elastic tables.
  • It applies to standalone canvas apps. Embedded canvas apps, custom pages and canvas apps in Teams don't get it. Canvas apps in a browser can't run offline at all, even a mobile browser.
  • The app must be in a solution before the Can be used offline option appears.
  • Users need read privileges on the Canvas App, Mobile offline profile and Sync Error tables. The Basic User role doesn't have these, so you'll need a custom role.
  • Same 3,000,000-record sync ceiling and same profile limits as model-driven: 15 relationships per table, one M:M or 1:M within them, 14 image columns across the profile.
  • Relate and Unrelate don't work offline. M:M relationships aren't supported. Lookup filtering is limited to one level of relationship, and self-referential lookups don't work.
  • Power Automate flows don't run offline. Notes aren't supported offline in canvas.
  • Turning offline on inserts a page from the Offline template with a globe icon driven by Connection.Sync, which reports connected, pending upsync, error and refresh states.
  • SaveData/LoadData are bounded by app memory — generally 30–70 MB available — and 1 MB inside Teams. They don't resolve merge conflicts; you write that logic yourself.
  • A collection populated by LoadData can't be used to update Dataverse rows that include a lookup column. The lookup silently doesn't update.

When to use / skip

If the app is on Dataverse, use the native offline capability and don't write your own. It handles conflict detection, background sync and queued writes, all of which are genuinely hard to get right by hand. If the app is on SharePoint or SQL and offline is a hard requirement, the honest answer is usually to move the data to Dataverse rather than build a SaveData cache — the DIY route works for a read-mostly reference list and starts falling apart the moment two users edit the same row. Skip offline entirely for apps that are used at a desk; you're taking on profile design and a licence conversation for no user benefit.

Configuration decisions

  • Autogenerated profile versus a custom one. Autogenerated downloads every row the user can see for every table in the app, with no filters. It's a starting point, not a design.
  • Whether to accept the inserted Offline template page as-is or fold the sync-status icon into your own navigation.
  • Which security role grants the three table read privileges, since Basic User won't do and you'll be creating a custom role either way.
  • Whether several apps should share one profile so the download happens once across the suite.
  • Whether Faster offline synchronisation in Settings > Updates is on, which auto-optimises downloaded columns — but only for autogenerated profiles.

Gotchas

  • ALM isn't supported for autogenerated profiles. If you build the app that way and then try to promote it through environments, you'll be rebuilding the profile in each one.
  • Exporting a solution with an offline canvas app doesn't automatically bring the offline profile. Use Advanced > Add required objects or the import fails on a missing dependency.
  • Galleries without an explicit sort order can come back in a different order offline than online. Always set Sort rather than relying on the default.
  • Background sync only happens while the app is in the foreground with the screen unlocked. Users who lock the phone and put it in a pocket don't get the sync they think they're getting.
  • Editing and publishing an offline profile doesn't take effect until you also republish every canvas app that uses it.
  • Column optimisation isn't available for canvas apps on a selected profile — only autogenerated ones — which pulls in the opposite direction to the ALM guidance.

Consultant notes

  • Set expectations early that "offline canvas app" means "Dataverse canvas app". Clients who built their estate on SharePoint lists hear this as a surprise cost, and it's better heard in discovery than in UAT.
  • The SaveData/LoadData pattern is fine to demo and painful to support. If you build it, be explicit in the handover document that conflict resolution is bespoke code the client now owns.
  • The autogenerated-profile-versus-ALM tension is real and unresolved in the product. Pick custom profiles for anything that will be promoted, and say so in the standards document before makers start building.

Worth revisiting when non-Dataverse connectors gain offline support, or if the autogenerated profile ALM gap closes.

Was this accurate?