Copilot Playbook
Updated November 7, 2026
Managed App Handbook · Chapter 3 of 8

Connecting data

What the agent can reach while it builds, what the published app can call, and how to use SharePoint, Dataverse, Excel and SQL.

For makers, developers, admins and owners · 20-minute read · Facts as of 7 November 2026

Chapter 3 of 820-minute readParts 9–11Facts current as of 7 November 2026

Evidence tagsD DocumentedO ObservedC CommunityI Inference

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

Figure 3. The binding is the only bridge. Everything on the left ends with the session; everything on the right runs as each user.
Two layers of connectivity 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. Build time: the agent, in your session Runs as you, inside the chat. Ends when the session ends. Microsoft 365 work contextmail, files, meetings, chats Code + Cowork UploadsCSV, Excel, PDF, Word, PowerPoint, images Code + Cowork Web search and page fetchand image generation Code + Cowork Plugins and skillsfrom the Microsoft 365 App Store Code + Cowork Power Platform connectorsread or write live systems, with approval Code + Cowork Schema readsSharePoint lists, Dataverse tables, flows Code + Cowork Shell, Git, testsheadless browser for scripted screenshots Code GitHubclone, branch, commit, draft pull request Code Edge browser on the webwith your sign-in: can open the live app Cowork Availability depends on admin settings, enabled plugins and session type. Binding "bind it" in chat, or ms app add data-source Run time: the published app Runs as each user, on their own connections, under tenant policy. Table modeone SharePoint list, SQL table or Dataverse table astyped create, read, update, delete Action modea connector's operations as typed methods (Outlook,Office 365 Users, Excel Online, OneDrive, Teams, Planner) Microsoft MCP serversWork IQ (Copilot, mail, calendar, Teams, Word, OneDrive,SharePoint, user), Fabric, Learn Default allow-list18 first-party, Entra-only connectors and 12 MCPservers; more only by admin exception Blocked by defaultopen-ended HTTP actions, Office Scripts, freeform DAX,custom Dataverse APIs; calls stay on the app's origin Device controls in the templatecamera, barcode scan, pen input, PDF export and viewer,3D; maps need a spatial binding Not bound = not livea source that can't be bound is built on sample data,flagged only in the chat Each viewer sees only what their own permissions allow and may approve a connection on first open. Guests can't open apps yet.

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).

Figure 4. Every connector call passes two policy filters. The examples come from an example tenant, observed on 7 November 2026 O; yours will differ.
Two policy filters, then binding and the user 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. The two policy filters 1. Tenant policy Power Platform data policies (DLP and connector policies) • Blocked connectors stayblocked for apps • The most restrictiveapplicable rule wins • Business vs non-businessgrouping is not used bymanaged apps 2. Runtime policy Environment-group rules for managed apps • Default: 18 connectors,12 Microsoft MCP servers • Blocks HTTP-style andscript actions • Content security policy:same origin 3. Binding What the app declares • Table mode: one tableas typed CRUD • Action mode: typedconnector methods • Written to ms.config.json 4. The user Identity and permissions • Runs on each person'sown connection • Sees only what theymay see • Approves the connectionon first use

Swipe sideways to see the whole figure, or read it as text below.

Example tenant, observed 7 Nov 2026 OTenant policyDefault runtime policyWhat it means
SharePoint, Excel Online (Business), Teams, Power BI✓ Allowed✓ On the allow-listBind and go; some actions inside are still blocked (Power BI freeform queries, SharePoint raw HTTP)
Dataverse✓ Allowed (Premium)✓ On the allow-listTable mode by logical name; users need Premium or credits anyway
SQL Server, Microsoft Copilot Studio✓ Allowed! Not on the default listAsk an admin for a runtime exception before you design around it
Logic flows (calling Power Automate flows)× Blocked! Not on the default listTrigger 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 listOut 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.1

Two 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.2

Build time: what the agent can use while it works

