
This guide walks you through everything you need to plan, map, move, and verify a Freshdesk-to-Zendesk migration with precision and structure. The goal is to help you replicate your Freshdesk environment inside 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 | |
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.
- 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.