Migration Playbook

HubSpot Salesforce

HubSpot to Salesforce: The Complete Migration Playbook

A 35-step runbook across six phases — track your progress, and open the right tool at every step.

0 / 35 steps complete 0%
TL;DR

Migrating HubSpot CRM to Salesforce takes 3 to 8 weeks. The biggest risk is the Contact-to-Lead/Contact split. Use API extraction, not CSV exports, to preserve engagement history.

Migrating from HubSpot CRM to Salesforce is a medium-to-high complexity data-architecture project with no native one-click migration path. The fundamental challenge is object bifurcation: HubSpot stores all people in a single Contact object governed by Lifecycle Stages, while Salesforce enforces a strict separation between Leads, Contacts, and Accounts with an explicit conversion process. Additionally, HubSpot Engagements (emails, calls, notes, meetings) use flexible many-to-many associations, whereas Salesforce Activities use a polymorphic WhoId/WhatId model limited to one person and one related record per activity. Workflows, reports, dashboards, form submissions, and marketing email history cannot be exported from HubSpot and must be rebuilt or re-architected in Salesforce, requiring significant custom configuration work.

Read this first

Pair-specific gotchas that catch teams out. Each one has cost somebody a weekend.

TL;DR: HubSpot CRM to Salesforce Migration

Migrating from HubSpot CRM to Salesforce is a medium-to-high complexity data-architecture project, not a simple export-import. The realistic timeline is 3 to 6 weeks for organizations under 100,000 records with standard objects, and 6 to 12 weeks for enterprise datasets with custom objects, multi-pipeline deals, and full activity history. The single biggest risk is the Contact-to-Lead/Contact split: HubSpot uses one Contact object for everyone, while Salesforce enforces a strict Lead vs. Contact and Account separation. Getting that split wrong corrupts pipeline reporting from day one. HubSpot Engagements (emails, calls, notes, meetings) cannot be migrated 1:1 because Salesforce Activities use a polymorphic WhoId/WhatId model that accepts only one person and one related record per activity. HubSpot Workflows, Reports, and Dashboards cannot be exported — they must be rebuilt in Salesforce. Teams with fewer than 50,000 records and no custom objects can self-serve with CSV exports and Salesforce Data Loader. Anything above that, especially with engagement history and file attachments, benefits from a managed migration service or custom ETL pipeline.

Order matters

If you load Opportunities before Accounts, every Opportunity fails because AccountId is required. If you load Activities before Contacts, WhoId resolution fails. There are no shortcuts.

The runbook

Work top to bottom. Tick steps as you go — your progress is saved in this browser.

01 Discovery Agree scope, pipeline design and success criteria before touching data. 0/5

Objective A scope covering every object in the revenue model, with sales leadership signed up to the pipeline design.

  1. Inventory every object in HubSpot

    RevOps 1-2 days

    Count accounts, contacts, leads, deals or opportunities, activities, notes, emails, files, products and quotes. Activity and email history is usually the largest object by an order of magnitude and the one people forget to size.

    Data Profiler Get real record counts instead of estimating from memory
  2. Map the current pipeline and agree the target model

    Sales leadership 3-5 days

    Document every pipeline, stage, probability and required field, then agree the Salesforce model with sales leadership. Migrating a broken pipeline faithfully is a wasted opportunity; redesigning it mid-migration is a wasted migration.

    Stage changes alter historical conversion rates. Agree how you will restate reporting before you change the model.

  3. Catalogue integrations and automation

    RevOps 2-3 days

    List every system touching HubSpot: marketing automation, quoting, billing, ERP, data enrichment, dialler, BI. Each is a separate cutover task with its own owner, and each can silently write bad data into your new CRM.

  4. Capture the reporting that must survive

    RevOps 2 days

    Interview the people who actually live in the dashboards — forecast, pipeline coverage, rep activity, cohort conversion. Every one of these needs the underlying fields to migrate, which frequently expands the scope.

  5. Build the business case and pick the go-live date

    Project sponsor 2 days

    Model licence delta, implementation effort and productivity dip. Then choose the date deliberately: mid-quarter is disruptive, quarter-end is worse. Most teams land on the first week of a new quarter.

    COI & ROI Calculator Build the 36-month business case you will need for sign-off

