How Dynamics 365, Power Platform, Azure, and Microsoft 365 fit together, how to design a Dataverse schema that will not box you in, when to reach for Power Automate versus a custom Azure integration, how to migrate data without losing a week to cleanup, and how to wire identity across your whole stack with Entra ID. Written from real implementations, not Microsoft documentation summaries.
Microsoft sells a lot of products that overlap in confusing ways. The naming changes every few years, the licencing bundles capabilities in non-obvious combinations, and the documentation is vast but organised around individual products rather than the workflows they support. What follows is the opposite: how the pieces fit together in practice, the design decisions that matter, and the mistakes that cost the most time to fix later.
The Microsoft commercial stack has four distinct layers, and each one depends on the one below it. Understanding which layer you are working in tells you which product to reach for and what constraints apply.
The implications are practical. Dynamics 365 runs on top of Dataverse and ships it as part of the licence. Power Apps and Power Automate can also connect to Dataverse independently, without Dynamics. Azure sits underneath everything and handles identity (through Entra ID), integrations that go beyond what Power Automate supports, and any compute you need that Microsoft 365 or Power Platform cannot provide.
Microsoft 365 includes SharePoint, OneDrive, Teams, Exchange, and the Office apps. It does not include Dynamics 365 or a Dataverse environment by default. The two ecosystems share identity through Entra ID but are separate licence lines. Most confusion in scoping comes from conflating them.
Dataverse is the database that Dynamics 365 and Power Platform run on. It is a structured, cloud-hosted store that understands business concepts: tables, relationships, lookup fields, business rules, and security roles. It is not a general purpose relational database, and it is not a good fit for high-throughput write workloads. What it is very good at is holding business records, enforcing access control at the row and column level, and surfacing data to Power Automate flows, Power Apps, and Dynamics forms without custom code.
Schema design in Dataverse is where most implementations either set themselves up for success or create years of rework. A few principles that hold across every project we have run:
xyz_) prevents naming collisions with Microsoft updates. Apply it from day one; retrofitting is painful.On environments. Dataverse environments are isolated instances with separate databases. Production, UAT, and development should each be a separate environment. Promoting solution packages between environments (not copying data) is the right deployment pattern. Many teams skip this early and pay for it when a development change corrupts the production schema.
Dynamics 365 comes in several applications: Sales, Customer Service, Field Service, Finance, Supply Chain, and others. The two most common entry points for growing businesses are Sales (pipeline and CRM) and Customer Service (case management and support). They share the same Dataverse backend and can be deployed together, but each has a distinct data model and business process logic.
Sales gives you the standard CRM objects, Lead to Opportunity conversion, Activity tracking (calls, emails, meetings), and pipeline forecasting. The configuration work on a typical Sales implementation covers: customising the Lead and Opportunity forms to match your actual sales process, setting up the business process flow that governs stage progression, configuring the email and calendar sync with Exchange, and mapping the legacy CRM or spreadsheet data model to the Dynamics entity structure.
The most common mistake is applying the default Dynamics Sales process to a business with a different motion and then fighting the tool for months. The business process flow is configurable; the right approach is to model your real stages and required fields, then let Dynamics enforce them rather than building workarounds in spreadsheets alongside it.
Customer Service is built around the Case entity: a record of a customer issue from intake through resolution. The configuration covers routing rules (which cases go to which queues and agents), SLA definitions, the knowledge base, and the agent-facing forms. Customer Service also integrates with Teams for agent collaboration and with Omnichannel for Customer Service if you need to route live chat, email, and voice through the same interface.
The critical design decision is how Cases relate to Accounts and Contacts. In most implementations, a Case belongs to one Contact and is associated with the Contact's Account. If your support motion is B2B (one company, many contacts), you need to make sure the Account view surfaces all Cases across all of the company's contacts, not just the one who submitted each ticket.
Power Automate is where most of the time savings in a Microsoft implementation come from, and where most of the technical debt is also created. A well designed flow is maintainable, testable, and handles errors. A poorly designed one is a tangle of conditions and scope actions that nobody can read six months later.
A few design rules that pay off every time:
Power Apps is a low-code application builder that connects to Dataverse, SharePoint, SQL, and hundreds of other data sources. It produces two types of apps: canvas apps (you design every screen) and model-driven apps (the app generates screens from your Dataverse schema). Dynamics 365 itself is a model-driven app; most custom internal tools are canvas apps.
Canvas apps are the right choice when: the screen layout needs to be precise, you are building on non-Dataverse data, or the users are on mobile and need a tailored interface. Model-driven apps are better when: you have a complex Dataverse schema with many related tables, you need the built-in views, forms, and business process flows, or you are extending Dynamics 365 itself.
The constraint to know before you start: canvas apps are not a replacement for a proper web application when you need complex business logic, high user concurrency, or sophisticated access control at the UI layer. They work well for 5 to 50 internal users doing structured data entry and retrieval. Beyond that, you are usually better served by a lightweight web app sitting on an Azure API.
On licensing. Power Apps licences are per user per month. A canvas app that reads only SharePoint and Microsoft 365 data does not require a premium licence. A canvas app that connects to Dataverse or external APIs does. This distinction saves meaningful cost at scale, so map your data sources before you buy.
Power Automate handles most workflow automation. When you need something it cannot do reliably, Azure is the answer. The cases where we reach for Azure rather than Power Automate:
Logic Apps and Power Automate share the same connector library and expression language. Logic Apps are the right choice when you need the integration to run in a specific Azure region, require enterprise SLAs, need to integrate into an Azure DevOps deployment pipeline, or have compliance requirements that preclude storing data in the Power Platform cloud tenant.
Entra ID (formerly Azure Active Directory) is the identity backbone of the Microsoft commercial stack. Every Microsoft 365 and Dynamics 365 user authenticates through it. If you want single sign-on across your SaaS tools, conditional access policies, or guest access for external collaborators, Entra is where you configure it.
The practical work on a typical implementation covers three areas. First, verifying that all your users are provisioned in Entra and that licences are assigned correctly, because a misconfigured user will hit confusing errors in Teams, SharePoint, and Dynamics. Second, setting up conditional access policies: requiring multi-factor authentication, restricting access from unmanaged devices for sensitive apps, and blocking sign-in from high-risk locations. Third, configuring enterprise applications for any non-Microsoft SaaS that supports SAML or OIDC federation, so users log in to everything with their Microsoft credentials.
For companies with guest users (contractors, clients, partners), Entra B2B guest accounts let you invite external identities to specific Teams channels, SharePoint sites, or even specific Dynamics views, without giving them full employee access. The permission boundary is enforced at the Entra level, not at the application level, which is more reliable.
Microsoft 365 is the collaboration layer that most businesses are already on. The work we do here on a Microsoft implementation project is less about deploying Teams and more about making it useful relative to Dynamics and Power Platform.
The two integrations that deliver the most value are the Dynamics 365 app for Teams and the Power Automate flows that surface Dataverse events in Teams channels. The Dynamics app lets sales and support staff view and edit CRM records without leaving Teams, which matters for companies where Teams is the primary communication surface. The channel notifications pattern means that a new lead, a closed deal, or a case escalation can surface as a card in the right Teams channel with the relevant context, replacing the manual email chain.
SharePoint deserves a specific note. SharePoint is excellent for document storage, intranet content, and structured lists. It is a poor substitute for Dataverse when you need relational data, security at the row level, or more than a few thousand items in a list. We see many teams try to run their business processes on SharePoint lists because they are already licensed for it, and then hit the column limits, the 5,000-item view threshold, and the lack of computed relationships. Dataverse is the right tool for structured business data; SharePoint is the right tool for documents and content.
Power BI connects to Dataverse, SharePoint, SQL, Excel, and most cloud APIs, and surfaces data in dashboards that can be embedded in Teams, SharePoint, or a public URL. On a Microsoft stack implementation, the reporting work typically covers three layers: operational dashboards for day-to-day visibility (pipeline by stage, open cases by team), management reports (win rate, resolution time, licence usage), and executive summaries that pull across multiple data sources.
The design decision that matters most is whether to use DirectQuery or Import mode. Import mode loads data into Power BI's in-memory engine and refreshes on a schedule, typically once or several times per day. It is faster for most query types and handles larger datasets better. DirectQuery sends queries directly to the source at report load time, which gives you live data but is slower and puts more load on Dataverse. For Dynamics 365 data that does not need to be real-time to the minute, Import with an hourly refresh is usually the better tradeoff.
On row-level security. If your Power BI reports surface data that different users should only see in part (sales reps see their own pipeline, managers see their team, directors see everything), configure row-level security in the Power BI dataset, not by building separate reports. One report with RLS applied at the dataset level is maintainable; twenty variant reports for different roles are not.
Data migration is where most Microsoft implementation timelines slip, and almost always because the source data was worse than anyone thought. The standard discovery conversation with a client about their legacy CRM or spreadsheet data tends to reveal: duplicate contact records with different spellings, phone numbers stored in multiple formats, deal stage values that map loosely to the new sales process, and attachment files that are not referenced by any record field.
A realistic data migration process has five steps. First, an extract of the source data in its raw form, no manual cleanup. Second, a profiling pass: count the nulls, the duplicates, the format violations, and the referential integrity gaps. Third, a mapping document that says, for each source field, which Dataverse field it maps to, what transformation applies, and what to do with values that do not map cleanly. Fourth, a trial import into a sandbox environment, validated against the profile numbers. Fifth, the production import with a delta capture for any records that changed during the migration window.
The tool we use for most Dataverse migrations is the Dataverse data import feature for straightforward flat data, and Azure Data Factory for more complex multi-table migrations or for data that needs significant transformation before it can be loaded. Power Query (which sits inside both Power BI and Power Automate) handles lighter transformation work.
The phase that matters most to protect is the schema design. Changes to the Dataverse entity model after data has been migrated in require re-mapping, re-importing, and re-testing the affected flows and forms. Two weeks of careful schema work up front saves four weeks of rework later. Every implementation project we have run that came in under budget did so because the schema was locked before configuration started.
User acceptance testing is the other phase that gets compressed when timelines slip. UAT is not just a checkbox before go-live; it is the last point where a misconfigured business process flow or a broken integration can be caught before it affects live customer data. We build UAT scripts from the process maps created during scoping, so users are testing real scenarios, not improvising.
A short list of the patterns that consistently cause projects to stall or fail:
That is the whole method. When you want it applied to your organisation, the next step is a free audit: a real review of your current Microsoft stack, your processes, and where the gaps are, in about two days, with no obligation.
A free audit of your current Microsoft stack, the findings written up, and a fixed scope to build what matters. Findings in 48 hours.
Get a free Microsoft audit