[object Object]

A platform owner is told the on-prem D365 environment “just needs to move to the cloud” before year end. The actual scope, once you finish the assessment, is a six to nine month program with a defined freeze window, a rebuilt integration layer, and three rounds of user acceptance testing. Migration projects fail when the scope is sized at the headline and not at the footnotes.

Why Migrate

Microsoft’s investment is in online. Features, Copilot, Power Platform integration all flow to online first. On-prem is maintenance mode. Mainstream support for the on-prem product ends on a published schedule; extended support is a holding pattern, not a destination. New features land online quarterly; on-prem gets cumulative updates that close gaps but do not introduce capability.

The forcing function is usually a Copilot pilot. Once leadership sees the demo, the on-prem environment looks frozen by comparison.

Assessment

Inventory customizations: plug-ins, workflows, SSRS reports, integrations. Assess each for online compatibility. Most plug-ins migrate; some custom auth will not. Run the Solution Checker against your unmanaged solution and triage the warnings.

Assessment buckets:
- Compatible: lift and shift
- Refactor: minor code changes for sandbox isolation
- Rebuild: ASP.NET Web Resources, certain assembly references
- Retire: features nobody uses, cleanup before move

The retire bucket is the most underestimated. On-prem environments accumulate eight years of feature requests; the move is the right time to delete the dead ones.

Data Movement

Dataverse Migration Tool for bulk data. Staged by entity — reference data first, transactional second. Plan for downtime or delta sync. The tool batches inserts at 1000 rows per call by default; tune the batch size based on your row width.

Stage 1: System tables, business units, security roles
Stage 2: Reference data, product catalog, price lists
Stage 3: Master data, accounts, contacts
Stage 4: Transactional data, opportunities, cases, activities
Stage 5: Audit and notes (largest volume, slowest)

Audit data is often the longest-running stage. Decide early whether to move all of it or to archive older audit to Azure Storage and start fresh in online.

Integrations

Every integration needs rework. Endpoints change, auth changes, some pipes will rebuild. Budget 20-40 percent of total effort for integrations. The big shifts are the move from Active Directory auth to Entra ID app registrations, and the move from custom HTTP endpoints to OData or Dataverse Web API.

// Old on-prem pattern
const client = new OrganizationServiceProxy(orgUri, null, credentials);

// Online pattern
const token = await msal.acquireToken(["https://contoso.crm.dynamics.com/.default"]);
const response = await fetch("https://contoso.crm.dynamics.com/api/data/v9.2/accounts", {
  headers: { Authorization: `Bearer ${token}` }
});

Catalog every integration before cutover. Owned-by-IT integrations are findable; shadow integrations built by individual users are not, and they break first.

Cutover

Pick a low-traffic window. Freeze changes to on-prem. Final delta sync. Repoint integrations. Monitor 24 hours post-cutover. The freeze window is non-negotiable. A user who creates a record during the delta sync window can lose that record if the sync misses it.

Communicate the freeze with three reminders: two weeks out, three days out, and the morning of. The communication failure is the most common cutover incident.

Validation Plan

Before the cutover, the validation team needs a checklist of representative scenarios: create an opportunity, run a workflow, fire a plugin, open a SSRS report, hit each integration endpoint. Run the checklist in the staging cutover at least twice with the same data set, and once on cutover day.

Rollback Plan

Have one. Define the trigger conditions in writing. Most projects do not rollback; the ones that do are usually at the integration layer, not the data layer. Keep the on-prem environment available read-only for 30 days post-cutover so you can compare numbers if a stakeholder questions a report.

What to do this week

Run the Solution Checker against your unmanaged solution, build the integration inventory, and stand up an empty Dataverse environment to test the migration tool with a single entity. The dry run will surface 80 percent of the surprises before you commit to a date.

[object Object]
Share