CRM migration
Field-level mapping, validation, and rollback between Dynamics 365 Field Service and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Dynamics 365 Field Service
Source
Salesforce Sales Cloud
Destination
Compatibility
14 of 14
objects map 1:1 between Dynamics 365 Field Service and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
48–72 hours
Overview
Microsoft Dynamics 365 Field Service is built on the Dataverse (Common Data Model) and ships with dedicated field-service entities: Bookable Resources, Work Orders, Incident Types, Customer Assets, and Resource Scheduling Optimization. Salesforce Sales Cloud ships with standard CRM objects (Account, Contact, Lead, Opportunity) and adds Field Service Lightning as an optional managed package with Service Appointments, Assigned Resources, and Service Territories. The migration carries everything Dynamics stores natively — accounts, contacts, work orders, assets, products, custom entities, and activity logs — into Salesforce's Account/Contact/Opportunity model plus any Field Service Lightning objects your org requires. The harder problems are mapping Dynamics Work Order headers and line items to Salesforce Service Appointments, preserving Bookable Resource assignments as Assigned Resources, translating Incident Type pick-lists into Salesforce custom pick-list fields, and getting the Dataverse-to-Salesforce lookup chain right before foreign-key resolution runs. FlitStack's migration engine reads Dynamics via the Dataverse Web API, transforms records through a staged pipeline, and loads into Salesforce using Bulk API 2.0 — handling AccountId lookups, OwnerId user-resolution by email, and timestamp preservation across both platforms. Workflows, Power Automate flows, and Resource Scheduling Optimization rules do not migrate and must be rebuilt in Salesforce Flow or FSL Dispatch.
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.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Dynamics 365 Field Service object lands in Salesforce Sales Cloud, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Dynamics 365 Field Service
Account
Salesforce Sales Cloud
Account
1:1Direct map. Dynamics Account (account) maps to Salesforce Account. Dataverse accountid becomes Salesforce Id. Dynamics parent-account lookups (parentaccountid) map to Salesforce ParentId. Multi-address records: Dynamics address1_line1, address1_city map to Salesforce BillingAddress fields. Address type flags (address2_type = shipping) require custom Salesforce address record or custom field for parity.
Dynamics 365 Field Service
Contact
Salesforce Sales Cloud
Contact
1:1Direct map. Dynamics Contact (contact) maps to Salesforce Contact. Email address (emailaddress1) maps to Contact.Email. Primary contact role on the Dynamics Account is preserved as the primary Contact on the Salesforce Account via AccountId lookup. Secondary contact roles stored on Account can be migrated as AccountContactRelation records in Salesforce.
Dynamics 365 Field Service
Lead
Salesforce Sales Cloud
Lead
1:1Direct map for pre-service leads. Dynamics leads (lead) map to Salesforce Lead when the record has not yet converted. Dynamics lead status (leadsource, statecode) maps to Salesforce Lead Status pick-list values. Note that Dynamics leads that have already converted to Account/Contact in the source should route to Salesforce Account/Contact directly to avoid duplicate records.
Dynamics 365 Field Service
msdyn_workorder
Salesforce Sales Cloud
ServiceAppointment / WorkOrder (FSL)
1:1Dynamics Work Order maps to Salesforce Field Service Lightning ServiceAppointment as the primary record, with WorkOrder as a related entity if your org uses the legacy FSL object model. msdyn_WorkOrderId becomes the ServiceAppointment Id. Work order priority, incident type, and system status are preserved as custom pick-list fields (WorkOrderPriority__c, IncidentType__c, SystemStatus__c) since FSL does not have a native 1:1 field for every Dynamics property.
Dynamics 365 Field Service
msdyn_workorderservicetask
Salesforce Sales Cloud
ServiceAppointment / WorkOrderLineItem
1:1Dynamics Work Order Service Tasks (line-level task entries on a work order) map to Salesforce WorkOrderLineItem if your destination uses the FSL WorkOrder object, or are attached as Tasks to the ServiceAppointment if FSL is not enabled. Task type, duration, and status are mapped field-by-field. msdyn_TaskType maps to WorkOrderLineItem.SubLineType or a custom TaskType__c pick-list.
Dynamics 365 Field Service
msdyn_bookableresource
Salesforce Sales Cloud
ServiceResource
1:1Dynamics Bookable Resources (technicians, crews, equipment) map to Salesforce ServiceResource. Resource type (msdyn_resourcetype: User, Contact, Account) determines whether ServiceResource.RelatedRecordId points to a Salesforce User or Contact. Crew resources and equipment types require custom fields or a separate ServiceResource record with ResourceType = 'Equipment'.
Dynamics 365 Field Service
msdyn_bookingsetupheader
Salesforce Sales Cloud
ServiceTerritory / OperatingHours
1:1Dynamics Resource Territories (msdyn_bookingsetupheader and msdyn_territory) map to Salesforce ServiceTerritory and OperatingHours. Territory address and timezone data become ServiceTerritory.Address and OperatingHours.TimeZone fields respectively. Multi-territory hierarchies in Dynamics — including parent/child territory relationships — map to Salesforce ServiceTerritory.ParentTerritoryId lookup, preserving the geographic service area structure. Service dispatchers use these territory mappings in the FSL Dispatch Console to assign work orders to resources operating within specific geographic boundaries.
Dynamics 365 Field Service
msdyn_customerasset
Salesforce Sales Cloud
Asset
1:1Dynamics Customer Assets (msdyn_customerasset) map directly to Salesforce Asset. The asset's parent Account is resolved via msdyn_AccountId → Asset.AccountId lookup. msdyn_ProductId links to the Salesforce Product2 record. Asset serial number, install date, and status fields map directly. Custom Dataverse columns on the asset entity become Asset__c custom fields.
Dynamics 365 Field Service
Product (msdyn_product)
Salesforce Sales Cloud
Product2
1:1Dynamics products (msdyn_product) map to Salesforce Product2. Product name, number, and stock-keeping unit (SKU) map directly. Product pricing in Dynamics — msdyn_unitamount and msdyn_pricelist — requires mapping to Salesforce PricebookEntry: the standard pricebook must be created first, then price entries added per product. Currency fields in Dynamics map to Salesforce CurrencyIsoCode.
Dynamics 365 Field Service
msdyn_incidenttype
Salesforce Sales Cloud
Custom Object / Custom Field
1:1Dynamics Incident Types (msdyn_incidenttype) define the type of service task associated with a work order and carry a pre-filled set of tasks, labor requirements, and estimated duration. Salesforce has no native Incident Type object. We migrate each unique Incident Type name as a custom pick-list value on the ServiceAppointment or WorkOrder object (IncidentType__c). Associated tasks and labor rules are exported as a reference document for manual rebuild in FSL Templates.
Dynamics 365 Field Service
msdyn_quoteline (if present)
Salesforce Sales Cloud
QuoteLineItem / OpportunityLineItem
1:1Dynamics 365 Sales-linked quote lines map to Salesforce QuoteLineItem or OpportunityLineItem depending on where the opportunity sits. Dynamics product quantity, unit price, and discount percentage map directly. Dynamics manual discount flags map to Salesforce IsDiscounted = true. Line-item sequencing is preserved in Salesforce SortOrder.
Dynamics 365 Field Service
msdyn_fieldservicepricelistitem
Salesforce Sales Cloud
PricebookEntry
1:1Dynamics Field Service Price List Items carry service-specific pricing (labor rates, trip charges, parts markups) that map to Salesforce PricebookEntry records. Each price list in Dynamics becomes a Salesforce Pricebook2 record, with Price List Items becoming PricebookEntry entries tied to Product2. Currency conversions are applied at migration time using the configured exchange rate.
Dynamics 365 Field Service
Custom Dataverse Entity
Salesforce Sales Cloud
Custom Object (__c)
1:1Any custom Dataverse entities your Dynamics org has created (beyond the standard Field Service entities) map 1:1 to Salesforce custom objects with the __c suffix. N:N relationships in Dataverse (e.g., a custom junction table) map to Salesforce junction objects or many-to-many relationship objects. Each custom entity is evaluated for lookup integrity before migration runs.
Dynamics 365 Field Service
msdyn_workordernotes (notes)
Salesforce Sales Cloud
Note / ContentNote
1:1Dynamics work order notes and email attachments map to Salesforce Notes (ContentNote / ContentDocumentLink) attached to the corresponding ServiceAppointment or WorkOrder record. Inline images in notes are downloaded and rehosted as Salesforce Files. File size limits per Salesforce (default 25MB per file) apply.
| Dynamics 365 Field Service | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Account | Account1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| msdyn_workorder | ServiceAppointment / WorkOrder (FSL)1:1 | Fully supported | |
| msdyn_workorderservicetask | ServiceAppointment / WorkOrderLineItem1:1 | Fully supported | |
| msdyn_bookableresource | ServiceResource1:1 | Fully supported | |
| msdyn_bookingsetupheader | ServiceTerritory / OperatingHours1:1 | Fully supported | |
| msdyn_customerasset | Asset1:1 | Fully supported | |
| Product (msdyn_product) | Product21:1 | Fully supported | |
| msdyn_incidenttype | Custom Object / Custom Field1:1 | Fully supported | |
| msdyn_quoteline (if present) | QuoteLineItem / OpportunityLineItem1:1 | Fully supported | |
| msdyn_fieldservicepricelistitem | PricebookEntry1:1 | Fully supported | |
| Custom Dataverse Entity | Custom Object (__c)1:1 | Fully supported | |
| msdyn_workordernotes (notes) | Note / ContentNote1: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.
Dynamics 365 Field Service gotchas
Dataverse service protection API limits throttle bulk exports
Offline profile FetchXML tuning is source-environment-specific
Project Operations integration has bidirectional sync limitations
Copilot add-on credits do not migrate and reset at zero
File attachments stored in SharePoint require separate file migration
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
Pair-specific challenges
Migration approach
Inventory Dynamics entities and deliver a pre-flight schema plan
FlitStack AI connects to your Dynamics 365 instance via the Dataverse Web API and inventories all entities in use — standard Field Service entities (msdyn_workorder, msdyn_bookableresource, msdyn_customerasset, msdyn_territory) plus every custom Dataverse table your org has created. We generate a schema plan that identifies: which entities have custom columns, which lookups point to custom entities, which Dataverse options sets need Salesforce custom pick-lists, and whether your Salesforce org needs Field Service Lightning enabled before data lands. This plan is reviewed with your admin before any data moves.
Create Salesforce schema and resolve user accounts by email
Salesforce custom fields (__c suffix), custom pick-lists for Dynamics options sets (msdyn_priority, msdyn_systemstatus, msdyn_resourcetype), and custom objects for Dataverse entities with no Salesforce equivalent are created from the schema plan. Simultaneously, every Dynamics user and contact who owns records is matched against Salesforce users by email address. Unmatched owners are flagged — your team either provisions Salesforce user accounts for them or designates a fallback owner before the migration pass. No record is loaded without a resolved OwnerId.
Run sequenced migration passes: master data first, then transactional records
The migration runs in a staged sequence: (1) Accounts and Assets — because they are lookup targets for everything else; (2) Products and Price List Items — to populate Pricebook2 and PricebookEntry before work orders that carry pricing; (3) Service Territories and Operating Hours — required for ServiceAppointment.ServiceTerritoryId; (4) Bookable Resources mapped to ServiceResource — required for AssignedResource lookups; (5) Work Orders mapped to ServiceAppointments — with FSL fields populated only if FSL is confirmed enabled; (6) Work Order Service Tasks mapped to WorkOrderLineItems; (7) Activities and Notes attached to their parent records. Each pass validates foreign-key integrity before the next pass starts.
Execute sample migration with field-level diff and owner-resolution audit
A representative slice of records — typically 100–500 records spanning accounts, contacts, work orders, service appointments, and a few activities — migrates first. We generate a field-level diff between the source Dynamics record and the destination Salesforce record so you can verify: that msdyn_priority mapped to ServiceAppointment.Priority correctly, that msdyn_serviceterritory resolved to ServiceTerritoryId, that Bookable Resource types mapped to the correct ResourceType value, and that timestamp fields (ScheduledStartTime, ScheduledEndTime, ActualStartTime) reflect the original Dynamics values. The owner-resolution audit log is included in the diff so you can confirm every record landed with the expected owner.
Full migration run with delta-pickup window and audit log
The full migration runs against Salesforce using Bulk API 2.0 for throughput. A delta-pickup window (typically 24–48 hours) opens at the point of go-live — any Dynamics records modified or created during the cutover are captured in a second migration pass. FlitStack maintains a full audit log of every insert, update, and error. If reconciliation identifies records that failed to migrate or landed with unexpected values, one-click rollback reverts the Salesforce org to its pre-migration state so the migration can be re-run with corrected mapping. RSO rule configuration, Power Automate flows, and FSL scheduling templates are exported as structured JSON and PDF documents for your admin to rebuild in Salesforce Flow and FSL Dispatch.
Platform deep dives
Dynamics 365 Field Service
Source
Strengths
Weaknesses
Salesforce Sales Cloud
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 Dynamics 365 Field Service and Salesforce Sales Cloud.
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
Dynamics 365 Field Service: Service protection limits enforced per org; specific numeric thresholds are not publicly documented by Microsoft and vary by workload type.
Data volume sensitivity
Dynamics 365 Field Service 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 Dynamics 365 Field Service to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Dynamics 365 Field Service to Salesforce Sales Cloud migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Dynamics 365 Field Service
Other ways to arrive at Salesforce Sales Cloud
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.