CRM migration

Migrate from Function 365 to HubSpot

Field-level mapping, validation, and rollback between Function 365 and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.

Function 365 logo

Function 365

Source

HubSpot

Destination

HubSpot logo

Compatibility

92%

11 of 12

objects map 1:1 between Function 365 and HubSpot.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Function 365 — built on the Dynamics 365 data model — stores accounts, contacts, opportunities, and activities across a normalized relational schema with entity relationships, business units, and security roles. HubSpot stores contacts, companies, deals, and engagements in a flat object graph where associations are managed through properties and association labels rather than foreign-key relationships. The migration carries all standard CRM objects (accounts → companies, contacts, opportunities → deals, activities) into HubSpot, with custom fields and custom entities mapped to HubSpot custom properties and custom objects. One key translation: Dynamics 365 opportunity stage values map to HubSpot deal pipeline stages, and Dynamics 365 currency fields convert to HubSpot's numeric amount fields with currency code preserved. We handle owner resolution by email match against HubSpot users before the migration runs, flagging any unmatched owners for manual assignment. Workflows, Power Automate flows, and business rules do not migrate — they must be rebuilt in HubSpot's automation tools. We deliver a field-level diff report after a sample migration so your team can verify every mapping before the full run commits, with a 24–48 hour delta-pickup window capturing in-flight changes during cutover. Audit logs and one-click rollback protect against reconciliation failures.

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

HubSpot logo

HubSpot

What's pulling them in

  • Lowest barrier to entry of any major CRM — the free tier with unlimited contacts lets teams validate fit before committing to a paid plan, according to G2 and Capterra reviewers.
  • Native integration between the CRM and sales engagement tools (sequences, email tracking, dialer) means no separate sync configuration, a theme across G2 Sales Hub reviews.
  • Pipeline visualization, deal tracking, and automated workflows are consistently praised as intuitive and easy to set up without developer involvement.
  • Strong onboarding for new team members — reviewers on Capterra and G2 highlight how quickly new reps become productive without formal training.
  • The HubSpot platform ecosystem (Marketing, Sales, Service, CMS hubs) allows growing companies to consolidate tools without building new integrations.

Object mapping

How Function 365 objects map to HubSpot

Each row shows how a Function 365 object lands in HubSpot, including any object-level transformations, lookup resolution, or schema-design dependencies.

Typical mapping — final map is confirmed during the sample migration step.

Function 365

Account

maps to

HubSpot

Company

1:1
Fully supported

Dynamics 365 Accounts map directly to HubSpot Companies. Account.Name becomes Company name, Account.Address fields map to HubSpot's address property group. Parent Account hierarchy in Dynamics 365 preserves as HubSpot parent company association. Multi-address accounts collapse to HubSpot's primary address with additional addresses stored as custom properties.

Function 365

Contact

maps to

HubSpot

Contact

1:1
Fully supported

Dynamics 365 Contacts migrate 1:1 to HubSpot Contacts. Full name splits into firstname and lastname properties; email, phone, mobilephone, and jobtitle map directly. Primary contact's account link resolves to the mapped HubSpot Company via email-domain matching or explicit AccountId lookup.

Function 365

Opportunity

maps to

HubSpot

Deal

1:1
Fully supported

Dynamics 365 Opportunities map to HubSpot Deals. Opportunity.Name becomes Deal name, Amount and CloseDate map directly. Opportunity.StageName (Dynamics pick-list) maps to HubSpot dealstage via value mapping per pipeline. Probability, forecast category, and stepphase are preserved as custom properties since HubSpot calculates deal probability from pipeline stage weights.

Function 365

Lead

maps to

HubSpot

Contact (unqualified) or Contact (qualified)

1:many
Fully supported

Dynamics 365 Leads that have not been qualified into Opportunities split based on lead status: 'Qualified' leads route to HubSpot Contacts (or Deals) depending on your deal-creation rule; 'Disqualified' leads are preserved as HubSpot Contacts with a lead_status property set to Disqualified and a lead_disqualified_at timestamp.

Function 365

Product

maps to

HubSpot

Product

1:1
Fully supported

Dynamics 365 Products migrate to HubSpot Products, where Product.Name, Product.Number (SKU), Product.Price, and Product.Unit map directly to HubSpot’s name, sku, price, and unit fields. Because HubSpot’s native product model emphasizes pricing and inventory, detailed product descriptions, images, and custom attributes are stored as custom text, file, or numeric properties. Currency values are transferred as numeric amounts, preserving the original currency code in a separate custom property.

Function 365

OpportunityProduct (Opportunity Line Items)

maps to

HubSpot

Line Item

1:1
Fully supported

Dynamics 365 Opportunity Product records map to HubSpot Line Items linked to the migrated Deal. Each line item carries quantity, unit price, and amount from the source, preserving the relationship to the deal and the product. HubSpot's Line Item object stores its own quantity and price independently of the parent deal amount.

Function 365

PhoneCall, Email, Task, Appointment

maps to

HubSpot

Engagement (Call, Email, Meeting, Note)

1:1
Fully supported

Dynamics 365 activity records (PhoneCall, Email, Task, Appointment) migrate as HubSpot Engagements of the matching type. Original timestamps, owners, and Regarding links to Contact, Account, or Opportunity are preserved. The activity subject or description maps to HubSpot engagement body text.

Function 365

Note

maps to

HubSpot

Note

1:1
Fully supported

Dynamics 365 Notes (including annotations on other entities) migrate as HubSpot Notes. If the note contains a file attachment, the file is downloaded and re-uploaded to HubSpot's file storage, with the note body updated to include the file link. Rich-text formatting in Dynamics notes is simplified to plain text in HubSpot.

Function 365

Custom Entity (Dynamics 365 custom table)

maps to

HubSpot

Custom Object (HubSpot Enterprise)

1:1
Fully supported

Dynamics 365 custom entities map to HubSpot custom objects. The custom entity name and all custom fields are created as HubSpot custom object properties. N:N relationships between custom entities in Dynamics 365 require HubSpot custom junction objects or association properties — this is surfaced in the pre-migration mapping plan.

Function 365

Connection (N:N relationships)

maps to

HubSpot

Association or Custom Property

1:1
Fully supported

Dynamics 365 Connections (N:N semantic links between any two entities) map to HubSpot associations. Where Connections use a named role (e.g., 'refers_to', 'manages'), that role becomes a custom association label in HubSpot. HubSpot's association model is simpler — if a Connection links two records that both have HubSpot equivalents, the association is created; otherwise the relationship is stored as a custom property holding the related record's ID.

Function 365

User (Owner)

maps to

HubSpot

User (Owner)

1:1
Fully supported

Dynamics 365 Users are matched to HubSpot Users by email address before migration. OwnerId on any record (Contact, Account, Opportunity) resolves to the matched HubSpot user. Unmatched owners — users in Dynamics 365 who do not have HubSpot accounts — are flagged in a pre-flight report; their records are assigned to a fallback owner or held pending invitation to HubSpot.

Function 365

Marketing List

maps to

HubSpot

Static List or Active List

1:1
Fully supported

Dynamics 365 Marketing Lists (static member lists) can be migrated as HubSpot static contact lists. Dynamic marketing lists with fetch-xml-based membership rules have no HubSpot equivalent — the list schema can be documented as a rebuild reference for HubSpot lists, but the dynamic rules must be recreated manually in HubSpot's list builder.

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

HubSpot logo

HubSpot gotchas

High

Marketing Contacts billing model is migration-critical

High

Feature tier gating is not visible until onboarding

Medium

Mandatory onboarding fees inflate year-one cost

Medium

HubSpot CSV importer cannot migrate engagements or attachments

Medium

Custom objects require Enterprise and a pre-existing schema

Pair-specific challenges

  • Dynamics 365 N:N junction tables require explicit HubSpot association creation

    Dynamics 365 uses explicit junction tables for N:N relationships (AccountContactBridge, OpportunityContact), where each junction record can carry additional attributes like the女子的 role name. HubSpot's association model links records without storing attributes on the association itself. We create the HubSpot association and store any junction-entity attributes (such as a role name or effective date) as a custom property on the child record. If the junction carries multiple attributes, we collapse them into a JSON-encoded custom property and surface it in the mapping plan for manual review before migration commits.

  • Dynamics 365 business units map to HubSpot teams but sharing rules differ fundamentally

    Dynamics 365 enforces Business Unit-level record ownership and security role inheritance. HubSpot uses a flat team model where records are shared to teams via sharing rules rather than business unit hierarchy. We map each Dynamics 365 Business Unit to a HubSpot team, and OwnerId resolves to the matching HubSpot user. Records owned by a Business Unit (rather than an individual user) are re-assigned to the mapped team owner during migration. Field-level security — a Dynamics 365 construct with no HubSpot equivalent — is documented as a gap in the pre-migration report, and any sensitive field values are stored as-is with a note that HubSpot's permission model does not enforce field-level read/write restrictions.

  • Opportunity currency fields convert to numeric HubSpot amount fields without currency precision preservation

    Dynamics 365 stores Opportunity.Amount (estimatedvalue) as a Money attribute tied to the organization's base currency and exchange rates. HubSpot's deal amount field stores numeric values without an attached currency code. We convert the Dynamics money value to a decimal number using the exchange rate active at migration time and store the source currency as a custom property (source_currency_code). Any multi-currency opportunities require pre-migration alignment on which currency the HubSpot organization will use as its base — this is identified in the pre-flight report.

  • Marketing Lists with dynamic membership rules have no HubSpot equivalent

    Dynamics 365 Marketing Lists support both static member lists and dynamic lists driven by a saved View or fetch-xml query that re-evaluates on access. HubSpot's equivalent constructs are Static Lists (member-based) and Active Lists (real-time behavioral criteria). Dynamic Marketing List definitions are exported as a JSON document and delivered as a rebuild reference — the criteria must be manually reconstructed in HubSpot's Active List builder. Static Marketing Lists migrate as HubSpot contact lists with all members imported directly.

  • Power Automate flows, business rules, and workflows do not transfer

    Dynamics 365 workflows (processes), Power Automate cloud flows, business rules, and real-time plugins execute business logic outside the data layer. These constructs have no equivalent in HubSpot's data model and cannot be exported as portable artifacts. We document every active workflow in the migration inventory and export the flow definitions (as screenshots or exported JSON from Power Automate) as a rebuild reference for your HubSpot automation team. HubSpot automation tools (workflows, sequences, bots) must be rebuilt from scratch, typically in 2–4 weeks depending on automation complexity.

