A practical reference architecture for taking Microsoft Copilot Studio agents from prototype to secure, governed, supportable enterprise production.
The agent works. It answers questions about the engineering procedures, pulls the right document from SharePoint, and calls a Power Automate flow to create a task. The demo lands, the sponsor is happy, and someone says the words that change the project: “Can we get this into production next month?”
That is the moment the questions change.
Who owns this agent after launch? Whose identity accesses SharePoint when a user asks a question? What happens to connection references when the solution moves environments? Who can share it? What happens when the flow times out? Where do transcripts live, and for how long? Who gets the ticket at 2am, and how do we roll it back?
None of those questions are about the conversation. All of them are about the architecture around it.
The agent was never the whole architecture.
The prototype architecture trap
Almost every Copilot Studio proof of concept has the same shape:
User ↓Copilot Studio agent ↓Knowledge + Actions
That model is fine. It is honest about what a prototype is for, which is proving the conversational experience can work and the business problem is real.
The trap is that this diagram survives into the production design review, because nothing in the prototype phase forced anyone to draw what was missing. No identity layer, so nobody asked whose permissions the agent uses. No environment concept, so the agent is still in the maker’s personal environment. No operational layer, so there is no answer to “how would we know if it broke.” No ownership, so when the builder changes teams the agent becomes an orphan with production traffic.
A more complete model looks like this:
User / Channel ↓Identity & Access ↓Copilot Studio Agent ↓Knowledge + Actions ↓Power Platform / Microsoft 365 / Enterprise Systems ↓Telemetry & Operations
And surrounding all of it: environment strategy, security, governance, ALM, and named ownership.
What follows walks that model layer by layer, separating what Microsoft documents as product behavior from what I recommend as architectural practice.
The enterprise reference architecture

