Power Apps: Canvas vs Model-Driven, Delegation, and Performance Guide

Microsoft Fix Intermediate 14 min read Official Docs Grounded Updated April 20, 2026

Why This Is Happening

If you've opened Power Apps for the first time and stared at the screen wondering whether to pick a canvas app or a model-driven app , or if your app suddenly started showing a blue delegation warning banner and half your records disappeared , you're not alone. I've seen this exact confusion on dozens of projects, from small businesses running a SharePoint list to enterprise teams on Microsoft Dataverse with millions of rows.

Power Apps is a suite of apps, services, connectors, and a data platform that gives you a fast path to building custom business apps. That's the official line, and it's accurate. But what the marketing page doesn't tell you is that choosing the wrong app type upfront, or ignoring that little yellow delegation warning in the formula bar, can turn a two-day project into a two-week debugging nightmare.

The core tension in Power Apps development comes down to three things that trip people up constantly:

  • Canvas vs Model-Driven: These are genuinely different tools built for different scenarios, and Microsoft doesn't make the distinction obvious until you're already deep into building the wrong one.
  • Delegation: Power Apps offloads filter and sort operations to the data source when it can. When it can't, because the formula or connector doesn't support it, it pulls only the first 500 (or up to 2,000) records to the device and filters locally. If your list has 5,000 rows, you'll silently get wrong results with no error message. Just a blue banner that most people ignore.
  • Performance: Canvas apps in particular are sensitive to how many controls you put on a screen, how many connectors you call on app load, and whether you're using concurrent functions or blocking sequential calls.

What makes this especially frustrating is that Power Apps error messages are often vague. The delegation warning doesn't tell you which records are missing. A slow app doesn't tell you which formula is the bottleneck. And the canvas vs model-driven decision screen doesn't explain the actual architectural trade-offs in plain language.

I know this is frustrating, especially when it blocks a real deadline. This guide walks through every layer: what each app type actually means, how to fix delegation so your queries return the right data, and how to diagnose and fix the performance issues that show up once your app gets real users.

Browse all Microsoft fix guides →

The Quick Fix, Try This First

If you landed here because your Power Apps gallery is not showing all records and you're seeing a blue banner that says "Delegation warning", here's the fastest fix that resolves the majority of cases.

The issue: your Filter() or Search() formula is running a comparison that your data source can't execute server-side. Power Apps falls back to local filtering on a capped record set.

Immediate fix for SharePoint or Dataverse sources:

  1. Open your canvas app in Power Apps Studio (make.powerapps.com → your app → Edit).
  2. Click the gallery control. In the formula bar, look at the Items property.
  3. If you see something like Filter(MyList, Status = "Active" && StartsWith(Title, SearchInput.Text)), the StartsWith part is delegable to SharePoint but string comparisons with Text type columns may not be, depending on your connector version.
  4. Replace non-delegable operations with delegable equivalents. For SharePoint: StartsWith and = on indexed columns are delegable. Search() on text is also delegable. in operator and most string functions like Lower() are not.
  5. Go to File → Settings → Upcoming features → Experimental and raise the Data row limit from 500 to 2000 as a temporary measure while you refactor.
  6. Save and republish (File → Save → Publish to this version).

If the blue banner disappears and your record counts match what you see directly in SharePoint or Dataverse, delegation is now working. If the banner stays, move to the Step-by-Step section, the formula needs deeper surgery.

Pro Tip
Turn on delegation warnings as errors during development. Go to File → Settings → Upcoming features → Experimental and enable "Formula-level error management." This forces you to deal with delegation issues before they reach users instead of discovering them when someone reports missing data in production.
1
Choose the Right Power Apps App Type for Your Scenario

Before you write a single formula, you need to make the right architectural choice. Getting this wrong means rebuilding from scratch. Here's the real-world breakdown Microsoft's docs summarize but don't spell out clearly enough.

Canvas apps give you a blank canvas, literally. You drag and drop controls, position them exactly where you want, and connect to data from over 900 sources: SharePoint, SQL Server, Salesforce, REST APIs, Excel files in OneDrive, you name it. The formula language (Power Fx) is Excel-like, which makes it approachable for non-developers. Canvas apps shine when you need a custom UI, a mobile-first experience, or when your data lives in a non-Dataverse source.

Model-driven apps work differently. You don't design the UI at all, the UI is generated automatically from your data model in Microsoft Dataverse. You define tables, columns, relationships, views, and forms, and Power Apps renders a consistent interface from that definition. Model-driven apps are the right choice when you have complex relational data, need built-in business process flows, want role-based security at the record level, or are building something that needs to scale to thousands of users with server-side logic.