HubSpot → Salesforce specifics

Multi-entity pipeline reporting
HubSpot works well for one company, one sales team, and one process. It starts to fray when you operate multiple business units with different sales motions, approval hierarchies, or reporting lines. Salesforce's architecture of Accounts, Contacts, Leads, Opportunities, and unlimited custom objects provides the layering and segmentation needed.
Advanced CPQ and revenue operations
Salesforce Revenue Cloud (CPQ), multi-currency Pricebooks, and approval chains for complex quoting are not available in HubSpot.
Governance and compliance
Salesforce offers field-level security, record-level sharing rules, Apex validation, and audit trails that HubSpot's permission model cannot replicate at enterprise scale.
Ecosystem depth
Salesforce AppExchange has thousands of integrations for ERP, billing, contract management, and vertical-specific solutions that rely on the Salesforce data model.
Lead/Contact bifurcation
HubSpot stores all people in a single Contact object with Lifecycle Stages. Salesforce enforces a strict Lead vs. Contact separation with an explicit conversion process that creates a Contact, an Account, and optionally an Opportunity.

Don't move on until

  • Object counts confirmed for accounts, contacts, deals and activities
  • Target pipeline and stage model agreed with sales leadership
  • Reporting requirements captured from the people who use the reports
02 Data Audit CRM data is usually dirtier than anyone expects. Find out how dirty. 0/6

Objective A profiled export with duplicates, ownership gaps and relationship integrity all quantified and triaged.

  1. Export and profile every object

    Data engineer 2 days

    Profile null rates, distinct values and type consistency across all objects. Pay attention to fields sales reps were supposed to fill in: an 80% null rate on a field your forecast depends on is a business finding, not a data one.

    Data Profiler Profile the HubSpot export for nulls, outliers and type drift
  2. Quantify duplicates and agree the merge policy

    RevOps 2-4 days

    Measure duplicate accounts (same company, different spellings and suffixes) and contacts (same email, or same person at a renamed company). Agree survivorship rules before merging: which record wins, which fields, and what happens to the activity history on the loser.

    Merging before you have agreed survivorship rules destroys history irreversibly. Decide first, merge second.

    Data Cleaner Strip empty rows, stray whitespace and dead columns
  3. Verify relationship integrity

    Data engineer 1-2 days

    Check every deal has a valid account, every contact a valid account, every activity a valid parent. Referential breaks are the defect that turns a clean-looking load into a CRM where the pipeline report does not tie to the account list.

  4. Resolve ownership and the user map

    RevOps 1-2 days

    Build the HubSpot user → Salesforce user map, including leavers. Every record needs a valid owner: records assigned to deactivated users either fail to load or land unassigned, and unassigned pipeline is pipeline nobody works.

    Records owned by deactivated users are a top cause of load failures. Decide the reassignment target before you start.

  5. Scan for PII and regional compliance

    Compliance / DPO 1-2 days

    CRMs hold marketing consent, lawful basis and unsubscribe state. Confirm these fields migrate intact and that consent provenance survives — losing consent records is a regulatory problem, not a data-quality one.

    PII & Compliance Scanner Find regulated fields before they land in a new system
  6. Clean, normalise and archive the pre-state

    Data engineer 2 days

    Normalise country and state values, phone formats, currencies and casing, and standardise all timestamps to UTC. Keep an untouched copy of the raw export — it is your only reference if a mapping decision turns out wrong.

HubSpot → Salesforce specifics

