CRM migration
Field-level mapping, validation, and rollback between EspoCRM and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
EspoCRM
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
8 of 10
objects map 1:1 between EspoCRM and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from EspoCRM to Microsoft Microsoft Dynamics 365 Sales is a platform migration from an open-source, self-hosted CRM to an enterprise cloud CRM built on the Microsoft Dataverse. EspoCRM stores Contacts, Accounts, Opportunities, and Cases via a REST API capped at 200 records per GET, while Microsoft Dynamics 365 Sales exposes all standard entities plus unlimited custom entities through its Web API. The migration challenge is threefold: EspoCRM custom entities created in the Entity Manager must be pre-provisioned in the Dynamics 365 environment before any record import; self-hosted EspoCRM instances store file attachments on the server filesystem under data/files/ rather than as database records, requiring a separate file-transfer step; and multi-enum fields capped at 20 options in EspoCRM must be mapped to Dynamics 365 multi-select picklists or separated into multiple fields. We do not migrate EspoCRM Workflows or BPM process definitions as code. We deliver a written inventory of every active workflow with a recommended Dynamics 365 Power Automate equivalent for the customer's admin to rebuild post-migration.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Source platform
EspoCRM platform overview
Scorecard, SWOT, gotchas, and pricing for EspoCRM.
Destination platform
Microsoft Dynamics 365 Sales platform overview
Scorecard, SWOT, gotchas, and pricing for Microsoft Dynamics 365 Sales .
Data migration guide
The complete Microsoft Dynamics 365 Sales migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Destination checklist
Microsoft Dynamics 365 Sales migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Sales .
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a EspoCRM object lands in Microsoft Dynamics 365 Sales , including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
EspoCRM
Account
Microsoft Dynamics 365 Sales
Account
1:1EspoCRM Account records map directly to Dynamics 365 Account. The account name, address fields, phone, website, and industry classification migrate 1:1. We use Account.Name as the primary dedupe key and resolve any duplicate Accounts by a domain-match on Website before insert to avoid creating duplicate parent records for Contact migration.
EspoCRM
Contact
Microsoft Dynamics 365 Sales
Contact
1:1EspoCRM Contact records map to Dynamics 365 Contact with the same name, email, phone, and address fields. The AccountId lookup resolves to the corresponding Dynamics 365 Account record created in the previous step. Any multi-email field in EspoCRM (contacts may have multiple email addresses) is stored in the EmailAddress2 and EmailAddress3 fields on Contact if the destination org schema permits; otherwise we write the primary email and flag the additional addresses in a custom text field.
EspoCRM
Lead
Microsoft Dynamics 365 Sales
Lead
1:1EspoCRM Lead records map to Dynamics 365 Lead. The Lead Status values from EspoCRM are mapped to Dynamics 365 Lead Status options during transformation. We preserve EspoCRM lead quality scores, source information, and campaign attribution in custom fields on the Dynamics 365 Lead for reporting continuity. Leads with a conversion status in EspoCRM carry the converted Contact and Account IDs, which we use to establish the Lead-to-Contact relationship during migration.
EspoCRM
Opportunity
Microsoft Dynamics 365 Sales
Opportunity
1:1EspoCRM Opportunity records map to Dynamics 365 Opportunity. StageName, Amount, CloseDate, Probability, and Description migrate directly. The parent AccountId resolves from the EspoCRM Account mapping. Pipeline and stage probability values are configured in Dynamics 365 before migration begins so that stage assignments are valid at insert time. Closed-Won and Closed-Lost reasons from EspoCRM custom fields map to the corresponding Dynamics 365 Opportunity fields.
EspoCRM
Case
Microsoft Dynamics 365 Sales
Case
1:1EspoCRM Case records map to Dynamics 365 Case. Status, Priority, Type, and Resolution fields migrate as typed fields. The case conversation thread migrates as a series of EmailMessage records linked to the Case, preserving the full support history. Case number in EspoCRM becomes a custom field case_original_number__c on the Dynamics 365 Case for cross-reference.
EspoCRM
Campaign
Microsoft Dynamics 365 Sales
Campaign
1:1EspoCRM Campaign records map to Dynamics 365 Campaign with campaign name, type, status, budget, and dates migrated. The campaign targeting list (Leads and Contacts linked via link-multiple) migrates as CampaignMember records. Email send history and delivery statistics do not migrate because EspoCRM does not expose open and click events via its API.
EspoCRM
User
Microsoft Dynamics 365 Sales
User
1:1EspoCRM User records map to Dynamics 365 User by email address match. Teams, roles, and active/inactive status are preserved in custom fields. Any EspoCRM User without a matching Dynamics 365 User account is held in a reconciliation queue; the customer's admin provisions the missing Users before record migration resumes. EspoCRM role and team assignments are documented as a written inventory for manual configuration in Dynamics 365 security roles.
EspoCRM
Activity
Microsoft Dynamics 365 Sales
Task, Email, PhoneCall, Appointment
1:manyEspoCRM Activities are differentiated by type: meetings and calls migrate as Dynamics 365 Appointment and PhoneCall respectively; tasks migrate as Task; emails migrate as EmailMessage linked to a Task record on the activity timeline. Each Activity's parent WhoId and WhatId are resolved to the migrated Dynamics 365 Contact, Lead, Account, or Opportunity ID via the remapping table created during Account and Contact migration. Activity timestamps are preserved as ActivityDate and ScheduledStart/End on the corresponding Dynamics 365 record.
EspoCRM
Document / Attachment
Microsoft Dynamics 365 Sales
SharePoint Document Location + Note
lossyOn self-hosted EspoCRM instances, uploaded files are stored on the server filesystem under the data/files/ directory. We extract the referenced files during discovery, copy them to the Dynamics 365 SharePoint document library configured on the Account or Contact, and register each file as a SharePointDocumentLocation record linked to the parent CRM record. For cloud-hosted EspoCRM, attachments stored in the database are exported as binary records and written to SharePoint. We also flag Attachment records for manual review if the parent record lookup cannot be resolved during migration.
EspoCRM
Custom Entity (Entity Manager)
Microsoft Dynamics 365 Sales
Custom Entity
1:1Custom entity types created in EspoCRM via Entity Manager are the most migration-sensitive object. We export the entityDefs metadata first to understand field types, then pre-provision matching custom entities in Dynamics 365 Dataverse including all custom fields, option set values, and lookup relationships before any data import. Custom entity records migrate last, after all parent standard objects are in place, because Entity Manager entities frequently carry link-multiple or lookup references to Accounts, Contacts, and Opportunities. We use the EspoCRM entity relationship metadata to topologically sort the custom entity import order and resolve foreign keys via the ID remapping table.
| EspoCRM | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Account | Account1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Case | Case1:1 | Fully supported | |
| Campaign | Campaign1:1 | Fully supported | |
| User | User1:1 | Fully supported | |
| Activity | Task, Email, PhoneCall, Appointment1:many | Fully supported | |
| Document / Attachment | SharePoint Document Location + Notelossy | Fully supported | |
| Custom Entity (Entity Manager) | Custom Entity1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
EspoCRM gotchas
Default 200-record API GET ceiling requires pagination
Server migration leaves WebSocket references pointing to old domain
Multi-enum field option cap of 20 limits data fidelity
Custom entity import ordering creates chicken-and-egg reference problems
Attachments on self-hosted instances are filesystem-stored
Microsoft Dynamics 365 Sales gotchas
Professional tier 15-table custom table limit blocks migrations
October 2024 pricing increase applies at renewal for all customers
Custom fields must be created in the UI before API writes
Power Platform request limits apply to bulk migrations
Activity records orphaned to inactive owners fail silently
Pair-specific challenges
Migration approach
Discovery and EspoCRM API audit
We audit the source EspoCRM instance across all entity types, custom entity definitions from the Entity Manager, active workflows and BPM processes, user count and role assignments, attachment volume, and multi-enum field option counts. We identify whether the instance is cloud-hosted or self-hosted and document the filesystem structure for attachment extraction. The discovery output is a written migration scope document that includes the entity dependency graph, the import order, and the list of workflows requiring post-migration rebuild.
Schema pre-provisioning in Dynamics 365
We provision the Dynamics 365 environment before any record import. This includes creating all custom entities (matching EspoCRM Entity Manager entity names), custom fields with typed mappings (multi-enum to multi-select picklist, varchar to text, etc.), option set values for picklist fields, and lookup relationships between custom entities and standard objects. We configure the Opportunity Sales Process and stage values to match the EspoCRM pipeline structure. All schema changes deploy into a Dynamics 365 Sandbox first for validation.
Sandbox migration and reconciliation
We run a full migration into a Dynamics 365 Sandbox using production-like data volumes. The customer's Dynamics 365 administrator reconciles record counts, spot-checks 25-50 records against the EspoCRM source, and validates that custom entity relationships resolved correctly. Any field mapping corrections, option set mismatches, or schema gaps surface here before production migration begins. We do not proceed to production until the sandbox reconciliation is signed off.
File attachment extraction and SharePoint transfer
For self-hosted EspoCRM instances, we extract the data/files/ directory, map each file to its parent Attachment record in the database, and copy the files to the target SharePoint document library. We register each file as a SharePointDocumentLocation record linked to the parent CRM record (Account, Contact, Opportunity, or Case). For cloud-hosted EspoCRM, we export attachment binary records from the database and write them to SharePoint. Any attachment with an unresolvable parent lookup is flagged for manual assignment.
Production migration in dependency order
We run production migration in record-dependency order: Accounts first, then Contacts and Leads (with AccountId resolved), then Opportunities, Cases, Campaigns, Users (lookup-validated), Activities (Tasks, Emails, PhoneCalls, Appointments via Dynamics 365 Web API), and Custom Entities last because they carry cross-references to standard records. Each phase emits a row-count reconciliation report. Multi-enum fields with option counts exceeding 20 are transformed in the ETL step before insert to avoid Dynamics 365 validation failures.
Cutover, delta sync, and workflow handoff
We freeze EspoCRM writes during cutover, run a final delta migration of records modified during the migration window, then enable Dynamics 365 as the system of record. We deliver the EspoCRM workflow and BPM inventory document with recommended Power Automate equivalents to the customer's admin team. We support a five-business-day hypercare window where we resolve reconciliation issues. We do not rebuild EspoCRM workflows as Power Automate flows inside the migration scope; that is a separate engagement.
Platform deep dives
EspoCRM
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between EspoCRM and Microsoft Dynamics 365 Sales .
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across EspoCRM and Microsoft Dynamics 365 Sales .
Object compatibility
All 8 core objects map 1:1 between EspoCRM and Microsoft Dynamics 365 Sales .
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
EspoCRM: Not publicly documented; rate limits can be configured server-side in the EspoCRM config file.
Data volume sensitivity
EspoCRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during EspoCRM to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your EspoCRM to Microsoft Dynamics 365 Sales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave EspoCRM
Other ways to arrive at Microsoft Dynamics 365 Sales
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.