CRM migration

Migrate from Function 365 to Salesforce Sales Cloud

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 logo

Function 365

Source

Salesforce Sales Cloud

Destination

Salesforce Sales Cloud logo

Compatibility

92%

11 of 12

objects map 1:1 between Function 365 and Salesforce Sales Cloud.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Function 365 logo

Function 365

What's pushing teams away

  • Functional Medicine + private-healthcare niche means general medical practices, NHS-primary settings, or non-UK clinics often have a tighter fit with Cliniko, Pabau, or country-specific PMS.
  • Implementation requires a paid specialist session (£55/session) plus optional onsite training (£350) — small clinics that expected pure self-serve may find the onboarding gate frustrating.
  • Smaller installed base than Cliniko, Pabau, or Halaxy means fewer integrations, fewer third-party services, and less peer benchmarking for procurement.
  • No public API documentation surfaced in research; integration with lab vendors, payment processors, or downstream EHRs may require vendor coordination.
  • Solo Practitioner tier (£132/month) is steeper than freemium-style PMS competitors; smallest practices may find the entry price hard to justify against single-clinician alternatives.

Choosing

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pulling them in

  • The AppExchange marketplace with 5,000+ prebuilt apps gives enterprises integrations for nearly every business workflow without custom development.
  • Native Einstein AI for lead scoring, opportunity insights, and predictive forecasting adds intelligence without a separate platform purchase.
  • Territory management, multi-currency support, and advanced forecasting satisfy the needs of complex B2B sales organizations with structured revenue teams.
  • Slack, Tableau, and CPQ are deeply integrated into the core platform, keeping the sales stack unified for teams already in the Salesforce ecosystem.
  • Organizations with a large, established Salesforce implementation choose it because switching costs — integrations, custom code, trained admins — are prohibitive.

Object mapping

How Function 365 objects map to Salesforce Sales Cloud

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

maps to

Salesforce Sales Cloud

Contact

1:1
Fully supported

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

maps to

Salesforce Sales Cloud

Lead

1:many
Fully supported

Function 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

maps to

Salesforce Sales Cloud

Account

1:1
Fully supported

Function 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

maps to

Salesforce Sales Cloud

Opportunity

1:1
Fully supported

Function 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

maps to

Salesforce Sales Cloud

Sales Process + Record Type

1:1
Fully supported

A 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

maps to

Salesforce Sales Cloud

Opportunity Stage

1:1
Fully supported

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

maps to

Salesforce Sales Cloud

Task / Event / Note

1:1
Fully supported

Function 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

maps to

Salesforce Sales Cloud

Custom Object

1:1
Fully supported

Function 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

maps to

Salesforce Sales Cloud

User

1:1
Fully supported

Function 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

maps to

Salesforce Sales Cloud

Salesforce Files

1:1
Fully supported

File 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

maps to

Salesforce Sales Cloud

Salesforce Flow

1:1
Fully supported

Function 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

maps to

Salesforce Sales Cloud

Salesforce Report / CRM Analytics

1:1
Fully supported

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

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.

Function 365 logo

Function 365 gotchas

High

AI-assisted notes are proprietary — verify clinical-record export coverage

High

NHS Number format must be preserved exactly

Medium

Implementation specialist time is paid extra at £55/session

Medium

GDPR consent timestamps are regulatory artefacts

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

Pair-specific challenges

  • Dataverse N:N relationships collapse to a single AccountId on Salesforce contacts

    Function 365 stores contact-to-account relationships as a many-to-many Dataverse connection entity. Salesforce enforces a single primary AccountId on contacts, with additional affiliations managed through Account Contact Relations. We migrate the primary (most-recently-modified) association as AccountId and surface the rest as Account Contact Relations — but the N:N label structure from Dataverse cannot be preserved natively. Teams that rely on multiple simultaneous account affiliations in Function 365 must decide whether to promote secondary affiliations to Contact Relations or treat them as a reference-only field in a custom object.

  • Pipeline-to-record-type mapping creates Salesforce schema prerequisites

    Every distinct pipeline in Function 365 requires a corresponding Salesforce Record Type so that Opportunity Stage pick-list values, page layouts, and validation rules are scoped correctly. Teams with four or five pipelines in Function 365 end up with four or five Salesforce record types — each needing its own page layout assignment, profile permissions, and Lightning page configuration before Opportunity records can land. We deliver a record-type setup plan as part of the discovery phase, but Salesforce admin time is required to pre-create the schema. This is the most common delay in Function 365 to Salesforce migrations.

  • Custom fields must be created in Salesforce before data can load

    Dataverse custom attributes with specific data types (currency, lookup, choice lists) must be translated to Salesforce custom fields using the __c suffix convention. Salesforce field-type restrictions apply — a Dataverse Currency attribute with multiple decimal places cannot load into a Salesforce Number field that enforces integer-only precision. We generate a custom-field creation script based on your Dataverse attribute inventory, but your Salesforce admin must deploy these fields (or grant us Metadata API access) before the migration batch runs. Fields not pre-created are skipped and logged.

  • Workflow rules and Power Automate flows have no migration path

    Function 365 workflow definitions, business rules, and Power Automate cloud flows execute against Dataverse records and have no Salesforce equivalent that can be auto-generated. We export workflow definitions as structured JSON documentation so your Salesforce admin can rebuild them in Flow, but this is a manual process. Teams with complex approval chains or multi-step data-entry rules should budget 2–4 weeks of admin time post-migration to rebuild the most critical automations — ideally before go-live rather than after.

  • Email body content and attachments require re-hosting

    Dataverse stores email body HTML and file attachments in the Dataverse file store (Azure Blob Storage under the Microsoft 365 tenant). When we migrate email activities to Salesforce Tasks, the body text is extracted and loaded into the Task Description field, but inline images embedded in HTML emails lose their source URLs. Attachments are downloaded and re-uploaded to Salesforce Files, which links them via ContentDocumentLink — this is a separate API operation and adds time for mailboxes with large attachment volumes.

Migration approach

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

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

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

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

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

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

Context on both ends of the pair

Function 365 logo

Function 365

Source

Strengths

  • Integrated PMS (booking, notes, prescriptions, billing, lab orders, telehealth) in one product.
  • GDPR and HIPAA support built into the data model.
  • Transparent per-licence published pricing on the vendor shop.
  • AI-assisted clinical note generation reduces practitioner admin time.
  • Tiered licence pricing rewards larger practices with lower per-seat cost.

Weaknesses

  • Niche fit (UK private healthcare + Functional Medicine) — not suited for NHS-primary or non-UK general practice.
  • Implementation specialist time billed separately (£55/session) plus £350 onsite training.
  • Smaller installed base than Cliniko/Pabau means thinner integration ecosystem.
  • No public API documentation visible in research.
  • Solo Practitioner price (£132/month) higher than some freemium-style PMS competitors.
Salesforce Sales Cloud logo

Salesforce Sales Cloud

Destination

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.

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 Function 365 and Salesforce Sales Cloud.

  • 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

    Function 365: Not publicly documented.

  • Data volume sensitivity

    B

    Function 365 doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

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

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

Can't find your answer?

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 consultation

A migration of up to 50,000 records typically completes in 48–72 hours of clock time once the Salesforce schema is pre-created. Migrations exceeding 500,000 records or involving multiple custom objects extend to 5–10 days, primarily because custom field validation and batch sequencing scale with volume. The longest planning step is the Salesforce schema setup — record types, custom fields, and page layouts must be in place before data can land.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Function 365.
Land in Salesforce Sales Cloud, 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