HubSpot Workflows
cannot be exported. Rebuild as Salesforce Flows.
HubSpot Reports and Dashboards
cannot be migrated. Rebuild in Salesforce.
HubSpot Form Submissions
have no native Salesforce equivalent. Store as custom object records or Campaign Responses.
HubSpot Marketing Email history
(sends, opens, clicks) does not map to any Salesforce standard object. Consider Salesforce Campaign Members or a custom object.
HubSpot Sequences
(sales outreach cadences) do not map to Salesforce natively. Requires Salesforce Engagement or a third-party tool like Outreach or Salesloft.

Don't move on until

  • Duplicate rate quantified per object with a merge policy agreed
  • Every record has a valid owner mapped to a target user
  • Relationship integrity verified — no orphaned deals or contacts
03 Field Mapping Map objects, relationships and picklists — in that order. 0/6

Objective A signed mapping spec that covers objects, relationships, picklist values and currency handling.

  1. Map objects and their relationships first

    Solution architect 2-3 days

    Establish how HubSpot objects correspond to Salesforce objects before any field work. Leads-versus-contacts, accounts-versus-organisations and deal hierarchies differ structurally between CRMs, and a field map built on the wrong object model has to be redone.

    Schema Mapper Opens pre-loaded with the HubSpot → Salesforce field pair
  2. Generate and then hand-review the field map

    Solution architect 2-3 days

    Auto-match both schemas, then review every row. Look hardest at anything named "type", "source", "stage" or "status", where names match and meanings do not.

  3. Map every picklist value, including retired ones

    RevOps 2 days

    Enumerate all values on both sides — deal stages, lead sources, industries, statuses — and map each explicitly, including values no longer offered but still present on old records. Unmapped values either fail the row or land as blanks that quietly break segmentation.

    Historical records often carry picklist values that were retired years ago and no longer appear in the UI.

  4. Decide currency, amount and date handling

    Finance / RevOps 1-2 days

    If you sell in multiple currencies, confirm how Salesforce stores amounts, exchange rates and dated conversion rates. Recalculating historical deal values at today's rate silently rewrites your revenue history.

    Multi-currency deals re-converted at current rates will not tie to your historical reporting or your finance system.

  5. Determine the load order

    Data engineer 1 day

    Sequence the load so parents exist before children: users, then accounts, then contacts, then deals, then activities and notes. Keep source IDs in custom fields so relationships can be rebuilt by lookup rather than guesswork.

  6. Freeze the spec and sign off

    Project manager 1 day

    Version-control the mapping, walk RevOps and sales leadership through the decisions that change reporting, and get written sign-off before the pilot.

Don't move on until

  • Object and relationship model mapped and reviewed
  • Every picklist value explicitly mapped, including dead values
  • Load order determined so parents always exist before children
04 Test Migration Pilot with related records, not a flat sample. 0/6

Objective A pilot load whose relationships, ownership and roll-up reporting all verify against source.

  1. Configure the Salesforce sandbox to match the agreed model

    Solution architect 3-5 days

    Build the pipelines, stages, custom fields, record types and user roles first. Load into a default configuration and you will only discover the configuration defects at full scale.

  2. Select a connected pilot slice

    Data engineer 0.5 day

    Take complete account trees — 50-100 accounts with all their contacts, deals, activities and files — rather than a flat random sample. Relationship defects are the whole point of a CRM pilot and a flat sample cannot expose them.

  3. Run the load in dependency order with full logging

    Data engineer 1-2 days

    Load users, accounts, contacts, deals, then activities, logging every request against its source ID. Note which failures are transient (rate limits, timeouts) and which are structural (validation, missing parent).

  4. Verify relationships and roll-ups

    RevOps 1-2 days

    Confirm every deal sits on the right account with the right owner and stage, and that pipeline totals per account and per rep match HubSpot exactly. Roll-up mismatches almost always mean a relationship or currency defect upstream.

    Migration Validation Tool Diff the pilot batch against source before scaling up
  5. Measure throughput and project the full load

    Data engineer 1 day

    Record actual records-per-hour under Salesforce's API limits and extrapolate, remembering activity history usually dominates volume. If the projection exceeds your window, split the load or trim activity scope now.

  6. Let reps work the pilot data

    Sales leadership 2-3 days

    Put two or three reps in the sandbox against their own accounts. They spot missing context, wrong owners and unusable notes far faster than any reconciliation script, and their buy-in is what makes adoption work.

