The Complete Guide to Migrating from Freshdesk to Tidio
Planning a Freshdesk to Tidio migration? This guide explains data mapping, ticket history, custom fields, API limits, and common pitfalls.
Planning a migration?
Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.
Schedule a free call- 1,500+ migrations completed
- Zero downtime guaranteed
- Transparent, fixed pricing
- Project success responsibility
- Post-migration support included
Migrating your customer service infrastructure from Freshdesk to Tidio requires careful planning. This guide covers the technical strategy for moving your core support assets, what transfers cleanly, what doesn't, and what you'll lose permanently.
Should You Migrate from Freshdesk to Tidio?
Before committing to a migration, confirm that Tidio covers the capabilities your team actually uses. The two platforms are architected differently: Freshdesk is a full-featured helpdesk with SLA management, CSAT surveys, community forums, and time tracking built in. Tidio is a live chat and ticketing platform oriented toward real-time customer engagement with lighter helpdesk functionality.
| Capability | Freshdesk | Tidio |
|---|---|---|
| Ticket management | ✓ Full | ✓ Basic |
| Live chat | ✓ Via Freshchat add-on | ✓ Native |
| Knowledge base | ✓ Full (Categories/Folders/Articles) | ✓ Basic |
| SLA policies | ✓ Full, with history | ✓ Configurable, no history migration |
| CSAT surveys | ✓ Built-in | ✗ Not supported |
| Time tracking | ✓ Per-ticket | ✗ Not supported |
| Community forums | ✓ Discussions | ✗ Not supported |
| Automation/Scenarios | ✓ Full rule engine | ✓ Basic scenarios |
| Custom fields (contacts) | ✓ Flexible types | ✓ Limited to text, email, number, phone, URL |
| Custom fields (tickets) | ✓ Flexible types | ✗ No direct equivalent — manual only |
| Reporting/Analytics | ✓ Historical + live | ✗ Historical data not migratable |
| API operator creation | ✓ Full | ✗ Read-only — manual setup required |
If your team depends on CSAT data, time entries, SLA compliance history, or community discussions, those are permanently lost in a migration to Tidio. If your primary use case is live chat with lightweight ticketing, Tidio fits. If you need a full helpdesk with audit trails, consider whether Tidio is the right destination before investing in migration.
Define Your Migration Scope
The success of your migration relies on understanding which data assets can be moved via API and which must be rebuilt manually.
Data Migrated Via API
The core transactional data can be programmatically migrated using Tidio's API:
- Contacts (Users): Customer records from Freshdesk can be bulk-created in Tidio.
- Tickets: The main support cases and issues recorded in Freshdesk.
- Conversations/Replies: The message history, replies, and notes associated with each ticket.
- Contact Custom Fields (Data): While the field structure itself is manual, the data stored in these fields can be populated via an API workaround (see Step 2 below).
Manual Configuration
Objects relating to internal organization, configuration, knowledge management, or performance metrics cannot be migrated via the Tidio API and must be manually rebuilt:
- Agents/Operators and Groups/Departments: Must be reestablished manually within Tidio's operator and department settings.
- Companies: Client organization structures in Freshdesk must be recreated manually in Tidio — no direct API migration route exists.
- Custom Fields (Schema & Data for Tickets): The structure and definition of custom fields related to tickets must be set up manually in Tidio prior to importing ticket data.
- Canned Responses: Predefined reply templates need manual creation.
- Solutions/Knowledge Base: The entire structure of Categories, Folders, and Articles must be recreated manually.
- Other Ancillary Objects: Roles, SLA Policies, Business Hours, Surveys, Discussions, and Time Entries require manual configuration.
What You Permanently Lose
Some Freshdesk data has no equivalent in Tidio and cannot be migrated at all:
- Time Entries: Agent time tracking data per ticket is not supported in Tidio.
- Surveys (CSAT): Customer satisfaction survey responses and scores are not transferable.
- Discussions: Community forum threads do not have a Tidio equivalent.
- SLA History: Historical SLA breach/compliance records are lost — only future SLA rules can be configured.
- Reporting/Analytics Data: Freshdesk's historical reporting metrics do not carry over.
If any of these are subject to compliance or audit requirements, export and archive them from Freshdesk before decommissioning.
Object Mapping Reference
| Freshdesk Object | Tidio Equivalent | Migration Method | Notes |
|---|---|---|---|
| Contact | Contact (Visitor) | API (bulk create) | Identified by email, name, or phone |
| Contact Custom Field (schema) | Custom Property | Manual | Must create before data import |
| Contact Custom Field (data) | Custom Property (value) | API (bulk update) | Requires schema to exist first |
| Ticket | Ticket | API (create) | Must reference Tidio Contact ID |
| Ticket Reply / Note | Ticket Message | API (add message) | Reconstructed per-ticket, chronologically |
| Agent | Operator | Manual | API is read-only for operators |
| Group | Department | Manual | API is read-only for departments |
| Company | — | Manual | No direct equivalent; recreate manually |
| Custom Field (Ticket) | — | Manual | Schema and data both manual |
| Canned Response | — | Manual | No API migration path |
| Knowledge Base (Category/Folder/Article) | Knowledge Base | Manual | Full manual rebuild required |
| SLA Policy | SLA Policy | Manual | Historical compliance data lost |
| Business Hours | Business Hours | Manual | — |
| Time Entry | — | Not migratable | Archive from Freshdesk |
| Survey (CSAT) | — | Not migratable | Archive from Freshdesk |
| Discussion | — | Not migratable | Archive from Freshdesk |
Archiving Strategy
For data that holds purely historical value and is not critical for day-to-day operations in Tidio — older closed tickets, Time Entries, Surveys, Discussions, or complex Custom Objects — generate a secure export from Freshdesk for archival purposes. This keeps your new Tidio instance clean while preserving compliance history.
Prepare Tidio for Data Import
Before transferring any transactional data, Tidio's framework must mirror your Freshdesk environment. This phase involves setting up foundational dependencies manually.
- Define Staff and Structure: Manually create your Operators (Tidio's term for agents) and set up the relevant Departments (Tidio's term for groups/teams). The Tidio API only supports retrieving lists of existing operators and departments — creation must be done in the Tidio administration panel.
- Replicate Custom Data Structures: Examine the custom fields defined on Freshdesk Contacts. Manually replicate these as custom properties in Tidio. These properties have predefined types: text, email, number, phone, or URL.
- Map Ticket Statuses and Priorities: Freshdesk and Tidio use different internal representations for status and priority values. Map these before import to prevent miscategorization.
Custom Field Type Mismatch Handling
Freshdesk supports custom field types — including dropdown, checkbox, date, and multi-select — that have no direct equivalent in Tidio's five supported types (text, email, number, phone, URL). This mismatch is where migrations break silently.
| Freshdesk Field Type | Tidio Support | Recommended Handling |
|---|---|---|
| Text (single line) | ✓ text | Direct map |
| Text (multi-line) | ✓ text | Direct map (formatting lost) |
| Direct map | ||
| Number | ✓ number | Direct map |
| Phone | ✓ phone | Direct map |
| URL | ✓ URL | Direct map |
| Dropdown (single select) | ✗ | Serialize selected value as text |
| Checkbox (boolean) | ✗ | Serialize as "true" / "false" text |
| Date | ✗ | Serialize as ISO 8601 string in a text field |
| Multi-select | ✗ | Serialize as comma-separated string in a text field |
For unsupported types, the recommended approach is to serialize the value into a Tidio text field before import. This preserves the data but loses type enforcement — a dropdown that was validated to a fixed list in Freshdesk becomes a free-text string in Tidio. Document every field that required serialization so your team knows which fields to validate manually post-migration.
Note that this type mismatch applies to contact custom fields only — ticket custom fields have no API migration path in Tidio and must be rebuilt manually regardless.
Status and Priority Mapping
| Freshdesk Status | Numeric Value | Tidio Equivalent |
|---|---|---|
| Open | 2 |
Map to Tidio's open status |
| Pending | 3 |
Map to Tidio's pending status |
| Resolved | 4 |
Map to Tidio's resolved status |
| Closed | 5 |
Map to Tidio's closed status |
| Freshdesk Priority | Numeric Value | Tidio Equivalent |
|---|---|---|
| Low | 1 |
Map to Tidio's low priority |
| Medium | 2 |
Map to Tidio's medium priority |
| High | 3 |
Map to Tidio's high priority |
| Urgent | 4 |
Map to Tidio's urgent priority |
Verify Tidio's internal status and priority representations in their API reference before running the import — Tidio's UI labels and API values may differ.
Migrate Objects
The data transfer relies on moving transactional records in a specific order to satisfy data dependencies. Each step produces an output that the next step requires — skipping or reordering steps breaks relational integrity.
Dependency chain:
- Step 1 output (Tidio Contact ID) → required by Step 3
- Step 2 requires Step 1 to complete (contact records must exist before properties can be populated)
- Step 3 output (Tidio Ticket ID) → required by Step 4
- Step 4 cannot execute without Step 3 output
1. Migrate Contacts
This is the foundational step. Freshdesk Contacts map to Tidio Contacts (visitors identified by email, name, or phone number).
Use Tidio's bulk contact creation endpoint (POST /contacts-batch) to onboard your customer base. Store the returned Tidio Contact IDs — every subsequent step depends on them.
Duplicate handling: Test what happens when you submit a contact with an email that already exists in Tidio. Depending on the API behavior, the request may fail the entire batch, skip the duplicate, or upsert. Validate this before running the full import.
2. Populate Contact Custom Field Data (Workaround)
Immediately after base contact creation, enrich the customer records.
Since you defined the custom properties in Tidio during preparation, retrieve the corresponding custom field data from Freshdesk Contacts and push it to Tidio using the bulk contact update endpoint (PATCH /contacts-batch).
This allows non-standard data fields to travel across platforms. Any Freshdesk field types that don't map directly to Tidio's supported types (dropdown, checkbox, date, multi-select) must be serialized to text before this step — see the field type mismatch table above.
3. Migrate Tickets
With Tidio Contact IDs established, import your core support records.
A Freshdesk Ticket maps to a Tidio Ticket (a record for complex conversations requiring additional interactions). Use the ticket creation endpoint (POST /tickets-as-contact) to create a ticket associated with a Contact.
Map metadata including the original subject, priority, and current status using the numerical value mappings from the preparation phase.
4. Reconstruct Conversation History (Workaround)
The historical correspondence within Freshdesk (Replies and Notes) needs to be associated with the newly created Tidio tickets.
Tidio provides a dedicated endpoint (POST /tickets/{ticketId}/reply) to add a reply message to an existing ticket. Iterate through the chronological conversations for each Freshdesk ticket and add them as messages to the matching Tidio ticket, noting whether the message originated from a customer or an operator.
Preserve original timestamps: Pass the original created_at timestamp from Freshdesk during each creation call. Without this, all records will show the migration date instead of the actual historical date. Freshdesk stores all timestamps in UTC.
Post Migration Configuration
Once the core data is transferred, configure the remaining structural elements to make the helpdesk operational.
- Rebuild Knowledge Assets: Freshdesk Solutions (Categories, Folders, Articles) must be recreated manually in Tidio's knowledge base tools.
- Replicate Business Logic: Scenario Automations, SLA Policies, and Business Hours must be redefined and activated within Tidio. These rules govern ticket prioritization, assignment, and escalation — validate them carefully.
- Finalize Internal Structure: Establish Companies, Canned Responses, Roles, and permissions. Ensure groups adhere to any necessary communication or staffing requirements.
Technical Constraints and Edge Cases
These constraints aren't immediately obvious and will break your migration if ignored:
- Freshdesk API Rate Limits: Freshdesk enforces per-minute rate limits that vary by plan tier. Hitting these limits halts your export. Queue API calls carefully and cache non-volatile data (like agent IDs and group mappings) to reduce unnecessary requests. Check your current plan's limits in the Freshdesk API documentation before designing your export pipeline.
- Tidio API Rate Limits: Tidio enforces rate limits on its API. Check the current limits in their developer documentation before designing your import pipeline. Exceeding them will result in
429 Too Many Requestsresponses. Implement exponential backoff on429— wait for theRetry-Afterheader value (if returned) or use a fixed backoff starting at 1 second, doubling on each retry, before resubmitting the failed batch. - The Contact ID is King: The linking mechanism between tickets and conversations relies on the Tidio Contact ID. Every ticket must be correctly associated with its Tidio Contact ID. If this mapping breaks, you lose relational integrity between contacts and their ticket history.
- Timestamp Handling: Pass the original
created_attimestamp during creation calls to preserve historical context. Freshdesk stores timestamps in UTC. If any Freshdesk records have null or missingcreated_atvalues, decide on a fallback strategy (e.g., useupdated_ator a sentinel date) before running the import. - Status and Priority Mapping: Freshdesk uses numerical values for Status (e.g.,
2for Open,4for Resolved) and Priority (e.g.,1for Low,4for Urgent). Verify Tidio's equivalent values against their current API documentation before running the import. - Volume Considerations: For large Freshdesk instances (tens of thousands of tickets or more), a sequential ticket-by-ticket approach may take hours or days. Consider parallelizing API calls within rate limit bounds, or implementing a job queue to manage throughput.
- Partial Migration Rollback: If the migration fails midway — for example, tickets imported without correct contact associations — you need a rollback plan. To identify partially imported records in Tidio, list tickets with
GET /ticketsand match them against the Freshdesk-to-Tidio ID crosswalk your import wrote. To remove them, issueDELETE /tickets/{ticketId}for each affected record. Run a clean re-run only after all partial records are confirmed deleted. Before starting any import run, record the exact timestamp so you can scope the rollback query precisely.