Import Builder/Guides/CRM migration
Sales & CRM

Moving Contacts Between CRMs

Moving between HubSpot, Salesforce, Pipedrive and Zoho CRM is a set of CSV exports and imports. Names and emails come across easily. What breaks is everything that connects them: which company a contact works for, who owns each deal, and what stage it's in. Here's how each CRM handles those, and what to check before you import.

Export every object, with its IDs

Export contacts, companies and deals as separate files, and include each record's ID and the ID or name of the company it belongs to. Those columns are what let you rebuild the links in the new CRM. Export before your old subscription ends, and keep the untouched files as your backup.

Emails, calls, notes and attachments usually need their own exports, or a migration tool, as a contact export only covers the contact's fields. Decide what history you need to keep before you start.

Keeping contacts, companies and deals linked

Each CRM links records in a different way, so the same export needs arranging differently for each.

HubSpot

Import contacts, companies and deals together from one file, where each row holds records that belong together, or from separate files that share a column. Give every record a unique identifier, such as the email for a contact and the domain for a company: without one, the import creates new records instead of linking them. To link one contact to two companies, repeat the contact on a second row.

Salesforce

The Data Import Wizard brings in accounts and their contacts together, and handles up to 50,000 records. For more, or for objects the wizard doesn't support, Salesforce points you to Data Loader, which links records by their Salesforce IDs or by an external ID field.

Pipedrive

Everything in a row is linked: a person's name, an organization name and a deal value on one row become a person, an organization and a deal, connected. Deals and leads need a person or organization to link to, or they're skipped.

Zoho CRM

Lookup fields connect records. A contact's Account Name column holds the account's name or its record ID; if it's blank or doesn't match, the contact is imported without its account. Import accounts first, then the contacts and deals that look them up.

The fields each CRM reads its own way

Owners

HubSpot reads a user's name, email or internal ID in the owner column, and asks for the email where two users share a name. The Salesforce import wizard takes a username or full name, but can't change the owner of records that already exist. Pipedrive allows one owner per contact, and Zoho can take the owner from the file, give every row to one user, or use an assignment rule. Add every user to the new CRM before importing.

Dropdowns and stages

HubSpot only accepts a dropdown option's label or internal value, and its default properties such as Lifecycle stage need the internal value or the English label. Zoho expects dropdown values to exist already. Salesforce's wizard accepts new picklist values, up to 100 per field in one import, so typos become new options. Map every old stage and status to the new CRM's before you import.

Several values in one cell

HubSpot separates multiple checkbox options with a semicolon and no spaces (value 1;value 2), and Salesforce separates multi-select picklist values with semicolons. A comma-separated list from your old CRM needs converting.

Dates

HubSpot reads day-month-year, month-day-year or year-month-day. Salesforce's Data Loader expects month first (MM/dd/yyyy) or yyyy-MM-dd unless you turn on its European date format. Pipedrive skips rows with a date it can't read. Year first (2026-10-19) is the one format they all read the same way. CSV date formatting guide.

Phone numbers

HubSpot wants + and the country code (+11234567890, with extensions as ext123), and Salesforce wants one phone number per field. Keep extra numbers in their own columns.

What goes wrong, and the fix

Contacts arrive without their company

The link between them didn't match. Use the same company name, domain or ID in the contact's row as in the company's record, and import companies first where the CRM needs it.

Records land with the wrong owner, or none

Write owners the way the new CRM reads them: an email is safest in HubSpot. Users have to exist before the import, and Salesforce's wizard won't reassign records that are already there.

Stages and statuses are blank or new

The values didn't match the new CRM's options. Rename them before importing, so Closed Won is written exactly as the new pipeline spells it.

The same company appears twice

Salesforce ignores case, punctuation and words such as Inc and Ltd, but HP and Hewlett Packard become two accounts. Write each company the same way in every row. CSV duplicate rows guide.

Zip codes and IDs lose their leading zeros

Excel turns 02134 into 2134 when it opens the export. Keep those columns as text, or don't open the file in Excel at all. Excel leading zeros guide.

Rows are skipped

Usually a missing required field. Pipedrive needs a name for every person and organization, Zoho needs a Last Name for leads and contacts and an Account Name for accounts, and HubSpot needs each object's required properties. Check the error file the CRM gives you.

How each CRM handles duplicates

An import into a CRM that already has records meets them. Each system decides differently what counts as the same person or company.

HubSpot

Matches contacts by email, companies by domain, or any record by its Record ID or a custom property that requires unique values. Blank cells are ignored, so an import can't empty a field.

Salesforce

The import wizard matches by name, email or Salesforce ID. By name, contacts are compared on account name, account site and their name; accounts on name and site. Repeats within the file are merged into one record.

Pipedrive

Merges a person into an existing one when the organization, phone or email matches, and an organization when its address matches. Deals with the same name are never treated as duplicates, so every one is imported.

Zoho CRM

Matches by record ID or by email or record name, ignoring case. You choose whether matches are skipped or updated, and whether blanks in your file leave existing values alone.

File limits and undoing an import

HubSpot's paid plans take files up to 512 MB and 1,048,576 rows, and its free tools 20 MB. Pipedrive takes up to 200,000 rows and 50 MB from one tab. Zoho CRM's CSV limit depends on the edition, from 10,000 rows on Standard to 50,000 on Ultimate, with Excel files capped at 5,000 records per batch. Salesforce's import wizard is for fewer than 50,000 records; Data Loader handles far more.

Undoing is limited. Pipedrive admins can revert an import within 48 hours, and a Zoho import can't be cancelled once it starts. Start with a test import of a handful of records, as Salesforce suggests, and check them before importing the rest.

Before you import

Every object exported, each with its record ID and the company it belongs to
Every user exists in the new CRM, and owners are written as it expects
Old stages, statuses and dropdown values mapped to the new CRM's options
Several values in a cell separated the way the new CRM reads them
Dates in one format, ideally year first
Phone numbers with country codes, one per column
Zip codes and IDs still have their leading zeros
Each company written the same way everywhere, and duplicates removed
A test import of a few records checked before the rest

Fix the export in the new CRM's columns

Import your old CRM's export into a form with the new CRM's columns. Emails, phone numbers, dates, dropdown values and duplicates are checked as you go, so the file is right before it's imported. Data is checked in the browser and never stored by us.