Don't move on until

  • Relationships intact across the whole pilot slice
  • Pipeline roll-ups match source for the pilot accounts
  • Reps have worked pilot records and confirmed they are usable
05 Cutover Switch the revenue system with the pipeline intact. 0/6

Objective All in-scope CRM data live in Salesforce, integrations repointed, and reps selling on day one.

  1. Pre-load history ahead of the freeze

    Data engineer 5-10 days

    Load closed deals, historical activities and inactive accounts while HubSpot stays live. Only open pipeline and the final delta need to move inside the window.

  2. Publish the cutover runbook

    Project manager 1 day

    A timed sequence with owners and abort criteria: freeze, final export, delta load, integration switch, smoke test, go/no-go, rep enablement. Pick a window that avoids quarter-end and month-end close.

  3. Freeze HubSpot and take the final delta

    RevOps 2-4 hours

    Set HubSpot read-only and export everything changed since the pre-load. Reps updating deals during an unenforced freeze is the classic way to lose the most recent — and most valuable — pipeline changes.

    A rep who updates a deal in the old CRM during the freeze will lose that update permanently.

  4. Load the delta and reconcile the pipeline

    RevOps 2-6 hours

    Run the delta, then verify open pipeline value and count per rep against HubSpot before anything else. If the pipeline number is wrong on day one, reps stop trusting the system and never fully come back.

    Migration Validation Tool Confirm the final delta landed before you reopen
  5. Repoint every integration and verify with real records

    IT / integrations 4-8 hours

    Switch marketing automation, quoting, billing, enrichment, dialler and BI connections, then push a live record through each path. An unrepointed integration writing into the old CRM causes divergence that gets harder to reconcile every day.

    Two-way integrations left pointing at the old CRM will keep writing there. Disable them before you switch, not after.

    Cron Expression Builder Schedule the delta syncs that run through the freeze
  6. Go/no-go, then enable the reps

    Project sponsor 1-2 days

    Call the decision explicitly against the exit criteria. Run enablement on real data with their own accounts on screen, and keep HubSpot read-only rather than cancelled until validation closes.

Don't move on until

  • Historical load complete and reconciled before the freeze
  • All integrations repointed and verified end to end
  • Reps logged in with pipeline visible and correct
06 Validation Prove the revenue numbers tie out, then close the project. 0/6

Objective Reconciled data, forecast parity with pre-migration reporting, and signed acceptance.

  1. Reconcile every object

    Data engineer 2 days

    Compare counts and values across accounts, contacts, deals, activities and files, plus field-level spot checks on a random sample. Produce a single report suitable for audit and for finance.

    Migration Validation Tool Reconcile HubSpot and Salesforce record-for-record
  2. Tie the pipeline and forecast to baseline

    RevOps 2-3 days

    Rebuild forecast, pipeline coverage and win-rate reporting and compare to pre-migration figures. Every variance needs an explanation — most trace back to stage or currency mapping decisions made in Field Mapping.

    Stage-model changes will legitimately shift historical conversion rates. Restate the baseline rather than chasing the difference as a defect.

  3. Verify ownership, visibility and permissions

    RevOps 1-2 days

    Confirm every record has the right owner and that sharing rules, territories and role hierarchy give each rep exactly the visibility intended. Over-broad visibility in a CRM is a data-protection issue as much as a config one.

  4. Re-profile for field completeness

    Data engineer 1 day

    Compare loaded null rates against the source profile per field. A field that arrived empty while counts matched is the failure counts alone cannot detect.

    Data Profiler Prove field completeness held up through the load
  5. Test automation and integration write-back

    RevOps 2 days

    Fire every workflow, assignment rule, sequence and notification, and confirm each integration writes correctly in both directions. Automation is rebuilt rather than migrated, so it is unproven until observed.

  6. Sign off and schedule decommission

    Project sponsor 1 day

    Get written acceptance against the Discovery criteria, keep HubSpot read-only for 30-90 days with a final archive export taken, then diarise cancellation so the contract does not auto-renew.

