A help desk is only as useful as its history. When an agent opens a ticket, they need to see what the customer asked last month, what was promised and who handled it. That is why a Freshdesk to HubSpot migration is harder than it looks. Moving the ticket list is easy. Moving the conversations behind each ticket, with the right customer, status and dates, takes a plan.
This guide covers why support teams move from Freshdesk to HubSpot, what Freshdesk data can be migrated, how to map tickets and contacts, how to keep ticket statuses and priorities consistent, how to migrate conversations and historical support data, and how to test the migrated records before agents rely on them.
Most teams do not leave Freshdesk because it fails as a ticketing tool. They leave because support data sits in a separate system from sales and marketing. An agent in Freshdesk cannot easily see the customer's open deal, renewal date or recent marketing activity. A sales rep in the CRM cannot see that the account has three urgent tickets open.
HubSpot puts tickets on the same CRM as contacts, companies and deals. A ticket is associated with the customer record, so anyone with access sees the full relationship in one place. For many teams, that alone justifies the move.
Common reasons for a Freshdesk HubSpot migration include:
Plan the channels as well as the data. Customers reach Freshdesk through support email addresses, portal forms, chat and sometimes phone. Each of those channels has to be connected to HubSpot's help desk before cutover, so new requests arrive in the right place on day one. The data migration and the channel switch should be scheduled together, otherwise tickets land in both systems during the overlap.
The move is also a chance to clean up. Old ticket types, unused custom fields and groups that no longer exist do not need to come across.
Freshdesk offers more than one way to get data out, and each covers different things. Choosing the right one is the first decision in a Freshdesk ticket migration.
|
Freshdesk data |
HubSpot destination |
Notes |
|---|---|---|
|
Contacts |
Contacts |
Email is HubSpot's main deduplication key |
|
Companies |
Companies |
Domain is HubSpot's deduplication key |
|
Tickets |
Tickets |
Map statuses to a ticket pipeline first |
|
Ticket fields (type, source, product) |
Ticket properties |
Create dropdown options before import |
|
Replies and notes |
Emails or notes on the ticket |
Needs the account export or API |
|
Agents |
HubSpot users |
Create users before importing owners |
|
Groups |
Teams, or a ticket property |
Decide how routing will work |
|
Solutions articles |
Knowledge base articles |
Usually a separate content move |
|
Attachments |
Files on the record or ticket |
Check size limits |
Contacts and companies come first, because every ticket needs a customer to attach to. For the Freshdesk contacts migration, map each contact field to a HubSpot contact property and confirm that every contact has a unique email where possible. HubSpot uses email to deduplicate contacts, so contacts without one need another unique identifier, such as the Freshdesk contact ID stored in a unique-value property.
Companies follow the same pattern. Freshdesk maps requesters to a company, and HubSpot uses the company domain to deduplicate. Import companies, then contacts with their company association, so each customer lands on the right account.
Tickets come next. Freshdesk's default ticket fields include subject, type, source, status, priority, group, agent, product, description and company. Map them as follows:
|
Freshdesk field |
HubSpot ticket property |
Notes |
|---|---|---|
|
Subject |
Ticket name |
Required to create the ticket |
|
Description |
Ticket description |
Plain text or HTML, check formatting |
|
Status |
Ticket status (pipeline stage) |
See the next section |
|
Priority |
Priority |
Check that every Freshdesk value has an option |
|
Type |
Category or a custom dropdown |
Create options before import |
|
Source |
Source, or a custom property |
Keep the original channel for reporting |
|
Agent |
Ticket owner |
Agent must exist as a HubSpot user |
|
Group |
Team or a custom property |
Supports routing and reporting |
|
Requester |
Contact association |
Match on email or Freshdesk ID |
|
Company |
Company association |
Match on domain or Freshdesk ID |
|
Created and resolved dates |
Create date and custom date properties |
Keep the original timeline |
Store the Freshdesk ticket ID on every HubSpot ticket in a unique-value property. It is the key that links conversations to tickets later, and it lets you reimport failed rows without creating duplicates.
Agents and groups need a decision before any ticket is imported. Every Freshdesk agent who owns tickets should exist as a HubSpot user, or their tickets will import without an owner. Agents who have left the company can be mapped to a placeholder user or to their team lead, so historical tickets still have an owner for reporting. Freshdesk groups usually become HubSpot teams, which keeps routing and team reports working.
Custom fields need the same care. Freshdesk supports custom single-line text, multi-line text, checkbox, dropdown, dependent, date, number and decimal fields. Most map directly to HubSpot property types. Dependent fields, which nest up to three levels in Freshdesk, usually become separate dropdown properties in HubSpot, with conditional options if you want to keep the dependency.
Statuses drive queues, SLAs and reports, so they must be mapped deliberately. Freshdesk's default statuses are Open, Pending, Resolved and Closed, and Freshdesk notes that these four cannot be deleted, though teams on higher plans often add custom statuses. HubSpot's default support pipeline has four statuses: New, Waiting on contact, Waiting on us and Closed.
The names do not line up, so map by meaning, not by label:
|
Freshdesk status |
Suggested HubSpot status |
Reasoning |
|---|---|---|
|
Open |
New or Waiting on us |
The team owes the next action |
|
Pending |
Waiting on contact |
The customer owes the next action |
|
Resolved |
Closed, or a custom Resolved status |
Decide if resolved tickets can reopen |
|
Closed |
Closed |
Final state |
|
Custom statuses |
Custom pipeline statuses |
Recreate only those still in use |
If the team relies on the difference between Resolved and Closed, add a Resolved status to the HubSpot pipeline. HubSpot lets you mark each ticket status as open or closed when you set up a pipeline, and its close date is set automatically when a ticket moves from an open status to a closed one. Import historical close dates into a custom property as well, so reports on resolution time reflect the original dates rather than the import date.
Priorities are simpler. Freshdesk's priority field has four values: Low, Medium, High and Urgent. Check the options on HubSpot's priority property before import and add any value that is missing, so no ticket lands blank.
Groups and SLA policies need a decision too. HubSpot offers SLAs in its help desk on Service Hub Professional and Enterprise, with goals for time to first reply, time to next reply and time to close. SLA timers do not carry over from Freshdesk, so set them up for new tickets and treat historical SLA results as report data.
Conversations are the part of the support history that agents value most and the part that takes the most work. As covered above, Freshdesk's ticket export does not include them. You need the account export or the API to extract each ticket's replies and notes.
Once extracted, decide how they will appear in HubSpot. HubSpot's import tool can create emails and notes as activities, and HubSpot notes that emails, meetings and notes must be associated with an object. That gives three common patterns:
Many teams combine these: full detail for tickets from the last year or two, and a single combined note for older ones. Agree on the cut-off with the support lead before extraction starts.
To migrate support history accurately, keep three things on every activity:
Formatting needs a check too. Freshdesk replies often contain HTML, inline images, signatures and quoted text from earlier messages. Decide whether to keep the HTML or convert it to plain text, and test a handful of long threads so the result is readable in HubSpot. Quoted history in every reply can make threads several times longer than they need to be, so stripping it is often worth the effort.
Attachments add volume. Decide which attachments matter, such as contracts or screenshots on recent tickets, and check HubSpot's file limits before planning a bulk upload.
Test on a sample before the full move, then test again after it. Choose a sample that stresses the mapping: tickets in every status and priority, tickets with long conversations and attachments, contacts without email and companies with many contacts.
|
Check |
How to run it |
Pass condition |
|---|---|---|
|
Record counts |
Compare Freshdesk exports to HubSpot counts for contacts, companies and tickets |
Counts match, minus agreed exclusions |
|
Duplicates |
Search on email, domain and Freshdesk IDs |
No unexpected duplicates |
|
Ticket associations |
Sample tickets for contact and company links |
Every ticket is on the right customer |
|
Statuses and priorities |
Count tickets per status and priority in both systems |
Distributions match the mapping |
|
Conversations |
Open sampled tickets and compare threads |
All replies and notes present, in order |
|
Dates |
Compare created and resolved dates |
Original dates preserved |
|
Owners and teams |
Count tickets per agent and group |
Counts match |
|
Help desk behavior |
Create test tickets and reply from HubSpot |
Routing and SLAs work for new tickets |
Ask two or three agents to review tickets they handled themselves. They will notice a missing reply or a wrong customer faster than any count. Fix problems in the mapping, not on individual records, then rerun the import for affected rows using the Freshdesk ID as the identifier.
Plan the cutover with open tickets in mind. A common approach is to migrate closed tickets first, while the team keeps working in Freshdesk. Then, on cutover day, switch the support channels to HubSpot, run a final delta migration of tickets that were open or updated since the first run, and freeze Freshdesk as read-only. Agents pick up the open tickets in HubSpot with their full history, and customers see no gap in service.
If you would rather hand this work to a team that has done it before, our Freshdesk to HubSpot migration services cover extraction, mapping, conversation import and testing.
A clean Freshdesk move depends on a few decisions: which export method gives you the conversations you need, how Freshdesk statuses and priorities map to a HubSpot ticket pipeline, how replies and notes will appear on HubSpot tickets, and how far back full history should go. Get contacts and companies right first, keep the Freshdesk ID on every record, and test with the agents who know the tickets best.
Start with a sample of your busiest tickets and prove the mapping before the full import. If you are planning a wider HubSpot Service Hub migration, OneMetric can help you plan the help desk setup alongside the data move. To talk through your own Freshdesk data, get in touch with OneMetric.