
This guide walks you through how to migrate from Intercom to Freshdesk step by step, with complete coverage of planning, mapping, moving, and validating your data. You will learn what can be directly imported through the Freshdesk API, what requires transformation, and what needs to be rebuilt inside Freshdesk. Every section includes detailed field mappings, caveats, and practical tactics to ensure a clean, accurate migration.
1. Define your migration scope and prepare your mapping plan
Start by defining the boundaries of your migration. Separate data objects that you can export from Intercom and import into Freshdesk, configuration items that must be recreated manually, and archival-only data that cannot be migrated as structured records.
- Data to migrate:
Conversations (including messages and attachments), contacts, companies, tags, and custom attributes. These represent the transactional and relational data that define your customer interactions. - Configuration to rebuild:
Workflows, assignment rules, SLAs, agent groups, roles, and automations. These are platform-specific and need to be recreated in Freshdesk. - Data to archive:
Intercom events, leads, and in-app engagement metrics. These can be exported to a CSV or stored as a JSON archive for reference, but they do not have 1:1 objects in Freshdesk.
Once you have identified what you are migrating, create a mapping sheet that tracks how each Intercom object maps to its Freshdesk equivalent, along with field names, data types, transformation rules, and validation checks.
2. Prepare Freshdesk for data import
Before you import anything, you must prepare Freshdesk so your imported data has valid relationships. Intercom and Freshdesk share a similar core model: contacts, companies, and conversations, but Freshdesk enforces stricter ID references and schemas.
Set up Freshdesk in this order:
- Create all agents, groups, and roles.
- Define business hours and SLA policies.
- Create ticket fields, contact fields, and company fields matching your Intercom custom attributes.
- Configure mailboxes, signatures, and email templates.
- Install integrations like Jira or Slack if you plan to keep them active.
After this setup, you’ll have a stable environment to receive the migrated records.
3. Migrate objects in a logical sequence
Because Freshdesk tickets reference contacts and companies, and messages reference tickets, the import must follow this order:
Companies → Contacts → Ticket schema → Conversations (tickets)
3.1 Companies
Intercom’s “Companies” object corresponds directly to “Companies” in Freshdesk.
Company mapping
Intercom Company | Freshdesk Company | Notes and caveats |
id | unique_external_id + custom field intercom_company_id | Required to re-run imports safely. |
name | name | Use the same company name. |
domain | domains[] | Enables auto-association for users sharing a domain. |
company_id (custom) | custom_fields{} | Precreate schema for any Intercom custom attributes. |
created_at | read-only custom field original_created_at | Timestamps cannot be backdated; store them for reference. |
After importing, verify that the same company appears once and is automatically linked to relevant contacts via email domain.
3.2 Contacts
Intercom’s “Contacts” (users) map cleanly to Freshdesk “Contacts.” Each contact can belong to one company and have multiple identifiers like emails or phone numbers.
Contact mapping
Intercom Contact | Freshdesk Contact | Notes and caveats |
id | unique_external_id + intercom_contact_id | Keeps imports idempotent. |
name | name | Combine first and last names if separate. |
Required for requesters. | ||
phone | phone | Normalize format to E.164 for consistency. |
companies[] | company_id | Links to imported company. |
custom_attributes{} | custom_fields{} | Create schema before import. |
tags[] | tags[] | One-to-one mapping. |
created_at | original_created_at | Stored as read-only field or note. |
Contacts in Intercom can represent both users and leads. Leads that have never converted into active users can be excluded or imported as inactive contacts tagged as lead.
3.3 Ticket schema
Before creating tickets, align Freshdesk ticket fields with Intercom’s conversation properties. Intercom conversations have flexible attributes like conversation type (chat, email, in-app), open/closed state, and assignment details. Freshdesk requires explicit schema fields for these.
Create the following in Freshdesk:
- Custom field “intercom_conversation_id” to preserve the source ID.
- Custom dropdown for “source_channel” (e.g., chat, messenger, email).
- Custom date field for “first_response_time” if you want to retain metric data from Intercom reports.
3.4 Conversations (Tickets)
Intercom’s “Conversations” are the equivalent of Freshdesk's “Tickets.” Each conversation can contain multiple parts (messages), which you’ll migrate as the ticket’s conversation history.
Conversation mapping
Intercom Conversation | Freshdesk Ticket | Notes and caveats |
id | unique_external_id + custom field intercom_conversation_id | Critical for deduplication and delta sync. |
title or subject | subject | Intercom may not have subjects for messenger threads; derive from first message. |
created_at | stored in original_created_at | Freshdesk does not allow backdating. |
state (open, closed, snoozed) | status | Map to Freshdesk statuses: Open, Pending, Resolved, Closed. |
priority | priority | Intercom doesn’t always expose priority; set default “Medium.” |
assignee.id | responder_id | Recreate agents and map accordingly. |
tags[] | tags[] | Direct import. |
custom_attributes{} | custom_fields{} | Schema must pre-exist. |
source | via.channel | Helps in reporting (e.g., chat, email, in-app). |
Each conversation has multiple “parts,” which map to Freshdesk conversation notes or replies depending on whether they were public or internal.
Message mapping
Intercom Part | Freshdesk Conversation | Notes and caveats |
author | requester or agent on note | Ensure user exists. |
body (HTML) | body_html | Clean inline styles and images. |
attachments[] | uploaded file on note | Re-upload; maintain original filenames. |
created_at | note header or original_created_at field | Freshdesk sets current time on import. |
Run imports in small batches, verify chronological order and attachments, then scale up.
3.5 CSAT (Customer Satisfaction)
Intercom offers post-conversation surveys similar to Freshdesk’s CSAT. You can recreate these ratings in Freshdesk as satisfaction ratings attached to tickets.
CSAT mapping
Intercom Survey | Freshdesk Satisfaction | Notes and caveats |
rating | rating value | Map “positive/neutral/negative” to “good/bad.” |
feedback_text | satisfaction comment | Store as rating comment. |
submitted_at | note text | Include “Original CSAT at [datetime] by [user].” |
If Intercom responses cannot be backdated, include the timestamp in a private note attached to the ticket.
3.6 Help Center
Intercom’s Articles and Collections translate directly to Freshdesk’s Solutions Categories and Folders.
Article mapping
Intercom Article | Freshdesk Solution Article | Notes and caveats |
id | unique_external_id | Use for re-runs. |
title | title | |
body (HTML) | description | Retain formatting; rewrite image URLs after upload. |
author_id | author | Must exist as agent. |
tags[] | labels[] | 1:1 mapping. |
attachments[] | attachments[] | Re-upload files. |
translations[] | translations[] | Add per language. |
After migration, verify category hierarchy and translation completeness.
3.7 Tickets (Intercom Tickets → Freshdesk Tickets)
Intercom now provides a dedicated Tickets API, separate from Conversations. These Tickets are used for structured workflows, often created by bots, forms, or back-office automations. Unlike Conversations, which represent customer-facing threads, Intercom Tickets represent internal tasks or requests that can still link back to Conversations or Contacts.
Ticket mapping
Intercom Ticket | Freshdesk Ticket | Notes and caveats |
id | unique_external_id + custom field intercom_ticket_id | Required to support idempotent imports and delta re-runs. |
title | subject | If missing, derive from category or ticket_type_id. |
description | description_html | Clean HTML before import; replace embedded image URLs. |
category | ticket_type or a custom dropdown field | Freshdesk uses “Ticket Type.” Create custom values if needed. |
ticket_type_id | custom_fields.ticket_type_ref | Optional – store reference for reporting. |
state (open, snoozed, closed) | status | Map to Open, Pending, Resolved, Closed. |
priority | priority | Direct mapping. Default “Medium” if null. |
contact_ids[] | requester_id | Ensure contact exists; create if missing. |
teammate_ids[] | responder_id or group association | Re-map agent IDs to existing Freshdesk agents. |
tags[] | tags[] | One-to-one tag import. |
created_at | original_created_at (custom field) | Store original timestamp since Freshdesk cannot backdate. |
updated_at | updated_at | Use for sync and delta comparison. |
custom_attributes{} | custom_fields{} | Pre-create schema for all Intercom ticket attributes. |
3.8 Ticket Replies and Notes
Each Intercom Ticket can include admin replies, contact replies, and internal notes. These are retrieved through the /tickets/{id}/reply and related endpoints and map to Freshdesk ticket conversations.
Intercom Reply / Note | Freshdesk Conversation | Notes and caveats |
Admin reply | Public reply by agent | Author → agent. |
Contact reply | Public reply by requester | Author → contact. |
Internal note | Private note | Create note type conversation. |
Attachments | Attached files on note or reply | Upload separately using multipart API; maintain filenames. |
Created time | Not backdatable in Freshdesk | Add as text note header: “Original created at [datetime]”. |
3.9 Linking Tickets and Conversations
Intercom allows linking Tickets to Conversations (via /conversations/{id}/convert or /tickets/{ticket_id}/conversation_id).
You can preserve these relationships in Freshdesk using one of these approaches:
Relationship Type | Freshdesk Workaround |
Conversation → Ticket link | Add a private note on the ticket: “Linked Conversation ID: xxx”. |
Multiple tickets from one conversation | Maintain a custom field linked_conversation_ids[] as comma-separated IDs. |
Backlink from conversation to ticket | Add a private note in the corresponding ticket with the Freshdesk Ticket URL. |
4) Rebuild automations, SLAs, and workflows
Once your data is in Freshdesk, the goal is to recreate your operational logic.
- Convert Intercom’s Inbox rules into Freshdesk Automations.
- Recreate assignment logic for teams and agents.
- Define Views based on status, tags, or priorities.
- Configure SLAs using business hours you recreated earlier.
- Convert Saved Replies in Intercom into Canned Responses in Freshdesk.
For integrations, replicate them using Freshdesk’s apps marketplace.
5. Manage gaps and historical data
Intercom stores large amounts of context data (events, lead scoring, product tours) that don’t map into Freshdesk. Export these as CSVs or JSON and store them externally. Add a Legacy Reference custom field in Freshdesk tickets linking to the archive location.
Other known limitations and workarounds:
Missing feature | Workaround |
Lead data | Store as tagged inactive contacts. |
Event data | Archive as JSON for analytics. |
Backdated timestamps | Record original date in note or field. |
Bot conversations | Export transcripts and attach to tickets as files. |
6. Insider Secrets
1. Use unique_external_id everywhere
Always set this field when importing to ensure idempotency. It lets you safely rerun partial batches or deltas without duplicates.
2. HTML cleanup is not optional
Intercom’s message body often contains embedded inline styles and base64 images. Clean them before import or you’ll end up with broken formatting and bloat.
Use a sanitizer that converts base64 to file uploads and rewrites image URLs.
3. Preserve chronology
Freshdesk doesn’t allow backdated timestamps.
Add an original_created_at field or prepend timestamps in note headers for historical accuracy.
4. Run a sample migration first
Select ~100 representative tickets covering different edge cases: multi-company contacts, multilingual articles, tagged threads, long message chains, and CSAT data.
Validate everything here before scaling up. This sample becomes your migration baseline.
5. Delta sync
Before the final cutover freeze, new ticket creation in Intercom and run a delta migration of new/updated records.
Quick Recap
Prepare Freshdesk first, ensuring your agents, groups, and fields are in place. Migrate companies, contacts, ticket schema, tickets with full history and attachments, CSAT ratings, and knowledge base content. Rebuild automations and SLAs. Archive Intercom-specific metrics externally. Test on a golden batch, perform a delta, and then cut over confidently.
At ClonePartner, we’ve completed numerous Intercom to Freshdesk migrations. Each project is handled by a dedicated engineer who customizes the data mapping to match your setup. If you want to avoid the technical complexity, ClonePartner can manage the entire migration for you, from planning and field mapping to validation and go-live.