Don't move on until

  • Full reconciliation report complete across all objects
  • Forecast and pipeline reports tie to pre-migration baselines
  • Acceptance signed and HubSpot decommission scheduled

Field mapping reference

The field-by-field mapping for each object. Use this as the starting point for your mapping spec.

HubSpot Salesforce Object and Field Mapping 15 fields
HubSpot fieldSalesforce fieldNotes
Contact (Lifecycle Stage = Lead, Subscriber, MQL) Lead Split based on Lifecycle Stage or a custom qualification field. Requires a decision rule before migration.
Contact (Lifecycle Stage = SQL, Opportunity, Customer) Contact + Account Qualified contacts become Contacts linked to Accounts. Account must be created first.
Company Account Map HubSpot Company Domain to Salesforce Account Website. Company Owner maps to Account Owner.
Deal Opportunity Deal Amount maps to Opportunity Amount. Deal Stage maps to Opportunity StageName. Close Date maps to CloseDate.
Deal Pipeline Opportunity Record Type + Stage picklist Multiple HubSpot pipelines require separate Salesforce Record Types or a single Record Type with distinct Stage picklist values.
Product Product2 + PricebookEntry HubSpot Product Price maps to PricebookEntry UnitPrice. Standard Pricebook must exist.
Line Item OpportunityLineItem Requires valid OpportunityId and PricebookEntryId.
Owner User HubSpot Owner email must match Salesforce User email. Inactive users need handling.
Note Task (or ContentNote) Map to Task with Subject = "Note" or use Salesforce ContentNote for rich text.
Task Task HubSpot Task Due Date maps to ActivityDate. Task Owner maps to OwnerId.
Call Task or Event Map call duration and outcome. Use Task for logged calls, Event for scheduled calls.
Email EmailMessage or Task Requires Enhanced Email enabled in Salesforce (available in Enterprise Edition and above). Email body maps to TextBody or HtmlBody.
Meeting Event Map start/end times, attendees, and outcome.
Ticket Case Only relevant if migrating service data alongside CRM.
Custom Object Custom Object Must be created in Salesforce first. Field-level mapping required.

Risk matrix

Per-object risk for this pair. Plan extra validation around anything marked high.

ObjectRiskNotes
Contacts high Every HubSpot Contact must be classified as either a Salesforce Lead or Contact+Account based on Lifecycle Stage, and incorrect splitting corrupts pipeline reporting from day one.
Companies low HubSpot Companies map relatively cleanly to Salesforce Accounts, with Company Domain mapping to Account Website and Company Owner mapping to Account Owner.
Deals medium Deals map to Opportunities but require valid StageName and CloseDate values, and multi-pipeline configurations need separate Salesforce Record Types or distinct Stage picklist values.
Engagements (Emails, Calls, Meetings) high HubSpot's many-to-many engagement associations must be flattened to Salesforce's single WhoId/WhatId per Activity, and email migration requires Enhanced Email enabled in Enterprise Edition or above.
Products and Line Items medium HubSpot's flat product model must be normalized across Salesforce's Product2, PricebookEntry, and OpportunityLineItem objects, with tiered pricing requiring custom schema or CPQ integration.
Custom Objects medium Custom Objects must be pre-created in Salesforce with field-level mapping defined before migration, and HubSpot association labels should be matched by typeId rather than display name.
Workflows and Automations high HubSpot Workflows and Sequences cannot be exported and must be manually rebuilt as Salesforce Flows or third-party tools, with no automated conversion path available.
Reports and Dashboards medium All HubSpot Reports and Dashboards must be reconstructed from scratch in Salesforce's reporting framework, as there is no export or migration mechanism.
Notes and Tasks low HubSpot Notes and Tasks map reasonably well to Salesforce Tasks or ContentNotes, though rich-text formatting and owner matching require validation.
Tickets low HubSpot Tickets map to Salesforce Cases with straightforward field mapping, though this is only relevant if migrating service data alongside CRM.