Code apps (the third option in the "Choose an app type" screen) are React-based apps built with the Power Apps Component Framework, that's for pro developers who need full control.

Decision rule: if your data is already in Dataverse or you're building something enterprise-grade with multiple related tables and approval workflows, go model-driven. If you need a custom screen layout, are connecting to SharePoint or an external API, or are building a single-purpose tool, go canvas. Mixing both in a solution is valid and common, a model-driven app can embed canvas app components using the Canvas control.

To start: go to make.powerapps.com → Create → Start from blank, then pick your type. If you see the Plan designer (the new AI-native experience), you can describe what you want in natural language and Copilot will scaffold the tables and screens for you, this is worth trying first for new projects because it sets up Dataverse structure correctly from the start.

Once you select your type and save, you cannot convert between canvas and model-driven. Choose carefully.

2
Fix Power Apps Delegation Warnings and Missing Records

The Power Apps delegation limit is one of the most misunderstood behaviors in the platform. Here's exactly what's happening and how to fix it.

When Power Apps evaluates Filter(DataSource, condition), it tries to send the condition to the server (SharePoint, Dataverse, SQL) to execute there and return only matching rows. That's delegation. When the data source can't execute that specific condition server-side, Power Apps pulls the first N records (default 500, max 2,000) to the device and filters there. You get wrong results silently.

Diagnosing which formula is non-delegable:

  1. In Power Apps Studio, hover over the blue underline in the formula bar. A tooltip will identify the exact function or operator that's non-delegable.
  2. Open the App checker (the shield icon in the left toolbar). It lists all delegation warnings with the screen and control name.

Common non-delegable operations and their delegable replacements:

// NON-DELEGABLE, avoid these in Filter/Search
Filter(Employees, Lower(Name) = Lower(SearchBox.Text))    // Lower() not delegable to SharePoint
Filter(Orders, Len(Notes) > 100)                          // Len() not delegable
Filter(Products, Product in MyCollection)                  // 'in' with collection not delegable

// DELEGABLE, use these instead
Filter(Employees, StartsWith(Name, SearchBox.Text))        // Delegable to SharePoint
Filter(Orders, Status = "Open")                            // Equality on indexed column, delegable
Search(Products, SearchBox.Text, "ProductName")            // Search() is delegable to SharePoint/Dataverse

For Dataverse specifically: virtually all filter operations including Filter, LookUp, CountRows, and Search are fully delegable when the column is indexed. Dataverse is the recommended data source for Power Apps precisely because of this, the delegation story is much stronger than SharePoint.

If you absolutely must use a non-delegable formula, load data into a collection first and filter the collection:

// On App.OnStart or Screen.OnVisible:
ClearCollect(colEmployees, Filter(Employees, Department = "Sales"));

// In Gallery.Items, now filtering a local collection, full dataset loaded:
Filter(colEmployees, Lower(Name) = Lower(SearchBox.Text))

This pattern works only when your filtered-to-collection result is small (under a few thousand rows). Don't try to ClearCollect an entire 100,000-row table.

After fixing, the blue banner should disappear and your gallery record counts should match the source exactly.

3
Connect to Microsoft Dataverse and Configure Tables Correctly

Microsoft Dataverse is the underlying data platform for Power Apps, and using it properly unlocks capabilities that simply don't exist with SharePoint or SQL connections. I've seen teams fight with SharePoint delegation limits for months when switching to Dataverse would have solved the problem in a day.

Dataverse stores data in tables (equivalent to database tables), which have columns, relationships, views, and built-in security roles. It supports server-side business rules, calculated columns, rollup columns, and Power Automate integration natively.

