Navigated to blog โ€บ salesforce-to-hubspot-migration-csv
Back to Blog
crm-import-guides

Salesforce to HubSpot Migration: Export, Clean, and Import Your CRM Data

March 20, 2026
17
By SplitForge Team

โฐ FAST FIX (5 Minutes โ€” Contacts Only)

If you need to move a small contact set from Salesforce to HubSpot today:

  1. Export from Salesforce โ€” Reports โ†’ Create a Contacts report โ†’ Export as CSV
  2. Rename columns using the field mapping table below โ€” LastName โ†’ lastname, Email โ†’ email, Account.Name โ†’ company
  3. Convert dates from M/D/YYYY to YYYY-MM-DD format using Data Cleaner
  4. Map lifecycle stage values โ€” Salesforce Lead Status values don't match HubSpot lifecyclestage; see the value mapping table below
  5. Validate and import โ€” Data Validator to confirm, then HubSpot's Import tool at Contacts โ†’ Import

For migrations including Accounts (Companies), Deals, Activities, or over 10,000 records โ€” follow the full workflow.


TL;DR: Salesforce to HubSpot is the most-searched CRM migration path because it's the most common cost-driven CRM switch. The technical barriers are well-understood: Salesforce exports in its own format, HubSpot has its own field naming and picklist conventions, and the gap between them requires deliberate transformation. This guide gives you the exact field mapping table and step-by-step workflow. Data Validator โ†’


Migration Complexity at a Glance

Before diving in, place your migration in the right tier. The workflow is the same across all three โ€” the difference is time investment and risk level.

TierRecord VolumeCustom FieldsEstimated TimePrimary RiskRecommended Approach
Small< 5,000 contacts + accounts0โ€“51โ€“3 daysOwner mappingFull CSV workflow below
Mid5,000โ€“50,0005โ€“201โ€“2 weeksPicklist remapping, date conversion, dedupFull CSV workflow + test on 10% sample
Large50,000โ€“200,00010+2โ€“4 weeksRelationship integrity, batch limits, owner gapsPhased CSV with parallel verification
Enterprise200,000+Any4โ€“10 weeksData integrity at scale, rollback complexityConsider HubSpot's Salesforce integration for phased cutover + CSV for cleanup

The critical distinction: record volume is not the primary timeline driver. Data quality is. A 4,000-record export from a well-maintained Salesforce instance with consistent field values migrates in a day. An 8,000-record export with five years of inconsistent manual entry, unmapped custom fields, and owner assignments to departed employees takes a week. Audit your data quality before committing to a timeline.

Your company is moving from Salesforce to HubSpot. The decision is made โ€” usually budget-driven, sometimes usability-driven. You have a migration deadline. And you have a Salesforce instance with five years of contact data, custom fields, and relationship history that needs to land correctly in HubSpot.

