Teams usually move from HubSpot to Salesforce when sales gets more complex. More pipelines, more territories, more approval steps or a finance team that wants CPQ and forecasting. The move itself is not hard to start. Export some CSVs, import them, done. The problems show up a month later, when a rep opens an account and the call notes are gone, or a deal is attached to the wrong company, or last year's revenue report no longer adds up. This guide covers the decisions that prevent that.
HubSpot and Salesforce think about data differently
HubSpot is built around contacts and flexible associations. A contact can be associated with several companies, a deal can be associated with many contacts and a ticket can sit across all of them. Salesforce is stricter. It separates Leads (people you have not qualified) from Contacts (people who belong to an Account), and most records hang off an Account. That difference drives almost every hard choice in the migration.
| HubSpot | Salesforce | Notes |
|---|---|---|
| Contacts | Leads or Contacts | Split by lifecycle stage and company association |
| Companies | Accounts | Parent company links become Parent Account |
| Deals | Opportunities | Each pipeline becomes a sales process with its own stages |
| Tickets | Cases | Needs Service Cloud or a custom object |
| Calls, emails, meetings, tasks | Tasks and Events | Linked by Who (person) and What (account or deal) |
| Notes | Notes | Keep original author and date in fields |
| Products and line items | Products, price books, opportunity products | Price books must exist before line items load |
| Custom objects | Custom objects | Recreate schema first, then load |
Step 1: Decide the Lead and Contact rule
This is the decision that sales leadership has to own. HubSpot keeps everyone as a contact and uses lifecycle stage (subscriber, lead, MQL, SQL, opportunity, customer) to say where they are. Salesforce wants you to choose. A simple rule that works for many teams:
- People with no company association and an early lifecycle stage become Leads.
- People associated with a company, an open or closed deal, or a customer record become Contacts under that Account.
- Unsubscribed or bounced people keep their opt-out flags wherever they land, so nobody gets emailed by mistake.
Some teams skip Leads entirely and load everyone as Contacts. That is a valid choice if your sales process does not use Lead conversion. Write the rule down and run it on a sample of 50 real records with a sales manager before you go further.
Step 2: Rebuild pipelines and properties in Salesforce first
Salesforce needs its structure in place before data arrives. List every HubSpot deal pipeline and its stages, then decide how they map to Opportunity stages and sales processes. If you have three pipelines with different stages, you will usually need record types so each one keeps its own stage list.
Then go through HubSpot properties. Most portals have many properties nobody uses. Export the property list with fill rates and drop anything that is empty or abandoned. For the rest, create matching Salesforce fields with the right types. Dropdowns need the same option values, dates need a consistent format and multi-select checkboxes need a multi-select picklist with every value defined.
Step 3: Get a full export, including associations and activity
The HubSpot export screen gives you records and properties. It does not give you everything you need. Associations (which contact belongs to which company and deal) and engagements (calls, emails, meetings, notes and tasks) are where history lives, and you usually need the HubSpot API to pull them out completely. Also export owners, so every record can be assigned to the right Salesforce user, and pipelines with their stage IDs.
Check attachments separately. Files attached to records and notes are easy to miss and painful to recover after HubSpot access ends.
Step 4: Load in dependency order
Salesforce records point at their parents, so parents go first. A typical order:
- Users, so ownership can be set.
- Accounts, then a second pass to set Parent Account.
- Contacts linked to Accounts, then Leads.
- Extra contact to company links as Account Contact Relationship records, if you use Contacts to Multiple Accounts.
- Products and price books.
- Opportunities, contact roles and opportunity products.
- Cases.
- Tasks, Events and Notes, linked through the external IDs.
- Files.
Tool choice matters here. The Salesforce Data Import Wizard runs in the browser and is fine for Accounts, Contacts and Leads under 50,000 records. It does not cover Opportunities, Cases or activities. For those, and for anything larger, use Data Loader or the Bulk API with upsert on your external ID field. Turn off workflow rules, flows, assignment rules and duplicate alerts during the load, or every imported record will trigger emails and tasks that nobody wanted.
Step 5: Test in a sandbox with the full dataset
Run the whole migration into a Salesforce sandbox, not a sample. Problems hide in the long tail. A company with 4,000 contacts, a deal with no associated company, a note with an attachment over the size limit, a picklist value someone typed with a trailing space. Each one fails a row, and the error file tells you why. Fix the mapping or the data, then rerun with upsert until the error file is empty or every remaining error is explained.
Step 6: Verify with numbers and with people
Counts come first. Records per object in HubSpot against records per object in Salesforce, with every gap explained. Then totals. Closed won revenue by quarter, open pipeline by stage and deals by owner should match within rounding.
Then ask reps to check what they know. Each rep picks five accounts they work every week and checks contacts, open deals, recent calls and notes. People spot wrong associations in seconds that no script will catch. Collect issues in one place, fix them in the mapping and rerun the test before you schedule cutover.
Step 7: Cut over without losing a day of selling
- Pick a date away from month end and quarter end.
- Freeze edits in HubSpot for the cutover window and run a final delta load of everything changed since the last test.
- Switch on Salesforce automation, assignment rules and duplicate rules.
- Reconnect integrations. Email sync, calendar, forms, enrichment, billing and any tool that wrote to HubSpot.
- Keep HubSpot read-only for reference. Many teams keep HubSpot for marketing and sync it with Salesforce, so decide that early.
Mistakes we see most often
- Every note and task owned by the integration user, so nobody knows who logged what.
- Contacts linked to several companies in HubSpot collapsed to one Account with the rest dropped.
- Deal stage history lost, so time in stage and win rate reports start from zero.
- Lifecycle stage mapped to Lead Status without agreeing what each value means.
- Opt-out and unsubscribe flags left behind.
- Automation left on during import, sending hundreds of welcome emails and task alerts.
Most of these are covered in more detail in our general CRM migration checklist, which applies to any pair of CRMs.
How Remqa runs HubSpot to Salesforce migrations
We run the same steps every time. Map, test run in a sandbox, verify with your team, cut over. Every record keeps its HubSpot ID, every note keeps its author and date, and HubSpot stays read-only until you sign off. If your data also needs to land in a warehouse or reporting database, we handle that as part of a data migration. See how we approach CRM migration, or book a call and walk an engineer through your portal.