CapabilityCopilot CodeCopilot CoworkHow 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 DYes, through Work IQ DAsk in plain words ("use my last three partner QBR decks") or attach from the + menu
Uploaded files (CSV, Excel, PDF, Word, PowerPoint, images)Yes DYes DDrag and drop, paste, or +
Web search, page fetch, image generationYes DYes; images use ChatGPT Images 2.0 DAsk
Plugins from the Microsoft 365 App StoreThe same plugins as Cowork DYes; enable per task in the Sources and Skills picker DEnable 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 OBuilt-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 sessionYes: find a connector, connect, call an operation; writes need your approval OThrough 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 OThe App skill uses the same service I"Read the list's columns and show me the field types first"
Power BI reports and semantic modelsFind, inspect and query; look up real ids to embed ONot documented"Find the Partner Revenue report and give me its ids"
Shell, package installs, Git, testsYes; consent prompts in local sessions DONo terminal surface"Run the tests and show me the output"
Headless browser for scripted screenshotsChromium and Playwright present in the cloud sandbox ONot applicable"Render the build at 1280 and 390 px and show me both"
Interactive browserSwitched off in the cloud workspace tested OLocal Edge automation on the web with your sign-in; admin opt-in DCowork: "Open the app's play link and walk this checklist"
GitHub (clone, branch, commit, draft PR)Yes, optional and admin-enabled DNot documented"Open a draft PR with this change"
Specialist sub-agents (reviewer, security review, research)Yes ONot documented"Have an independent reviewer score this against the rubric"
Memory across sessionsDocumented as conversation-scoped D; saved memories carried across sessions in an example tenant OPersonal instructions (up to 20 KB) and projects; chat memory does not persist D"Remember: the CRM data is read-only for this project"

9.3

Run 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

SourceHow it is boundWhat to know
SharePoint listTable mode: full site URL and list name ORuns 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 filesAction mode (SharePoint, OneDrive for Business) DGood for per-user files such as saved settings in a JSON file O
Dataverse tableTable mode by logical name, from the linked org OSecurity 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 tableTable mode: 'server,database' and '[schema].[table]' ONot 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 O256 rows per call by default, so page beyond that; Office Scripts are blocked D
Office 365 OutlookAction mode DDraft, 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, GroupsAction mode DProfiles, managers, photos; read-only for profiles D
Teams, Planner, To Do, Bookings, Forms, Word, OneNote, Viva Engage, Azure DevOps, Power BIAction mode DAll 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 DOBilled 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 MCPMCP servers on the default allow-list DValidate exactly which operations your app needs
Power Automate flowsCode can read a flow's definition and callable interface O; a managed-app flow binding is not yet documented DPower Apps code apps document instant flows with the Power Apps trigger; do not assume parity, test it DI
Copilot Studio agentsCopilot Studio connector DDocumented for Power Apps code apps; not on the managed-runtime default allow-list, so it needs an exception D
Custom and third-party connectorsAdmin exception DExcluded from the default allow-list by design D
External web APIs, CDNs, map tiles, analyticsAdmin adds the origin to the content security policy DDefault connect-src is 'self'; allowing a connector does not require a CSP entry for the service behind it D
MapsThe template's map control with a spatial services binding OFails closed without the binding O
Camera, barcode, pen, PDF, 3DBuilt-in template controls OUse the provided controls; the template blocks direct use of the underlying libraries O
Browser storageAvailable to app codeFine for caches and drafts; never the only copy of shared records I

9.4

The 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

Decide this in the setup Step 6: Integrations

9.5

Two 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.6

Identity, 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.7

Prompts 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

Units: as labelled on each cardSource: section 10.2Evidence D

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
ItemAs statedUnitEvidencePartSource
The list view threshold: it limits expensive queries, not storage| 5,000 items |items (list view threshold)D10 (10.2)In the part text
Security scopes: a different 5,000 from the query thresholdwith 5,000 recommendedunique permissions recommendedD10 (10.2)In the part text
items per list30 million itemsitems per listD10 (10.2)In the part text
indexed columns per list20 indexesindexed columns per listD10 (10.2)In the part text
calls per minute per connection600 calls per minutecalls per minute per connectionD10 (10.2)Source
unique permissions per list, at most50,000 unique permissionsunique permissions (security scopes) per listD10 (10.2)In the part text
MB per attachment through the connector| 90 MB |MB per attachment through the connectorD10 (10.2)Source
MB per list attachment in SharePoint itself250 MB per list attachmentMB per list attachment (native)D10 (10.2)In the part text
rows per call from Excel Online (Business)| 256 rows |rows per call (default)D10 (10.2)In the part text
days in the recycle bin, both stages93 daysdays in the recycle binD10 (10.5)In the part text

