SharePoint Lists vs Dataverse for Canvas Apps: Pick the Storage, Not the Habit
The first canvas app in most tenants sits on a SharePoint list because every maker already has a site. Six months later the gallery is slow, the lookup column is a 5,000-item trap, and someone asks "should we move this to Dataverse?" The answer is not ideological. It is a storage decision with a migration cost, and most teams make it two years late.
What a list is actually good at
A SharePoint list is a document-adjacent table with a generous UI, attachments, and permissions that follow the site. For a departmental tracker — facilities tickets, a team roster, a content calendar under a few thousand rows — it is the right default. Makers can add columns without a solution publisher. Backup is the site collection. Nobody files a change request to create a table.
The constraints show up as soon as you treat it like a database. Delegation in canvas apps against SharePoint is a short menu: Filter on simple equality, Sort on indexed columns, no real joins. Anything else pulls a page of rows to the device and lies to you with a blue warning you will eventually ignore. Lookup columns are not foreign keys; they are stored strings plus an id, and they break in Filter the moment you nest them. Unique indexes are a premium afterthought. Transactions do not exist — two patches can interleave and you will not know.
If the app is a form over a list the team already lives in, stay. Wrapping SharePoint in Dataverse "for architecture" is how you get two sources of truth and a sync flow that fails on throttling.
What Dataverse buys you
Dataverse is a relational store with security roles, solutions, and an API that the rest of the Power Platform already speaks. Relationships are first-class: many-to-one, many-to-many, cascading delete you can name. Alternate keys give you upserts. Plugins and real-time workflows run next to the write. Canvas delegation against Dataverse is wider — Filter, LookUp, Sort, Search on indexed columns, and you can Filter on related records without stuffing a collection.
The security model is the quiet win. SharePoint item-level permissions become unmaintainable past a few hundred unique ACLs; Dataverse security roles plus team ownership scale to a company. If the data will be used by a model-driven app, a Power Pages portal, or Copilot Studio knowledge, Dataverse is not optional — those products assume it.
The cost is real: Dataverse capacity is licensed and metered. A list that was "free" on an existing site becomes a table that needs an environment, a publisher, and someone who understands solutions. Makers who could add a column at lunch now need a unmanaged layer and a pipeline. That friction is the point if the app is a product; it is sabotage if the app is a picnic signup.
A decision rule that does not require a workshop
Stay on SharePoint when all of these are true:
- Peak working set the gallery needs is well under the 2,000-row practical ceiling (the 500/2,000 delegation limits are not theoretical).
- Relationships are at most one lookup, not a graph.
- Security is "everyone in this site" or a handful of groups.
- There is no second app, flow family, or portal that must share the schema.
Move to Dataverse when any of these are true:
- You are about to build the second or third app on the same entities.
- You need row-level security that is not "break inheritance and hope."
- You are hitting delegation warnings on queries the business actually runs.
- ALM matters: the schema must move Dev → Test → Prod as a solution, not as a list template and a prayer.
Migration without a rewrite
Do not dual-write a list and a table "for a while." Pick a cutover weekend. Create tables with types that match (choice vs choice, datetime vs datetime — SharePoint's "multiple lines" is not Dataverse memo by accident). Use a dataflow or a one-shot cloud flow to copy, then point the canvas data source at the tables and fix the formulas that used ThisItem.'{FilenameWithExtension}' or nested lookups. Keep the list read-only for two sprints as an audit trail, then archive it.
Attachments are the part everyone forgets: list attachments become File or Image columns, or a related Notes table. Plan that before you delete the site.
The habit to break
Makers pick SharePoint because it is nearby, not because they modeled the data. If you are starting a canvas app that will outlive the intern who built it, spend thirty minutes asking "who else will query this?" If the answer is "a flow, a report, and maybe a portal," start in Dataverse. The list is a great filing cabinet. It is a mediocre system of record.
Keep reading
Power Apps Collections vs. Dataverse: Where Your App's Data Should Actually Live
Collections feel fast and convenient, so makers overuse them — and ship apps that lose data and break on refresh. Here is when to hold data in memory and when it belongs in Dataverse.
Canvas vs Model-Driven vs Power Pages: Choosing the Right Power Apps Type
Choose between canvas apps, model-driven apps, and Power Pages using a practical matrix for UX, data, licensing, governance, and audience fit.
Solving Power Apps Delegation Warnings for Large Dataverse Tables
Learn how Power Apps delegation works, why blue warnings matter, and the Dataverse patterns that keep large-table queries accurate and fast.
Building Your First PCF Control for Power Apps
Build a first Power Apps PCF control with the CLI, manifest, TypeScript lifecycle, local testing, solution packaging, and safe deployment steps.
Building Offline-Capable Power Apps for the Field
Design offline-capable Power Apps for field teams using canvas app caching, queue-and-sync patterns, conflict handling, and mobile offline profiles.
Named Formulas and the With() Function: Power Fx Patterns for Faster Apps
Use Power Fx named formulas and With to replace noisy OnStart logic, reduce repeated lookups, and make canvas apps faster and easier to maintain.
Newsletter
New posts, straight to your inbox
One email per post. No spam, no tracking pixels, unsubscribe anytime.
Comments
- No comments yet. Be the first.