Every claim in this handbook carries a tag, so you can tell documentation from observation from opinion.
- DDocumented. Documented by Microsoft on Learn, Support, Message center, GitHub or an official blog, as of the dates in Appendix E
- OObserved. Observed first-hand on 7 November 2026 in a live Copilot Code cloud session: its tools, its sandbox, an example tenant's policy verdicts, and the repository of a production partner-sales app
- CCommunity. Reported by the community (MVP blogs, forums, videos, GitHub issues) and not confirmed by Microsoft
- IInference. Inference or recommendation by the author; test it before you rely on it
Part 9
Connectivity: what each tool can reach, and how to ask for it
- What it isThe two layers of connectivity: what the agent reaches while it builds, and what the published app can call at run time through bindings and policy.
- What you doAsk for every source to be bound by exact name, then ask which screens still run on sample data before you publish.
- Watch outA connector can pass your data policy and still be blocked by the runtime policy, and allowing a read does not filter rows.
Decide this in the setup Step 5: Data
Swipe sideways to see the whole figure, or read it as text below.
Read the figure as text
On the left, what the agent can use while it builds, running as you inside the chat. On the right, what the published app can call at run time, running as each user. A data-source binding is the only arrow between them.
Numbers from the claim register: 18 Microsoft first-party connectors D (section 9.4); 12 in the default allow-list D (section 9.4).
Swipe sideways to see the whole figure, or read it as text below.
| Example tenant, observed 7 Nov 2026 O | Tenant policy | Default runtime policy | What it means |
|---|---|---|---|
| SharePoint, Excel Online (Business), Teams, Power BI | ✓ Allowed | ✓ On the allow-list | Bind and go; some actions inside are still blocked (Power BI freeform queries, SharePoint raw HTTP) |
| Dataverse | ✓ Allowed (Premium) | ✓ On the allow-list | Table mode by logical name; users need Premium or credits anyway |
| SQL Server, Microsoft Copilot Studio | ✓ Allowed | ! Not on the default list | Ask an admin for a runtime exception before you design around it |
| Logic flows (calling Power Automate flows) | × Blocked | ! Not on the default list | Trigger flows from data the app writes instead (for example a SharePoint item) |
| Third-party MCP servers (Zapier, Box, DocuSign and others) | × Blocked | × Not on the default list | Out of reach without both a DLP change and a runtime exception |
Read the figure as text
A connector call passes the tenant's Power Platform data policy, then the managed-app runtime policy of the environment group. Only then does the app's binding apply, and the call runs as the signed-in user with that person's permissions.
Numbers from the claim register: 18 Microsoft first-party connectors D (section 9.4); 12 in the default allow-list D (section 9.4).
9.1Two layers, not one
Most confusion about managed apps comes from treating two different things as one. While you build, the agent works inside your session: it can read your mail and files, search the web, use plugins and call connectors as you. None of that travels into the app. The published app runs later, as each person who opens it, and it can reach only the sources that were bound into it. A data-source binding is the only bridge between the two layers. OD
The practical rule: if you want the app to show something, ask for it to be bound, then ask which screens are still running on sample data. If you only want the agent to look something up while it builds, say so, and nothing is added to the app.
Figure 3 is shown at the top of this part.
9.2Build time: what the agent can use while it works
| Capability | Copilot Code | Copilot Cowork | How you invoke it |
|---|---|---|---|
| Microsoft 365 work context (mail, files, meetings, chats) | Yes, if your admin enables it; on for cloud sessions and off for local by default D | Yes, through Work IQ D | Ask in plain words ("use my last three partner QBR decks") or attach from the + menu |
| Uploaded files (CSV, Excel, PDF, Word, PowerPoint, images) | Yes D | Yes D | Drag and drop, paste, or + |
| Web search, page fetch, image generation | Yes D | Yes; images use ChatGPT Images 2.0 D | Ask |
| Plugins from the Microsoft 365 App Store | The same plugins as Cowork D | Yes; enable per task in the Sources and Skills picker D | Enable the plugin for the task, then ask |
| Skills (documents, mail, calendar, Teams, SharePoint, Power BI, automation) | A similar catalog appears in Code sessions; invoke by name O | Built-in skills plus up to 50 custom skills; type / to reference one D | "Use the xlsx skill to build the import template" |
| Power Platform connectors, called live during the session | Yes: find a connector, connect, call an operation; writes need your approval O | Through plugins that carry connectors D | "Check the Partner list for duplicate domains before you build the import" |
| Schema reads (SharePoint list, Dataverse table, flow definition) | Yes O | The App skill uses the same service I | "Read the list's columns and show me the field types first" |
| Power BI reports and semantic models | Find, inspect and query; look up real ids to embed O | Not documented | "Find the Partner Revenue report and give me its ids" |
| Shell, package installs, Git, tests | Yes; consent prompts in local sessions DO | No terminal surface | "Run the tests and show me the output" |
| Headless browser for scripted screenshots | Chromium and Playwright present in the cloud sandbox O | Not applicable | "Render the build at 1280 and 390 px and show me both" |
| Interactive browser | Switched off in the cloud workspace tested O | Local Edge automation on the web with your sign-in; admin opt-in D | Cowork: "Open the app's play link and walk this checklist" |
| GitHub (clone, branch, commit, draft PR) | Yes, optional and admin-enabled D | Not documented | "Open a draft PR with this change" |
| Specialist sub-agents (reviewer, security review, research) | Yes O | Not documented | "Have an independent reviewer score this against the rubric" |
| Memory across sessions | Documented as conversation-scoped D; saved memories carried across sessions in an example tenant O | Personal instructions (up to 20 KB) and projects; chat memory does not persist D | "Remember: the CRM data is read-only for this project" |
9.3Run time: what the published app can call
Every source the app uses at run time is bound in one of two modes. Table mode exposes one table of a tabular connector (a SharePoint list, a SQL table or a Dataverse table) as a typed create, read, update and delete service. Action mode exposes a connector's operations as typed methods. Binding writes a connection reference into ms.config.json and generates typed models and services under generated/. Code does this with its data-source tools; the CLI does it with ms app add data-source. OD
| Source | How it is bound | What to know |
|---|---|---|
| SharePoint list | Table mode: full site URL and list name O | Runs on each user's permissions; item-level permissions are your row-level security; attachments up to 90 MB per the connector D |
| SharePoint libraries, OneDrive files | Action mode (SharePoint, OneDrive for Business) D | Good for per-user files such as saved settings in a JSON file O |
| Dataverse table | Table mode by logical name, from the linked org O | Security roles give real row-level security; personal developer environments start without Dataverse, so add it first; arbitrary custom API actions are blocked by default D |
| SQL Server or Azure SQL table | Table mode: 'server,database' and '[schema].[table]' O | Not in the default allow-list, so it needs an admin exception; stored procedures are not offered as a data source by the app service DO |
| Excel Online (Business) | Action mode, including row create, read, update, delete O | 256 rows per call by default, so page beyond that; Office Scripts are blocked D |
| Office 365 Outlook | Action mode D | Draft, read back, update and send all work through the connector (tested in a production partner-sales app) O; open-ended HTTP actions are blocked D |
| Office 365 Users, Groups | Action mode D | Profiles, managers, photos; read-only for profiles D |
| Teams, Planner, To Do, Bookings, Forms, Word, OneNote, Viva Engage, Azure DevOps, Power BI | Action mode D | All on the default allow-list; Power BI "Run a query" (freeform DAX) is blocked D |
| Work IQ (Copilot, mail, calendar, Teams, Word, OneDrive, SharePoint, user) | MCP servers on the default allow-list; a production partner-sales app binds the Work IQ Copilot MCP connector in action mode DO | Billed separately from app runtime D; calls can be slow, so plan a timeout, a retry and a cache (section 14.4) O |
| Fabric MCP, Microsoft Learn Docs MCP | MCP servers on the default allow-list D | Validate exactly which operations your app needs |
| Power Automate flows | Code can read a flow's definition and callable interface O; a managed-app flow binding is not yet documented D | Power Apps code apps document instant flows with the Power Apps trigger; do not assume parity, test it DI |
| Copilot Studio agents | Copilot Studio connector D | Documented for Power Apps code apps; not on the managed-runtime default allow-list, so it needs an exception D |
| Custom and third-party connectors | Admin exception D | Excluded from the default allow-list by design D |
| External web APIs, CDNs, map tiles, analytics | Admin adds the origin to the content security policy D | Default connect-src is 'self'; allowing a connector does not require a CSP entry for the service behind it D |
| Maps | The template's map control with a spatial services binding O | Fails closed without the binding O |
| Camera, barcode, pen, PDF, 3D | Built-in template controls O | Use the provided controls; the template blocks direct use of the underlying libraries O |
| Browser storage | Available to app code | Fine for caches and drafts; never the only copy of shared records I |
9.4The default policy every app inherits
Every app built on Copilot Managed Runtime inherits a default environment-group policy with four rules: routing (each maker gets a personal developer environment), connectors and MCP servers, sharing, and content security. D
- Connectors: 18 Microsoft first-party connectors that authenticate only through Entra ID: SharePoint, OneDrive for Business, Word Online (Business), OneNote (Business), Microsoft Teams, Office 365 Outlook, Office 365 Groups Mail, Office 365 Users, Office 365 Groups, Microsoft Planner, Microsoft To Do, Microsoft Bookings, Microsoft Forms, Excel Online (Business), Dataverse, Power BI, Yammer/Viva Engage and Azure DevOps. D
- MCP servers: 12 in the default allow-list: the Work IQ Copilot, Teams, Outlook Mail, Outlook Calendar, Word, User, OneDrive and SharePoint servers, the Power Apps MCP Server, Fabric MCP, Microsoft Learn Docs MCP and an entry listed as Microsoft MCP Servers. D
- Blocked actions inside allowed connectors: "Send an HTTP request" style actions, Office Scripts, freeform DAX queries and arbitrary Dataverse custom APIs. D
- Sharing: sharing with everyone in the organization is allowed; guest sharing can be switched on but guests can't open apps yet (a known issue). D
- Content security policy: same-origin by default for scripts, fonts, images and network calls; no web workers or service workers; admins can add specific origins, ideally in report-only mode first. D
Two consequences matter for makers. First, a connector can show as allowed by your Power Platform DLP policy and still be unavailable to apps, because the runtime policy is a second filter. Second, no service workers means no offline mode or installable web app today. DI
9.5Two policy filters, seen in an example tenant
A connector has to clear two separate policies before an app can call it: your tenant's Power Platform data policies, and the managed-app runtime policy of the app's environment group. Then it runs only as the signed-in user. D
Figure 4 is shown at the top of this part.
- When Code lists connectors, it shows each one's tier (Standard or Premium) and its data-policy verdict, and it can include the blocked ones on request. In an example tenant, Power BI, SharePoint, Excel Online (Business), Teams, Standard approvals, SQL Server, Dataverse and Microsoft Copilot Studio were allowed, while the Logic flows connector, the one an app would use to call a Power Automate flow, was blocked. O
- The same list showed Microsoft's MCP servers as connectors: the Work IQ family (Copilot, Mail, Calendar, Teams, Word, OneDrive, SharePoint and User, plus a standard Work IQ server), Microsoft 365 Admin Center, Azure DevOps, Dynamics 365 Sales, Contact Center and Customer Insights, Fabric IQ Ontology, Microsoft Learn Docs and Microsoft Sentinel. Almost every third-party MCP server, from Zapier to DocuSign, was blocked by that tenant's policy. O
- An allowed verdict there is necessary but not sufficient: the runtime allow-list must also include the connector or server, and individual actions can still be blocked inside it. Microsoft notes that discovery and code generation leave out blocked operations, so a missing method in generated/ usually means policy, not a bug. D
"List every connector and MCP server I could bind in this app, including the ones blocked by policy. For each, show its tier, the tenant policy verdict, and whether the managed-runtime allow-list includes it."
9.6Identity, consent and connections
By default each person runs the app on their own connection, so they see only what they could already see in the source. The first time someone opens the app they may be asked to approve a connection. An app can deliberately use a shared connection (a service account) with only specific actions allowed, but Microsoft is explicit that allowing a table read does not by itself restrict which rows each person can read. If rows must differ by person, enforce it in the source: Dataverse security roles or SharePoint item permissions. D
Connections age. A connection can be connected, stale (it says connected but has expired), expired or missing, and a stale one needs the owner to sign in again. Ask Code to check connection health before a release and after any password or policy change. O
Finally, anything the app downloads is visible to the person using it. Microsoft notes that people can inspect request and response payloads in the browser, so hiding a column in the UI is not security. D
9.7Prompts that bind the right thing
- "List the connectors I can use in this app, including the ones blocked by policy, and mark which are on the managed-runtime allow-list."
- "Bind the Partner Opportunities list on https://contoso.sharepoint.com/sites/Sales in table mode. Show me the generated fields before you build any screen."
- "Use Office 365 Outlook in action mode. Draft only; never send without my click. Add a test that fails if any path sends without the send checks."
- "Add Work IQ through its MCP connector for the meeting brief. Time out after 3 minutes, retry once on 429 or 5xx, and cache the last answer per user for 24 hours."
- "Before you publish, list every screen and dataset that is running on sample data."
Part 10
SharePoint done right
- What it isHow SharePoint lists connect to managed apps, which limits matter, how to design the lists, and a five-level permission ladder.
- What you doPick a plainly named site, fix internal column names on day one, index the columns you filter on, and choose a permission level deliberately.
- Watch outApps reach lists as each user, so anyone who can write through the app can also write in SharePoint directly.
Decide this in the setup Step 5: Data
SharePoint lists are the most common data source for managed apps: no extra license, familiar to users, and already inside your governance. There is one fact to design around. A managed app reaches SharePoint as each signed-in person, so the list's permissions are the app's security model. Anything a user can do through the app, they can also do in SharePoint itself or through any other tool that uses their account. D
Know which SharePoint limit you are hitting
The two 5,000s
- 5,000 items in one queryThe list view threshold: it limits expensive queries, not storageD
- 5,000 unique permissions per list (recommended)Security scopes: a different 5,000 from the query thresholdD
The other limits
- 30 million items per listD
- 20 indexed columns per listD
- 600 calls per minute per connectionD
- 50,000 unique permissions per list, at mostD
- 90 MB per attachment through the connectorD
- 250 MB per list attachment in SharePoint itselfD
- 256 rows per call from Excel Online (Business)D
- 93 days in the recycle bin, both stagesD
Show the data
| Item | As stated | Unit | Evidence | Part | Source |
|---|---|---|---|---|---|
| The list view threshold: it limits expensive queries, not storage | | 5,000 items | | items (list view threshold) | D | 10 (10.2) | In the part text |
| Security scopes: a different 5,000 from the query threshold | with 5,000 recommended | unique permissions recommended | D | 10 (10.2) | In the part text |
| items per list | 30 million items | items per list | D | 10 (10.2) | In the part text |
| indexed columns per list | 20 indexes | indexed columns per list | D | 10 (10.2) | In the part text |
| calls per minute per connection | 600 calls per minute | calls per minute per connection | D | 10 (10.2) | Source |
| unique permissions per list, at most | 50,000 unique permissions | unique permissions (security scopes) per list | D | 10 (10.2) | In the part text |
| MB per attachment through the connector | | 90 MB | | MB per attachment through the connector | D | 10 (10.2) | Source |
| MB per list attachment in SharePoint itself | 250 MB per list attachment | MB per list attachment (native) | D | 10 (10.2) | In the part text |
| rows per call from Excel Online (Business) | | 256 rows | | rows per call (default) | D | 10 (10.2) | In the part text |
| days in the recycle bin, both stages | 93 days | days in the recycle bin | D | 10 (10.5) | In the part text |
The permission ladder: climb only as far as the rules require
Inherited group access
How: Users get access through the site's group
Good for: Shared team data everyone may see and edit
Limits: Everyone sees every row
Contribute, not Edit, on a list with its own permissions
How: Stop inheritance once at the list and grant a group Contribute
Good for: Most apps: users add and change items but can't change the list
Limits: Users can still edit any item outside the app DC
Item-level permissions
How: List settings, Advanced settings: "Read items that were created by the user" and "Create items and edit items that were created by the user"
Good for: Requests, expenses, submissions
Limits: Creator-based only; no manager or team views; test privileged users C
Privileged writes through a flow
How: The app writes a request to an intake list; a flow running on an owner's connection validates it and writes the protected record
Good for: Approvals, status changes, anything users mustn't set themselves
Limits: Flow triggers and calls from managed apps need testing in your tenant (Part 13) DI
Dataverse
How: Security roles with record- and field-level access
Good for: Real role-based security, sensitive fields
Limits: Premium; needs Dataverse in the environment (Part 11) D
Show the data
| Level | How | Good for | Limits |
|---|---|---|---|
| 1. Inherited group access | Users get access through the site's group | Shared team data everyone may see and edit | Everyone sees every row |
| 2. Contribute, not Edit, on a list with its own permissions | Stop inheritance once at the list and grant a group Contribute | Most apps: users add and change items but can't change the list | Users can still edit any item outside the app DC |
| 3. Item-level permissions | List settings, Advanced settings: "Read items that were created by the user" and "Create items and edit items that were created by the user" | Requests, expenses, submissions | Creator-based only; no manager or team views; test privileged users C |
| 4. Privileged writes through a flow | The app writes a request to an intake list; a flow running on an owner's connection validates it and writes the protected record | Approvals, status changes, anything users mustn't set themselves | Flow triggers and calls from managed apps need testing in your tenant (Part 13) DI |
| 5. Dataverse | Security roles with record- and field-level access | Real role-based security, sensitive fields | Premium; needs Dataverse in the environment (Part 11) D |
10.1How a list connects to an app
- Table mode binds one list or library as a typed create, read, update and delete service; action mode binds the connector's operations as typed methods. Both write the binding into ms.config.json and generate code under generated/, which you never edit by hand. After any column change, ask for the data source to be refreshed and the app rebuilt. D
- Where the list can live: in the session tested, a table binding needed the full URL of a site or subsite under /sites/ or /teams/. The tenant root site and personal OneDrive sites were refused, as were site names with characters other than letters, digits, spaces and ._~-. Give app data a plainly named site. O
- Schema reads before you build: Code can read a list's columns (up to 200 fields per read) through your own connection, so the app uses real internal names from the first prompt. O
- Let Copilot create the list: Cowork can generate a data schema in supported connectors, and community demos show Cowork turning an Excel sheet into a SharePoint list and reconnecting the app to it. DC SharePoint's own import from a spreadsheet takes tables of up to 5,000 rows and keeps the uploaded workbook in Site Assets, where other people with access can open it; delete it if the data is sensitive. D
"Create a SharePoint list called Requests on https://contoso.sharepoint.com/sites/OpsApps with these columns and types: Title (text), RequestStatus (choice: New, In review, Approved, Rejected), Requester (person), DueDate (date), Amount (currency). Index RequestStatus and DueDate. Then bind it to the app in table mode and show me the generated fields."
10.2Know which limit you are hitting
| Limit | What it really means |
|---|---|
| 5,000 items | SharePoint's list view threshold limits expensive queries, not storage. A list can hold up to 30 million items; filter on indexed columns and it keeps working D |
| 256 rows | The Excel Online (Business) connector's default page size. It is not a documented SharePoint limit for managed apps, so check paging in the network trace rather than assuming D |
| 90 MB | Attachments through the SharePoint connector. Native SharePoint allows 250 MB per list attachment and 250 GB per library file D |
| 600 calls per minute | Connector throttling per connection. Chatty screens hit it before users notice anything else D |
| 20 indexes | Indexed columns per list. Multi-choice, multi-person and calculated columns can't be indexed D |
| 50,000 unique permissions | Security scopes per list, with 5,000 recommended. A different 5,000 from the query threshold D |
10.3Design the site and the lists
- Pick the site by boundary. A dedicated site is not required, but use one whenever the app's owners, sensitivity, external sharing or lifetime differ from the site you were about to reuse. Team sites inherit permissions from their Microsoft 365 group; communication sites use Owners, Members and Visitors. DI
- Fix internal names on day one. A column's internal name is set when it is created and never changes. Create it as RequestStatus, then give it a friendly display name. Spreadsheet imports produce awkward internal names, so record the real ones in DESIGN.md. C
- Use real types. Number, currency and date columns, single choice for small fixed sets, lookups for maintained related lists, Person for people. Changing a column's type later can corrupt existing data. D
- Index before you grow. List settings, Indexed columns, Create a new index, for every column the app filters or sorts on, such as status, owner and dates. Test with realistic volume, not an empty demo list. DI
- Validate in SharePoint, not only in the app. Required columns and column validation (formula plus user message) still apply when someone edits outside the app. D
- Turn on versioning (List settings, Versioning settings) and content approval if records need sign-off. D
- Formatting is not logic. JSON column and view formatting change only how SharePoint displays data; none of it reaches the app or protects anything. D
- Keep lists generic. Custom list templates cause trouble for connectors and flows; build from a plain list. D
10.4Permissions: the list is the security model
Climb this ladder only as far as the business rules require. I
| Level | How | Good for | Limits |
|---|---|---|---|
| 1. Inherited group access | Users get access through the site's group | Shared team data everyone may see and edit | Everyone sees every row |
| 2. Contribute, not Edit, on a list with its own permissions | Stop inheritance once at the list and grant a group Contribute | Most apps: users add and change items but can't change the list | Users can still edit any item outside the app DC |
| 3. Item-level permissions | List settings, Advanced settings: "Read items that were created by the user" and "Create items and edit items that were created by the user" | Requests, expenses, submissions | Creator-based only; no manager or team views; test privileged users C |
| 4. Privileged writes through a flow | The app writes a request to an intake list; a flow running on an owner's connection validates it and writes the protected record | Approvals, status changes, anything users mustn't set themselves | Flow triggers and calls from managed apps need testing in your tenant (Part 13) DI |
| 5. Dataverse | Security roles with record- and field-level access | Real role-based security, sensitive fields | Premium; needs Dataverse in the environment (Part 11) D |
- SharePoint connections can't be shared. The standard SharePoint connection is marked not shareable, so there is no "service account" shortcut for a SharePoint binding. Every user needs real rights on the list. D
- Cosmetic controls are not security. Hidden lists, "[Me]" views, disabled grid editing and stripped application pages reduce accidental edits but leave the user's rights intact. C
- Allowing reads doesn't filter rows. Microsoft is explicit that allowing a table's read actions does not restrict which rows each person can read; only source permissions do. D
10.5Governance, recovery and audit
- Containers: sensitivity labels on the site govern external sharing, unmanaged devices and authentication context, but list items don't inherit labels. Restricted Access Control adds a group gate to the site; Restricted Content Discovery only hides content from search and Copilot, and does not change access. Keep confidential app data on a site with external sharing off. D
- Policy: managed apps don't use the business and non-business connector grouping of classic data policies; with advanced connector policies and classic policies both active, the most restrictive setting wins. Purview data loss prevention protects files, not individual list cells. D
- Recovery: version history restores earlier values; the recycle bin keeps deleted items for 93 days in total across both stages; Microsoft 365 Backup restores a site to a point in time. Rehearse restoring a list, its schema and its permissions, separately from rolling back app code. DI
- Retention: list items are covered by retention labels, not retention policies. D
- Audit: Purview records SharePoint list and sharing operations. Managed-app sharing events are not documented in a published catalog yet, so keep your own access inventory (Part 15). D
10.6Performance
- Filter and sort on the server on indexed columns, request only the columns a screen needs, page through results and debounce search boxes. DI
- Cache small reference lists per session and refresh them after writes; never preload a whole list or look up related items one by one. I
- Test the published app, not just the local loop: one builder reported SharePoint calls working locally but failing after publishing because of a Conditional Access challenge. C
10.7When to move off SharePoint
Treat these as triggers for a design review, not hard thresholds: many related tables, transactions that must succeed or fail together, row- or field-level security, heavy concurrent writing, or around 10,000 items with complex filters. Move to Dataverse (in the app's environment; it isn't provisioned until a maker or admin adds it) or SQL (not on the default allow-list, so ask first). Never use an Excel workbook as a multi-user database: Microsoft says concurrent edits through the connector are unsupported and cause conflicts. DI
10.8SharePoint setup checklist for an app
- Name the data owner, site, list ids, audience, sensitivity and the trigger for moving off SharePoint. I
- Record internal column names, types and relationships in DESIGN.md. C
- Choose the permission level from the ladder and test it with an ordinary user's account. DI
- Add indexes, required columns, validation, versioning and, if needed, approval and retention labels. D
- Prove that paging returns every row beyond the first page at realistic volume. I
- Try editing outside the app as a normal user, and confirm what that person can and can't change. I
- Rehearse a restore and review group membership and access every quarter. I
Part 11
Dataverse, Excel, SQL and files
- What it isChoosing between Dataverse, Excel, SQL, files and browser storage, and how each one binds, secures and scales for a managed app.
- What you doChoose the store before the first build prompt, and use the table in section 11.1 to match it to your security needs.
- Watch outSQL needs an admin exception, Excel is not a multi-user database, and shared connections don't restrict which rows people see.
Decide this in the setup Step 5: Data
SharePoint gets its own part because most apps start there. This part covers the other stores, and how to choose between them before the first build prompt.
11.1Choosing the store
| Store | Best for | Security model | Licensing and policy | Avoid when |
|---|---|---|---|---|
| SharePoint list | Lightweight team data, documents, Microsoft 365 collaboration | Site, list and item permissions, per user | Standard; on the default allow-list | Relational data, row or field security, heavy concurrent writes (Part 10) DI |
| Dataverse table | Relational, secured, audited business data | Security roles, business units, column security, per user | Premium; on the default allow-list; must exist in the environment | Simple lists nobody else will query DI |
| SQL Server or Azure SQL | Existing line-of-business databases | Database permissions, per user, or a shared connection with SQL authentication | Premium; not on the default allow-list | You can't get an exception or a view to bind D |
| Excel Online (Business) | Import, export, a bounded personal prototype | File permissions | Standard; on the default allow-list | More than one person writes to it D |
| OneDrive or SharePoint files | Attachments, exports, per-user settings as small JSON files | File permissions | Standard | Records other people need to query I |
| Browser storage | Caches and unsent drafts | The user's own browser | None | Anything that must survive a device change OI |
11.2Dataverse
- Binding: table mode binds one table by its logical name; action mode exposes the connector's organization-scoped operations when the table is chosen at run time. There is no procedure mode, and custom APIs (bound and unbound actions) are blocked by default, so don't put the app's core logic there. D
- What works: guidance written for Power Apps code apps, the same lineage, covers create, read, update and delete, choice labels, metadata, lookups, file and image columns (preview), and server-side filter, sort and top with paging. Polymorphic lookups, schema changes, FetchXML and alternate keys are not supported. Assume the same for managed apps and test. DI
- Security: with per-user connections, security roles, business units and column-level security all apply to every request (system administrators bypass column security). A shared connection would collapse everyone onto one identity, so don't use one for Dataverse. DI
- Where the tables live: default personal developer environments start without Dataverse; a maker or admin adds it in the Power Platform admin center. In an example tenant, the builder's developer environment already had a Dataverse database. Other users need a security role in that environment and premium licensing, which is one more reason not to run production apps from a maker's personal environment. DO
- Moving: moving an app to another environment doesn't move its Dataverse tables; recreate them there, ideally through a solution, before moving. DI
- At build time: Code sees every environment you can see, so pick the target explicitly. It can run read-only, SQL-style queries against Dataverse, Microsoft 365 and Business Central data you have access to, and inspect real tables and sample rows while designing. Copilot Studio Apps binds only existing tables. OD
"Read the columns, relationships and ten sample rows of the cr123_request table in the Operations environment. Then propose the screens, using the real logical names, and stop for my approval."
11.3Excel
- In Code, Excel Online (Business) binds in action mode, row create, read, update and delete included; the CLI offers a table-mode picker instead. Either way the connector returns 256 rows per call by default, and you should let the picker discover the workbook rather than pasting a file URL. OD
- Microsoft says concurrent changes through the connector and by hand are not supported and can cause merge conflicts and inconsistent data. Use Excel to import, to export, or for a prototype one person uses; then move the data to a list or table. D
11.4SQL Server and Fabric SQL
- SQL Server is allowed by policy in many tenants but isn't on the managed-runtime allow-list, so ask for an exception first (section 16.7). It binds in table mode with the dataset as 'server,database' and the table as '[schema].[table]'. DO
- Stored procedures can't be bound; expose what you need as views or tables. An early SDK bug that returned 404 for SQL actions was fixed in later versions. DC
- A shared connection is possible for SQL Server with SQL authentication; it must declare allowed actions and still doesn't restrict rows (section 11.6). Fabric Warehouse and the SQL analytics endpoint don't support SQL authentication, so they run per user and each user needs item permissions. D
11.5Files
- The SharePoint and OneDrive connectors separate items from files: binding a library's metadata doesn't mean table operations upload file bytes. Use the file actions for content, and keep attachments under the connector's 90 MB. D
- A small JSON file in each user's OneDrive is a good home for per-user settings, saved filters and drafts; it follows the person across devices and needs no shared list. OI
11.6Shared connections
- Most apps run on each user's own connection. A shared connection makes the app use one account's credentials for everyone, through a proxy that enforces the actions declared in ms.config.json; deployment fails if they're missing. D
- Only shareable authentication types qualify, such as SQL Server authentication or API keys. Microsoft 365 connectors (SharePoint, Teams, Planner, Power BI and others) authenticate only through Entra ID and are not shareable, so Microsoft 365 data is always reached as the signed-in user. D
- Allowing a table's read actions on a shared connection doesn't restrict which rows each person can read; filter rows in the source or don't share the connection. Shared identities also blur who changed what, so log the real user in the record. DI