---
title: The Complete Guide to Migrating from Freshdesk to Zendesk
slug: freshdesk-to-zendesk-migration-guide
date: 2025-12-18
author: Tejas Mondeeri
categories: [Migration Guide, Zendesk]
excerpt: "This guide walks you through everything you need to plan, map, move, and verify a Freshdesk-to-Zendesk migration with precision and structure."
canonical: https://clonepartner.com/blog/freshdesk-to-zendesk-migration-guide/
---

# The Complete Guide to Migrating from Freshdesk to Zendesk


This guide walks you through everything you need to plan, map, move, and verify a [Freshdesk to Zendesk](https://clonepartner.com/migrate/freshdesk-to-zendesk) migration with precision and structure. The goal is to help you replicate your [Freshdesk](https://clonepartner.com/help-desk-migration/freshdesk) environment inside [Zendesk](https://clonepartner.com/help-desk-migration/zendesk) with minimal data loss, consistent relationships, and working automations. You will see which configurations need rebuilding, which data can be imported directly, and how to handle nuances like timestamps, satisfaction ratings, and attachments.

## 1. Define the scope and build your mapping plan

Before touching any APIs or exports, start by defining your scope. Separate what will move as **data** and what must be **rebuilt** as configuration.

- **Data to migrate:** Tickets with all conversation history and attachments, contacts, companies, tags, custom fields, and knowledge base content.
- **Configuration to rebuild:** Automations, triggers, SLAs, business hours, agent roles, and integrations.
- **Items to archive:** Ticket audit trails, time logs, and analytics reports. Zendesk will not import those directly.

Once you have this list, create a **mapping sheet**. Each Freshdesk object should point to its equivalent Zendesk object. Include transformations, validation rules, and a crosswalk for IDs and statuses. Keep it open while you plan.

## 2. Prepare Zendesk before you start importing

Zendesk must be configured before you import anything. The system expects valid IDs for users, groups, fields, and forms referenced in tickets.

Create your **Zendesk scaffolding** in this order:

- Set up **agents**, **groups**, and **roles**.
- Configure **business hours**, **holidays**, and **SLA policies**.
- Recreate **ticket fields** and **ticket forms**.
- Add **custom statuses** if your Freshdesk account uses more granular ones.
- Set up **email channels**, signatures, and templates.
- Install required apps such as **Jira**, **Slack**, or **Knowledge Capture**.

Once this is done, your importer will be able to create tickets and link them correctly without orphaned references.

## 3. Migration flow: follow a sequence that preserves relationships

Tickets depend on contacts and companies, and conversations depend on tickets. To keep everything consistent, you must migrate objects in this order:
 **Companies → Contacts → Ticket schema → Tickets and conversations → CSAT → Knowledge base**.

Each section below explains how to map the objects and handle the edge cases.

### 3.1 Companies

Start with companies. Zendesk calls them **Organizations**. They help group users and tickets.

**Company → Organization mapping**

| **Freshdesk Company** | **Zendesk Organization** | **Notes and caveats** |
| --- | --- | --- |
| id | external_id and custom field fd_company_id | Keep the Freshdesk ID for reference and deduplication. |
| name | name | Use consistent naming for search and automation rules. |
| domains[] | domain_names[] | Ensures auto-assignment of tickets to organizations. |
| custom_fields{} | custom fields | Create schema in advance with the same value types. |
| tags[] | tags | Tags import directly as strings. |

After import, verify that domain associations work automatically when you create a test ticket for a user under that organization.

### 3.2 Contacts

Once organizations exist, migrate your users. Freshdesk contacts map directly to Zendesk **Users**.

**Contact → User mapping**

| **Freshdesk Contact** | **Zendesk User** | **Notes and caveats** |
| --- | --- | --- |
| id | external_id and custom field fd_contact_id | Keeps imports idempotent. |
| name | name |  |
| email | email | Required for requesters. |
| phone, mobile | phone | Combine both numbers if needed. |
| company_id | organization_id | Must reference an existing organization. |
| custom_fields{} | user_fields{} | Schema must exist first. |
| tags[] | tags[] | One-to-one mapping. |

Agents should be created manually in Zendesk’s admin panel. If you want to preserve agent authorship in notes or comments but won’t provision them, prefix each comment with their name and email.

### 3.3 Ticket schema

Zendesk’s ticket structure is similar to Freshdesk’s, but the terminology changes slightly.

- Ticket **Forms** in Zendesk replace **Ticket Types** in Freshdesk.
- Custom **Fields** must be pre-created and have matching keys and value sets.
- **Status** and **Priority** values must be mapped manually.

Build a crosswalk between Freshdesk’s statuses (Open, Pending, Resolved, Closed, and any custom ones) and Zendesk’s (New, Open, Pending, On-hold, Solved, Closed). Test it with sample tickets before full migration.

### 3.4 Tickets and their entire conversation history

This is the most detailed part of the migration.
 You must create the ticket, attach custom fields, and then import each conversation in chronological order.

**Ticket mapping**

| **Freshdesk Ticket** | **Zendesk Ticket** | **Notes and caveats** |
| --- | --- | --- |
| id | external_id and custom field fd_ticket_id | Required to rerun safely and update existing tickets. |
| subject | subject | Keep it short; Zendesk truncates at 255 chars. |
| description (HTML) | initial comment | Preserve formatting; clean up HTML tags before import. |
| requester_id | requester_id | User must already exist. |
| responder_id | assignee_id | If missing, assign to a default group and update later. |
| group_id | group_id | Recreate groups first. |
| status | status | Use crosswalk table. |
| priority | priority | Direct map (Low, Normal, High, Urgent). |
| source (email/chat/api) | via.channel | Used in Zendesk analytics. |
| tags[] | tags[] | Direct map. |
| custom_fields{} | custom_fields{} | Schema must match. |
| created_at, updated_at | stored in custom fields original_created_at, original_updated_at | Zendesk does not allow backdating. |
| due_by | due_at | Recreate SLA-based due times if required. |

**Conversation mapping**

| **Freshdesk Conversation** | **Zendesk Comment** | **Notes and caveats** |
| --- | --- | --- |
| body | body_html | Keep HTML safe and properly escaped. |
| incoming true | public true | Marks customer reply. |
| private true | public false | Internal note. |
| attachments[] | attachments[] | Re-upload files; store URLs temporarily if you hit limits. |

Run the import in batches and test after each load. Verify comment order, author, and file integrity on a random ticket sample before scaling up.

### 3.5 Ticket CSAT

Zendesk supports per-ticket satisfaction ratings, similar to Freshdesk’s survey results.
 If you want to preserve historical scores:

- Create the rating via Zendesk’s[ CSAT API](https://developer.zendesk.com/api-reference/ticketing/ticket-management/csat_survey_responses/?utm_source=chatgpt.com).
- Store the original timestamp and rater inside a private note if you cannot backdate it.

**CSAT mapping**

| **Freshdesk CSAT** | **Zendesk CSAT** | **Notes and caveats** |
| --- | --- | --- |
| Rating value | score (good or bad) | Map numerical or emoji ratings into “good” or “bad”. |
| Feedback comment | comment | Attach text feedback. |
| Timestamp | note text or custom field | Include “Original CSAT at [datetime] by [user]”. |

### 3.6 Knowledge base

Zendesk’s Help Center structure matches Freshdesk’s Solutions fairly well.
 Import in hierarchy: **Categories → Sections → Articles → Translations → Attachments**.

**Solutions → Help Center mapping**

| **Freshdesk Solutions** | **Zendesk Help Center** | **Notes and caveats** |
| --- | --- | --- |
| Category | Category | Create first. |
| Folder | Section | Map parent-child properly. |
| Article | Article | Keep HTML, rewrite asset URLs to match new host. |
| Attachments | Article attachments | Upload and relink inside HTML. |
| Tags | Labels | 1:1 mapping. |
| Translations | Translations | Match locale codes (en-US, fr-FR, etc.). |
| Redirects | Redirect rules | Recreate via API if you had SEO redirects. |

After import, check article counts per category and language. Broken inline links and missing attachments are the two most common errors; fix those before cutover.

## 4. Rebuild workflows and automations

Once the data exists in Zendesk, the next task is to make it behave like Freshdesk.

- Recreate **Automations** as Zendesk **Triggers** (event-based) and **Automations** (time-based).
- Rebuild **Views** using filters for group, status, and tags to replicate agent queues.
- Define **SLA policies** and apply your existing business hours.
- Convert **Scenarios** from Freshdesk into **Macros** in Zendesk.
- Reinstall integrations such as **Jira** and **Slack**, and reconfigure their credentials.

To reconnect Jira tickets, store the original key (e.g., JIRA-1234) as a custom field in each ticket and use Zendesk’s Jira integration to relink after migration.

## 5. Handle the gaps with clear documentation

A few data types from Freshdesk cannot be recreated exactly in Zendesk.

| **Gap** | **Workaround** |
| --- | --- |
| Ticket audit logs | Export as JSON or CSV and store in external storage (S3, Drive). Add a “Legacy Audit Reference” field in Zendesk with a link. |
| Agent activity reports | Archive separately; Zendesk Explore will generate new reports moving forward. |
| Ticket backdating | Store original_created_at and original_updated_at in fields or notes. |
| Freshchat / Freshcaller logs | Include as attachments or text files on the linked ticket. |
| Portal themes | Rebuild manually in the Zendesk Help Center editor. |

This approach keeps the new instance clean while preserving historical reference material.

## 6. Test thoroughly, run a delta import, then cut over

Select a **golden batch** of tickets that represent different combinations: long threads, multiple attachments, translated articles, and CSAT ratings. Import that first, compare side by side, and confirm data integrity.

When ready for go-live:

- Freeze Freshdesk or mark it read-only.
- Run a delta export for new or updated tickets using Freshdesk’s incremental export APIs.
- Apply updates in Zendesk using the same external_id logic so no records duplicate.
- Switch your mail channels and chat integrations to Zendesk.
- Keep Freshdesk accessible in read-only mode for at least two weeks as a fallback.

After cutover, validate total counts for tickets, users, organizations, and articles. Run SLA timers on new tickets to confirm expected behavior.

## 7. Proven habits that keep migrations reliable

- Use **idempotent imports** by setting external_id on every record.
- Always respect rate limits and queue requests with exponential backoff.
- Normalize HTML and fix image URLs immediately after upload.
- Keep timestamps in UTC for consistency across systems.
- Maintain a per-record import log with status, object type, and reason for failure.

Those five habits will save you hours of debugging later.

## Quick Recap

Set up Zendesk’s foundation first. Import organizations, then users, then ticket schema, then tickets and comments with attachments, then CSAT, then Help Center content. Recreate automations, SLAs, and macros. Archive audits and reports externally. Test with a golden batch, run a delta, cut over, and verify everything.

*At ClonePartner, we’ve done this numerous times. Each project has a dedicated engineer who tailors the mapping to fit your unique data structure. If you’d prefer to skip the technical complexity, ClonePartner can take care of everything for you, from planning and field mapping to final validation and go-live.*

> Book a consultation to understand how ClonePartner can help you migrate to Zendesk
>
> [Talk to us](https://cal.com/clonepartner/meet?utm_source=blog&utm_medium=button&utm_campaign=demo_bookings&utm_content=cta_click&utm_term=demo_button_click)

## Further reading:

- [Freshdesk](https://developers.freshdesk.com/api)
- [Zendesk](https://developer.zendesk.com/api-reference/ticketing/introduction/)
