CRM migration

Migrate from EspoCRM to Microsoft Dynamics 365 Sales

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 logo

EspoCRM

Source

Microsoft Dynamics 365 Sales

Destination

Microsoft Dynamics 365 Sales  logo

Compatibility

80%

8 of 10

objects map 1:1 between EspoCRM and Microsoft Dynamics 365 Sales .

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

EspoCRM logo

EspoCRM

What's pushing teams away

  • Email and SMS follow-up functionality requires third-party integrations and does not work out of the box, frustrating teams expecting a complete CRM experience.
  • Integration ecosystem is narrow compared to HubSpot or Salesforce, with official integrations limited to Google Workspace, Outlook, Zoom, VoIP, and Stripe.
  • Customization depth requires increasing technical knowledge; complex entity relationships and custom PHP/Before-Save scripts become difficult to maintain across upgrades.
  • Performance degrades on large datasets without careful server configuration; teams with hundreds of thousands of records report slow list views and search.

Choosing

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

What's pulling them in

  • Deep Microsoft 365, Teams, and Outlook integration makes Microsoft Dynamics 365 Sales a natural fit for Microsoft-first organizations already invested in that ecosystem
  • Sales Enterprise and Premium tiers offer unlimited custom tables and advanced AI-driven forecasting and predictive analytics not available in lower tiers
  • Professional tier pricing at $65 per user per month offers a lower entry cost than Salesforce for SMB teams with straightforward CRM needs
  • Flexible customization options allow businesses to build bespoke apps, tailor forms and views, and integrate with other Dynamics 365 modules
  • Microsoft Copilot AI tools are embedded directly into the sales workflow on Enterprise and Premium, automating routine tasks and providing deal intelligence

Object mapping

How EspoCRM objects map to Microsoft Dynamics 365 Sales

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

maps to

Microsoft Dynamics 365 Sales

Account

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

Contact

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

Lead

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

Opportunity

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

Case

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

Campaign

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

User

1:1
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

Task, Email, PhoneCall, Appointment

1:many
Fully supported

EspoCRM 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

maps to

Microsoft Dynamics 365 Sales

SharePoint Document Location + Note

lossy
Fully supported

On 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)

maps to

Microsoft Dynamics 365 Sales

Custom Entity

1:1
Fully supported

Custom 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.

Gotchas + challenges

What specifically takes care here

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 logo

EspoCRM gotchas

Medium

Default 200-record API GET ceiling requires pagination

High

Server migration leaves WebSocket references pointing to old domain

Medium

Multi-enum field option cap of 20 limits data fidelity

High

Custom entity import ordering creates chicken-and-egg reference problems

Medium

Attachments on self-hosted instances are filesystem-stored

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales gotchas

High

Professional tier 15-table custom table limit blocks migrations

High

October 2024 pricing increase applies at renewal for all customers

Medium

Custom fields must be created in the UI before API writes

Medium

Power Platform request limits apply to bulk migrations

Medium

Activity records orphaned to inactive owners fail silently

Pair-specific challenges

  • EspoCRM 200-record API ceiling requires chunked pagination

    The EspoCRM REST API returns a maximum of 200 records per GET request by default. Migrating large EspoCRM instances with hundreds of thousands of records requires paginated extraction with sequential page fetches using the offset and maxSize parameters. We detect the total record count from the first response header and orchestrate chunked loops. Skipping this step silently truncates your dataset at 200 records. We configure maxSize explicitly during extraction to balance throughput against EspoCRM server load, particularly for self-hosted instances where API calls compete with normal user activity.

  • Custom Entity Manager relationships create import ordering dependencies

    EspoCRM Entity Manager custom entities frequently carry link-multiple or foreign-key references to standard objects (Accounts, Contacts, Opportunities) and to each other. Importing records in the wrong order produces orphaned foreign keys because EspoCRM enforces referential integrity on save. We perform a dependency graph analysis of the entity types during discovery, topologically sort the import order, and maintain an ID remapping table so that source IDs resolve to destination IDs. Skipping this step is the most common cause of migration failure on EspoCRM-to-any-destination migrations.

  • Self-hosted filesystem attachments require separate file transfer

    On self-hosted EspoCRM instances, uploaded files live in the data/files/ directory on the server filesystem rather than as blob records in the database. A standard database export will not capture these files. We identify attachment records during discovery, extract referenced files from the filesystem archive, transfer them to the Dynamics 365 SharePoint document library, and re-register each file with a SharePointDocumentLocation record linked to the parent CRM record. We flag any attachment whose parent record lookup fails during migration for manual resolution.

  • Multi-enum field option cap of 20 causes Dynamics 365 validation failures

    EspoCRM multi-enum fields are capped at 20 selectable options by default. If your EspoCRM source data uses multi-enum fields with more than 20 options, or if your migration mapping strategy requires more than 20 distinct values in a multi-select field, records will fail Dynamics 365 validation on import. We detect multi-enum fields during discovery, report the option counts, and advise whether to split into multiple fields, raise the cap via EspoCRM field definition before extraction, or consolidate values in the transformation step before loading into Dynamics 365.

  • EspoCRM Workflows and BPM processes do not map to Power Automate

    EspoCRM Advanced Pack workflows and BPM process definitions use a PHP-based execution model with before-save hooks, scheduled actions, and entity-level triggers that are not compatible with Microsoft Power Automate. We do not migrate workflow definitions as code. We deliver a written inventory of every active EspoCRM workflow and BPM process with its trigger conditions, actions, and a recommended Power Automate equivalent for the customer's admin to rebuild post-migration. This inventory is a deliverable, not a migration step.