Salesforce to HubSpot is the single most-searched CRM migration query because it's the most common migration path. It's also the migration most commonly underestimated. The blocker is never the export tool (Salesforce exports cleanly) or the import tool (HubSpot's importer is reliable). The blocker is the data transformation step โ€” the gap between how Salesforce structures data and what HubSpot expects.

Salesforce CRM exports contain everything: contact names, email addresses, phone numbers, deal values, activity history, and five years of notes. This is the most comprehensive PII dataset your organization holds. Most CRM migration services process this data on remote servers โ€” creating a GDPR Article 5(1)(c) data minimization issue (unnecessary processing with a third party), a potential GDPR Article 28 processor relationship requiring a Data Processing Agreement, and CCPA service provider contract exposure under California Civil Code ยง1798.100. SplitForge transforms and validates your Salesforce export entirely in Web Worker threads in your browser. Your customer data never reaches any server. Confirm in Chrome DevTools โ†’ Network tab โ€” zero outbound file transfer.

This migration workflow was validated using Salesforce Data Export Service output and HubSpot CRM import documentation, March 2026.

For the general CRM migration framework, see our CRM data migration guide. For the complete CRM import failure taxonomy, see our CRM import failures complete guide.


๐Ÿ“‹ Table of Contents


What Makes Salesforce to HubSpot Different

Salesforce and HubSpot have fundamentally different data models in three areas that directly affect migration:

Leads vs Contacts. Salesforce has a Lead object and a Contact object โ€” the same person can exist in both. HubSpot has one Contact object with a Lifecycle Stage property. Before migrating, you need to decide: convert all Leads to Contacts in Salesforce before export, or export Leads and Contacts separately and merge them during migration.

Account vs Company. Salesforce's Account object maps to HubSpot's Company object. The relationship is similar, but the field names differ. Contact-to-Account relationships in Salesforce become Contact-to-Company relationships in HubSpot.

Owner identification. Salesforce identifies record owners by User ID internally. Exports typically include the owner's full name. HubSpot identifies owners by their active HubSpot user email. The owner column in your Salesforce export must be converted to HubSpot user email addresses before import โ€” otherwise, records import with no owner.

โŒ BROKEN โ€” three Salesforce export columns that fail HubSpot import directly:
Salesforce column    Salesforce value           HubSpot problem
"OwnerId"            "0051x000003ABC123"        Not a valid owner identifier
"Owner.Name"         "John Smith"               Not a valid owner identifier
"LeadStatus"         "Working - Contacted"      Not in HubSpot's lifecyclestage list
"CreatedDate"        "3/20/2026 9:15 AM"        Date format not ISO 8601
"AnnualRevenue"      "$1,250,000"               Currency symbol breaks numeric field

FIXED โ€” after transformation:
"hubspot_owner_id"   "[email protected]"   Active HubSpot user email
"hubspot_owner_id"   "[email protected]"   (same โ€” resolve name to email)
"lifecyclestage"     "lead"                     Valid HubSpot internal value
"createdate"         "2026-03-20"               ISO 8601 date
"annualrevenue"      "1250000"                  Numeric only, no symbol

Step 1: Export from Salesforce

Salesforce offers three export methods:

Data Export Service (Setup โ†’ Data โ†’ Data Export) โ€” exports all objects as CSV files. Best for full migrations. Generates a ZIP file with separate CSVs for each object (Contacts.csv, Accounts.csv, Opportunities.csv, etc.). Note: Data Export runs on Salesforce's schedule (weekly or monthly depending on edition) โ€” plan your migration timeline accordingly.

Reports โ€” for targeted exports of specific record sets with specific fields. Create a Contact report with all relevant fields, run it, and export as CSV. Best for partial migrations or when you need custom filtering.

Data Loader โ€” for migrations over 50,000 records. Exports via SOQL query, giving you precise control over which records and fields to include. Requires Java and Data Loader client installation.

What to export in order:

  1. Accounts (Companies) โ€” required before Contact import
  2. Contacts โ€” include Account Name or Account ID for relationship
  3. Leads โ€” if migrating separately from Contacts
  4. Opportunities / Deals โ€” after Contacts and Accounts are confirmed in HubSpot

Export field checklist for Contacts: Include all standard fields plus these migration-critical columns:

  • OwnerId or Owner.Email โ€” for owner mapping
  • AccountId or Account.Name โ€” for company relationship
  • CreatedDate โ€” for import date field
  • LeadSource โ€” will need value remapping
  • Lead.Status or Contact.Status โ€” will need lifecycle stage mapping

Step 2: Salesforce to HubSpot Field Mapping

Salesforce FieldHubSpot PropertyNotes
FirstNamefirstnameDirect map
LastNamelastnameDirect map โ€” required field in HubSpot
EmailemailDedup key in HubSpot โ€” required for dedup
PhonephoneStrip formatting: (555) 555-0101 โ†’ +15555550101
MobilePhonemobilephoneDirect map after formatting
Account.NamecompanyString; HubSpot creates Company record on match
TitlejobtitleDirect map
WebsitewebsiteDirect map
DepartmentdepartmentDirect map
DescriptiondescriptionMax 65,536 chars in HubSpot
LeadSourcehs_analytics_sourceValue remapping required (see below)
Lead.Status / Contact.StatuslifecyclestageValue remapping required (see below)
Owner.Emailhubspot_owner_idMust be active HubSpot user email
AnnualRevenueannualrevenueRemove $ and commas: "$1,250,000" โ†’ "1250000"
NumberOfEmployeesnumemployeesInteger only
IndustryindustryValue remapping may be required
MailingStreetaddressDirect map
MailingCitycityDirect map
MailingStatestateDirect map
MailingPostalCodezipPreserve leading zeros โ€” see address guide
MailingCountrycountryHubSpot accepts full country names
CreatedDatecreatedateConvert to YYYY-MM-DD
Birthdatedate_of_birthConvert to YYYY-MM-DD

PLATFORM SPECIFICATION SOURCE Platforms: Salesforce CRM, HubSpot CRM Sources: Salesforce Contact Object Reference; HubSpot CRM Properties Documentation URLs: https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_contact.htm ; https://knowledge.hubspot.com/crm-setup/manage-your-properties Verified: March 2026 Next re-verify: June 2026

Lifecycle Stage Value Mapping

Salesforce Lead Status and Contact Status values must be remapped to HubSpot's lifecyclestage internal values. HubSpot accepts only these internal values (lowercase) or their exact English labels:

Salesforce Lead StatusHubSpot lifecyclestageNotes
Open - Not ContactedleadDefault for new leads
Working - ContactedleadStill in lead stage
Closed - ConvertedcustomerConverted to customer
Closed - Not ConvertedotherNo equivalent; map to "other"
MQLmarketingqualifiedleadConfirm with marketing team
SQLsalesqualifiedleadConfirm with sales team
OpportunityopportunityIf you use this stage
CustomercustomerDirect map

Values that cause import rejection: LEAD, New Lead, mql, SQL, Closed, Active, Inactive. HubSpot requires exact internal values or exact English labels โ€” no variations.


Step 3: Data Cleaning for HubSpot

3a. Owner Mapping

This is the highest-failure-rate step in Salesforce-to-HubSpot migrations. Build a lookup table:

FIXED โ€” owner resolution table:
Salesforce Owner Name   โ†’   HubSpot User Email
"John Smith"            โ†’   "[email protected]"
"Sarah Johnson"         โ†’   "[email protected]"
"Mike Wilson"           โ†’   "[email protected]"
"Former Employee"       โ†’   "[email protected]" (reassign to admin)

Use Find & Replace to convert the Owner Name column to the corresponding HubSpot user email. Any owner email that doesn't match an active HubSpot user causes the record to import without an owner โ€” it lands in the default unassigned pool.

3b. Date Format Conversion

Salesforce exports dates in M/D/YYYY H:MM AM/PM format (e.g., 3/20/2026 9:15 AM). HubSpot expects YYYY-MM-DD for date fields and YYYY-MM-DDThh:mm:ss.SSSZ for datetime fields.

For date-only fields (close date, birthdate), convert to 2026-03-20. HubSpot's import wizard handles date-only fields correctly with this format.

3c. Revenue and Numeric Field Cleanup

Salesforce exports Annual Revenue with currency formatting: $1,250,000.00. HubSpot's annualrevenue field is numeric and rejects currency symbols and commas. Strip all non-numeric characters except the decimal point before import.

โŒ BROKEN โ€” currency-formatted revenue values:
annualrevenue
$1,250,000.00
$500,000
$75,000.00
$12,000,000

FIXED โ€” numeric only:
annualrevenue
1250000.00
500000
75000.00
12000000

3d. Phone Number Formatting

HubSpot accepts multiple phone formats for import but standardizes internally. Remove all formatting characters โ€” parentheses, dashes, spaces, extensions โ€” to avoid import validation errors. Use E.164 format for international numbers: +15555550101.

3e. Deduplicate on Email

Before importing Contacts to HubSpot, deduplicate on email. HubSpot auto-deduplicates on email during import โ€” an incoming record that matches an existing contact's email updates the existing record. If your Salesforce export contains duplicate emails (Lead and Contact for the same person), HubSpot creates one record and updates it with the last-imported values. Control which record "wins" by deduplicating in your CSV before upload and keeping the most complete record.

See our CRM deduplication guide for the full workflow.


Step 4: Validate Before Import

Run the transformed CSV through Data Validator to confirm:

  • Email format is valid for all rows
  • lifecyclestage values match HubSpot's accepted internal values
  • hubspot_owner_id contains email addresses, not names or IDs
  • Numeric fields (annualrevenue, numemployees) contain numbers only
  • Date fields are in YYYY-MM-DD format

Fix all critical errors before proceeding to import. Import-time errors in HubSpot generate an error file โ€” but the records that did import (without errors) are already in HubSpot. Partial imports are harder to clean up than pre-import validation failures.


Step 5: Import to HubSpot

Import order:

  1. Companies first โ€” import your Salesforce Accounts as HubSpot Companies. Use the Account Name as the Company Name. This creates Company records in HubSpot before Contacts reference them.
  2. Contacts second โ€” import after Companies are confirmed. Include the company column โ€” HubSpot matches on company name and creates the Contact-Company relationship.
  3. Deals third โ€” import after Contacts and Companies are confirmed. Include contact_email and company_name for relationship mapping.

HubSpot import settings:

  • Create and update existing contacts โ€” handles both net-new and existing contacts
  • Associate with company based on company name โ€” creates Contact-Company relationships during import
  • Don't update existing properties with empty values โ€” prevents blank fields from overwriting existing data

Save the field mapping after the first successful import โ€” HubSpot stores it for reuse on subsequent imports.


Common Salesforce to HubSpot Failures

Lifecycle stage values rejected silently. HubSpot imports the Contact record but leaves lifecyclestage blank when the imported value isn't recognized. The record looks complete but has no lifecycle stage โ€” it won't appear in lifecycle stage-filtered lists. Remap all Salesforce status values to HubSpot's internal list before import.

Owner assignment fails for all records. The owner column contains Salesforce User IDs (0051x000003ABC123) rather than names. Build the owner mapping from Salesforce User exports โ€” export Users separately to get the Name-to-Email mapping.

Contacts import without Company association. The company column in the Contact CSV doesn't match the Company Name as it imported in the Companies CSV. A single character difference (trailing space, different capitalization) breaks the relationship. Normalize company names in both exports using the same rules.

Salesforce Activities don't transfer. Email logs, call records, and task history from Salesforce are not importable via HubSpot's CSV import. This is a platform limitation, not a migration error. Archive Salesforce activities via data export before decommissioning the org, and treat HubSpot as a clean start for activity tracking.

Salesforce 'Bad Value for Restricted Picklist' errors appear in HubSpot too. Custom picklist fields from Salesforce that you mapped to HubSpot custom properties still require value remapping if the HubSpot property is a dropdown. The values must match exactly. See our Salesforce Bad Value for Restricted Picklist guide for context on why this fails in both platforms.


Post-Import Audit Checklist

Run this within 24 hours of the full import completing. These are the checks most commonly skipped โ€” and the ones that surface the silent failures before they cause downstream damage.

  • Record count matches expected โ€” HubSpot contact count equals your post-dedup CSV row count (ยฑ5 records for edge cases)
  • Lifecycle stage populated โ€” filter Contacts where lifecyclestage is unknown; should be near zero
  • Owner assigned on all records โ€” filter Contacts where owner is unassigned; fix now before automations fire
  • Company associations present โ€” spot-check 10 contacts; each should show a linked Company record
  • Custom fields populated โ€” open 5 records and verify custom field values match the source Salesforce record
  • Date fields correct โ€” check Close Date on 3 Deals; confirm dates are in the right year and format
  • No duplicate contacts โ€” HubSpot's dedup report (Contacts โ†’ Actions โ†’ Manage Duplicates) should show minimal new matches
  • Active sequences haven't fired to migrated contacts โ€” confirm no automations enrolled migrated contacts in sequences not intended for them
  • Lists and segments populated correctly โ€” any active-criteria lists should have updated to include newly migrated contacts
  • Search returns expected results โ€” search for 3 known contacts by name; confirm they appear as a single record each

If lifecycle stage, owner, or company association failures appear in this audit, fix them in HubSpot using the bulk edit or re-import update workflow before the sales team begins working from the new system.


If the Import Goes Wrong: Rollback Options

Most HubSpot plans support rollback of a CSV import within the import session window.

Option 1 โ€” Delete via import history (fastest): In HubSpot, go to Contacts โ†’ Import โ†’ find your import โ†’ select "Delete imported records." This removes only the contacts from that specific import. Available for recent imports; use within the same session where possible.

Option 2 โ€” Bulk delete from a list: If the import history option isn't available, create a list filtered by "Import = [your import name]" and bulk-delete from that list. Requires list-based deletion permissions.

Option 3 โ€” Fix and re-import with update: If the records imported with incorrect field values (blank lifecycle stage, wrong owner) but the records themselves are structurally correct, use HubSpot's "Update existing contacts" import option. Re-import only the corrected columns โ€” you don't need to re-import all fields, just the ones that need correction.

When rollback isn't the right answer: if the import created orphaned contacts (no company association) but the contacts themselves are correct, fixing the association is faster than deleting and re-importing. Use HubSpot's company association tools to bulk-associate orphaned contacts to the correct company.


Additional Resources

Official Migration Documentation:

Data Standards:

Privacy:


FAQ

HubSpot offers a native Salesforce integration that syncs records bidirectionally in real time. This is not a migration tool โ€” it's a sync for organizations running both CRMs simultaneously. For a full migration (moving from Salesforce to HubSpot and decommissioning Salesforce), CSV migration is the correct approach. The native integration requires keeping Salesforce active as the source of truth during the sync period, which adds cost and complexity to the transition.

Standard Salesforce objects (Contacts, Accounts, Opportunities) map to HubSpot's standard objects. Custom Salesforce objects (custom modules like Events, Products, or industry-specific records) have no direct equivalent in HubSpot by default. Options: create equivalent Custom Objects in HubSpot (available on Enterprise plans), map the data to HubSpot's Notes or Associations features, or archive the data outside of HubSpot. Assess custom object migration as a separate workstream before committing to the migration timeline.

Option 1: Convert all Leads to Contacts in Salesforce before export, then migrate Contacts only. This simplifies the migration but merges Lead and Contact data into one object. Option 2: Export Leads and Contacts separately, deduplicate across both files on email, and import as a single Contact CSV to HubSpot. HubSpot has one Contact object with Lifecycle Stage โ€” there's no direct Salesforce Lead equivalent in HubSpot's data model.

HubSpot does not publish a hard daily import limit for CSV imports. Individual import files are limited to 1,048,576 rows. In practice, large imports (100,000+ records) are processed asynchronously โ€” HubSpot queues the import and processes it in the background. You receive an email confirmation when the import completes. For very large migrations, split the import into multiple files and import in dependency order (Companies, then Contacts, then Deals).

Yes โ€” use a HubSpot Sandbox account if your HubSpot edition includes one (Professional and Enterprise). Import the sample set to the Sandbox, validate the results, then run the full migration to Production. If a Sandbox isn't available, create a test list in HubSpot and import a small sample set, then verify before importing the full dataset. After the test, delete the test records from HubSpot using the import history's delete option.

Download the error file from HubSpot's import history (Contacts โ†’ Import โ†’ [Import Name] โ†’ Download Error File). The error file contains the rows that failed with the specific rejection reason. Common reasons: lifecyclestage value not recognized, hubspot_owner_id email not found in the portal, numeric field contains non-numeric characters, duplicate email that merged into existing record. Fix each error type in the source CSV and re-import only the failed rows.


Migrate from Salesforce to HubSpot Without Data Loss

Complete field mapping table: every Salesforce field to its HubSpot equivalent
Lifecycle stage and lead status value remapping so no records land with blank stages
Owner reassignment workflow โ€” names to active HubSpot user emails
Your Salesforce export validates locally โ€” never uploaded to a migration service

Continue Reading

More guides to help you work smarter with your data

csv-import-guides

CSV Delimiter Errors: Fix Comma vs Semicolon for International Teams

Stop all data in Column A errors. Learn comma, semicolon & tab CSV delimiters plus quick fixes for global teams.

Read More
csv-guides

How to Split Large CSV Files Without Excel (Even 1M+ Rows)

Need to split a massive CSV file but Excel keeps crashing? Learn how to split files with millions of rows safely in your browser without uploads.

Read More
excel-guides

Batch Convert Multiple Excel Files to CSV Without Opening Each One

Opening 50 Excel files one at a time to save as CSV takes 45 minutes and produces inconsistent results. Three methods handle the same task in under 60 seconds โ€” none require opening a single file.

Read More