The permission ladder: climb only as far as the rules require

Units: levels 1 to 5, from shared access to role-based securitySource: section 10.4Evidence I D C

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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
LevelHowGood forLimits
1. Inherited group accessUsers get access through the site's groupShared team data everyone may see and editEveryone sees every row
2. Contribute, not Edit, on a list with its own permissionsStop inheritance once at the list and grant a group ContributeMost apps: users add and change items but can't change the listUsers can still edit any item outside the app DC
3. Item-level permissionsList 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, submissionsCreator-based only; no manager or team views; test privileged users C
4. Privileged writes through a flowThe app writes a request to an intake list; a flow running on an owner's connection validates it and writes the protected recordApprovals, status changes, anything users mustn't set themselvesFlow triggers and calls from managed apps need testing in your tenant (Part 13) DI
5. DataverseSecurity roles with record- and field-level accessReal role-based security, sensitive fieldsPremium; needs Dataverse in the environment (Part 11) D
10.1

How 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.2

Know which limit you are hitting

LimitWhat it really means
5,000 itemsSharePoint'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 rowsThe 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 MBAttachments through the SharePoint connector. Native SharePoint allows 250 MB per list attachment and 250 GB per library file D
600 calls per minuteConnector throttling per connection. Chatty screens hit it before users notice anything else D
20 indexesIndexed columns per list. Multi-choice, multi-person and calculated columns can't be indexed D
50,000 unique permissionsSecurity scopes per list, with 5,000 recommended. A different 5,000 from the query threshold D

10.3

Design 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.4

Permissions: the list is the security model

Climb this ladder only as far as the business rules require. I

LevelHowGood forLimits
1. Inherited group accessUsers get access through the site's groupShared team data everyone may see and editEveryone sees every row
2. Contribute, not Edit, on a list with its own permissionsStop inheritance once at the list and grant a group ContributeMost apps: users add and change items but can't change the listUsers can still edit any item outside the app DC
3. Item-level permissionsList 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, submissionsCreator-based only; no manager or team views; test privileged users C
4. Privileged writes through a flowThe app writes a request to an intake list; a flow running on an owner's connection validates it and writes the protected recordApprovals, status changes, anything users mustn't set themselvesFlow triggers and calls from managed apps need testing in your tenant (Part 13) DI
5. DataverseSecurity roles with record- and field-level accessReal role-based security, sensitive fieldsPremium; 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.5

Governance, 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.6

Performance

  • 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.7

When 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.8

SharePoint 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.1

Choosing the store

StoreBest forSecurity modelLicensing and policyAvoid when
SharePoint listLightweight team data, documents, Microsoft 365 collaborationSite, list and item permissions, per userStandard; on the default allow-listRelational data, row or field security, heavy concurrent writes (Part 10) DI
Dataverse tableRelational, secured, audited business dataSecurity roles, business units, column security, per userPremium; on the default allow-list; must exist in the environmentSimple lists nobody else will query DI
SQL Server or Azure SQLExisting line-of-business databasesDatabase permissions, per user, or a shared connection with SQL authenticationPremium; not on the default allow-listYou can't get an exception or a view to bind D
Excel Online (Business)Import, export, a bounded personal prototypeFile permissionsStandard; on the default allow-listMore than one person writes to it D
OneDrive or SharePoint filesAttachments, exports, per-user settings as small JSON filesFile permissionsStandardRecords other people need to query I
Browser storageCaches and unsent draftsThe user's own browserNoneAnything that must survive a device change OI

11.2

Dataverse

  • 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.3

Excel

  • 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.4

SQL 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.5

Files

  • 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.6

Shared 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