The complete guide · Microsoft implementation

Microsoft Dynamics 365 and Power Platform: the complete implementation guide

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.

A working reference, not a sales brochure. When you want it done, start with a free Microsoft audit.

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.

How the Microsoft stack fits together

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 Microsoft commercial stack: four layers
DYNAMICS 365 SALES & CUSTOMER SERVICE CRM, case management, custom model-driven apps POWER PLATFORM + DATAVERSE Power Automate flows, Power Apps, Dataverse tables, Power BI datasets MICROSOFT 365 + TEAMS + SHAREPOINT Email, calendar, documents, collaboration, SharePoint lists AZURE + ENTRA ID Identity, API management, Functions, Logic Apps, Event Grid, storage Each layer builds on the one below. Dynamics 365 runs on Dataverse. Dataverse runs on Azure. Entra ID manages identity across all of them.
Understanding which layer you need before buying licences saves money and reduces rework. A company that only needs workflow automation between Microsoft 365 tools does not need Dynamics 365 licences. A company that needs a CRM does need Dataverse, which is bundled with Dynamics but not with standard Microsoft 365 plans.

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 and the data layer

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:

  • Use standard entities first. Dynamics ships with Account, Contact, Lead, Opportunity, Case, and dozens more that are already wired into the app. Customising a standard entity is almost always cheaper than creating a parallel custom table.
  • Name custom fields consistently. The prefix your organisation registers (for example, xyz_) prevents naming collisions with Microsoft updates. Apply it from day one; retrofitting is painful.
  • Keep lookup depth shallow. A view that traverses four or five table relationships to render a grid will be slow and hard to maintain. Denormalise where query performance matters more than storage efficiency.
  • Separate configuration from data. Option sets and choice columns work well for stable enumerations. If the list changes frequently, a lookup table is more maintainable.

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 Sales and Customer Service

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.

Dynamics 365 Sales

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.

Dynamics 365 Customer Service

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 flow design

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 typical lead-to-quote Power Automate flow
TRIGGER: Lead qualified Has email? Yes Create Opportunity HTTP: quoting API Send email (O365) No Terminate (invalid)
The flow branches early on the presence of a contact email, terminates cleanly if missing, and then chains: create the Opportunity record, call the external quoting API via HTTP, send the quote email using the Office 365 connector, and update the Opportunity field. Each action has its own error handling scope, not a single try/catch wrapped around the whole flow.

A few design rules that pay off every time:

  • Terminate on invalid input early. Check the fields you need before doing any work. A flow that fails midway through is harder to debug and can leave partial data.
  • Use child flows for reusable logic. If you find yourself copying the same ten actions into multiple flows, extract them into a child flow that takes parameters. This is the same reason you extract functions in code.
  • Store sensitive credentials in environment variables. Hardcoding an API key in an HTTP action means every developer with access to the flow can see it. Environment variables let you change credentials without editing flows.
  • Set concurrency controls on loops. A flow that processes a list of records in parallel will hit Dataverse API throttle limits quickly. Set a concurrency of 1 to 5 for write-heavy loops.
  • Test with real data shapes. Power Automate's expression language (the same one used in Logic Apps) has edge cases around null values and empty strings. Test with the actual data your trigger will receive, not a clean mock.

Power Apps for internal tools

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.

Azure integrations and API architecture

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:

  • High throughput writes. Power Automate flows are rate-limited and designed for human-scale event frequencies. If you need to process thousands of records per minute from an external system, an Azure Function or Event Grid subscriber is the right tool.
  • Complex data transformation. Power Automate's expression language handles most transformations, but parsing irregular data formats, applying business rules to large payloads, or assembling documents from multiple sources is cleaner in code.
  • Exposing Dataverse data as a clean API. When an external system needs to read or write Dataverse data programmatically, Azure API Management fronting the Dataverse Web API gives you versioning, rate limiting, authentication, and request/response transformation in one place.
  • Long-running processes. Power Automate flows time out at 30 days, but certain integrations (batch import, document processing) need longer-running coordination. Azure Durable Functions handles this with checkpointing.
