CRM migration
Field-level mapping, validation, and rollback between Civicrm and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
Civicrm
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
3 of 11
objects map 1:1 between Civicrm and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
4-8 weeks
Overview
CiviCRM tracks engagement as Activities against a flat contact record; Microsoft Microsoft Dynamics 365 Sales uses Leads, Contacts, Accounts, and Opportunities with a structured pipeline model. There is no native Opportunity or pipeline concept in CiviCRM, so migrations require identifying which Activities represented informal deal tracking and reconstructing them as Opportunities with stage, amount, close date, and probability. Contributions and Memberships have no standard Dynamics equivalent; we create custom objects to preserve these nonprofit-native records. Relationships become Connections, Groups become Marketing Lists or Teams, and multi-record custom field sets require schema-aware custom object creation. ECK (Entity Construction Kit) entities with arbitrary custom schemas are handled as custom objects with explicit schema mapping.
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
Civicrm platform overview
Scorecard, SWOT, gotchas, and pricing for Civicrm.
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 Civicrm 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.
Civicrm
Contact (Individual, Household, Organization)
Microsoft Dynamics 365 Sales
Contact or Lead (split required)
1:manyCiviCRM Contact subtypes (Individual, Household, Organization) map to Dynamics Contact. We recommend mapping all CiviCRM Contacts to Dynamics Contact rather than splitting to Lead, because CiviCRM has no separate Lead object and organizations using CiviCRM typically track all contacts equally without a qualification gate. If the customer requires Dynamics Lead for an explicit sales qualification workflow, we define the split rule during scoping using contact properties such as source, activity count, or contribution history, and preserve the original contact record as a custom field on Lead for audit.
Civicrm
Activity
Microsoft Dynamics 365 Sales
Task and Event
1:manyCiviCRM Activities (email, call, meeting, task subtypes) map to Dynamics Task and Event objects. Each Activity type routes to the corresponding Dynamics object: calls and tasks become Task records, meetings become Event records. The src_contact_id maps to WhoId, and the case_id or parent_case reference maps to WhatId pointing at the related Case. We flag Activities that represent informal deal or pipeline stages for Opportunity reconstruction separately during scoping.
Civicrm
Custom Field (CustomValue / Custom_*)
Microsoft Dynamics 365 Sales
Custom Field
1:1Single-record custom groups attach as custom fields on the parent object using the custom.* selector in APIv4. Multi-record sets appear as separate entities prefixed Custom_ and become Dynamics custom objects with lookup relationships to the parent Contact or Case. We query both via API, reconstruct the multi-record cardinality, and create the corresponding custom object schema before import. Multi-record sets with more than 20 custom groups fall back to entity-by-entity exports to stay within MySQL join limits on the CiviCRM side.
Civicrm
Relationship
Microsoft Dynamics 365 Sales
Connection
1:1CiviCRM Relationships (spouse, household member, employee, employer, and custom types) map to Dynamics Connection records with ConnectionRole matching the CiviCRM relationship_type label. Both contact references (contact_id_a and contact_id_b) map to the Dynamics record1id and record2id Contacts. We preserve the relationship is_active flag and start/end dates as custom fields on Connection since Dynamics Connections do not natively track activation periods.
Civicrm
Group and GroupContact
Microsoft Dynamics 365 Sales
Marketing List or Team
lossyCiviCRM Groups map to Dynamics Marketing Lists (for contact segmentation and campaign targeting) or Teams (for access control and record sharing). We preserve the group hierarchy where it exists, flattening nested groups into a flat list annotated with parent group references. Dynamic (smart) groups that recalculate based on CiviCRM search criteria cannot be reproduced as static lists; we document the search criteria and recommend rebuilding as a Dynamics Marketing List with equivalent filter conditions or a Power Automate flow.
Civicrm
Contribution
Microsoft Dynamics 365 Sales
Custom Object (contribution_custom)
lossyCiviCRM Contributions (financial_type, total_amount, currency, receive_date, payment_instrument, check_number, card_type, trxn_id) have no standard Microsoft Dynamics 365 Sales equivalent. We create a custom object contribution_custom with fields matching the CiviCRM contributionfinancial_type, total_amount, currency, receive_date, and payment_instrument. Price sets introduce variable line-item complexity; we flatten price set fields to custom line_item fields on the contribution_custom record. The source contact_id maps to a Contact lookup.
Civicrm
Membership
Microsoft Dynamics 365 Sales
Custom Object (membership_custom)
lossyCiviCRM Memberships (type, status, start_date, end_date, source, join_date, renewal_notification_date) have no standard Dynamics equivalent. We create a membership_custom object with type, status, start_date, end_date, join_date, and source fields. Membership Price Sets introduce tier complexity that we flatten into custom fields on the membership_custom record. The owner contact_id maps to a Contact lookup. If the customer also tracks membership fees as Contributions, we link the membership_custom record to the corresponding contribution_custom record via a custom lookup field.
Civicrm
Case (CiviCase)
Microsoft Dynamics 365 Sales
Case
1:1CiviCRM Cases map to Dynamics Case records. Case_id, subject, case_type, and start_date migrate directly. Case statuses require per-type enumeration: we enumerate every active case_type during scoping, extract its status option values, and map each to a Dynamics global Case Status value. Status IDs are scoped to each case_type in CiviCRM; we handle this individually to avoid silent mis-assignments. The activity chain attached to each Case migrates as related Task records with WhatId pointing to the Case.
Civicrm
Event
Microsoft Dynamics 365 Sales
Custom Object (event_custom)
lossyCiviCRM Events (title, event_type, start_date, end_date, location, max_participants, fee_level, is_monetary) map to a custom event_custom object. Price sets, participant roles, and online registration profiles introduce complexity: we flatten price set fields to custom price_level fields, participant roles to custom fields or separate participant records linked via Contact lookup, and registration profiles to a custom registration_custom object. If Dynamics Calendar is in use, we also create corresponding Calendar entries with registration links.
Civicrm
Grant
Microsoft Dynamics 365 Sales
Custom Object (grant_custom)
lossyCiviCRM Grants (grant_type, amount_requested, amount_granted, amount_total, status, deadline, decision_date, notes) exist only where the Grants extension is enabled. We create a grant_custom object with the available grant fields and map the receiving contact_id to a Contact lookup. Grant data often has tight coupling to the associated Contribution records for grant-funded donations; we preserve the financial_type context on linked contribution_custom records for audit trails.
Civicrm
ECK Entity (Entity Construction Kit)
Microsoft Dynamics 365 Sales
Custom Object
lossyECK allows arbitrary custom entity types with user-defined properties and custom field attachments. Each ECK entity type is scoped to a CiviCRM extension and can reference contacts via custom relationship fields. We handle ECK entities as custom objects requiring explicit schema analysis during scoping. We document each ECK entity type, its properties, its CiviCRM extension origin, and its contact reference pattern, then create corresponding Dynamics custom objects before migration. ECK entities without contact references and with purely internal organizational purpose are migrated at the customer's request and documented separately if out of scope.
| Civicrm | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Contact (Individual, Household, Organization) | Contact or Lead (split required)1:many | Fully supported | |
| Activity | Task and Event1:many | Fully supported | |
| Custom Field (CustomValue / Custom_*) | Custom Field1:1 | Fully supported | |
| Relationship | Connection1:1 | Fully supported | |
| Group and GroupContact | Marketing List or Teamlossy | Fully supported | |
| Contribution | Custom Object (contribution_custom)lossy | Fully supported | |
| Membership | Custom Object (membership_custom)lossy | Fully supported | |
| Case (CiviCase) | Case1:1 | Fully supported | |
| Event | Custom Object (event_custom)lossy | Fully supported | |
| Grant | Custom Object (grant_custom)lossy | Fully supported | |
| ECK Entity (Entity Construction Kit) | Custom Objectlossy | 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.
Civicrm gotchas
Server-to-server migration requires CMS settings file portability
Multi-record custom groups can hit MySQL's 61-join limit
No native bulk export — data portability is API- or database-dependent
CiviCase statuses are per-case-type — not a global status list
Hosted Spark tier has no documented API rate limit — performance varies by plan
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
Migration discovery and scoping
We audit the source CiviCRM instance: CMS integration (Drupal, WordPress, Joomla, Backdrop), CiviCRM version, hosting type (self-hosted, CiviSpark), and API configuration. We enumerate all active entities including contacts, activities, contributions, memberships, cases, events, grants, relationships, groups, tags, and any ECK entity types. We scan civicrm_custom_group and civicrm_custom_field tables for the full custom field inventory and identify multi-record sets that require custom object creation. We also identify activities that function as informal pipeline records by analyzing subject patterns and contribution context. For the destination, we confirm the Microsoft Dynamics 365 Sales edition (Essentials at $70/user/mo or Professional at $115/user/mo) and document which custom objects are required for nonprofit-specific data.
Schema design in Dynamics
We design the destination schema before any data moves. This includes creating custom objects for Contributions (contribution_custom), Memberships (membership_custom), Events (event_custom), and Grants (grant_custom) with all required fields, field types, and lookups. We create ECK entity schemas as custom objects where applicable. For contacts, we define the Lead-Contact split rule based on the customer's qualification workflow. For cases, we enumerate every case_type and map its status options to global Dynamics Case Status values. We configure Marketing Lists or Teams for Groups. All schema is deployed to a Dynamics Sandbox first for validation before production deployment.
Sandbox migration and reconciliation
We run a full migration into a Dynamics Sandbox using production-equivalent data volumes. The customer reconciles record counts for each entity type against the source CiviCRM instance, spot-checks 25-50 records in each entity for field-level accuracy, and reviews the custom object data quality for Contributions, Memberships, and any ECK records. The customer signs off the schema and mapping before production migration begins. Any mapping corrections, field type adjustments, or status value corrections happen in sandbox, not in production.
Owner reconciliation
We extract every distinct CiviCRM owner referenced on contact, activity, contribution, membership, case, and event records and match by email against the Dynamics destination User table. Any CiviCRM owner without a matching Dynamics User goes to a reconciliation queue. The customer's Dynamics admin provisions any missing Users with appropriate security roles before production migration resumes. OwnerId references must be satisfied on all standard records before bulk import begins.
Production migration in dependency order
We run production migration in dependency order with per-phase row-count reconciliation. We respect the Dynamics API rate limit of approximately 6,000 requests per 300 seconds using exponential backoff and Retry-After header reading. The sequence is: Contact and Relationship records (with ConnectionRole lookups resolved), Cases (with per-type status map applied), Custom Objects for Contributions, Memberships, Events, and Grants (with parent Contact lookups resolved), Activities (Tasks and Events with WhatId resolved to Cases), then Tags. We run a delta migration after initial load to capture records modified during the migration window.
Cutover, validation, and rebuild handoff
We freeze writes to CiviCRM during cutover, run a final delta sync, then enable Microsoft Dynamics 365 Sales as the system of record. We validate sample records for each entity and flag data quality issues for customer review. We deliver the CiviRules, scheduled job, and PHP hook inventory with Power Automate rebuild recommendations to the customer's admin team. We offer a one-week hypercare window for reconciliation issues. We do not rebuild CiviRules as Power Automate flows inside the migration scope; that is a separate engagement.
Platform deep dives
Civicrm
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Civicrm and Microsoft Dynamics 365 Sales .
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Civicrm and Microsoft Dynamics 365 Sales .
Object compatibility
All 8 core objects map 1:1 between Civicrm 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
Civicrm: Not publicly documented — Spark tier has no published limit; self-hosted performance is infrastructure-dependent.
Data volume sensitivity
Civicrm 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 Civicrm to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your Civicrm 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 Civicrm
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.