Skip to content
DataUntangler

HubSpot to Salesforce Migration Starts With Deduped Contacts and Accounts

Salesforce does less duplicate matching on a load than most migration plans assume. The Data Import Wizard compares one field, Data Loader compares none on an insert, and HubSpot contacts with several companies have to be squeezed into one Account. Here is how to clean the export so the load does not double your records.

Published 25 September 2026 8 min read Written by the DataUntangler team

On a HubSpot to Salesforce migration, most duplicates are created by the load itself. The Data Import Wizard matches new contacts and leads on one field you choose, Name or Email, and accounts on Account Name and Account Site together. Data Loader, which you need for opportunities, matches nothing at all on an insert. So a HubSpot contact with no email, or a company written two ways, lands in Salesforce as two records.

The fix is to dedupe the HubSpot export before the first load, while the duplicates are still rows in a file you can approve or reject, rather than merge them in Salesforce afterwards, when each copy has already collected an owner, activities and opportunity roles.

What the Salesforce import tools match on

Salesforce gives you two standard ways to load a HubSpot export, and they behave very differently on duplicates. The difference decides where your cleaning has to happen.

Tool Objects it loads Matches new records on Size limit
Data Import Wizard Accounts, contacts, leads, campaign members, custom objects Contacts and leads: Name or Email. Accounts: Account Name and Account Site together 50,000 records per file
Data Loader Every object, including opportunities Nothing on insert. Upsert matches on Salesforce ID or an External ID field Up to 5 million records

The Import Wizard does not load opportunities at all, so deals from HubSpot go in through Data Loader, where the only protection against a double is the ID you map.

Read the account rule with a HubSpot export in front of you. HubSpot has no Account Site property, so that column is empty on every row, and the match comes down to an identical company name. Clearwater Health and Clearwater Health Inc are two accounts. So is any company a rep typed in by hand next to the same company created by a form. The step that compares those names properly is fuzzy matching after the legal suffix is stripped, and it has to run on the file, because nothing in the load will do it.

Why HubSpot records double up in Salesforce

Three habits of a HubSpot portal turn into duplicates on the way across.

First, HubSpot deduplicates contacts on email only, so any portal a few years old holds contacts with no email and contacts entered twice under two addresses. Second, a HubSpot contact can be associated with several companies, one of them marked primary, while a Salesforce contact has one direct Account. Contacts to Multiple Accounts lets you add indirect relationships, but only after the contact exists, so the export has to decide which company is the Account before the load. Third, HubSpot companies without a domain were never deduplicated automatically, and they come across exactly as they were typed.

The HubSpot rows that become duplicate Salesforce contacts

Here is a six row HubSpot contact export run through our engine exactly as written. Each row also carried its HubSpot Record ID, a state and a create date, which are left out below to keep the table readable.

Row in the HubSpot export Email Import Wizard, matching on Email What the pass proposes
Rachel Nguyen, Clearwater Health Inc rachel.nguyen@clearwaterhealth.com Creates the contact Keep
Rachel Nguyen, Clearwater Health empty Creates a second contact Same name and company, high
Derek Mills, Tidewater Freight DMILLS@Tidewater.com, with a trailing space Creates the contact Keep, email trimmed and lowercased
Derek Miles, Tidewater Freight LLC empty Creates a second contact Close name and company match, likely
Maria Santos, Pinecrest Schools msantos@pinecrest.org Creates the contact Left alone
Maria Santos, Pinecrest Schools maria.santos@pinecrest.org Creates a second contact Left as two people on purpose

Matching on Name instead of Email would not rescue the Derek pair, whose names differ by one letter, and it would merge the Maria pair, which may well be two different people.

The same run proposed the formatting fixes the load would otherwise carry into Salesforce: State/Region values of california, texas and new york turned into CA, TX and NY, and Create Date values of 03/04/2026 and 4 Mar 2026 both resolved to 2026-03-04. The state fix is not cosmetic. Salesforce state and country picklists, where an org has them switched on, reject a value they do not recognize, and a rejected row is a record that quietly never arrives. The CRM wide version of that pass is CRM data cleansing.