Layer 1: Experience and channel
Microsoft Teams. Microsoft 365 Copilot. Web and custom applications where supported. Other approved channels.
Channel selection looks like a distribution decision. It is an authentication decision, and the coupling is tighter than most teams expect.
Microsoft documents that the “Authenticate with Microsoft” option gives you the Teams and Microsoft 365 channel, and that because Teams authentication itself identifies the user, users are not prompted to sign in while in Teams unless the agent requires an expanded scope. To publish to other channels and still have authentication, you must use “Authenticate manually” instead (Configure user authentication).
That is an architectural constraint, not a settings page. The channel constrains the authentication model, which constrains which identity reaches downstream systems, which constrains what the agent can safely do. The chain runs in one direction and is far easier to get right at design time than to unwind after the pilot.
Architectural recommendation: decide the channel first, and write down why. Every subsequent identity decision inherits from it.
Layer 2: Identity and access
This is the layer that most prototype architectures skip entirely, and it is where I have seen the most rework.
The critical insight is that there are four different identity questions, and they have four different answers:
- Who is allowed to access the agent at all?
- Who does the agent believe the user is?
- Whose identity do downstream systems see during knowledge retrieval?
- Whose permissions does an action actually execute with?
These are not the same question, and the platform does not force them to have the same answer.
On question one, Microsoft is explicit that “No authentication” allows anyone with the link to chat, and that with this option you cannot control which users in your organization can chat with the agent. With “Authenticate manually” using Entra ID, you can require sign-in and then use agent sharing to control who can chat. With generic OAuth2, you can require sign-in but still cannot control which specific users can chat using agent sharing (Configure user authentication). Requiring authentication is not the same as controlling authorization.
On question four, the choice is explicit at the action level. Microsoft documents two options when you create an action for an authenticated project: “Agent author authentication” where access to the service is implicit or the use case is low risk, and “User authentication” where you must restrict data access to specific groups or individuals, or the agent performs work on the user’s behalf (Configure user authentication for actions). There is also a documented on-behalf-of option for connections supporting single sign-on (Create and manage connections).
The word “author” is doing a lot of work. It means the connection runs with credentials that are not the end user’s. I walk through what that costs you in the next section.
Architectural recommendation: produce an identity map for every agent before it reaches test. One row per hop, with the identity, the permission boundary, and the failure behavior.
Layer 3: Copilot Studio
The agent itself. Instructions, topics, generative orchestration, knowledge configuration, actions and tools, variables, and configuration.
The framing I now use is that the agent is an orchestration layer, not a solution. It decides what to retrieve and what to invoke. It does not own the data, the business logic in the flows, or the permissions. When something goes wrong, the agent is usually where the failure becomes visible rather than where it originated.
That changes how you scope work. If the agent is the solution, every problem is an agent problem and the fix is always more instructions. If the agent is an orchestration layer, a wrong answer is a knowledge problem, a failed task is an action problem, and a permissions surprise is an identity problem. Different owners, different fixes.
Layer 4: Knowledge
SharePoint. Dataverse. Enterprise websites. Approved documentation sets. Microsoft Fabric and data services where applicable.
Microsoft documents something important about how retrieval executes. When you publish an agent, calls using generative answers are made on behalf of the user chatting with the agent, using the authentication settings you configured. Agent user authentication for knowledge sources means that when a specific user asks a question, the agent surfaces only content that user can access (Add SharePoint as a knowledge source, Knowledge sources summary).
That is the most reassuring fact you can give a security reviewer, and it is worth stating precisely: the agent does not grant new access to SharePoint content. It surfaces what the signed-in user could already have found.
Which leads to the uncomfortable part. If your SharePoint estate is overshared, the agent does not create that problem, but it makes it efficient. Content a user technically had permission to open but would never have located through navigation is now one question away. That is a permissions remediation project, not an AI project, and it belongs on the plan before launch.
Two documented behaviors worth designing around:
- The agent-level SharePoint knowledge source respects sensitivity labels for permission trimming, but the agent cannot extract or ground on content whose protection encrypts the file, including labels that apply encryption, Double Key Encryption, and password-protected files. Such documents can show as Ready in the knowledge source list and be openable by the user in SharePoint, yet still return no response (SharePoint knowledge sources don’t return results). Every observable signal says the configuration is correct.
- Tenant graph grounding with semantic search requires user authentication set to “Authenticate with Microsoft,” and cannot be changed if authentication is set to any other method (Knowledge sources summary). File size handling also differs by licensing: without a Microsoft 365 Copilot license in the same tenant, generative answers process SharePoint files up to seven megabytes with tenant graph grounding off; with that license the maximum is two hundred megabytes with it on (SharePoint knowledge sources don’t return results).
Beyond product behavior, knowledge quality is an ownership problem. An AI agent cannot compensate for an enterprise knowledge base nobody owns. If three versions of a procedure exist and two are wrong, the agent will confidently cite whichever one retrieval favors, faster and to more people than intranet search ever did.
Architectural recommendation: maintain an Agent Knowledge Register. One row per knowledge source with:
| Field | Purpose |
|---|---|
| Source | The specific site, library, table, or URL. Not “SharePoint.” |
| Owner | A named person accountable for content accuracy. |
| Data classification | Per your organization’s scheme. |
| Authentication model | User identity, author identity, or service identity. |
| Refresh process | How and how often content is updated. |
| Expected audience | Who should be able to retrieve this. |
| Approval status | Approved, pending, or rejected, with the date. |
The register is not bureaucracy. It is what lets you answer “where did the agent get that from” in under a minute, which is the only question anyone asks after a bad answer reaches a senior stakeholder.
Layer 5: Actions and tools
Power Automate flows. Connectors and custom connectors. APIs. Dataverse operations. Other agent tools.
Retrieval risk is about what the agent can see. Action risk is about what the agent can do.
Those are different risk categories deserving different controls, but they usually get the same review because they sit in the same configuration pane. A knowledge misfire produces a wrong answer, which is embarrassing and recoverable. An action misfire produces a state change in a system of record, which may not be recoverable at all.
Microsoft documents that connections carry a status, with values including Connected, Not Connected, Deactivated, Expired, and Stale, each needing different remediation, and that Copilot Studio does not store credentials and reprompts users when a token expires or is revoked (Create and manage connections, Configure user authentication for actions).
Design the action layer for failure cases rather than the happy path:
- Connection ownership. Who owns it, what access does that identity carry, and what happens when that person leaves?
- Least privilege. The service account behind a connection accumulates permissions, because expanding scope is the fastest way to unblock a demo. Audit it before production.
- Timeouts and retries. What does the agent say while a long-running flow executes, and what does it say when the flow never returns?
- Idempotency. If the user asks twice, or the orchestrator retries, do you create one task or two? Not hypothetical with generative orchestration.
- Irreversible actions. Deletes, payments, external communications, and record merges deserve a confirmation step in the conversation, not an instruction telling the model to be careful.
- Auditing. Power Automate run history is your action-level audit trail. Know its retention before you need it.
I now classify every action an agent can take and require review proportional to the class:
| Class | Example | Review |
|---|---|---|
| Read | Look up an order status | Standard |
| Create | Open a ticket | Standard |
| Update | Change a record field | Elevated |
| Delete | Remove a record | Elevated, plus confirmation step |
| Financial or transactional | Submit an expense, trigger a payment | Elevated, plus business sign-off |
| External communication | Send email outside the tenant | Elevated, plus business sign-off |
| Security sensitive | Group membership, permissions, credentials | Security review required |
The point is not the taxonomy. It is that “the agent answers HR policy questions” and “the agent answers HR policy questions and updates employee records” are two entirely different systems that happen to share a chat window, and they should not go through the same approval path.
Layer 6: Enterprise systems
Microsoft 365, Dataverse, Dynamics 365, Fabric, Azure services, SAP, Salesforce, internal APIs.
The complete runtime path matters more than any single component:
User → Agent → Action → Power Automate → Connector → API → Enterprise system
A security boundary, throttle, or outage anywhere in that chain surfaces to the user as the agent being broken. Your first-line team will receive tickets saying “the AI is down” when the fault is an expired service account on hop six.
Architectural recommendation: document the full path for every action, with the identity at each hop and the owning team for each component. That turns “the agent is broken” into a triage tree instead of a guess.
Layer 7: Governance and security
Environments. Data policies. Managed Environments where appropriate. Security groups. Connector governance. Agent sharing. Maker permissions. Environment roles. Solution architecture. Data classification. Intake and approval. Risk classification.
Microsoft documents that data policies let you govern how agents connect and interact with data and services, configured in the Power Platform admin center, with enforcement in effect for all tenants since early 2025 (Configure data policies for agents).
One interaction is worth knowing: when a data policy requires authentication, the “No authentication” option is not available in Copilot Studio and “Require users to sign in” cannot be turned off (Configure user authentication). That is governance removing an unsafe option from the maker’s screen, which beats a policy document asking makers not to choose it.
Governance designed after adoption is remediation, and remediation is more expensive and more political than design. Once an unauthenticated agent has three hundred users, turning authentication on is a change management project.
Layer 8: ALM
Microsoft’s guidance here is clear and I would not deviate from it. A healthy ALM strategy includes at least three environments: development, test, and production. Production should be configured as a production type environment and all others, including development and test, as sandbox type. Every environment should be secured with an Entra security group limiting access to its members (Establish an ALM strategy).
Microsoft’s documented golden rules are worth reproducing in your own standards: do not customize outside a development environment, always work in the context of solutions, use a custom publisher and prefix, create separate solutions only when you need independent deployment, use environment variables for settings and secrets that change across environments, export and deploy as managed unless setting up development, and automate source control and deployment.
Deploy the solution, not the developer’s environment.
Now the detail that has caused more failed go-lives than anything else on this list. Microsoft documents that Copilot Studio includes specific items that are not solution-aware, do not follow the normal deployment process, and require post-deployment steps downstream. The documented list includes Azure Application Insights settings, manual authentication settings, Direct Line and web channel security settings, deployed channels, and sharing (Establish an ALM strategy).
Read that list again with a production incident in mind. Authentication configuration does not travel. Channel deployment does not travel. Telemetry configuration does not travel. Sharing does not travel.
A successful deployment can therefore produce an agent in production that is unauthenticated, unpublished to any channel, unmonitored, and shared with nobody, while the pipeline reports green. Every one of those is invisible in an import log and obvious in a smoke test.
Architectural recommendation: write a post-deployment configuration checklist covering exactly those five items, and make executing it part of the deployment, not part of someone’s memory.
Identity is usually more complicated than the diagram suggests
Take a realistic request:
“Find the latest engineering procedure and create a follow-up task for my team.”
That sentence crosses at least four identity boundaries. Walk it deliberately.
Employee to agent. The signed-in user, assuming authentication is configured. With “No authentication” there is no user identity at all and anyone with the link can chat. Boundary: whatever agent sharing allows, which is not controllable under every authentication option.
Agent to knowledge retrieval. Generative answers calls are made on behalf of the user chatting, and the agent surfaces only content that user can access. Boundary: the user’s SharePoint permissions plus sensitivity label trimming. If the user lacks access, the agent finds nothing and says so, which looks identical to the document not existing, and identical again to the file being encrypted by a label. Three causes, one symptom.
Agent to action. Depends entirely on configuration. With user authentication, the user’s own connection. With agent author authentication, credentials that are not the user’s. Boundary: whatever that connection identity can do. When it has more access than the user, the action succeeds where it should have failed, and nothing in the conversation indicates anything unusual happened.
That third case belongs on the whiteboard in every design review. The failure is silent, invisible to both user and maker, and discoverable only by reading the configuration. It is not a product defect. It is a documented option used without an explicit decision.
Action to target system. The connection identity in the flow, which may differ again. Boundary: that account’s rights in the target system. Failure mode: a task is created under a service account and nobody can work out who requested it, because the user’s identity was never carried through.
The deliverable that fixes this is boring and takes about an hour: one row per hop, with columns for identity, permission boundary, behavior when the user lacks access, and behavior when the connection identity has more access than the user. If you cannot complete the last column, you are not ready for production.
Environment strategy
Production agents should not live in whichever environment the prototype was built in. This is the most common architectural debt I see, and it compounds quietly because everything appears to work.
A workable model:
| Environment | Purpose | Who has access |
|---|---|---|
| Personal or experimental | Exploration, learning, throwaway builds | Individual makers |
| Development | Solution development against a custom publisher | Named makers |
| Test or UAT | Business validation, failure testing | Testers, business owner, deployment identity |
| Production | Controlled runtime | End users, production owner, support |
The separation that matters most is human, not technical. The maker who builds should not be the identity that deploys, the tester should not be the person who wrote the topics, and the production owner should be a role that survives the individual. Microsoft’s guidance to secure every environment with an Entra security group is what makes that real rather than aspirational.
One consequence people miss: because sharing is not solution-aware, sharing must be granted deliberately in production. That is a feature. Production access becomes an explicit act rather than an inherited state.
Observability and operations
Start with the only question that matters: how will we know the agent failed?
Not “how do we see usage.” Usage dashboards answer the question the sponsor asks, not the one that wakes you up.
Microsoft documents the available surfaces. The built-in analytics dashboard covers usage and key performance indicators. An agent can send custom events to Application Insights, giving telemetry on logged messages and events, topics triggered during conversations, and custom events sent by topics. Admins can monitor and alert on agent activity through Microsoft Sentinel, with audit logs ingested from Microsoft Purview, where Copilot Studio activities, data modifications, and user actions can be audited. Capacity and message usage are monitored in the Power Platform admin center (Monitor operations, compliance, and capacity).
Retention is the detail to design around before you need it. Microsoft documents that conversation transcripts are stored in the Dataverse conversation transcripts table with a thirty day retention period, that the period can be extended, and that for longer retention the recommended approach is exporting raw transcript data to a store such as Azure Data Lake Storage Gen2 using Azure Synapse Link for Dataverse.
Thirty days is shorter than most incident investigations. If a complaint reaches you forty-five days after the conversation and retention was never extended, the evidence is gone. That cannot be fixed retroactively.
Two further details. Viewing transcripts requires the Bot Transcript Viewer security role, and only admins can grant it (Understand downloaded conversation transcripts). And Monitor data is available for up to 360 days while session details and transcript information cover the last 28 days (Monitor overview). The trend window and the forensic window are not the same length.
None of this works without named ownership. For every production agent I now expect five roles filled by actual people:
| Role | Accountable for |
|---|---|
| Business owner | Whether the agent should exist, and what it is allowed to do |
| Technical owner | The agent configuration, topics, and actions |
| Knowledge owner | Accuracy and currency of the grounding content |
| Platform owner | Environment, DLP, connectors, capacity |
| Support owner | Triage, escalation, and communication during an incident |
An agent with fewer than five names is not in production. It is in extended pilot with production traffic, which is a different and worse thing.
Ten questions to ask before approving an agent for production
- Who owns this agent after launch, in each of the five roles?
- What identity executes every downstream action, at every hop?
- What enterprise information can this agent retrieve, and who validated that list?
- What systems can this agent modify?
- What is the highest-risk action available to it, and what stops that action from firing incorrectly?
- How does this solution move between environments, and what configuration does not travel with it?
- What happens when a downstream dependency fails, times out, or throttles?
- How would we investigate an inappropriate or inaccurate response, and is the retention window long enough to do it?
- Who can share or modify this agent in production?
- How do we disable or roll back this agent safely, and who is authorized to make that call at 2am?
If any answer is a name nobody can produce, or a process nobody has run, the agent is not ready.
Seven lessons I wish I had started with
One. The agent is one component, not the architecture. Draw the layers before you build the topics. The conversation demos well and matters least to whether this survives production.
Two. Identity must be designed, not assumed. Four identity questions, four potentially different answers, and the platform will not force them to agree. The silent failure, where an action succeeds because the connection identity has more access than the user, is the one to design against explicitly.
Three. Knowledge quality beats knowledge volume. A thousand documents is not a knowledge strategy. An unowned knowledge base does not become owned because an agent now reads from it.
Four. Actions require stronger controls than answers. Retrieval risk is what the agent can see. Action risk is what the agent can do. Classify every action and make review proportional to the class.
Five. Environment strategy must exist before production. Moving a production agent out of a personal environment after it has users is a migration project with a change management component.
Six. ALM starts before the first deployment. Solutions, custom publisher, environment variables, connection references, and a written post-deployment checklist for everything Microsoft documents as not solution-aware. A green pipeline and a working agent are not the same claim.
Seven. Every production agent needs an operational owner. Five named roles. Not a team, not a distribution list, not “the Power Platform team.” People.
Where this leaves you
The difference between a successful Copilot Studio demo and a successful enterprise AI system is rarely the conversational interface.
It is identity. Knowledge. Security. Actions. Environments. ALM. Monitoring. Ownership.
The architecture around the agent determines whether it stays an interesting prototype or becomes a trusted enterprise capability. None of it is exotic. Most of it is Power Platform architecture you already know, applied to a component that happens to talk back.
The agent will demo perfectly without any of it, which is precisely why it gets skipped.
Get the checklist
I have turned the criteria above into a checklist covering business ownership, environment, identity, knowledge, actions, security and DLP, ALM, testing, monitoring, and support.
More practical resources are coming on Copilot Studio ALM, agent security, agent governance, agent observability, Power Automate actions, and production troubleshooting.
A note on sources
Everything described as documented product behavior is linked to current Microsoft documentation. Everything described as a recommendation, register, classification, or checklist is my architectural practice, not a Microsoft requirement. The distinction matters, because Copilot Studio changes quickly and my recommendations do not carry Microsoft’s release cadence behind them.
Verify product behavior against your own tenant before making design decisions. Where I could not verify something against a primary source, I left it out.