CRM migration

Migrate from Salesforce Sales Cloud to Microsoft Dynamics 365 Sales

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 logo

Salesforce Sales Cloud

Source

Microsoft Dynamics 365 Sales

Destination

Microsoft Dynamics 365 Sales  logo

Compatibility

88%

14 of 16

objects map 1:1 between Salesforce Sales Cloud and Microsoft Dynamics 365 Sales .

Complexity

BStandard

Timeline

5-8 weeks

Rollback included Accuracy guarantee Field-level validation

Try the reverse

Microsoft Dynamics 365 Sales
Salesforce Sales Cloud

Overview

What this migration involves

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.

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

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pushing teams away

  • The sticker price is a fraction of the actual cost: storage overages run $125/GB, Agentforce conversations are $2 each, and annual uplift is 8–10% on renewal.
  • Admin configuration is non-trivial; teams without a dedicated Salesforce admin spend disproportionate time on maintenance and lose productivity on a platform that resists shortcuts.
  • Workflow Rules and Process Builder are retired features requiring mandatory migration to Flow before Salesforce decommissions them, creating a forced rework project.
  • Hidden costs accumulate: Sales Engagement, Sales Programs, Salesforce Maps, and other add-ons that enterprise teams need are not included in the base per-seat price.
  • Complexity and licensing cost drive mid-market companies to simpler CRMs with faster time-to-value and transparent pricing.

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 Salesforce Sales Cloud objects map to Microsoft Dynamics 365 Sales

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

maps to

Microsoft Dynamics 365 Sales

Account

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Contact

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Connection (Contact-to-Account)

1:many
Fully supported

Salesforce'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

maps to

Microsoft Dynamics 365 Sales

Lead

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Opportunity

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Contact (opportunitycustomeraccountcontact role)

1:many
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Product

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

ProductPriceLevel

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

OpportunityProduct (Opportunity Line Item)

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Incident (Case)

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Campaign

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Contract

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Task

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Appointment

1:1
Fully supported

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

maps to

Microsoft Dynamics 365 Sales

Annotation (Note/Attachment)

1:1
Fully supported

Salesforce 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

maps to

Microsoft Dynamics 365 Sales

Custom Table (Dataverse)

1:1
Fully supported

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

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.

Salesforce Sales Cloud logo

Salesforce Sales Cloud gotchas

High

Workflow Rules and Process Builder are retired

High

Bulk API batch quota exhaustion during large imports

Medium

Storage overage billing is non-obvious

Medium

Account-Contact many-to-many relationship mapping

Low

Territory and team member import ordering dependencies

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

  • Account-Contact many-to-many relationship requires two-pass migration

    Salesforce's Account Contact Relation junction object allows a single Contact to associate with multiple Accounts with role-specific permissions. Dynamics 365 stores a Contact's primary Account as a direct lookup field and handles secondary relationships via the Connection entity. A flat single-pass import that sets only the primary AccountId will silently drop every secondary Account relationship. We import Contacts with their primary AccountId, then replay all Account Contact Relation records as Dynamics 365 Connection records in a second pass, preserving every relationship the org has built.

  • Workflow Rules and Process Builder do not migrate to Power Automate

    Salesforce has retired Workflow Rules and is restricting Process Builder, requiring orgs to migrate to Flow. Dynamics 365 uses Power Automate and the native Dynamics 365 workflow engine as its automation layer, which operates on different triggers, conditions, and actions. We do not migrate automations as code. We deliver a written inventory of every active Salesforce Workflow Rule and Process Builder process with its trigger, conditions, and actions, plus a recommended Power Automate template or Dynamics 365 workflow equivalent. The customer's admin rebuilds these post-migration.

  • User ID reference chain blocks junction record migration

    Opportunity Team Members, Account Team Members, and Territory Account Assignments in Salesforce all reference User IDs that must exist in the destination Dynamics 365 tenant before the junction records can be inserted. We audit all User IDs during the pre-migration data audit and flag any Salesforce User without a corresponding Dynamics 365 User. The customer's tenant admin provisions missing users in Dynamics 365 before we begin the junction record pass. Skipping this step causes the junction insert to fail with a foreign-key violation on the Owner field.

  • Salesforce Bulk API quota pacing is required for large historical imports

    Salesforce limits Bulk API to 15,000 batches per day with 10,000 records per batch. For orgs with millions of historical records, this quota can be exhausted in a single migration day, blocking subsequent days. We pace imports across multiple days, monitor batch consumption in real time, and switch to the REST API Composite endpoint for smaller objects when the bulk quota is exhausted. The Dataverse target side also has API request limits per environment that we observe with exponential backoff.

  • Salesforce Contracts field mapping XML has no Dynamics 365 equivalent out-of-box

    Salesforce Contracts uses a Field Mapping XML to create and update Contract records from Opportunity, Order, Quote, or custom objects with parent-to-child and child-to-child mapping relationships. Dynamics 365 Contract creation follows the standard contract entity workflow without this flexible mapping configuration. We document every active Salesforce Contract field mapping during scoping and the customer rebuilds the equivalent logic in Dynamics 365 using Power Automate or a plugin. The contract record data itself migrates; the automated creation logic does not.

Migration approach

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

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

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

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

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

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

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

Context on both ends of the pair

Salesforce Sales Cloud logo

Salesforce Sales Cloud

Source

Strengths

  • Largest enterprise app ecosystem in CRM with 5,000+ AppExchange integrations covering nearly every vertical workflow.
  • Native Einstein AI delivers lead scoring, opportunity insights, and predictive forecasting without a third-party layer.
  • Advanced territory management, multi-currency, and flexible forecasting satisfy complex B2B revenue structures.
  • Deep platform extensibility: Custom Objects, Apex, Flow, and the Metadata API allow full schema customization.
  • Well-documented REST API, Bulk API, and Composite API with published rate limits for programmatic migration.

Weaknesses

  • Pricing model is layered and opaque in practice: per-seat fees plus storage overages, add-on subscriptions, and annual uplifts compound to 30–40% above sticker price.
  • Workflow Rules and Process Builder are deprecated, forcing all orgs onto Salesforce Flow — a migration task that catches many teams by surprise.
  • Steep administrative complexity: meaningful configuration requires a dedicated Salesforce admin or consultant.
  • API rate limits are edition-gated (100k/day base for Enterprise) and easily exhausted by large historical imports without throttling.
  • Data export is exportable via Data Loader but preserving relationship integrity across 30+ objects requires careful ETL sequencing.
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. 1 of 8 objects need a mapping; the rest are 1:1.

B

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

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • 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

    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

    A

    Salesforce Sales Cloud exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Salesforce Sales Cloud 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 Salesforce Sales Cloud to Microsoft Dynamics 365 Sales data migrations

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

Can't find your answer?

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 consultation

Most migrations land between five and eight weeks for organizations under 30,000 Accounts and 10,000 Opportunities with standard objects and no custom objects. Migrations with large engagement histories (over 500,000 activity records), custom objects, complex Account hierarchies with multiple junction table passes, Territory management, or multiple Salesforce orgs consolidated into one Dynamics 365 tenant move to twelve to eighteen weeks because of Dataverse API pacing, multi-pass junction resolution, and Power Automate workflow inventory scope.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Salesforce Sales Cloud.
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