To add a Dataverse connection to a canvas app:

  1. In Power Apps Studio, open the Data panel (cylinder icon in the left toolbar).
  2. Click Add data → Microsoft Dataverse.
  3. Select your environment from the dropdown (make sure you're in the right environment, this is the most common mistake; people add the table from the wrong environment and see no data).
  4. Search for and select your table. Click Connect.

Setting up a new Dataverse table for a canvas app:

  1. Go to make.powerapps.com → Tables → New table.
  2. Name your table. Dataverse will automatically create a primary column (Name by default).
  3. Add columns: click Add column, set the data type (Text, Number, Choice, Lookup, Date, etc.).
  4. For relationship columns (lookups), set the Related table. This enables server-side joins and eliminates the need for manual VLOOKUP-style formulas in your app.

One thing that catches everyone: Dataverse column names in Power Fx use the schema name (like cr4f2_employeeid) not the display name ("Employee ID"). In newer versions of Power Apps Studio, the formula bar autocompletes the display name and maps it correctly, but if you're seeing errors like Name isn't valid, 'EmployeeID' is not recognized, check the actual column schema name in the table editor under Advanced options → Schema name.

// Correct Dataverse formula referencing schema name:
Filter('Employees', cr4f2_department = "Engineering")

// Or use the display name alias (works in newer Studio versions):
Filter(Employees, Department = "Engineering")

Once your Dataverse tables are connected, you'll notice that delegation warnings largely disappear, and queries return the correct full record set regardless of size.

4
Diagnose and Fix Power Apps Performance Problems

A slow Power Apps canvas app almost always comes down to one of three root causes: too many connector calls on app load, sequential (non-concurrent) data loading, or too many controls on a single screen. Here's how to find which one is killing your app.

Step 1, Use the Monitor tool to profile your app:

  1. In Power Apps Studio, go to Advanced tools → Monitor (or press Alt+Shift+M on Windows).
  2. Launch your app from the Monitor window. Every formula evaluation, connector call, and control event is logged with timestamps and duration.
  3. Look for rows with Network type, these are connector calls. Sort by Duration descending. Anything over 2,000ms is a candidate for optimization.

Step 2, Fix slow startup with Concurrent():

The single biggest performance win I see in real-world apps is replacing sequential data loads with Concurrent(). If your App.OnStart looks like this:

// SLOW, runs sequentially, each waits for the previous
ClearCollect(colUsers, Users);
ClearCollect(colOrders, Orders);
ClearCollect(colProducts, Products);

Change it to:

// FAST, all three run in parallel
Concurrent(
    ClearCollect(colUsers, Users),
    ClearCollect(colOrders, Orders),
    ClearCollect(colProducts, Products)
);

On a three-source app load, this alone can cut startup time by 60–70%.

Step 3, Move data loads from App.OnStart to Screen.OnVisible:
Don't load data for Screen 3 during initial app startup. Load it when the user navigates to Screen 3. This makes the first screen appear almost instantly.

Step 4, Reduce gallery render load:
Each row in a gallery renders all its controls. A gallery with 8 labels, 3 icons, and 2 buttons per row, showing 50 rows, is rendering 650 controls simultaneously. Cut it to 3–4 visible fields per row and use a detail screen for the rest. Also enable Gallery → Properties → Delay item loading (Experimental) to defer off-screen row rendering.

After these changes, reload your app in the Monitor tool and compare the startup time. Most apps go from 8–12 seconds down to under 3 seconds with just these four steps.

5
Fix Common Power Apps Configuration and Connector Errors

Beyond delegation and performance, there's a set of configuration errors that show up repeatedly when teams first deploy Power Apps. Here are the ones I see most often, with exact fixes.

Error: "The data source 'SharePoint' returned an error. The response is not valid JSON."
This usually means your SharePoint site URL has a trailing slash or a space, or the list name has been renamed but your connection still references the old name. Fix: go to Data panel → three dots next to the SharePoint connection → Edit, re-enter the site URL without a trailing slash, and re-select the list.

Error: "Connector throttling, 429 Too Many Requests"
Power Apps connectors have call limits. SharePoint standard connector allows around 600 calls per 60 seconds per connection. If your gallery is triggering individual row lookups (anti-pattern), you'll hit this fast. Fix: load related data with ClearCollect once, then use LookUp(localCollection, ...) instead of calling the connector per row.

Error: "You don't have permission to perform this action" on Dataverse
This is a security role issue. In Dataverse, every user needs a security role assigned that grants access to the specific tables your app uses. Fix:

  1. Go to Power Platform admin center (admin.powerplatform.microsoft.com) → Environments → [your env] → Settings → Users + permissions → Security roles.
  2. Find the role assigned to your user (or create a custom one).
  3. Under the role editor, set at minimum Read privilege on each table your app accesses. Match the scope (User, Business Unit, Organization) to what your app needs.
  4. Reassign the role to affected users under Users → [user] → Manage security roles.

Error: "This app isn't working, Contact your administrator"
This generic error in the published app almost always means a connection wasn't shared when the app was shared. Fix: go to make.powerapps.com → Apps → [your app] → Share. Under Data permissions, make sure every connector has Can use checked for the shared users. Republish after saving.

App checker showing "Accessible label" warnings:
These are accessibility errors, controls missing labels for screen readers. Fix each flagged control by setting its AccessibleLabel property to a descriptive string. This also matters for Microsoft 365 compliance in enterprise environments.

After addressing these errors, do a full republish: File → Save → Publish to this version → Publish this version. Tell your users to clear browser cache or reinstall the Power Apps mobile app if they're still seeing old behavior.

Advanced Troubleshooting

When the standard fixes don't work, or you're dealing with an enterprise deployment with hundreds of users and complex Dataverse configurations, these are the deeper diagnostic paths.

Using the Power Apps Test Studio for regression testing:
If your app is in active development with multiple makers, use Test Studio (Advanced tools → Open tests in Power Apps Studio) to create automated UI test cases. Record a test run, define assertions (e.g., "after clicking Submit, the success label is visible"), and run tests on every publish. This catches delegation regressions and broken formulas before users find them.

Analyzing Dataverse performance with Azure Synapse Link:
For apps hitting Dataverse tables with millions of rows, real-time query performance degrades without proper indexing. Microsoft's official documentation points to Azure Synapse Link for Dataverse as the right path for analytics and reporting queries, move heavy read operations to Synapse instead of querying Dataverse directly from your canvas app. This is a significant architectural change but the right call at scale.

Model-driven app performance, server-side customization:
Model-driven app slowness usually traces to poorly written JavaScript web resources, synchronous XrmServiceToolkit calls in form OnLoad handlers, or excessive plugin execution on the server side. To diagnose:

  1. Open your model-driven app in a browser.
  2. Press F12 → Network tab → filter by XHR.
  3. Reload the form. Look for calls to RetrieveMultiple taking over 1,000ms.
  4. In the Power Platform admin center → Dataverse → Plugin trace log, check for plugins executing on your table's Retrieve/RetrieveMultiple messages with execution time over 500ms.

Group Policy and conditional access blocking Power Apps on corporate devices:
In enterprise environments, Azure AD Conditional Access policies can block the Power Apps service endpoint (service.powerapps.com) if the device is not compliant or the user doesn't have an approved license. Symptoms: users see a blank screen or a "You need permission" error that isn't a role issue. Fix path: work with your Azure AD admin to check Azure AD → Enterprise applications → Microsoft Power Apps → Conditional access policies and verify the policy isn't excluding certain device compliance states your users have.

Licensing errors, "This feature requires a Power Apps premium license":
Using Dataverse, premium connectors (Salesforce, SAP, custom connectors), or per-app plans triggers this. The resolution path is in the Power Platform admin center → Billing → Licenses. Assign Power Apps per-user premium licenses to affected users, or check if your Microsoft 365 plan includes Power Apps for Microsoft 365 (which covers only standard connectors and no Dataverse access).

When to Call Microsoft Support
Escalate to Microsoft Support if: your environment is in a degraded state that affects all apps (check the Power Platform service health dashboard in the admin center first), you're seeing connector errors that return HTTP 500 from Microsoft's side, a Dataverse table is corrupted or a solution import is stuck in "installing" for over 2 hours, or a user's security roles appear correct but they still receive permission errors. Before calling, export the Monitor tool session log as a CSV, Microsoft support will ask for it. Also grab the Session ID from Settings → Session details in the published app; it ties your issue to Microsoft's telemetry.

Prevention & Best Practices

The best time to avoid Power Apps problems is before you build. These practices reflect what separates apps that run well in production from the ones that get rebuilt six months later.

Use solutions from day one. A solution is a container that packages your apps, flows, tables, and connection references together. Building inside a solution isn't just an enterprise nicety, it's what enables healthy application lifecycle management (ALM): moving your app from development to test to production environments without manually recreating connections. Go to make.powerapps.com → Solutions → New solution before you create your first app. Add every artifact to the solution as you go. Microsoft's official docs describe this as the foundation for implementing ALM with solutions using pipelines.

Use connection references, not direct connections. When your canvas app references SharePoint or Dataverse directly, that connection is tied to the maker's identity. In a team environment, this breaks when the maker leaves or loses access. Connection references decouple the logical connector from the credential, so admins can swap credentials in the Power Platform admin center without touching the app.

Keep formulas out of OnStart when possible. With the newer Named formulas feature (enabled under File → Settings → Upcoming features → Preview → Named formulas), you can define app-level variables that are calculated lazily on demand rather than eagerly on startup. This dramatically improves perceived performance.

Index your SharePoint columns. If you're using SharePoint as a data source and filtering on a column, go to your SharePoint list → Settings → List settings → Indexed columns → Create a new index and index every column you filter on. This directly affects whether Power Apps can delegate the filter, SharePoint can only delegate filters on indexed columns (up to 20 per list).

Test with realistic data volumes before go-live. Every time I see a delegation issue hit production, it's because testing was done on a list with 30 rows. Load at least 1,000 test records into your data source and verify record counts before you publish to users.

Quick Wins
  • Enable App checker before every publish, fix all delegation warnings before they reach users
  • Store all environment-specific values (URLs, IDs, thresholds) in environment variables, not hard-coded in formulas
  • Set Gallery.Items to a named formula or collection variable, never put a raw Filter() call directly in Items if you call it from multiple places
  • Run the Monitor tool in the first week of production to catch real-user performance issues before they become support tickets

Frequently Asked Questions

What is Microsoft Dataverse and do I need it for Power Apps?

Microsoft Dataverse is the cloud data platform built into Power Apps, think of it as a fully managed relational database with security, business logic, and API access baked in. You don't technically need it; canvas apps can connect to SharePoint, SQL, Excel, and hundreds of other sources. But Dataverse unlocks model-driven apps, server-side business rules, full delegation support, record-level security, and the Copilot AI features in the new Plan designer. If you're building anything that will grow beyond a small team, Dataverse is the right foundation from the start. The main cost consideration is that Dataverse access requires a Power Apps premium per-user or per-app license, which is an additional cost above Microsoft 365.

My Power Apps gallery is only showing 500 records, how do I get all of them?

That 500-record cap is the delegation limit in action. When Power Apps can't push your filter to the server, it downloads only the first 500 rows locally. The real fix is to rewrite your filter formula using delegable functions, for SharePoint that means StartsWith(), Search(), or equality checks on indexed columns. As a stopgap, you can raise the row limit to 2,000 under File → Settings → Upcoming features → Experimental → Data row limit, but this doesn't solve the root problem. For full access to all records with complex filtering, migrate your data to Dataverse, which supports full delegation for almost all filter operations regardless of record count.

What's the real difference between a canvas app and a model-driven app in Power Apps?

Canvas apps let you design every pixel of the UI yourself and connect to almost any data source, great for custom tools, mobile apps, and one-off business processes. Model-driven apps auto-generate the interface from your Dataverse data model, forms, views, dashboards, and navigation are all created automatically based on your table definitions. Model-driven apps are better for complex, relational data with role-based security, approval workflows, and large-scale deployments. Canvas apps are better for unique UI requirements, external data sources, and targeted single-purpose tools. Many mature solutions use both together: a model-driven app for the core data management layer, with embedded canvas apps for specialized custom screens.

Power Apps is running really slowly for my users, what's the fastest way to speed it up?

The fastest single fix is wrapping your App.OnStart data loads in Concurrent() so they run in parallel instead of one at a time, this alone cuts startup time by 50–70% for most apps. After that, open the Monitor tool (Advanced tools → Monitor in Power Apps Studio) and look at which connector calls are taking the longest. Move data loads for screens 2, 3, 4 into those screens' OnVisible property so you're not loading everything upfront. Finally, reduce the number of controls visible in each gallery row, each control in each visible row is rendered simultaneously, and a complex gallery layout with 50 rows can mean 500+ simultaneous renders.

How do I share a Power Apps canvas app with my team so they can actually use it?

Go to make.powerapps.com → Apps → select your app → Share. Add users or Azure AD groups, and set their role to either User (can run the app) or Co-owner (can edit it). Critically, scroll down to the Data permissions section on that same share panel and make sure every connected data source has Can use enabled for your users. If you skip this step, users will get a blank screen or "contact your administrator" error because the connection credentials aren't shared. After saving, users will receive an email with a link and can also find the app at make.powerapps.com → Apps or in the Power Apps mobile app.

Can Power Apps connect to AI and Copilot features, and how do I add a Copilot control?

Yes, Power Apps has deep Copilot integration at two levels. First, in Power Apps Studio itself, Copilot can help you write Power Fx formulas, suggest data sources, and scaffold entire app structures via the Plan designer (describe what you want in plain English and AI generates the table structure and initial screens). Second, you can add a Copilot control directly to a canvas app screen, this is currently in preview. To add it, go to Insert → AI → Copilot (preview) in Power Apps Studio, then configure the data source and the questions users should be able to ask. The Copilot control lets your app users ask natural language questions against your data directly inside the app interface. You'll need an environment with Dataverse and the appropriate Power Apps license that includes AI Builder credits for some of the more advanced AI features.

Related Microsoft Fix Guides

H
Sai Kiran Pandrala
Our team includes certified Microsoft engineers, Azure architects, and system administrators with 10+ years of enterprise IT experience. Every guide is written from hands-on troubleshooting, not guesswork. We test every fix before publishing.