CRM migration
Field-level mapping, validation, and rollback between Salesforce Sales Cloud and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
Salesforce Sales Cloud
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
14 of 16
objects map 1:1 between Salesforce Sales Cloud and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
5-8 weeks
Try the reverse
Overview
Moving from Salesforce Sales Cloud to Microsoft Microsoft Dynamics 365 Sales is a cross-platform migration that requires translating Salesforce's object model and relationship graph into Dynamics 365's Dataverse structure. The core entities map cleanly—Accounts, Contacts, Leads, Opportunities, Cases, Products, and Quotes—but the relationship topology differs: Salesforce uses a many-to-many Account Contact Relation junction table while Dynamics 365 attaches Contacts directly to Accounts, requiring a relationship-flattening step during import. We resolve parent Account hierarchies first, import Contacts with their primary AccountId, then replay any secondary Account relationships as a separate junction pass. Opportunity Team Members and Territory assignments reference User IDs that must exist in the destination tenant before the junction records can be inserted. Workflow Rules and Process Builder automations do not migrate; we deliver a written inventory of every active automation with a recommended Power Automate or Dynamics workflow 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
Salesforce Sales Cloud platform overview
Scorecard, SWOT, gotchas, and pricing for Salesforce Sales Cloud.
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.
Source platform guide
Salesforce migration guide
Understand the data you're exporting from Salesforce Sales Cloud before mapping it.
Destination checklist
Microsoft Dynamics 365 Sales migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Sales .
Source checklist
Salesforce migration checklist
Exit checklist for unwinding your Salesforce Sales Cloud setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Salesforce Sales Cloud 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.
Salesforce Sales Cloud
Account
Microsoft Dynamics 365 Sales
Account
1:1Salesforce Account maps directly to Dynamics 365 Account. The primary key mapping uses AccountId-to-accountid with Name, Industry, AnnualRevenue, Type, and BillingAddress migrating as standard fields. Parent-Account hierarchies require a recursive import pass: we import top-level Accounts (where ParentId is null) first, then resolve parent IDs and import child Accounts. The relationship preserves the hierarchy depth up to Dynamics 365's ten-level limit, which covers the vast majority of Salesforce org hierarchies.
Salesforce Sales Cloud
Contact
Microsoft Dynamics 365 Sales
Contact
1:1Salesforce Contact maps to Dynamics 365 Contact with a critical relationship difference to resolve. Salesforce supports many-to-many Contact-to-Account relationships via the Account Contact Relation junction object; Dynamics 365 uses a primary AccountId on Contact with the Connection entity for secondary relationships. We import Contacts with their primary AccountId set, then replay secondary Account relationships as Connection records (fromcontacts and toaccounts) in a second pass. Email, Phone, Title, and custom contact fields migrate directly.
Salesforce Sales Cloud
AccountContactRelation
Microsoft Dynamics 365 Sales
Connection (Contact-to-Account)
1:manySalesforce's Account Contact Relation junction table (which enables a Contact to belong to multiple Accounts with roles) maps to the Dynamics 365 Connection entity. Each Account Contact Relation record becomes a Connection with Record1Id pointing to the Account and Record2Id pointing to the Contact, with a custom Connection Role reflecting the original Account Contact Relation roles field. This second-pass migration runs only after both Accounts and Contacts are committed to Dataverse.
Salesforce Sales Cloud
Lead
Microsoft Dynamics 365 Sales
Lead
1:1Salesforce Lead maps directly to Dynamics 365 Lead with field-level mapping of Name, Company, Email, Phone, LeadSource, Status, Rating, and custom fields. Salesforce Lead Status values map to Dynamics 365 Lead Status values via a pre-migration value map. If the source org uses Lead conversion mapping to auto-create Contacts and Accounts on conversion, we map the pre-conversion Lead record to the Dynamics 365 Lead and set the converted-flag fields accordingly.
Salesforce Sales Cloud
Opportunity
Microsoft Dynamics 365 Sales
Opportunity
1:1Salesforce Opportunity maps to Dynamics 365 Opportunity with Stage, Amount, CloseDate, Probability, Description, and OwnerId fields. The OwnerId maps to the Dynamics 365 Owner (User) entity. Opportunity Record Type maps to Dynamics 365 Opportunity Type or a custom field if multiple sales processes are in use. Multi-currency Opportunities from Salesforce with CurrencyIsoCode map to Dynamics 365 TransactionCurrency with the appropriate exchange rate context.
Salesforce Sales Cloud
OpportunityContactRole
Microsoft Dynamics 365 Sales
Contact (opportunitycustomeraccountcontact role)
1:manySalesforce Opportunity Contact Role junction records map to the Contact's opportunitycustomeraccountcontact role relationship in Dynamics 365. The Contact's primary role on the Opportunity is set via the Role field on that relationship. If a Salesforce Opportunity has multiple Contact Roles, we set the first Contact as primary and store additional roles in a custom field or notes for the customer's admin to distribute post-migration.
Salesforce Sales Cloud
Product2
Microsoft Dynamics 365 Sales
Product
1:1Salesforce Product2 records map to Dynamics 365 Product (the Dataverse product table). ProductCode from Salesforce maps to ProductID (the product number field). We import Products before Pricebook Entries and before Opportunity Line Items so that the product reference is available at line-item import time. Status field (Active/Inactive) maps to Statecode (Active/Inactive) in Dataverse.
Salesforce Sales Cloud
PricebookEntry
Microsoft Dynamics 365 Sales
ProductPriceLevel
1:1Salesforce PricebookEntry maps to Dynamics 365 ProductPriceLevel within a Price List (which replaces Salesforce Pricebook). The StandardPrice from PricebookEntry maps to the Amount (default) field on ProductPriceLevel. We import the default (standard) Pricebook as the base Price List first, then create product price levels for each product in the catalog, then set the IsStandardPrice flag for the standard price level.
Salesforce Sales Cloud
OpportunityLineItem
Microsoft Dynamics 365 Sales
OpportunityProduct (Opportunity Line Item)
1:1Salesforce Opportunity Line Item maps to Dynamics 365 OpportunityProduct. We resolve the parent Opportunity's OpportunityId, the Product's ProductId, and the PriceList's TransactionCurrencyId at migration time. Quantity, UnitPrice, and TotalPrice migrate as Quantity, PricePerUnit, and LineItemAmount. Discount (percent or amount) maps to the ManualDiscountAmount or ManualDiscountPercent field depending on the source field type.
Salesforce Sales Cloud
Case
Microsoft Dynamics 365 Sales
Incident (Case)
1:1Salesforce Case maps to Dynamics 365 Case (internally the Incident table in Dataverse). Case Status, Priority, Origin, and Subject fields migrate directly. The Contact and Account lookups resolve via the Contact and Account IDs established in the earlier passes. If Salesforce Cases have nested Case Comments, these migrate as Dynamics 365 Case Articles or as Note records attached to the Case depending on the customer's preference.
Salesforce Sales Cloud
Campaign
Microsoft Dynamics 365 Sales
Campaign
1:1Salesforce Campaign maps to Dynamics 365 Campaign with CampaignName, Type, Status, BudgetedCost, and StartDate/EndDate fields. Campaign Members (Contacts and Leads linked to the Campaign) map to Dynamics 365 Campaign Activity Members or to a custom Campaign Member entity. If the source Campaign uses Campaign Member Status values, we map these to Dynamics 365 Campaign Response status values.
Salesforce Sales Cloud
Contract
Microsoft Dynamics 365 Sales
Contract
1:1Salesforce Contract maps to Dynamics 365 Contract with StartDate, EndDate, ContractTerm, Status, and the AccountId lookup. If the source org uses Salesforce Contracts with the Field Mapping XML feature for parent-to-contract mappings from Opportunity or Order, we document those mappings in the handoff package and the customer rebuilds the equivalent logic in Dynamics 365 using Power Automate or the native contract creation workflow.
Salesforce Sales Cloud
Task
Microsoft Dynamics 365 Sales
Task
1:1Salesforce Task maps to Dynamics 365 Task with Subject, Status, Priority, ActivityDate, and Description fields. OwnerId resolves to the Dynamics 365 Owner (User). If the Task has a WhatId pointing to an Account, Opportunity, or Case, we resolve the Dataverse record ID at migration time. Salesforce TaskSubtype (Call, Email, etc.) maps to a custom field in Dynamics 365 since the native Task record type does not include a TaskSubtype attribute in the same way.
Salesforce Sales Cloud
Event
Microsoft Dynamics 365 Sales
Appointment
1:1Salesforce Event maps to Dynamics 365 Appointment with Subject, StartDateTime, EndDateTime, Location, and Description. The Dynamics 365 Appointment is a subset of the fuller calendar Event entity which also covers non-appointment events; we use the Appointment entity for calendar-bound events and map remaining Event fields to custom fields where the native Appointment schema does not support them.
Salesforce Sales Cloud
ContentDocument (Attachments)
Microsoft Dynamics 365 Sales
Annotation (Note/Attachment)
1:1Salesforce ContentDocument (files attached to records via ContentDocumentLink) maps to Dynamics 365 Annotation records with a documentbody binary attachment. The Annotation is linked to the parent record via the objectid field in Dataverse. We resolve the parent record ID at migration time so that the document attachment lands on the correct Account, Contact, Opportunity, or Case in Dynamics 365.
Salesforce Sales Cloud
Custom Object
Microsoft Dynamics 365 Sales
Custom Table (Dataverse)
1:1Salesforce Custom Objects (with __c suffix) map to Dataverse Custom Tables with the corresponding schema. We pre-create the destination custom table in Dataverse using the Power Platform admin center or the Dataverse API, including all custom columns, lookup relationships, and option set values, before migrating any data. Custom table naming follows Dataverse conventions and we preserve the Salesforce API name in a field or in documentation for the customer's admin.
| Salesforce Sales Cloud | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Account | Account1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| AccountContactRelation | Connection (Contact-to-Account)1:many | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| OpportunityContactRole | Contact (opportunitycustomeraccountcontact role)1:many | Fully supported | |
| Product2 | Product1:1 | Fully supported | |
| PricebookEntry | ProductPriceLevel1:1 | Fully supported | |
| OpportunityLineItem | OpportunityProduct (Opportunity Line Item)1:1 | Fully supported | |
| Case | Incident (Case)1:1 | Fully supported | |
| Campaign | Campaign1:1 | Fully supported | |
| Contract | Contract1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Event | Appointment1:1 | Fully supported | |
| ContentDocument (Attachments) | Annotation (Note/Attachment)1:1 | Fully supported | |
| Custom Object | Custom Table (Dataverse)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.
Salesforce Sales Cloud gotchas
Workflow Rules and Process Builder are retired
Bulk API batch quota exhaustion during large imports
Storage overage billing is non-obvious
Account-Contact many-to-many relationship mapping
Territory and team member import ordering dependencies
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 source org audit
We audit the source Salesforce org across edition, active objects, record counts per object, custom object definitions, Workflow Rules and Process Builder inventory, Territory configuration, and API usage over the prior 90 days. We assess the destination Dynamics 365 environment's licensing tier, existing Dataverse tables, and any Power Platform capacity constraints. The discovery output is a written migration scope document covering object-by-object mapping, volume estimates, automation inventory, and a go/no-go readiness checklist for both source and destination.
User and Owner reconciliation
We extract every distinct Salesforce User ID and Owner ID referenced across Accounts, Contacts, Leads, Opportunities, Cases, and Activities and match by email against the destination Dynamics 365 tenant's User table. Users without a matching Dynamics 365 User go to a reconciliation queue for the customer's tenant admin to provision before migration begins. Owner IDs on records must resolve to valid Dynamics 365 Users or the record insert will fail on the OwnerId reference.
Dataverse schema preparation
We pre-create any custom tables (Dataverse equivalent of Salesforce Custom Objects) and custom columns in the destination Dynamics 365 environment before any data migrates. This includes option set values, lookup relationships, and any calculated or rollup fields. If the destination is a Sandbox environment, we validate the schema there first before deploying to production. The Account-Contact relationship model (primary AccountId plus Connection entity for secondary relationships) is configured in Dataverse at this stage.
Sandbox migration and reconciliation
We run a full migration into the Dynamics 365 Sandbox environment using production-like data volume. The customer's RevOps lead reconciles record counts across all objects (Accounts in, Contacts in, Opportunities in, Activities in), spot-checks 25-50 records against the Salesforce source, and validates that the Account-Contact relationship model preserved secondary Account connections. Schema corrections and mapping adjustments happen in Sandbox, not in production.
Production migration in dependency order
We run production migration in record-dependency sequence: Users (manually provisioned, validated by email match), Accounts (with parent Account hierarchy resolved), Contacts (with primary AccountId set), Account Contact Relations (as Connection records), Leads, Opportunities (with OwnerId and AccountId resolved), Products, Price Lists, Opportunity Products, Cases, Campaigns, Contracts, and Activity history (Tasks, Events, Notes, Attachments via Dataverse API with chunking and backoff). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, delta sync, and workflow handoff
We freeze Salesforce 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 Workflow Rules and Process Builder inventory document with Power Automate equivalents to the customer's admin team. We support a one-week hypercare window for reconciliation issues. We do not rebuild Salesforce automations as Power Automate flows inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Salesforce Sales Cloud
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 Salesforce Sales Cloud 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
Salesforce Sales Cloud: 100,000 daily API requests base for Enterprise, plus 1,000 requests per user license; concurrent long-running requests capped at 25; individual call timeout 10 minutes.
Data volume sensitivity
Salesforce Sales Cloud exposes a bulk API — large-volume migrations stream efficiently.
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 Salesforce Sales Cloud to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your Salesforce Sales Cloud 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 Salesforce Sales Cloud
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.