Salesforce to HubSpot migration: what maps cleanly and what does not
A Salesforce to HubSpot migration moves leads and contacts into HubSpot contacts, accounts into companies, opportunities into deals and activities into engagements, keyed on the Salesforce 18 character ID. Record types, contact roles, formula fields and Apex logic do not map directly and need a decision each. Most migrations take three to six weeks.
By HubReven Engineering
The export is the easy part. Salesforce will hand you every object as a CSV in an afternoon.
What decides whether the migration works is the handful of Salesforce concepts that have no direct equivalent in HubSpot, and whether someone made a decision about each one before the first record moved.
The objects that map cleanly
| Salesforce | HubSpot | Note |
|---|---|---|
| Account | Company | Parent account becomes a parent company association |
| Contact | Contact | Matched on Salesforce ID, not email |
| Lead | Contact | Add a property so you can still tell them apart |
| Opportunity | Deal | Stage values need a translation table |
| Product, Price Book Entry | Product, Line item | One price book per HubSpot product library |
| Task, Event | Task, Meeting | Original owner and timestamp preserved |
| Email Message | Email engagement | Attached to every associated record |
Two rules apply to every row in that table.
Store the 18 character Salesforce ID on every HubSpot record. Not the 15 character version, which is case sensitive and collides once a spreadsheet touches it. That property becomes the key for every upsert, every association and every re-run.
Load in dependency order. Owners first, then companies, then contacts, then deals, then associations, then activity. Load deals before companies and every association has nothing to attach to.
The five that need a decision
1. Leads and contacts are one object in HubSpot
Salesforce separates a person you have not qualified from a person attached to an account. HubSpot does not. Both become contacts.
That is usually a relief, but it breaks any report that counted leads. Carry a
salesforce_record_type property with the value lead or contact, and map lead status to
lifecycle stage explicitly. Do not let HubSpot infer it.
Converted leads are the trap. Salesforce keeps the original lead record after conversion. Migrate
both and you get a duplicate for every converted lead. Filter on IsConverted = false before the
lead export.
2. Record types become pipelines, or properties, or nothing
A Salesforce opportunity record type often means a different sales motion with different stages. In HubSpot that is a separate deal pipeline.
Sometimes, though, record types were created to show a different page layout, and the stages are identical. Those should collapse into one pipeline with a property. Check which kind each record type is before building pipelines, because a pipeline nobody needed is hard to take back once deals sit in it.
3. Opportunity contact roles become association labels
Salesforce lets you say this contact is the Economic Buyer on this opportunity. HubSpot does the same thing with association labels between deals and contacts.
Create the labels first, then rebuild the associations with the label attached. Skip this and the deals arrive with the right people on them and no indication of who signs.
4. Formula and roll up fields do not migrate as formulas
The value migrates. The logic does not.
For each formula field, decide whether it is still needed. If yes, rebuild it as a HubSpot calculated property or a workflow. If nobody can say what it is for, migrate the last value as plain text for reference and leave it behind. In most orgs that is the majority of them.
5. Apex, flows and validation rules are behaviour, not data
Nothing in the export tells you that a trigger reassigns accounts when the billing country changes. You find it by reading the org's automation, or you find it when routing breaks in week two.
Inventory every active flow, trigger and validation rule. Each one becomes a HubSpot workflow, a required property, a custom coded action, or a conscious decision to drop it.
Activity history is the part people regret skipping
The migrated CRM is judged on day one by a rep opening an account they have worked for three years. If the emails and calls are not there, it feels like a downgrade, and they keep a Salesforce tab open.
Migrate tasks, events and email messages as engagements with their original timestamp, owner and every association. Filter by age if volume is a problem. Five years of history is usually plenty.
The owners problem
HubSpot assigns ownership to users. Salesforce owners who left the company years ago still own thousands of records.
Map every Salesforce user ID to a HubSpot owner before migration, including a deliberate answer for departed staff: a named team, a holding owner, or reassignment by territory. Without that table, ownerless records quietly drop out of every rep's view.
Prove it before you switch off Salesforce
A migration is finished when someone outside the project agrees the numbers match.
object salesforce hubspot diff
accounts 18,402 18,402 0
contacts 91,377 91,377 0
leads (open) 12,045 12,045 0
opportunities 23,118 23,118 0
assoc. deal-co 23,118 23,118 0
activities 1,904,226 1,904,226 0
Then sample fifty records by hand, across owners and ages, and compare them field by field. Counts prove nothing was dropped. Samples prove nothing was garbled.
Keep Salesforce read only for at least one renewal cycle after cutover. Someone will need to check something.
Frequently asked questions
How long does a Salesforce to HubSpot migration take?
Three to six weeks for most B2B orgs. Two weeks of that is profiling, mapping and a sandbox load. The variable is automation: an org with forty active flows takes longer than one with five, because each flow needs a HubSpot equivalent before cutover.
Can HubSpot's Salesforce connector do the migration for me?
It can seed contacts, companies and deals, and for a small, clean org that may be enough. It is a sync tool, not a migration tool, so it does not carry historical activity, contact roles or Salesforce automation, and it matches contacts on email, which merges people you meant to keep apart.
Will we lose email history moving off Salesforce?
Not if it is in scope. Email messages, tasks and events migrate as HubSpot engagements with original timestamps and owners. Emails logged by a third party tool may live outside standard objects, so check where they are stored during profiling.
Should we clean the data before or during the migration?
During, in a staging layer, not in either live system. Cleaning Salesforce first doubles the work and disrupts the team still using it. Rules are agreed once, applied in staging, and reviewed in the sandbox load before anything reaches production.
Get the next one