CRM migration
Field-level mapping, validation, and rollback between Function 365 and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Function 365
Source
Salesforce Sales Cloud
Destination
Compatibility
11 of 12
objects map 1:1 between Function 365 and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
48–72 hours
Overview
Function 365 — in this migration context, a Microsoft Dynamics 365 or Microsoft 365 Business Application environment — stores contacts, companies, and deals in a record hierarchy where accounts and contacts share a loosely coupled relationship and user licenses map to Microsoft 365 seat assignments. Salesforce Sales Cloud uses a structured Account-Contact-Opportunity model with mandatory AccountId lookups on contacts, record types to vary page layouts per business unit, and pick-list values scoped to sales processes. We map Function 365 contacts to Salesforce Contacts with AccountId resolution, companies to Salesforce Accounts, and deals to Opportunities with pipeline-to-record-type mapping. We do not migrate workflows, automation rules, or reporting configurations — those must be rebuilt in Salesforce Flow. Our migration engine uses API-based extraction from Function 365 and Bulk API 2.0 loading into Salesforce, with field-level validation before commit. Original create dates, owner assignments, and stage history are preserved as custom fields to maintain reporting continuity from day one.
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 Function 365 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.
Function 365
Contact
Salesforce Sales Cloud
Contact
1:1Function 365 contacts map directly to Salesforce Contacts. Salesforce requires an AccountId on every contact — if the Function 365 contact has no associated company, we attach it to a default 'Unassigned Account' record or flag it for manual resolution before migration commits.
Function 365
Contact (lead-like records)
Salesforce Sales Cloud
Lead
1:manyFunction 365 records flagged as leads or prospects with no closed-won status route to Salesforce Lead. Records with an active account relationship and deal history route to Salesforce Contact. The split is determined by the presence of a sales transaction or opportunity association in the source record.
Function 365
Account / Company
Salesforce Sales Cloud
Account
1:1Function 365 accounts and companies map to Salesforce Accounts. Parent-account hierarchies in Function 365 preserve as Salesforce ParentId. Multi-company associations (N:N in Function 365) collapse to a primary AccountId plus Account Contact Relations for secondary affiliations. This ensures a single primary relationship in Salesforce while preserving secondary affiliations.
Function 365
Opportunity / Deal
Salesforce Sales Cloud
Opportunity
1:1Function 365 opportunities and deals map to Salesforce Opportunities. Each pipeline in Function 365 becomes a Salesforce Sales Process keyed by Record Type — this is the most impactful structural decision because stage pick-list values, probabilities, and forecast categories are scoped per record type.
Function 365
Pipeline
Salesforce Sales Cloud
Sales Process + Record Type
1:1A single Function 365 pipeline maps to one Salesforce record type with its own sales process. Multiple Function 365 pipelines require multiple Salesforce record types, each needing a page layout, profile assignment, and validation rules pre-created in Salesforce before data lands.
Function 365
Pipeline Stage
Salesforce Sales Cloud
Opportunity Stage
1:1Stage names map value-by-value per Salesforce record type. Stage probability and forecast category (Open, Commit, Best Case) are re-applied based on Salesforce's stage-history model. Function 365 stage-entry timestamps are preserved as custom datetime fields for reporting continuity and historical tracking.
Function 365
Task / Activity (Email, Call, Note)
Salesforce Sales Cloud
Task / Event / Note
1:1Function 365 email activities map to Salesforce Tasks with Type='Email'. Call activities map to Tasks with Type='Call'. Meetings map to Salesforce Events with original start and end times. Notes migrate as Salesforce Notes — rich-text body preserved. Original timestamps and owner IDs carry over.
Function 365
Custom Entity
Salesforce Sales Cloud
Custom Object
1:1Function 365 custom entities and Dataverse custom tables map 1:1 to Salesforce custom objects (CustomObject__c). Custom-entity relationships that use Dataverse N:N junction tables require Salesforce junction objects — we surface this in the migration plan and pre-build the junction schema before the load.
Function 365
User / Owner
Salesforce Sales Cloud
User
1:1Function 365 users are resolved by email match against Salesforce users. Unmatched owners are flagged before migration — the team either invites them to Salesforce first or assigns their records to a designated fallback owner. No record lands without a valid Salesforce OwnerId.
Function 365
Attachment / File
Salesforce Sales Cloud
Salesforce Files
1:1File attachments on Function 365 records are downloaded and re-uploaded to Salesforce Files, linked to the target record via ContentDocumentLink. Salesforce's default 25MB per-file limit applies; files exceeding this are flagged, chunked into smaller segments, or skipped based on your pre-defined handling instructions.
Function 365
Workflow / Automation Rule
Salesforce Sales Cloud
Salesforce Flow
1:1Function 365 workflow definitions, Power Automate flows, and business rules do not migrate automatically. We export all rule definitions as JSON and structured documentation so your Salesforce admin can rebuild them in Flow. This is a manual step requiring careful planning — allocate 2–4 weeks of admin time for complex automation rule sets.
Function 365
Report / Dashboard
Salesforce Sales Cloud
Salesforce Report / CRM Analytics
1:1Dynamics 365 SSRS reports and Power BI dashboards do not migrate directly. The underlying migrated data is fully available in Salesforce, but all reports and dashboards must be rebuilt from scratch. Salesforce Reports provide equivalent standard functionality, while CRM Analytics (Tableau) handles advanced analytical dashboards and visualizations.
| Function 365 | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Contact (lead-like records) | Lead1:many | Fully supported | |
| Account / Company | Account1:1 | Fully supported | |
| Opportunity / Deal | Opportunity1:1 | Fully supported | |
| Pipeline | Sales Process + Record Type1:1 | Fully supported | |
| Pipeline Stage | Opportunity Stage1:1 | Fully supported | |
| Task / Activity (Email, Call, Note) | Task / Event / Note1:1 | Fully supported | |
| Custom Entity | Custom Object1:1 | Fully supported | |
| User / Owner | User1:1 | Fully supported | |
| Attachment / File | Salesforce Files1:1 | Fully supported | |
| Workflow / Automation Rule | Salesforce Flow1:1 | Fully supported | |
| Report / Dashboard | Salesforce Report / CRM Analytics1: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.
Function 365 gotchas
AI-assisted notes are proprietary — verify clinical-record export coverage
NHS Number format must be preserved exactly
Implementation specialist time is paid extra at £55/session
GDPR consent timestamps are regulatory artefacts
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
Audit Function 365 data and map to Salesforce schema
FlitStack AI inventories all Function 365 entities — contacts, accounts, opportunities, activities, and custom tables — and generates a field-level mapping document. We identify Dataverse custom attributes that need Salesforce __c fields, flag N:N relationship handling, and produce a custom-field creation script for your Salesforce admin. This phase also surfaces records with missing required fields, duplicate candidates, and records exceeding Salesforce file-size limits.
Pre-create Salesforce schema (record types, custom fields, page layouts)
Before any data moves, your Salesforce admin creates the record types, page layouts, and custom fields identified in the audit. We deliver a detailed setup plan with exact API field names, pick-list values, and profile assignments. For record-type-heavy migrations, we strongly recommend spinning up a Salesforce sandbox first — this lets the admin configure, test, and validate layouts against real data before the production load commits anything.
Resolve users by email and validate owner assignment
We match each Function 365 owner ID to a Salesforce user by email address. Any owners without a corresponding Salesforce account appear in a pre-flight report with clear guidance on whether to provision new users or assign a fallback owner. No record enters Salesforce without a valid OwnerId; any records with unresolved owners are held and processed after your team completes the user provisioning step.
Run a sample migration with field-level diff
A representative slice of 100–500 records — spanning contacts, accounts, opportunities, and activities — migrates into a Salesforce sandbox first. We generate a field-level diff comparing source values against the loaded Salesforce fields so you can verify mapping accuracy, check record-type assignment, and confirm owner resolution before the full run commits. Sample results typically identify 2–5 field-level adjustments per 100 records.
Execute full migration with delta-pickup window
The full migration runs using Salesforce Bulk API 2.0 for high-volume loads and REST API for records requiring immediate relationship resolution. A delta-pickup window (24–48 hours after the main run) captures any Function 365 records modified or created during the cutover. An audit log records every operation — insert, update, skip, and error — and one-click rollback reverts the Salesforce org to its pre-migration state if reconciliation fails.
Platform deep dives
Function 365
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 Function 365 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
Function 365: Not publicly documented.
Data volume sensitivity
Function 365 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 Function 365 to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Function 365 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 Function 365
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.