CRM migration
Field-level mapping, validation, and rollback between Dynamics 365 Marketing and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.
Dynamics 365 Marketing
Source
HubSpot
Destination
Compatibility
12 of 12
objects map 1:1 between Dynamics 365 Marketing and HubSpot.
Complexity
BStandard
Timeline
48–72 hours
Overview
Dynamics 365 Marketing stores data in Microsoft Dataverse, using a relational model built around Accounts, Contacts, Leads, Opportunities, Marketing Lists, and Campaigns. HubSpot uses a flat contact-centric model with Companies, Contacts, Deals, and custom objects. The two platforms diverge most sharply in how they handle lifecycle data, marketing automation logic, and workflow constructs. We extract Dynamics 365 data via the Dataverse API and bulk export tools, transform each entity according to HubSpot's property naming conventions (snake_case, hubspot-specific suffixes), and load through HubSpot's Contacts API and bulk import endpoints. Accounts map directly to Companies; Contacts map to Contacts with email as the primary key; Leads and Opportunities map to Contacts and Deals respectively. Dynamics 365 marketing lists become HubSpot static lists; campaigns require manual rebuild in HubSpot's campaign tool. All custom fields migrate as HubSpot custom properties. Workflows, customer journeys, email templates, and Power Automate flows do not transfer — we export definitions as JSON for your HubSpot admin to rebuild in HubSpot's workflow builder.
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 Marketing 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.
Dynamics 365 Marketing
Account
HubSpot
Company
1:1Dynamics 365 Accounts map directly to HubSpot Companies. Account.Name becomes Company name. HubSpot's primary-company model differs from Dynamics 365's required AccountId on every Contact — we resolve the primary company by account role or most-recent modification date. This ensures accurate company attribution for reporting.
Dynamics 365 Marketing
Contact
HubSpot
Contact
1:1Contact maps 1:1 to HubSpot Contact. Email is the deduplication key. We preserve Contact.fullname as FirstName + LastName split, phone, jobtitle, and all address components. Dynamics 365's createdon and modifiedon timestamps migrate as custom datetime properties for reporting continuity across systems.
Dynamics 365 Marketing
Lead
HubSpot
Contact
1:1Dynamics 365 Leads with status 'Open' or 'Qualified' that were not converted to Contacts map to HubSpot Contacts with lifecycle_stage set to 'lead'. Leads that converted to Contacts already exist in the Contact table and do not duplicate and are retained for audit.
Dynamics 365 Marketing
Opportunity
HubSpot
Deal
1:1Opportunity maps to HubSpot Deal. Opportunity.name becomes Deal name; estimatedvalue maps to amount; estimatedclosedate maps to closedate; statecode/stagecode maps to dealstage. HubSpot deal pipelines are separate from the Deal object — we map each Dynamics 365 Opportunity's salesstage to a corresponding HubSpot pipeline stage.
Dynamics 365 Marketing
Account (parent/child hierarchy)
HubSpot
Company (parent company relationship)
1:1Dynamics 365 parentaccountid creates a parent-child account hierarchy. HubSpot Companies support a single parent_company_id field. We map the top-level parent account first, then resolve child accounts referencing their parent. Circular references (if any) are flagged for manual resolution and are documented in the migration report for your team to address before final load.
Dynamics 365 Marketing
Marketing List
HubSpot
HubSpot List (static)
1:1Dynamics 365 Marketing Lists are entity-specific (Contact, Account, or Lead lists). Each list migrates as a HubSpot static list. Dynamic marketing lists require HubSpot's list-filter equivalent to be rebuilt — we export the filter criteria as JSON for your HubSpot admin.
Dynamics 365 Marketing
Campaign
HubSpot
HubSpot Campaign
1:1Dynamics 365 Campaigns carry journey logic, multi-channel execution records, and campaign activity history. HubSpot Campaigns track email campaign performance only. We migrate the campaign name and description as a custom object for reference; the campaign structure and customer journeys must be rebuilt in HubSpot.
Dynamics 365 Marketing
Product
HubSpot
HubSpot Product
1:1Dynamics 365 Products (with product hierarchy, pricing, and unit groups) map to HubSpot Products. Product.name, productnumber, and defaultuomscheduleid (unit of measure) transfer. Bundle and product family structures become HubSpot product categories. Pricing lists and unit groups are preserved, and any associated product relationships are mapped accordingly.
Dynamics 365 Marketing
Opportunity Product (Line Items)
HubSpot
Deal Line Items
1:1Each Opportunity Product line item in Dynamics 365 maps to a Deal Line Item in HubSpot. Quantity, unit price, manual discount, and product lookup resolve against the migrated Product records. If the product does not exist, the line item is created without the product link and flagged for review.
Dynamics 365 Marketing
Annotation (Notes/Attachments)
HubSpot
HubSpot Note / Attachment
1:1Dynamics 365 Notes (notemime = 'text/html') migrate as HubSpot Notes with creation timestamp and owner preserved. File attachments (annotation_documentbody) download, re-upload to HubSpot Files, and attach to the corresponding contact, company, or deal record. Ensuring that attachment metadata, such as file size and original filename, is retained in HubSpot's file manager.
Dynamics 365 Marketing
Activity (Email, Task, Phone Call, Appointment)
HubSpot
HubSpot Email, Call, Meeting, Task
1:1Dynamics 365 activities map to their HubSpot equivalents: Email -> Email, Task -> Task, PhoneCall -> Call, Appointment -> Meeting. We preserve subject, description, regardingobjectid (linked record), createdon, and owner. Activity party records (attendees, recipients) resolve by email to HubSpot contacts.
Dynamics 365 Marketing
Custom Entity (Dataverse)
HubSpot
HubSpot Custom Object / Custom Property
1:1Dataverse custom tables migrate as HubSpot custom objects if they have a relationship to Contact or Company. Standalone custom tables without HubSpot equivalents become custom properties on the primary contact/company record. N:N relationships in Dataverse may require HubSpot custom junction objects.
| Dynamics 365 Marketing | HubSpot | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Lead | Contact1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Account (parent/child hierarchy) | Company (parent company relationship)1:1 | Fully supported | |
| Marketing List | HubSpot List (static)1:1 | Fully supported | |
| Campaign | HubSpot Campaign1:1 | Fully supported | |
| Product | HubSpot Product1:1 | Fully supported | |
| Opportunity Product (Line Items) | Deal Line Items1:1 | Fully supported | |
| Annotation (Notes/Attachments) | HubSpot Note / Attachment1:1 | Fully supported | |
| Activity (Email, Task, Phone Call, Appointment) | HubSpot Email, Call, Meeting, Task1:1 | Fully supported | |
| Custom Entity (Dataverse) | HubSpot Custom Object / Custom Property1: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 Marketing gotchas
Marketing Contact billing triggers on record import
Configuration Migration Tool does not migrate high-volume transactional data
Customer Insights segments are stored separately from Dataverse CRM records
Marketing Lists and Campaign Activities have legacy schema dependencies
Custom entities require a managed solution schema, not a UI export
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
Extract Dynamics 365 data via Dataverse API and Configuration Migration Tool
We connect to your Dynamics 365 environment using OAuth 2.0 with an Azure AD application registration. Standard entities extract via the Dataverse Web API (OData 4.0 endpoint). Configuration data (marketing lists, campaign templates, custom field metadata) uses Microsoft's Configuration Migration Tool. We extract in dependency order — Accounts first, then Contacts, then Opportunities — so foreign key relationships resolve during load. For large datasets (>100k records), we use Dataverse's bulk export to Azure Blob Storage, then process from Parquet files to avoid API pagination limits.
Clean, deduplicate, and resolve owner records
Before mapping, we run deduplication across Contacts by email address, flagging duplicate records for your team to resolve or accept a merge strategy (keep oldest, keep newest, or manual selection). We match Dynamics 365 owner records (systemusers) to HubSpot users by email address. Unmatched owners are reported — your team either creates HubSpot user accounts first or assigns records to a designated fallback owner. Activity records with invalid regardingobjectid references are excluded from migration and logged.
Map and transform fields, create HubSpot custom properties
We apply the field mapping rules: Dataverse names to HubSpot snake_case, picklist values to HubSpot option labels, and lookup references to HubSpot associated record IDs. Custom Dataverse fields that have no HubSpot native equivalent are created as HubSpot custom properties during the mapping phase. After mapping, we validate referential integrity — every Contact with an AccountId must have a corresponding Company in HubSpot before Deals can associate.
Run a sample migration with field-level diff
A representative slice — typically 100–500 records spanning Contacts, Companies, Deals, and a set of activity records — migrates first into a HubSpot sandbox or staging account. We generate a field-level diff comparing source D365 values against destination HubSpot values. You review the diff to verify lifecycle stage mapping, pipeline-to-stage mapping, owner resolution rate, and custom property creation. No records commit to production until you approve the diff.
Execute full migration with delta-pickup window
Approved migration runs against your live HubSpot account. A delta-pickup window (24–48 hours after the full migration completes) captures any records created or modified in Dynamics 365 during the cutover. We apply an audit log entry for every migrated record with the source system ID, migration timestamp, and operation type. If reconciliation fails — record counts mismatch, field validation errors, or owner resolution gaps below your threshold — one-click rollback reverts all migrated records from HubSpot and triggers a rerun with corrected mapping.
Platform deep dives
Dynamics 365 Marketing
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 Dynamics 365 Marketing 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
Dynamics 365 Marketing: Dataverse Web API enforces organization-level throttling; specific limits vary by workload and are not publicly documented at fixed thresholds.
Data volume sensitivity
Dynamics 365 Marketing 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 Marketing to HubSpot migration scoping. Not seeing yours? Book a call.
Walk through your Dynamics 365 Marketing 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 Dynamics 365 Marketing
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.