---
title: Salesforce to HubSpot Migration Guide | Remqa
url: https://remqa.com/blog/salesforce-to-hubspot-migration
updated: 2026-10-23
---

[Home](https://remqa.com/) / [Blog](https://remqa.com/blog) / Salesforce to HubSpot Migration Guide

CRM migration guide

# Salesforce to HubSpot migration: objects, history and cutover

How to move Salesforce accounts, contacts, leads, opportunities, cases, activities, owners, files and associations into HubSpot without losing context.

Remqa · October 23, 2026 · 5 min read

**Short answer:** A Salesforce to HubSpot migration starts by mapping Accounts to companies, Leads and Contacts to contacts, Opportunities to deals and Cases to tickets. Export source IDs and relationships, configure HubSpot properties and pipelines first, import in dependency order, rebuild associations, load activities and files separately, then reconcile counts and representative records before cutover.

- Preserve every Salesforce record ID in a unique HubSpot property
- Create HubSpot pipelines, stages and custom properties before importing records
- Historical activities require an explicit import, not only activity sync
- Files and attachments need a separate export and validation path

By the Remqa engineering team · Last updated October 23, 2026

Moving from Salesforce to HubSpot is not a reverse copy of a HubSpot to Salesforce project. Salesforce has a stricter account model, separate Leads and Contacts, detailed activities, custom objects and many ways to relate records. HubSpot is simpler to operate, but the migration still has to preserve the context that sales and service teams use every day.

## Map the source model before exporting data

Start with a list of Salesforce objects in use, including custom objects. For each one, decide the HubSpot destination, the unique identifier, required properties and associations. Do not assume every standard object has a perfect equivalent.

| Salesforce | Typical HubSpot target | Migration decision |
| --- | --- | --- |
| Account | Company | Map parent accounts and company domains |
| Contact | Contact | Keep account association and contact roles |
| Lead | Contact | Use lifecycle stage or status properties to preserve meaning |
| Opportunity | Deal | Rebuild pipelines, stages, amounts and close dates |
| Case | Ticket | Map status, priority, owner and related company or contact |
| Task and Event | Activity | Load history with the right associations and owners |
| Campaign | Campaign data or custom structure | Decide what reporting must survive |
| Custom object | HubSpot custom object or property set | Check subscription and relationship needs |

Preserve the Salesforce ID for every record. Create a unique HubSpot property such as Salesforce Account ID, Salesforce Contact ID or Salesforce Opportunity ID. These IDs let the migration connect records, rerun safely and trace any issue back to Salesforce.

## Choose the export path for each data type

Salesforce Data Loader can export selected fields and filtered rows. It supports some relationship queries, but Salesforce documents that it does not support nested queries, child-object queries or polymorphic relationship queries. Complex relationships often need separate exports that are joined through source IDs.

Salesforce CLI can run a bulk export through Bulk API 2.0 and return CSV or JSON. It can include soft-deleted rows when the all-rows option is used. Decide whether deleted and merged records belong in the migration or only in an archive.

Files need their own plan. Exporting a record row is not the same as exporting the physical file. Salesforce documents separate permissions and export routes for Content Documents, attachments, images and documents. Build a file manifest with the source file ID, name, parent record and destination status.

> **Keep a source snapshot.** Store the raw Salesforce exports, the queries used and the export timestamp. Clean data in working copies, not in the only source files you have.

## Configure HubSpot before importing

Create HubSpot properties with the correct types before data arrives. Dropdown and multi-select values must match the options configured in HubSpot. Set up deal and ticket pipelines first. HubSpot requires imported deals to use an existing pipeline and a stage that belongs to that pipeline. Tickets also need a valid pipeline and status.

Create any association labels before the import if the account supports them. Decide how Salesforce account hierarchies, contact roles and custom relationships will appear in HubSpot. If the target model is simpler, write down which source relationships are being archived instead of moved.

## Import in dependency order

1. **Owners and reference data.** Match Salesforce users to active HubSpot users and prepare owner values using email where names may collide.
2. **Companies.** Import Accounts as companies with Salesforce IDs and parent-account references.
3. **Contacts.** Merge Leads and Contacts into the target contact model while preserving source type, status and Salesforce IDs.
4. **Deals.** Import Opportunities after pipelines, stages, owners and company records exist.
5. **Tickets and custom objects.** Load Cases and any approved custom structures with their parent identifiers.
6. **Associations.** Connect contacts to companies, deals to companies and contacts, tickets to customers and any same-object relationships.
7. **Activities.** Load calls, emails, meetings, notes and tasks with source dates, owners and associations.
8. **Files.** Upload documents and connect them to the correct HubSpot records using the migration crosswalk.

HubSpot supports single-file and two-file multi-object imports. Two-file imports need a shared column that connects the records. For updates, HubSpot can use Record ID, contact email, company domain or eligible unique-value properties. Source IDs remain the safest migration key because email and domain values can change.

## Handle Leads and Contacts deliberately

HubSpot uses one contact object, so Salesforce Leads and Contacts usually converge. Preserve the original source object in a property. Map Lead Status, Contact status fields and lifecycle meaning into a small target model that sales understands.

Do not merge solely by name. Email is a useful identifier for contacts, but shared inboxes, missing email addresses and old duplicates need review. Build a dedupe table before import and record which Salesforce IDs were merged into each HubSpot contact.

HubSpot's Salesforce-record import has special behavior for Leads and Contacts. Its documentation says the initial import may bring only the email address, with remaining fields depending on inclusion-segment and later-sync behavior. Check the exact integration settings before relying on that path for a one-time migration.

## Rebuild associations without creating duplicates

In a single-file multi-object import, include unique identifiers for both objects on each association row. To associate one record with several others, repeat the first record identifier across rows. Keep the repeated object data identical. HubSpot documents that differing values across repeated rows can create separate records in some create-and-update imports.

For existing contacts and companies, use primary email or primary company domain when the import requires those identifiers. If a relationship has a label such as decision maker or billing contact, create the label before import and confirm the target subscription supports importing it.

## Activities, notes and files need separate checks

HubSpot's general import tool supports calls, emails, meetings, notes and tasks. Some activities can be created but not updated through multi-object imports. That makes source IDs and rerun planning important. Do not assume that enabling Salesforce activity sync brings all historical tasks into HubSpot. HubSpot explicitly documents that historical Salesforce task data needs an import.

For each activity type, preserve the original timestamp, author or owner, subject, body and related records. Then sample long activity histories on important accounts. A record count can match while the activity is attached to the wrong company or deal.

## Validate before cutover

- Compare source and destination counts by object and status.
- Reconcile opportunity value by stage, owner and close period.
- Check every import error and explain every skipped row.
- Sample accounts with several contacts, deals, cases and activities.
- Confirm owners resolve to active HubSpot users.
- Check files by count, filename and parent record.
- Ask sales and service users to inspect records they know.
- Run a delta import for records changed after the first export.

HubSpot's import review reports rows imported, records created and records updated. Its error reports can identify invalid values, missing owners and association failures. Use those reports as one layer of validation, then run your own reconciliation from the source-ID crosswalk.

## Mistakes we see

- Combining Leads and Contacts without preserving their source status.
- Creating deals before the HubSpot pipelines and stages exist.
- Using blank cells to clear values, even though HubSpot ignores blank import cells.
- Assuming activity sync replaces a historical activity migration.
- Exporting file metadata but not the physical documents.
- Assigning owners by display name when several users share a name.
- Dropping Salesforce IDs after the first load.

## How Remqa runs Salesforce to HubSpot migrations

Remqa maps the source objects, preserves Salesforce IDs, exports the full relationship model and builds the HubSpot target before loading data. We run test imports, reconcile records and history, then complete a delta cutover with Salesforce available as a read-only reference. See our [CRM migration](https://remqa.com/crm-migration) process, the broader [CRM migration checklist](https://remqa.com/blog/crm-migration-checklist) and our approach to [data migration](https://remqa.com/data-migration).

## Questions people ask.

**Q: How do Salesforce objects map to HubSpot?**
A common mapping is Account to company, Lead or Contact to contact, Opportunity to deal and Case to ticket. Custom objects and relationships need a separate mapping based on how the business uses them.

**Q: Can HubSpot import Salesforce records directly?**
HubSpot can import selected Salesforce record types through its Salesforce integration and can also import spreadsheet files for multiple objects. The right route depends on data volume, inclusion rules and the history that must move.

**Q: Will Salesforce activities move automatically?**
Do not assume that activity sync imports all historical tasks. HubSpot documents a separate import path for Salesforce tasks and events, and its general import tool supports calls, emails, meetings, notes and tasks with specific update limits.

**Q: How are Salesforce owners assigned in HubSpot?**
Spreadsheet imports can assign an owner by the HubSpot user name, email or internal owner value. Email is safer when names are duplicated. For integration sync, user matching depends on active users and matching identity data.

**Q: How do we avoid duplicate HubSpot records?**
Use explicit unique identifiers, preserve the Salesforce ID in a HubSpot property and test create versus update behavior. Email and company domain can help, but they should not replace a documented source-ID crosswalk.

Book a free 30-minute call with an engineer: https://calendly.com/meghanaj-connect/30min