The hard parts

What makes this specific migration difficult, beyond the mechanics.

Contact-to-Lead/Contact Split

HubSpot's single Contact object must be bifurcated into Salesforce Leads and Contacts based on Lifecycle Stage or a custom qualification rule, and Contacts must be linked to separately created Account records.

Activity Association Model Mismatch

HubSpot Engagements can associate with multiple Contacts, Companies, and Deals simultaneously, but Salesforce Activities accept only one WhoId (Lead/Contact) and one WhatId (Account/Opportunity/Case) per record, requiring association flattening.

Product and Pricing Normalization

HubSpot's flat Product library with Line Items on Deals must be normalized into Salesforce's three-object model of Product2, PricebookEntry, and OpportunityLineItem, with tiered pricing requiring custom schema or CPQ.

Data Type and Picklist Validation

HubSpot stores most fields as strings internally and allows free-text values in dropdowns, while Salesforce enforces strict field types and picklist value sets, requiring extensive data cleansing and formatting before load.

Workflow and Report Reconstruction

HubSpot Workflows, Reports, Dashboards, Sequences, and Calculated Properties cannot be exported and must be entirely rebuilt as Salesforce Flows, Reports, Dashboards, and Formula/Roll-Up Summary Fields.

Multi-Company Contact Handling

HubSpot Contacts can associate with multiple Companies, but Salesforce requires a single primary AccountId per Contact, necessitating use of Account Contact Relations or the Contacts to Multiple Accounts feature in Enterprise Edition.

Tools used in this playbook

All free, all run entirely in your browser — nothing is uploaded.

FAQ

How much does a HubSpot to Salesforce migration cost?

Costs typically range from $10,000 for simple migrations to $100,000+ for complex enterprise implementations. A managed data migration service for a mid-market CRM (50,000 to 500,000 records) typically runs $5,000 to $30,000 for the data migration component alone, excluding Salesforce implementation and configuration.

Can I migrate HubSpot timeline activity to Salesforce?

Yes, but not all of it. Emails, calls, notes, tasks, and meetings can be migrated as Salesforce Tasks, Events, or EmailMessages using the HubSpot v3 API. Page views, form submissions, and list membership changes have no standard Salesforce equivalent. The native HubSpot-Salesforce integration has backfill limits that make it insufficient for full historical preservation.

What data cannot be migrated from HubSpot CRM to Salesforce?

HubSpot Workflows, Reports, Dashboards, and Sequences cannot be exported or migrated. They must be rebuilt in Salesforce. Marketing email analytics, form submissions, calculated properties, and tiered product pricing structures also have no direct Salesforce equivalent.

How do you handle the HubSpot Contact to Salesforce Lead vs. Contact split?

Define a qualification rule based on HubSpot Lifecycle Stage. Contacts with stages like subscriber or MQL migrate as Salesforce Leads. Those with stages like SQL, opportunity, or customer become Salesforce Contacts linked to Accounts. Lock the routing rule before building anything and test with sales before production load.

Can I keep HubSpot running alongside Salesforce after migration?

Yes. HubSpot Marketing Hub can sync with Salesforce CRM using the native integration, allowing marketing to continue in HubSpot while sales works in Salesforce. Keep HubSpot CRM licenses active for at least 30 days post-migration for rollback safety.

Or skip all of this and let us handle it

Book a 30-minute call and we'll scope your migration in a single session.