Skip to main content

Tejas Mondeeri

·10 min read

The Complete Guide to Migrating from Intercom to Freshdesk

Intercom to Freshdesk migration made simple. Learn how to move contacts, companies, conversations, tickets, help center content, and workflows.

ClonePartner Intercom to Freshdesk migration

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.

email

email

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.

Further reading: