CRM migration
Field-level mapping, validation, and rollback between Function 365 and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.
Function 365
Source
HubSpot
Destination
Compatibility
11 of 12
objects map 1:1 between Function 365 and HubSpot.
Complexity
BStandard
Timeline
48–72 hours
Overview
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.
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 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
HubSpot
Company
1:1Dynamics 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
HubSpot
Contact
1:1Dynamics 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
HubSpot
Deal
1:1Dynamics 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
HubSpot
Contact (unqualified) or Contact (qualified)
1:manyDynamics 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
HubSpot
Product
1:1Dynamics 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)
HubSpot
Line Item
1:1Dynamics 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
HubSpot
Engagement (Call, Email, Meeting, Note)
1:1Dynamics 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
HubSpot
Note
1:1Dynamics 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)
HubSpot
Custom Object (HubSpot Enterprise)
1:1Dynamics 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)
HubSpot
Association or Custom Property
1:1Dynamics 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)
HubSpot
User (Owner)
1:1Dynamics 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
HubSpot
Static List or Active List
1:1Dynamics 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.
| Function 365 | HubSpot | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Lead | Contact (unqualified) or Contact (qualified)1:many | Fully supported | |
| Product | Product1:1 | Fully supported | |
| OpportunityProduct (Opportunity Line Items) | Line Item1:1 | Fully supported | |
| PhoneCall, Email, Task, Appointment | Engagement (Call, Email, Meeting, Note)1:1 | Fully supported | |
| Note | Note1:1 | Fully supported | |
| Custom Entity (Dynamics 365 custom table) | Custom Object (HubSpot Enterprise)1:1 | Fully supported | |
| Connection (N:N relationships) | Association or Custom Property1:1 | Fully supported | |
| User (Owner) | User (Owner)1:1 | Fully supported | |
| Marketing List | Static List or Active List1: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
HubSpot gotchas
Marketing Contacts billing model is migration-critical
Feature tier gating is not visible until onboarding
Mandatory onboarding fees inflate year-one cost
HubSpot CSV importer cannot migrate engagements or attachments
Custom objects require Enterprise and a pre-existing schema
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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
Function 365
Source
Strengths
Weaknesses
HubSpot
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 HubSpot.
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 HubSpot migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Function 365
Other ways to arrive at HubSpot
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.