Migration approach

Six steps for a successful EspoCRM to Microsoft Dynamics 365 Sales data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

EspoCRM logo

EspoCRM

Source

Strengths

  • AGPLv3 open-source license with no per-contact or per-seat recurring fee on self-hosted deployments.
  • Entity Manager provides a UI for creating custom entity types, fields, and relationships without writing code.
  • Full REST API covers all standard CRUD operations plus stream, metadata, and currency rate endpoints.
  • Cloud plans include daily backups with 7-day retention and all official extensions at no additional cost.
  • Both cloud-hosted and fully self-hosted deployment options with explicit customer data ownership.

Weaknesses

  • Email and SMS functionality requires third-party integrations and does not work natively out of the box.
  • Official integrations are limited to Google Workspace, Outlook, Zoom, VoIP, and Stripe.
  • Multi-enum field type is capped at 20 options by default and requires configuration changes to extend.
  • Large record volumes without server-side performance tuning cause slow list views and degraded search performance.
  • WebSocket domain references can persist after server migration if internal URL configuration is not fully updated.
Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

Destination

Strengths

  • Native integration with Microsoft 365, Teams, Outlook, and SharePoint for unified productivity workflow
  • Unlimited custom tables and complex workflows on Enterprise tier enable deep customization for complex sales processes
  • AI-driven predictive analytics and deal intelligence on Enterprise and Premium tiers help sales teams prioritize pipeline
  • Dataverse unified data layer provides a consistent API and data model across all Dynamics 365 and Power Platform apps
  • Strong security model with Field-Level Security and Record Ownership rules for governance-conscious enterprises

Weaknesses

  • Sales Professional tier caps custom tables at 15, creating a migration ceiling for highly customized SMB environments
  • October 2024 pricing increases of $15 per user across all tiers apply to existing customers upon renewal
  • Implementation typically requires costly certified partners, adding 30–50% to total project cost
  • Updates and platform releases can disrupt customizations and plugins, requiring regression testing after each wave
  • Non-Microsoft integrations require additional configuration or middleware, limiting flexibility for heterogeneous tech stacks

Complexity grading

How hard is this migration?

Standard CRM migration. All 8 core objects map 1:1 between EspoCRM and Microsoft Dynamics 365 Sales .

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across EspoCRM and Microsoft Dynamics 365 Sales .

  • Object compatibility

    A

    All 8 core objects map 1:1 between EspoCRM and Microsoft Dynamics 365 Sales .

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    EspoCRM: Not publicly documented; rate limits can be configured server-side in the EspoCRM config file.

  • Data volume sensitivity

    B

    EspoCRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your EspoCRM to Microsoft Dynamics 365 Sales migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about EspoCRM to Microsoft Dynamics 365 Sales data migrations

Answers to the questions buyers ask most during EspoCRM to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for accounts under 15,000 Contacts and 3,000 Opportunities with no Entity Manager custom entities and no filesystem attachment extraction. Migrations with custom entity types, large attachment volumes (over 50,000 files), or self-hosted EspoCRM instances requiring filesystem extraction move to eight to twelve weeks because of schema pre-provisioning, file-transfer coordination, and SharePoint library configuration.

Adjacent paths

Related migrations to explore

Ready when you are

Move from EspoCRM.
Land in Microsoft Dynamics 365 Sales , intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day