How to dedupe the HubSpot export before the Salesforce load

  1. 1 Export contacts, companies and deals from HubSpot with the Record ID column on every file. Before the first load, create a text field on Account, Contact and Opportunity in Salesforce, mark it External ID and Unique, and map the HubSpot Record ID into it. That field is what lets Data Loader upsert instead of insert, and what lets anyone trace a Salesforce record back to its HubSpot origin later.
  2. 2 Decide the Account for every contact. Where a contact has several associated companies, use the primary one as the Account and keep the others in a separate file for Contacts to Multiple Accounts once the contacts exist.
  3. 3 Drop the Contact owner column from the matching copy of the file. It holds the name of a rep, and a matcher reading it next to the contact name will keep two copies of one person apart because two different reps created them.
  4. 4 Load the companies file into the browser demo first, then the contacts file. Nothing uploads: both files are parsed and matched in your own tab. Approve the company clusters before the contacts, because a contact merge depends on the company names already agreeing.
  5. 5 Reject anything borderline. A duplicate that survives into Salesforce can still be merged there later, while a wrong merge on the export removes a real person before anyone has seen them.
  6. 6 Load accounts, then contacts, then opportunities through Data Loader keyed on the HubSpot ID field. Reconcile before you call it done: rows loaded plus rows merged in the change log should equal the rows you exported from HubSpot.

The reverse move has its own quirks, mostly around the 15 and 18 character Salesforce IDs, and we covered it in Salesforce to HubSpot migration. The wider cutover plan for ERP moves as well as CRM ones is in data migration cleansing software.

Should I use the Data Import Wizard or Data Loader for a HubSpot migration?

Use both, for different objects. The Import Wizard is fine for accounts, contacts and leads under 50,000 rows a file, and its Name or Email matching is a useful last check. Opportunities need Data Loader, and a migration of any size is safer with Data Loader throughout, upserting on an External ID that holds the HubSpot Record ID, because that match is exact and repeatable.

Either way, neither tool compares near duplicates. That work has to be finished on the export before the first file goes in, which is why a cleaned, reviewed file is the real input to the load, whichever tool runs it.

How do I merge duplicate accounts after the migration?

In Salesforce you merge accounts from the account record, up to three at a time, and the fields you do not pick from a losing record are gone. Related contacts and opportunities move to the surviving account. It works, but each merge is a judgment made on live records, so a list of pairs you already reviewed makes that afternoon much shorter.

The better answer is to have few left to merge. Every account pair caught on the export is one fewer merge, one fewer opportunity report that splits one customer across two rows, and one fewer argument about whose account it is. The system specific version of that cleanup is on the Salesforce deduplication page. For the accounts already in the org, the merge list with owner conflicts flagged is on Salesforce merge accounts.

Rebuild routing before the first new lead arrives

HubSpot workflows that rotated leads between reps do not come across in a data migration. On the day forms start writing into Salesforce, every new lead needs somewhere to go, and a clean contact table does not help if the new records land unassigned or on the wrong rep. Salesforce assignment rules cover straightforward territories, and teams with round robin, capacity or skill based rules often run dedicated lead routing software for it. Either way, test the routing on a copy of the cleaned file before cutover, so the first real lead is not the test.

When a migration partner or a sync tool is the better buy

If the move involves custom objects, marketing history, attribution and a rebuilt pipeline, a Salesforce partner or a dedicated migration service is money well spent. Their scoping covers far more than the data. If duplicates keep arriving after cutover from forms and integrations, a tool connected to the org that merges on a schedule is the right shape, and we compare two of them honestly on the Cloudingo alternative and Insycle alternative pages.

The data cleaning step in the middle is the part that suits a file tool. DataUntangler does not connect to HubSpot or Salesforce. It takes the export, proposes every duplicate cluster and every format fix as a change you approve or reject, and returns the cleaned CSV with a log of what you decided, keyed on the HubSpot Record ID. The Analyst plan is 59 dollars a month for unlimited files of up to about 100,000 rows each, and the data cleaning tool runs in your browser if you want to put the real export through it first.

The file is still messy after the article

Load it into the demo and see every duplicate, every broken date and every mangled character as a line you can approve or reject.

No card required. Your file never leaves your computer.

Clean a file