Migration approach

Six steps for a successful Function 365 to HubSpot data migration

  1. Inventory and pre-flight: audit Dynamics 365 schema and export field map

    FlitStack AI connects to your Dynamics 365 instance via the Web API and enumerates all entities, attributes, relationships, and option-set values. We export a complete field inventory and deliver a pre-flight report identifying: custom entities requiring HubSpot custom objects, N:N junction tables that need association mapping, option-set values needing value-by-value translation, unmatched users (Dynamics users without HubSpot accounts), and any Business Unit or security role constructs that require team configuration in HubSpot. Your team reviews the report and approves or adjusts the mapping before we proceed.

  2. Configure HubSpot destination: create pipelines, custom properties, and teams

    Before data lands, FlitStack creates the HubSpot deal pipelines matching your Dynamics 365 sales processes, configures custom properties for all Dynamics fields that lack direct HubSpot equivalents, and maps Business Units to HubSpot teams. We create custom objects (Enterprise) for Dynamics custom entities that don't map to HubSpot's standard objects. This step runs in parallel with your team's review of the pre-flight report so the HubSpot schema is ready before validation begins.

  3. Resolve owners and company-contact dependencies by email match

    Dynamics 365 owner IDs are resolved against HubSpot users by email address — the authoritative key for both platforms. Contacts and Accounts are processed first so that the AccountId lookup on Contact records resolves correctly in HubSpot. Opportunities (deals) are processed after Contacts so that deal-company and deal-contact associations resolve in the correct order. Any Dynamics users without corresponding HubSpot accounts are flagged in the pre-flight report; your team either invites them to HubSpot or designates a fallback owner before the migration run commits.

  4. Run sample migration with field-level diff across all object types

    A representative slice — typically 200–500 records per object — migrates first. We generate a field-level diff comparing source Dynamics 365 field values to destination HubSpot field values, covering all mapping types: direct, value-mapping, transformed, and custom field creation. Your team reviews the diff to verify stage mapping, owner resolution, currency conversion, and association linkage before the full run is scheduled. This step typically runs within 24 hours of schema configuration completion.

  5. Execute full migration with delta-pickup window and audit log

    The full migration runs against HubSpot's Bulk API for high-volume objects (Contacts, Companies) and the REST API for complex records (Opportunities with line items, custom entities). A 24–48 hour delta-pickup window captures any records created or modified in Dynamics 365 during the cutover window. Every operation is logged in the FlitStack audit log — record counts, field transformations, skipped records, and errors. One-click rollback reverts the HubSpot instance 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.
HubSpot logo

HubSpot

Destination

Strengths

  • Genuinely useful free CRM tier with no seat limit on contact records.
  • All-in-one sales engagement layer (sequences, email tracking, calling, dialer) embedded natively in the CRM, eliminating a separate integration.
  • Intuitive interface and fast onboarding for individual reps, per G2 and Capterra reviews.
  • Workflow automation triggers across contacts, deals, and tickets with a visual builder.
  • API coverage for all standard objects including custom objects at Enterprise tier.

Weaknesses

  • Pricing model is contact-based at the marketing layer — importing all records as marketing contacts can multiply the monthly bill by 4×.
  • Feature tier cliffs are frequent surprises: sequences, calling, advanced reporting, and quoting are all gated, often requiring plan upgrades mid-implementation.
  • Mandatory onboarding fees at Professional ($1,500) and Enterprise ($3,500) are not prominently disclosed on the pricing page.
  • API rate limits are restrictive for bulk migration — burst limits of 100-200 req/10sec and search endpoint limits of 4 req/sec require careful job queuing.
  • Custom objects, additional pipelines, and advanced forecasting are Enterprise-only, making cost projections difficult for growing teams.

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

  • 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 HubSpot 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 HubSpot data migrations

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

Can't find your answer?

Walk through your Function 365 to HubSpot migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most Function 365 (Dynamics 365) to HubSpot migrations complete in 48–72 hours of clock time for datasets under 50,000 records. Larger migrations with more than 250,000 records, multiple business units, or extensive custom-entity mappings extend to 5–10 business days. The longest phase is typically schema planning and owner resolution in the pre-flight step — data transfer itself runs faster once HubSpot pipelines and custom properties are configured.

Adjacent paths

Related migrations to explore

Ready when you are

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