CRM migration
Field-level mapping, validation, and rollback between X2CRM and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
X2CRM
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
8 of 11
objects map 1:1 between X2CRM and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from X2CRM to Microsoft Microsoft Dynamics 365 Sales is a structural migration that reconciles two fundamentally different data models. X2CRM stores Contacts, Accounts, and Deals as a flat modular system on its own REST API; Microsoft Dynamics 365 Sales operates on Dataverse with a Lead-Contact-Account-Opportunity hierarchy, configurable sales processes, and an activity timeline tied to the timeline wall on each record. We extract data from the X2CRM REST API, resolve parent-record dependencies during transform, and write through the Dataverse API with batch chunking and rate-limit handling. X2Flow automation logic does not export as portable data—every workflow must be manually mapped or rebuilt in Power Automate, which we document in a Workflow Reconstruction Document delivered with the migration. We do not migrate Reports, Dashboards, Forms, or Marketing Campaigns as live assets; we deliver a written inventory of these for the customer's admin to rebuild in Dynamics 365.
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
X2CRM platform overview
Scorecard, SWOT, gotchas, and pricing for X2CRM.
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 X2CRM 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.
X2CRM
Contact
Microsoft Dynamics 365 Sales
Lead and Contact (split required)
1:manyX2CRM Contacts map to Dynamics 365 Leads or Contacts based on qualification status. We inspect the X2CRM contact record for tag associations (lead qualification tags, lifecycle tags) and field values to determine which records qualify as Contacts attached to Accounts versus Leads awaiting conversion. Unqualified or unsourced contacts become Dynamics 365 Leads; active customer contacts become Contacts linked to an Account. We preserve the original X2CRM contact ID in a custom field x2crm_contact_id__c on both Lead and Contact for audit and cross-reference.
X2CRM
Account
Microsoft Dynamics 365 Sales
Account
1:1X2CRM Accounts map directly to Microsoft Dynamics 365 Sales Accounts. Account name, website, industry, phone, address fields, and lifetime value migrate as typed Account fields. Account is created before Contact import so that the AccountId lookup is satisfied at the moment of Contact insert. Deduplication uses Account Name and Website as the matching key.
X2CRM
Deal
Microsoft Dynamics 365 Sales
Opportunity
1:1X2CRM Deals map to Dynamics 365 Opportunities. The deal stage maps to a Microsoft Dynamics 365 Sales Process and Opportunity StageName. Deal value, probability, expected close date, and owner migrate directly. Closed-Won and Closed-Lost reason fields from X2CRM custom fields become Dynamics 365 custom fields or map to the standard status change notes. Pipeline is resolved via Record Type mapping before migration.
X2CRM
Product
Microsoft Dynamics 365 Sales
Product2
1:1X2CRM Products (catalog items with SKU, pricing, description) map to Dynamics 365 Product2 records. Standard Price Book entries are created during migration. ProductCode maps from the X2CRM product SKU field. Products must be imported before any Deals that reference them so that the PriceLevel and ProductId lookups resolve during OpportunityLineItem creation.
X2CRM
Service
Microsoft Dynamics 365 Sales
Contract or custom field on Account
lossyX2CRM Services track recurring service contracts or subscriptions linked to Accounts. Microsoft Dynamics 365 Sales does not have a native Services module; we map Services to either a Contract object (if Service Cloud is licensed) or to a custom Service_Contract__c object created during schema design. Renewal date, status, and linked AccountId are preserved in the migration.
X2CRM
Activity (calls, meetings, tasks)
Microsoft Dynamics 365 Sales
Task, Event (with TaskSubtype)
1:1X2CRM Activities (calls, meetings, tasks with timestamps, owners, and related Contacts or Deals) map to Dynamics 365 Task and Event records. Call disposition and duration map to Task custom fields or Event fields. Each Activity is linked to the resolved Contact or Account via the RegardingObjectId (Dynamics 365's WhatId equivalent). We sequence Activities in chronological order using the original X2CRM timestamp as ActivityDate for accurate timeline ordering in Dynamics 365.
X2CRM
Marketing Campaign
Microsoft Dynamics 365 Sales
Campaign
1:1X2CRM Marketing Campaigns (campaign name, type, status, associated mailing lists) map to Dynamics 365 Campaign records. Campaign history and linked contacts are preserved by creating CampaignMember records during migration. Email campaign templates are migrated as static HTML content if the destination Dynamics 365 org has marketing capabilities; otherwise they are flagged as content for rebuild in Dynamics 365 Customer Insights - Journeys or a marketing automation tool.
X2CRM
Tag
Microsoft Dynamics 365 Sales
Multi-Select Picklist or Topic
lossyX2CRM Tags are standalone label records applied across multiple object types. We migrate all tag names to a tag library and reapply them to their target records. Tags on Contacts map to a custom multivalue field (tag__c as a multi-select picklist) or to Dynamics 365 Topics if the customer prefers topic-based classification. The customer selects the tag strategy during scoping.
X2CRM
Custom Field
Microsoft Dynamics 365 Sales
Custom Field
1:1X2CRM custom fields added via module builder vary by module and require field-level mapping during scoping. We inspect the X2CRM field schema via API discovery and align each custom field to a typed Dynamics 365 field (text, number, picklist, date, currency, lookup) before migration. Custom fields are pre-created in the Dynamics 365 org via the metadata API or manually before any data writes begin. API names follow the __c suffix convention.
X2CRM
User and Role
Microsoft Dynamics 365 Sales
User
1:1X2CRM Users (name, email, role, assignment permissions) map to Dynamics 365 User records. We match by email address. Role configurations (viewer, editor, admin in X2CRM) are documented in the migration scope and mapped to Dynamics 365 security roles during the handoff. Owner assignment on Deals, Accounts, and Activities resolves via the User lookup. Users not yet provisioned in Dynamics 365 are held in a reconciliation queue for the customer's admin before record import resumes.
X2CRM
Attachment
Microsoft Dynamics 365 Sales
Annotation (ActivityMimeAttachment or Note)
1:1X2CRM file attachments are stored as file references or blobs linked to records. We attempt to download and re-upload files during migration. If the X2CRM instance is self-hosted with local disk attachment storage, we coordinate with the customer's IT team to expose the upload directory via SSH or admin panel access before migration scoping begins. Attachments are re-linked to their parent records (Contact, Account, Opportunity) in Dynamics 365 as Notes with file attachments or as ActivityMimeAttachment records on the activity timeline.
| X2CRM | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Contact | Lead and Contact (split required)1:many | Fully supported | |
| Account | Account1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Product | Product21:1 | Fully supported | |
| Service | Contract or custom field on Accountlossy | Fully supported | |
| Activity (calls, meetings, tasks) | Task, Event (with TaskSubtype)1:1 | Fully supported | |
| Marketing Campaign | Campaign1:1 | Fully supported | |
| Tag | Multi-Select Picklist or Topiclossy | Fully supported | |
| Custom Field | Custom Field1:1 | Fully supported | |
| User and Role | User1:1 | Fully supported | |
| Attachment | Annotation (ActivityMimeAttachment or Note)1: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.
X2CRM gotchas
Rate limiting is gated behind Platinum Edition
Workflow automation (X2Flow) does not export as portable data
API requires Content-Type: application/json on all write requests
Data validation errors return HTTP 422 and may halt batch imports
Self-hosted attachment storage may require manual file extraction
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 environment assessment
We audit the source X2CRM instance across edition (Starter, Business, Platinum), custom field schemas per module, active X2Flow workflows, attachment storage backend (cloud vs self-hosted), and record volume by object type. We confirm the destination Microsoft Dynamics 365 Sales environment: edition (Sales Professional, Sales Enterprise, Sales Premium), whether Dataverse is shared with other Dynamics 365 apps, and the presence of any existing data that would trigger deduplication handling. For self-hosted X2CRM, we coordinate with the customer's IT team to confirm API access and file store paths. The discovery output is a written migration scope with record counts, object mapping, and a confirmation of attachment extraction feasibility.
Schema design and Dynamics 365 environment preparation
We design the destination schema in Dynamics 365 before any data moves. This includes provisioning custom fields (with __c suffix and typed field definitions matched to X2CRM field types), creating the Lead-Contact split rule based on the customer's X2CRM contact attributes, configuring Opportunity Record Types and Sales Processes mapped to X2CRM pipeline stages, and pre-creating any custom Service or Contract objects needed for X2CRM Services. Schema is deployed into a Dynamics 365 Sandbox via the environment's deployment tools for validation before production migration begins.
Sandbox migration and reconciliation
We run a full migration into the Dynamics 365 Sandbox using production-like data volume. The customer's admin or RevOps lead reconciles record counts (Accounts in, Contacts in, Leads in, Opportunities in, Activities in), spot-checks 25-50 random records against the X2CRM source for field accuracy, and validates that the Lead-Contact split logic applied correctly. Any mapping corrections, field type adjustments, or validation rule bypasses are resolved in the Sandbox before production migration begins. This step prevents corrections from blocking production cutover.
User provisioning and owner reconciliation
We extract every distinct X2CRM User referenced on Contact, Account, Deal, and Activity records and match by email against the Dynamics 365 destination org's User table. Any X2CRM owner without a matching Dynamics 365 User is placed in a reconciliation queue. The customer's Dynamics 365 admin provisions missing Users (active or inactive based on whether the original X2CRM user is still employed and active in the system). Migration cannot proceed past this step because OwnerId references are required on most standard objects in Dynamics 365.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from X2CRM Accounts, establishing the parent record), Contacts (with AccountId resolved via the Account mapping and Lead-Contact split applied), Leads (for unqualified contacts), Opportunities (with AccountId, OwnerId, and RecordTypeId resolved), Products and Pricebook entries, Activity history (Tasks and Events via Dataverse Bulk API with chunking and parent-record resolution), Tags (applied to migrated records post-import), and Attachments (extracted from X2CRM file storage and re-uploaded as Notes or ActivityMimeAttachment records). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and workflow rebuild handoff
We freeze X2CRM writes during cutover, run a final delta migration of any records modified during the migration window, then enable Microsoft Dynamics 365 Sales as the system of record. We deliver the Workflow Reconstruction Document mapping each X2Flow rule to a Power Automate flow equivalent, the Reports and Dashboards inventory for manual rebuild, and the Marketing Campaigns content map for the customer's marketing team. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's sales team. We do not rebuild X2Flow workflows as Power Automate flows inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
X2CRM
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across X2CRM and Microsoft Dynamics 365 Sales .
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
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
X2CRM: Not publicly documented. X2CRM is an open-source / self-hosted CRM, so practical throughput is bounded by the customer's PHP/MySQL deployment rather than a vendor-imposed limit. We benchmark export queries against the customer's hosted instance before the cutover sync..
Data volume sensitivity
X2CRM 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 X2CRM to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your X2CRM 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 X2CRM
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.