A typical Azure integration topology for a Microsoft stack
ERP / e-commerce Marketing platform Azure API Mgmt auth, rate limit, routing Azure Logic Apps Azure Functions Dataverse Microsoft 365 Azure Storage Entra ID: identity across all layers
External systems call the Azure API Management gateway, which authenticates, rate-limits, and routes to either Logic Apps (for orchestration flows) or Azure Functions (for compute-heavy processing). Both write to Dataverse, Microsoft 365, or Azure Storage. Entra ID manages identity across the whole topology.

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 and identity

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 and Teams

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 reporting

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

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.

A realistic rollout timeline

Typical rollout timeline for a Dynamics 365 and Power Platform implementation
Wk 1 Wk 2 Wk 3 Wk 4 Wk 5 Wk 6 Wk 7 Wk 8 Wk 9 Audit and scoping Dataverse schema and envs Dynamics 365 configuration and data migration Power Platform builds and integrations UAT and go-live
Typical timeline for a focused Dynamics 365 Sales implementation with Power Platform automation. Complex migrations, multi-module rollouts, or Azure integration work extend the timeline. The Dataverse schema phase is the one most teams want to rush and should not: a schema change after data migration is expensive.

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.

What does not work

A short list of the patterns that consistently cause projects to stall or fail:

  • Starting with licences, not requirements. Buying Dynamics 365 licences before mapping the use case is how you end up with a CRM configured for a sales motion that does not match how you actually sell. The audit comes first.
  • Customising standard entities beyond recognition. Adding a hundred custom fields to the Contact entity, hiding the standard ones, and renaming everything is technically possible and operationally painful. Future Microsoft updates will conflict with it. Start with standard, customise what you genuinely need different.
  • Flows without error handling. A Power Automate flow that has no error branches will fail silently on invalid data. By the time someone notices, the queue of unprocessed records is long. Every flow that touches business data needs an error notification, even if it is just a Teams message.
  • Migrating dirty data as-is. Importing 12,000 duplicate Contact records into Dynamics so they can be cleaned up later is a mistake. The clean-up never happens as thoroughly after import as it would have before, and the duplicates corrupt every report and automation that touches Contact data.
  • Building Power Apps where a simple SharePoint form would do. Power Apps is genuinely powerful, but it has a learning curve and a licence cost. A SharePoint list with a standard form handles most simple data collection use cases without either.
  • Skipping environment separation. Developing directly in the production Dataverse environment because it is faster is a pattern that works until it does not. A flow that accidentally deletes records in production because it was tested against live data is a painful lesson.

Frequently asked questions

What does the free Microsoft audit cover? +
We review your current Microsoft licences, your Dynamics 365 or CRM setup, which manual processes could be automated with Power Automate, where your data sits across Microsoft 365 and other systems, and where you are paying for capability you are not using. You get written findings and a call, at no charge.
How long does a Dynamics 365 implementation take? +
A focused Dynamics 365 Sales or Customer Service implementation runs roughly six to twelve weeks: two weeks of scoping and data mapping, four to six weeks of configuration and migration, and two weeks of testing and handover. Complexity, data volume, and integration count move that range.
Can you connect Dynamics 365 to our other tools? +
Yes. Microsoft has native connectors for hundreds of applications through Power Automate and the Dataverse connector library. Where a native connector does not exist, we build a custom one using Azure Logic Apps or a lightweight API layer. We have connected Dynamics 365 to marketing automation platforms, ERP systems, e-commerce stacks, and custom-built internal tools.
When should we use Power Automate versus a custom Azure integration? +
Power Automate handles most business workflow automation without code: approvals, data sync, notifications, document generation. When you need high throughput, complex transformation logic, or a real-time API that Power Automate cannot manage at scale, we build an Azure Function or Logic App instead. We recommend the right tool for each job in the audit.
What does it cost? +
Scope drives cost, and scope is what the audit reveals. A focused Power Automate project can be fixed and priced quickly. A full Dynamics 365 rollout with data migration and integrations is a larger fixed-scope engagement. We write the price into the agreement before any work begins, so there are no open-ended retainers.

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.

Get a free Microsoft audit

Ready to put this to work?

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
No credit card · You keep the findings · 48h reply

Related reading

Related reading

Related reading

Related reading

Get a free Microsoft audit