โฐ FAST FIX (5 Minutes โ Contacts Only)
If you need to move a small contact set from Salesforce to HubSpot today:
- Export from Salesforce โ Reports โ Create a Contacts report โ Export as CSV
- Rename columns using the field mapping table below โ
LastNameโlastname,Emailโemail,Account.Nameโcompany - Convert dates from M/D/YYYY to YYYY-MM-DD format using Data Cleaner
- Map lifecycle stage values โ Salesforce Lead Status values don't match HubSpot lifecyclestage; see the value mapping table below
- 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.
| Tier | Record Volume | Custom Fields | Estimated Time | Primary Risk | Recommended Approach |
|---|---|---|---|---|---|
| Small | < 5,000 contacts + accounts | 0โ5 | 1โ3 days | Owner mapping | Full CSV workflow below |
| Mid | 5,000โ50,000 | 5โ20 | 1โ2 weeks | Picklist remapping, date conversion, dedup | Full CSV workflow + test on 10% sample |
| Large | 50,000โ200,000 | 10+ | 2โ4 weeks | Relationship integrity, batch limits, owner gaps | Phased CSV with parallel verification |
| Enterprise | 200,000+ | Any | 4โ10 weeks | Data integrity at scale, rollback complexity | Consider 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
- Step 1: Export from Salesforce
- Step 2: Salesforce to HubSpot Field Mapping
- Step 3: Data Cleaning for HubSpot
- Step 4: Validate Before Import
- Step 5: Import to HubSpot
- Common Salesforce to HubSpot Failures
- Additional Resources
- FAQ
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:
- Accounts (Companies) โ required before Contact import
- Contacts โ include Account Name or Account ID for relationship
- Leads โ if migrating separately from Contacts
- Opportunities / Deals โ after Contacts and Accounts are confirmed in HubSpot
Export field checklist for Contacts: Include all standard fields plus these migration-critical columns:
OwnerIdorOwner.Emailโ for owner mappingAccountIdorAccount.Nameโ for company relationshipCreatedDateโ for import date fieldLeadSourceโ will need value remappingLead.StatusorContact.Statusโ will need lifecycle stage mapping
Step 2: Salesforce to HubSpot Field Mapping
| Salesforce Field | HubSpot Property | Notes |
|---|---|---|
| FirstName | firstname | Direct map |
| LastName | lastname | Direct map โ required field in HubSpot |
| Dedup key in HubSpot โ required for dedup | ||
| Phone | phone | Strip formatting: (555) 555-0101 โ +15555550101 |
| MobilePhone | mobilephone | Direct map after formatting |
| Account.Name | company | String; HubSpot creates Company record on match |
| Title | jobtitle | Direct map |
| Website | website | Direct map |
| Department | department | Direct map |
| Description | description | Max 65,536 chars in HubSpot |
| LeadSource | hs_analytics_source | Value remapping required (see below) |
| Lead.Status / Contact.Status | lifecyclestage | Value remapping required (see below) |
| Owner.Email | hubspot_owner_id | Must be active HubSpot user email |
| AnnualRevenue | annualrevenue | Remove $ and commas: "$1,250,000" โ "1250000" |
| NumberOfEmployees | numemployees | Integer only |
| Industry | industry | Value remapping may be required |
| MailingStreet | address | Direct map |
| MailingCity | city | Direct map |
| MailingState | state | Direct map |
| MailingPostalCode | zip | Preserve leading zeros โ see address guide |
| MailingCountry | country | HubSpot accepts full country names |
| CreatedDate | createdate | Convert to YYYY-MM-DD |
| Birthdate | date_of_birth | Convert 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 Status | HubSpot lifecyclestage | Notes |
|---|---|---|
| Open - Not Contacted | lead | Default for new leads |
| Working - Contacted | lead | Still in lead stage |
| Closed - Converted | customer | Converted to customer |
| Closed - Not Converted | other | No equivalent; map to "other" |
| MQL | marketingqualifiedlead | Confirm with marketing team |
| SQL | salesqualifiedlead | Confirm with sales team |
| Opportunity | opportunity | If you use this stage |
| Customer | customer | Direct 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
lifecyclestagevalues match HubSpot's accepted internal valueshubspot_owner_idcontains 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:
- 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.
- Contacts second โ import after Companies are confirmed. Include the
companycolumn โ HubSpot matches on company name and creates the Contact-Company relationship. - Deals third โ import after Contacts and Companies are confirmed. Include
contact_emailandcompany_namefor 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:
- Salesforce: Data Export Service โ How to export all CRM data
- HubSpot: Import Records โ HubSpot import documentation including field mapping and error handling
- HubSpot: Migrate from Salesforce โ Official Salesforce integration documentation
Data Standards:
- ISO 8601: Date Formats โ Date format standard for CRM imports
- E.164: International Phone Number Format โ ITU standard for phone number formatting
Privacy:
- GDPR Article 5: Data Minimization โ Principle limiting unnecessary third-party processing during migration
- GDPR Article 28: Processor Obligations โ Third-party migration service processor requirements
- CCPA: California Consumer Privacy Act โ Service provider contract requirements for customer data