Helpdesk migration
Field-level mapping, validation, and rollback between Chatwoot and Freshdesk. We move data and schema; workflows are rebuilt natively in Freshdesk.
Chatwoot
Source
Freshdesk
Destination
Compatibility
6 of 10
objects map 1:1 between Chatwoot and Freshdesk.
Complexity
BStandard
Timeline
2-3 weeks
Overview
Moving from Chatwoot to Freshdesk is a structural translation from Chatwoot's conversation-centric model to Freshdesk's ticket-centric model. Chatwoot organizes support around Inboxes and Conversations with a single message thread; Freshdesk organizes around Tickets with a structured conversation log that separates public replies from internal notes. We preserve message order using created_at timestamps, split Chatwoot's assignee and team model into Freshdesk's agent and group structure, and map Chatwoot Labels to Freshdesk Tags at the ticket level. We flag that Automation Rules, SLA Policies, Help Center Articles, and Teams require Business or Enterprise tier on the source and may not exist in the export; we document their existence and deliver a written reconstruction guide for each. Freshdesk's API access requires Blossom tier or higher, and rate limits cap at 3,000 calls per hour on Blossom, requiring batch chunking during migration. Workflows, canned responses logic, and reporting dashboards do not migrate; we deliver a written inventory for the customer's admin to rebuild in Freshdesk's automation builder.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Chatwoot object lands in Freshdesk, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Chatwoot
Conversation
Freshdesk
Ticket
1:1Chatwoot Conversations map to Freshdesk Tickets. We preserve conversation status (open, resolved, pending) as Freshdesk Ticket status values, priority mapping from Chatwoot priority to Freshdesk priority (urgent, high, medium, low), assignee mapping from Chatwoot assignee_id to Freshdesk responder_id, and team-to-group resolution where Chatwoot Teams exist on Business+ source plans. Label taxonomy migrates to Freshdesk Tags on the ticket record. The conversation created_at timestamp becomes Ticket created_at; last_message_at becomes Ticket updated_at. Private notes from Chatwoot map to Freshdesk's internal notes using message_type = 'note' on the conversation_message.
Chatwoot
Contact
Freshdesk
Contact
1:1Chatwoot Contact records (name, email, phone, custom_attributes) map directly to Freshdesk Contact. The Contact email field is the dedupe key. Chatwoot custom_attributes that attach to Contacts migrate to Freshdesk custom contact fields, which must be pre-created in the Freshdesk schema before import. Chatwoot Contact avatar URLs migrate as contact avatar URLs in Freshdesk if the destination plan supports avatar uploads.
Chatwoot
Message
Freshdesk
Conversation
1:manyChatwoot Messages nest inside Conversations as conversation_message records. We flatten the message array and write each message as a Freshdesk Conversation entry (public reply or private note) using the message_type field (incoming/outgoing = public note; activity = internal note). Message created_at timestamps preserve chronological order in Freshdesk's conversation timeline. Attachments migrate as conversation attachment URLs linked to the Freshdesk conversation record. Chatwoot's sender_type (agent vs customer) maps to Freshdesk's body_text_type (reply vs note) to preserve agent-versus-customer attribution.
Chatwoot
Inbox
Freshdesk
Product
lossyChatwoot Inboxes (Website Live Chat, Email, WhatsApp, Facebook, Twitter, API) map to Freshdesk Products (channel configurations). Channel credentials (webhook URLs, page tokens, WhatsApp business account tokens, API keys) are credentials-bound and do not transfer between platforms. We document the inbox type and name from Chatwoot so the customer's admin can configure the corresponding Freshdesk Product with matching channel type at the destination. The live chat widget code snippet does not migrate; Freshdesk provides its own widget script that replaces Chatwoot's widget on the website.
Chatwoot
Agent
Freshdesk
Agent
1:1Chatwoot Agents (user accounts with email, name, role, and availability status) map to Freshdesk Agents. We match by email address during import. Chatwoot role values (agent, administrator) map to Freshdesk Role permissions. Agent passwords do not transfer; Freshdesk sends invitation emails to migrated agents. If a Chatwoot agent account is inactive, we create the Freshdesk agent as inactive pending the customer's decision on provisioning.
Chatwoot
Team
Freshdesk
Group
1:1Chatwoot Teams (Business tier and above) map to Freshdesk Groups. Teams group agents and route conversations in Chatwoot; Groups serve the same routing function in Freshdesk. If the source Chatwoot plan is Hacker or Startups, no Teams exist in the export and this mapping step is skipped. We create Freshdesk Groups using the Team names from Chatwoot and map agent memberships to Group membership. Team-level routing rules are documented separately as Freshdesk Group assignment automations for the customer's admin to rebuild.
Chatwoot
Label
Freshdesk
Tag
1:1Chatwoot Labels (string tags applied to Conversations) map to Freshdesk Tags at the ticket level. We export the full label taxonomy including label names and color metadata where available. Tags are applied to migrated Tickets to preserve the categorization layer. Tag color display metadata from Chatwoot does not transfer; Freshdesk uses a default tag color palette.
Chatwoot
Custom Attribute
Freshdesk
Custom Field
lossyChatwoot Custom Attributes (text, number, dropdown, checkbox) attached to Conversations or Contacts map to Freshdesk Custom Fields. We pre-create the destination schema in Freshdesk (Admin Settings > Custom Fields) before any record import, matching the Chatwoot attribute name, type, and dropdown options. The destination field type must be explicitly mapped: Chatwoot text becomes Freshdesk text, Chatwoot dropdown becomes Freshdesk dropdown, Chatwoot checkbox becomes Freshdesk checkbox. Schema creation is a prerequisite step; migration cannot begin until all custom attribute targets exist in Freshdesk.
Chatwoot
Canned Response
Freshdesk
Template
1:1Chatwoot Canned Responses (pre-written reply templates with shortcut codes) map to Freshdesk Canned Templates. We export the full set including template content and shortcut trigger. Canned Responses with variable placeholders ({conversation.snoozed_until}, {contact.name}) are preserved as-is; the customer's Freshdesk admin verifies template variable compatibility post-migration. Canned Responses require Startups tier or higher on Chatwoot; if the source is on Hacker plan, no canned responses exist to migrate.
Chatwoot
Automation Rule
Freshdesk
Automation
lossyChatwoot Automation Rules (Business+ tier only) trigger on Events and execute Actions such as assign, label, or send email. They map conceptually to Freshdesk Scenario Automations, but the rule logic is platform-specific and cannot transfer as executable code. We export the full rule definitions (trigger, conditions, actions) and deliver a written reconstruction guide mapping each Chatwoot automation to the equivalent Freshdesk Scenario Automation step-by-step. If the source Chatwoot plan is Hacker or Startups, no automation rules exist in the export and this documentation step is skipped.
| Chatwoot | Freshdesk | Compatibility | |
|---|---|---|---|
| Conversation | Ticket1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Message | Conversation1:many | Fully supported | |
| Inbox | Productlossy | Fully supported | |
| Agent | Agent1:1 | Fully supported | |
| Team | Group1:1 | Fully supported | |
| Label | Tag1:1 | Fully supported | |
| Custom Attribute | Custom Fieldlossy | Fully supported | |
| Canned Response | Template1:1 | Fully supported | |
| Automation Rule | Automationlossy | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Chatwoot gotchas
Hacker plan 30-day data retention permanently deletes conversations
Free plan limits silently block new inboxes and agents
Captain AI credits bill at $20 per 1,000 beyond the monthly allocation
Database schema inconsistencies on stable tags v4.2–v4.4
Automation Rules and SLA Policies are tier-gated and cannot export from lower plans
Freshdesk gotchas
API access is blocked on the free plan
Per-minute rate limits are account-wide and endpoint-specific
Multi-channel source types do not map 1:1 to all destinations
Custom objects created in-product cannot be accessed by other apps
Contact import requires at least 10 existing tickets in the account
Pair-specific challenges
Migration approach
Discovery and plan verification
We audit the source Chatwoot account across plan tier (Hacker/Startups/Business/Enterprise), data retention window, conversation volume, active inbox count, and which tier-gated objects exist (Teams, Automation Rules, Help Center Articles, SLA Policies). We verify the destination Freshdesk plan and confirm API access is enabled (Blossom+ required). The discovery output is a written migration scope listing every object that will migrate, every object that will not migrate, and the reason for each exclusion. This document serves as the migration contract before any data extraction begins.
Schema pre-creation in Freshdesk
Before any record import, we pre-create the destination schema in Freshdesk. This includes Freshdesk Groups (mapped from Chatwoot Teams if present), custom contact fields (mapped from Chatwoot contact custom_attributes), custom ticket fields (mapped from Chatwoot conversation custom_attributes), and product channel configurations (inbox types documented from Chatwoot for admin to configure). We cannot import records with custom field values until the custom fields exist in Freshdesk, so schema creation is a hard prerequisite step. We coordinate with the customer's Freshdesk admin to verify field types, dropdown options, and group structure before proceeding.
Data extraction from Chatwoot
We extract records from Chatwoot via the REST API using the conversations, contacts, messages, agents, teams, labels, and custom_attributes endpoints. For conversations, we paginate using the created_at_after and created_at_before parameters to handle volume in chunks. We validate the export against Chatwoot's internal record counts and flag any records that fail to export due to schema bugs (documented in Chatwoot GitHub issues on v4.2-v4.4). If the source is on Hacker plan and older than 30 days, we document the conversation gap explicitly. We do not extract Captain AI state, report snapshots, or webhook configurations.
Test migration and reconciliation
We run a full migration into a Freshdesk sandbox or trial account using a subset of the exported data (typically 500-1,000 records per object type). The customer's Freshdesk admin reconciles record counts, spot-checks 25-50 migrated tickets against the Chatwoot source for field accuracy, and verifies that message chronology, tag application, and assignee mapping are correct. We correct any mapping errors identified during test migration before running the production migration. Freshdesk API rate-limit behavior is validated against the destination plan tier during this phase so production chunk sizes are tuned correctly.
Production migration in dependency order
We run production migration in record-dependency order: Agents (Users), Groups (from Teams), Contacts (with email dedupe key resolved), Conversations as Tickets (with Group assignment and assignee resolved), Messages as Conversation entries (preserving chronological order by created_at), Tags (applied to migrated tickets), Canned Responses as Templates, and Custom Field values on both Contact and Ticket records. Each phase emits a row-count reconciliation report. We apply exponential backoff and batch chunking against the Freshdesk API based on the confirmed plan tier rate limits.
Cutover, validation, and automation reconstruction handoff
We freeze Chatwoot writes during cutover and run a final delta migration of any records modified during the migration window. We deliver the written automation reconstruction guide for Chatwoot Automation Rules mapped to Freshdesk Scenario Automations, the Help Center reconstruction guide (if applicable), and the SLA Policy configuration guide. We do not rebuild automations, canned response logic, or SLA policies inside the migration scope. We support a three-day post-migration window to resolve data integrity issues; we do not provide ongoing admin support or training as standard scope.
Platform deep dives
Chatwoot
Source
Strengths
Weaknesses
Freshdesk
Destination
Strengths
Weaknesses
Complexity grading
Standard Helpdesk migration. All 7 core objects map 1:1 between Chatwoot and Freshdesk.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Chatwoot and Freshdesk.
Object compatibility
All 7 core objects map 1:1 between Chatwoot and Freshdesk.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
7-object category — typical timelines run 2–7 days end-to-end.
API constraints
Chatwoot: Not publicly documented.
Data volume sensitivity
Chatwoot doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Chatwoot to Freshdesk migration scoping. Not seeing yours? Book a call.
Walk through your Chatwoot to Freshdesk migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Chatwoot
Other ways to arrive at Freshdesk
Same-Helpdesk migrations
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.