TL;DR: Map entities and fields, choose an import method (Import Data Wizard for files, Dataverse APIs for scale, or Azure pipelines for orchestration), cleanse and de-duplicate, run repeatable test loads, observe Dataverse request limits, validate with queries and spot checks, then schedule a short freeze, execute cutover, verify results, and enable monitoring.
Step-by-Step Data Migration to Microsoft Dynamics 365
Scope and Inventory
Successful migration starts with a precise scope. List source systems, target Dataverse tables, and relationships. Identify immutable history, active records, and must-keep attachments. Decide what to migrate now versus archive. Capture record counts per entity and field-level constraints so tests can confirm completeness later without guesswork.
- Inventory entities: accounts, contacts, activities, opportunities, custom tables.
- Note keys, lookups, option sets, ownership, and required fields.
- Separate configuration/master data from transactional history.
- Log exclusions and archival rules.
See also: /blog/dynamics-365-data-quality-checklist.
Choose Your Migration Path
Pick the path that matches volume, repeatability, and control. For structured file drops and small-to-medium volumes, use the Import Data Wizard. For higher throughput or automation, use Dataverse APIs through Power Automate or custom code. For orchestrated, multi-system moves, schedule pipelines with Azure Data Factory and service principals.
Import Data Wizard (files)
- Best for CSV/XML source files and one-time or few-time loads.
- Supports mapping, transformation via data maps, and async processing.
- Keep files per entity for simpler retries.
Dataverse APIs / Power Automate
- Best for iterative loads, transformations, and controlled retries.
- Use upserts with alternate keys to ensure idempotency.
- Respect service protection and entitlement limits when designing concurrency.
Azure Data Factory (or Synapse pipelines)
- Best for scheduled, multi-source orchestration.
- Use service principal auth and parameterized pipelines.
- Stage to Azure storage when needed; throttle activities to align with limits.
Mapping, Cleansing, and IDs
Do mapping before tooling. Define a field-by-field map, including owners, lookups, option sets, and default values. Normalize phone and email formats, trim whitespace, fix encodings, and resolve duplicates. Establish stable alternate keys (for example, legacy ID) to drive upserts and make re-runs safe and predictable.
- Maintain a mapping workbook and version it.
- Preload configuration data first (users, teams, business units, option sets).
- Prepare reference tables used by lookups to avoid orphaned relationships.
Throughput, Limits, and Batching
Plan around Dataverse limits to avoid throttling. Licensed users typically have 40,000 requests per 24 hours; non-licensed pools start at 500,000 per tenant with accruals. Service protection limits apply per user and web server: about 6,000 requests per five minutes, 20 minutes combined execution, and ~52 concurrent requests. Batch operations can include up to 1,000 operations.
Guidance:
- Start with low concurrency and increase until you hit retry-after responses; back off automatically.
- Use multiple threads but cap parallelism well below the concurrent request limit.
- Prefer smaller batches with higher controlled parallelism for better total throughput.
- Run long-running transformations outside Dataverse when possible.
Test Loads and Validation
Treat tests as rehearsals. Load a representative slice per entity, including related records and edge cases. Validate counts match expectations, spot-check field values, confirm lookups resolve, and review error logs. Iterate until a full dress rehearsal completes within the planned window and the rollback path is proven.
Validation ideas:
- Compare source vs. target counts by entity and by filtered segments.
- Query for nulls in required fields and unresolved lookups.
- Re-run with upserts to confirm idempotency.
Cutover Plan and Backout
Plan a short freeze covering final export, transform, import, and verification. Communicate timings, roles, checkpoints, and clear go/no-go criteria. If a step fails or validation misses targets, execute a tested backout to the source system, fix issues, and retry on a new window without risking partial data.
Checklist:
- Final delta extraction from source systems.
- Disable conflicting automations during the window.
- Import in dependency order; verify each checkpoint.
- Announce completion and re-enable automations.
Post-Cutover Hardening
After go-live, monitor integrations, plugins, and flows. Re-enable automations gradually, confirm entitlements, and watch request usage. Address user-reported data issues promptly with controlled hotfix loads that use the same mappings and keys, keeping audit trails and rerun safety intact.
Further reading: /blog/dynamics-365-deployment-checklist and our service overview at /services/data-migration.
FAQ
How do I avoid throttling during a bulk load?
Increase concurrency gradually and honor Retry-After headers. Keep threads well under concurrent request limits, and prefer smaller batch sizes with controlled parallelism. If possible, run transformations before import to reduce compute per request.
Should I use upserts or create-then-update?
Use upserts with alternate keys tied to stable legacy identifiers. Upserts are idempotent, simplify retries, and reduce duplicate risk. Create-then-update is harder to make safe under retries and concurrency.
In what order should I load data?
Load configuration and reference data first, then parents before children. Typical order: users/teams, accounts, contacts, products, opportunities/activities, then custom tables. This avoids orphaned lookups and simplifies validation.
Frequently Asked Questions
What are the recommended best practices for data migration to Dynamics 365?
In my work with clients, I've found that creating a comprehensive checklist is crucial for a smooth transition. I always recommend starting with thorough data gathering, including product catalogs, customer data, and sales records. It's also essential to clean and validate your data before migration. This step can save a lot of headaches down the line.
Can you describe the data migration process for moving from CRM 2013 to Dynamics 365?
When I help clients move from CRM 2013 to Dynamics 365, I typically follow a structured approach. First, we assess the current data structure and identify any compatibility issues. Next, we map the data fields between the old and new systems. This step is crucial for ensuring data integrity during the migration process.
How can I utilize the Dynamics 365 Data Migration Tool for my data import?
The Dynamics 365 Data Migration Tool is a powerful resource I often use with clients. It allows for efficient bulk data imports and helps maintain data relationships. I usually start by preparing the data in Excel, ensuring it matches the required format. Then, I use the tool to map fields and validate the data before the final import.
What steps should I follow to move data from an on-premise Dynamics CRM to Dynamics 365 online?
Moving from on-premise to online requires careful planning. I typically begin by assessing the current data and identifying any customizations that need to be addressed. Next, I help clients export their data using the built-in tools in Dynamics CRM. We then prepare the data for import into Dynamics 365 online, often using the Configuration Migration tool.
What is the most efficient way to transfer data between environments in Dynamics 365 using the XrmToolBox?
XrmToolBox is a fantastic resource for data transfer between Dynamics 365 environments. I often use the Configuration Migration tool within XrmToolBox for this purpose. This tool allows me to select specific entities and records for migration, making it ideal for transferring configurations or subsets of data between environments.
How can one export data from Excel and then import it into Dynamics 365 effectively?
Exporting from Excel and importing into Dynamics 365 is a common task. I usually start by ensuring the Excel data is clean and formatted correctly. Next, I use the Import Data Wizard in Dynamics 365. This tool allows me to map Excel columns to Dynamics 365 fields, ensuring the data ends up in the right place.
Daniel Harper
AuthorDaniel is a senior Microsoft Dynamics 365 consultant with years of hands-on experience implementing ERP and CRM solutions across manufacturing, retail, healthcare, and professional services. He specializes in Business Central implementations, data migrations, and custom integrations using Power Platform and third-party tools.



