Sales teams judge a CRM move by one thing: can they pick up where they left off? On the first day in HubSpot, a rep expects to open a deal and see the right stage, the right amount, the last call and the next task. A Freshsales to HubSpot migration that moves the records but loses the activity timeline or scrambles the pipeline fails that test, even if every contact arrived.
This guide covers why teams move from Freshsales to HubSpot, what Freshsales data can be migrated, how to map deals and pipelines, how to migrate tasks, notes and sales activities, what happens to lead scoring and automation, and how to validate the result before reps go live.
Freshsales is a capable sales CRM, and many teams outgrow it for reasons that have little to do with its core features. The usual trigger is that sales is no longer working alone.
A Freshsales CRM migration is also a good time to simplify. Old pipelines, unused custom fields and sales activity types that nobody logs anymore do not need to come across. Every item you leave behind is one less thing to map and test.
Freshsales provides a full data export. Its support documentation explains that you export data from Admin Settings, Account Settings, by choosing a time period and the records to include, and that the export arrives as a Zip file by email. Freshsales lists contacts, activities, deals, sales activities, user information, email logs and email conversations among the data you can export. It also notes that you can export CRM data up to five times a day, and over the full time range only once, so plan test exports carefully.
|
Freshsales data |
HubSpot destination |
Notes |
|---|---|---|
|
Contacts |
Contacts |
Email is HubSpot's main deduplication key |
|
Accounts |
Companies |
Domain is HubSpot's deduplication key |
|
Deals |
Deals |
Map pipelines and stages first |
|
Tasks |
Tasks |
Keep due date, owner and status |
|
Appointments (meetings) |
Meetings |
Keep start time and attendees |
|
Notes |
Notes |
Associate with the right record |
|
Custom sales activities |
Calls, meetings, notes, or a custom property |
See the activities section |
|
Email conversations |
Email activities |
Check what the export contains |
|
Contact score |
Custom property, for reference |
Scoring logic is rebuilt, not migrated |
|
Workflows and sequences |
Rebuilt in HubSpot |
Logic does not migrate |
Before mapping, confirm the export covers every module you need. If anything is missing from the bulk export, such as files or a specific activity type, plan another route, such as module level exports or the Freshsales API, before the project timeline is fixed.
For the Freshsales contacts to HubSpot step, start with clean data. Merge duplicate contacts in Freshsales before export where you can, and make sure every contact has an email or another unique identifier. Store the Freshsales record ID on every HubSpot record in a unique-value property. It is the key that links deals, activities and associations later, and it lets you reimport failed rows without duplicates.
Users come before records. Every Freshsales user who owns contacts, deals or activities should exist as a HubSpot user before import, so ownership is assigned correctly. For users who have left, decide whether their records go to a manager, a shared placeholder user or the territory's new owner. Write the rule down, because it affects every owner based report after go-live.
Deals are where reps feel the migration most, so map them carefully. Freshsales supports multiple deal pipelines, with limits by plan that its documentation lists as 1 on Growth, 10 on Pro and 25 on Enterprise. Each pipeline has its own stages, starting with New, Won and Lost, and each stage can carry a probability.
HubSpot deal pipelines work in a similar way. Each pipeline has stages, each stage has a win probability, and HubSpot calculates a weighted amount from the deal amount and its probability. HubSpot's pipeline limits also vary by subscription, so confirm your plan allows the number of pipelines you need.
Work through the Freshsales deals migration in this order:
|
Freshsales deal field |
HubSpot deal property |
Notes |
|---|---|---|
|
Deal name |
Deal name |
Required |
|
Deal value |
Amount |
Check currency |
|
Pipeline and stage |
Pipeline and deal stage |
Map by meaning |
|
Expected close date |
Close date |
Keep original dates on closed deals |
|
Owner |
Deal owner |
User must exist in HubSpot |
|
Probability |
Deal probability (by stage) |
Avoid importing it per deal |
|
Lost reason |
Closed lost reason |
Create options before import |
|
Contacts and account |
Deal associations |
Match on Freshsales IDs |
Two details catch many teams. First, Freshsales notes that individual deal probabilities can be changed by hand. HubSpot notes that importing or editing deal probability stops it from updating automatically when the stage changes, so let HubSpot set probability from the stage unless you need per deal values. Second, HubSpot sets the close date to the current day when a deal moves to a closed stage, so check a sample of imported closed deals to confirm their original close dates survived.
The activity timeline is what reps rely on to remember where a deal stands. Freshsales describes sales activities as a record of meetings and conversations with prospects and their results. It includes default activity types, such as tasks and appointments, and lets admins on Pro plans and above create custom activity types with their own outcomes.
HubSpot's import tool supports activities. HubSpot notes that its multiple object import can create emails, meetings, notes and tasks, and can create and update calls, and that emails, meetings and notes must be associated with an object. That makes the mapping straightforward for default types:
Custom sales activity types need a decision. A Freshsales activity type such as "Demo" or "Site visit" usually maps to a HubSpot meeting or call with a property that records the original type. HubSpot calls and meetings also carry an outcome, which can hold the Freshsales activity outcome.
Keep three things on every imported activity: the original date, the owner who logged it, and its associations. Without the date, the timeline reads in the wrong order. Without the owner, activity reports break. Without associations, the activity is invisible on the record where reps look for it.
Decide how far back to go. Many teams migrate full activity history for open deals and active customers, and a shorter window for closed or inactive records.
Freshsales lead scoring does not migrate as logic. Freshsales describes its contact scoring as AI driven: Freddy calculates scores from historical contact properties, engagement and web and in-app activity, with scores from 0 to 99, and admins can tune the scoring signals. That model lives inside Freshsales, and HubSpot cannot import it.
What you can do is preserve the current values and rebuild the scoring in HubSpot:
Engagement history affects the new score. A fresh HubSpot engagement score only sees activity that happened in HubSpot, or that was imported as activity. Expect scores to settle over the first few weeks as new engagement builds up.
Automation follows the same rule. Freshsales workflows, sequences and assignment rules are logic, not data. List each one, decide whether it is still needed, and rebuild it as a HubSpot workflow, sequence or rotation rule. Turn new workflows on only after the data is imported, so they do not fire on thousands of migrated records at once.
Validation proves that HubSpot matches Freshsales. Base it on counts and comparisons, not on scrolling through records that look fine.
|
Check |
How to run it |
Pass condition |
|---|---|---|
|
Record counts |
Compare Freshsales exports to HubSpot counts per object |
Counts match, minus agreed exclusions |
|
Duplicates |
Search on email, domain and Freshsales IDs |
No unexpected duplicates |
|
Pipeline totals |
Deal count and amount per pipeline and stage |
Matches Freshsales |
|
Closed deals |
Closed won amount by month |
Matches by month |
|
Associations |
Sample deals for contacts and company |
All links present |
|
Activities |
Count tasks, meetings, calls and notes per owner |
Counts match |
|
Timeline |
Open sampled deals and compare timelines |
Activities in the right order and record |
|
Scores |
Compare imported score property to Freshsales |
Values match |
Ask a few reps to review their own deals before go-live. They will spot a missing call or a wrong stage faster than any report. Fix the mapping, not the records, then reimport affected rows using the Freshsales ID as the identifier.
Plan the cutover so reps never work in two systems at once. A common pattern is to migrate historical data first while the team keeps selling in Freshsales, then pick a cutover day, freeze Freshsales, run a final delta migration of records changed since the first run, and switch email and calendar connections to HubSpot. Keep Freshsales read-only for a few weeks so anyone can check a record if something looks wrong, then retire it.
A successful Freshsales move rests on a handful of decisions: which pipelines and stages to keep, how stage probabilities carry over, how default and custom sales activities appear in HubSpot, and how lead scoring and automation are rebuilt rather than copied. Import companies and contacts first, keep the Freshsales ID on every record, and validate pipeline totals and timelines with the reps who own them.
Start with a test import of a few hundred records across every pipeline and activity type, and fix the mapping before the full run. For broader help, from data model to go-live, OneMetric's HubSpot CRM migration services support each step.