Help Scout → Freshdesk
Load Help Scout customers with Freshdesk's contact CSV, then create tickets through the API. Help Scout will not export thread text from the report screens, and Freshdesk's ticket create rate depends on the plan.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Help Scout
- Shared inboxes, Docs, and Beacon keep email support and self-service in one desk
- Tickets, customer context, knowledge, automation, and service reporting share one operating system
- Import2 skips users, workflows, and the knowledge base, and a full archive leaves through the API
- Conversation visibility, routing logic, SLAs, and reporting history are hard to reproduce exactly
Freshdesk
- Accessible omnichannel ticketing and automation provide strong value for growing support teams
- Tickets, customer context, knowledge, automation, and service reporting share one operating system
- Advanced reporting, customization, and ecosystem depth can lag enterprise-focused competitors
- Conversation visibility, routing logic, SLAs, and reporting history are hard to reproduce exactly
Freshdesk: Accessible omnichannel ticketing and automation provide strong value for growing support teams. This removes a major source-side concern: Import2 skips users, workflows, and the knowledge base, and a full archive leaves through the API.
What you lose: Shared inboxes, Docs, and Beacon keep email support and self-service in one desk. What you inherit: Advanced reporting, customization, and ecosystem depth can lag enterprise-focused competitors.
Jump to a section
Know the shape of the move.
This timeline assumes
- You can export Help Scout conversations with the Inbox API. Report CSVs exclude thread contents. A customer name-and-email CSV, if Help Scout sends one to an Account Owner, has no history.
- Freshdesk already has at least 10 tickets, because Freshdesk says contact import needs that. Custom contact fields exist before the CSV. Email is the unique id, and a matching email overwrites the contact.
- Tickets are created with the API, not a ticket CSV. Trial accounts are limited to 50 calls a minute. Growth, Pro, and Enterprise have lower per-endpoint caps on ticket create than the account total.
- The site already documents Zendesk → Freshdesk, Freshdesk → Zendesk, and Help Scout → Zendesk. This guide is the Help Scout archive into Freshdesk.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| Thread text | manual | critical | Help Scout's in-app report export covers All Channels, Email, Company, and Happiness, and it excludes conversation thread contents. The Inbox API is how you get conversations. List Conversations defaults to active. Pass status=all. embed=threads truncates chat, so use List Threads for a full Beacon thread. | Page status=all to disk before you create Freshdesk tickets. |
| Contact CSV rules | partial | high | Freshdesk wants a header row and Name plus Email, or Name plus Phone. Email overwrites an existing contact. You can add up to 9 secondary emails besides the primary. Phone numbers need a country code, such as +14088481234. A company name that does not exist is created. The first company in the column becomes primary. Dropdown values must already exist. A checkbox must be yes or no, and any other value is stored as no. Tags are comma-separated. Dates must be YYYY-MM-DD. The file must be UTF-8. | Build the file from Help Scout customers. Fix phones and dates before upload. Read the failure CSV Freshdesk emails back. |
| Ten-ticket minimum | manual | medium | Freshdesk says you need at least 10 tickets in the account before a contact import succeeds. | Create those tickets, or wait until the first API batch has created them, then import contacts if you still need the CSV. |
| Ticket create identity | manual | critical | Create Ticket needs one of requester_id, email, facebook_id, phone, twitter_id, or unique_external_id. An unknown email becomes a new contact. Phone without email also needs name. Default status is 2, which is Open. Default priority is 1, Low. Default source is 2, Portal, so set source 1 if the conversation was email. | Send email and name from the Help Scout customer. Set status and source on purpose. |
| Status numbers | partial | high | Freshdesk's ticket properties are Open 2, Pending 3, Resolved 4, and Closed 5. Help Scout's switching table pairs Active with Freshdesk Open, Pending with Pending, and Closed with Resolved or Closed. Pick Resolved or Closed for Help Scout's Closed and use it on every row. | Write the map down. Do not leave status at the default Open for closed history. |
| Rate limits | partial | high | The limit is per account, not per agent or IP. Trials are 50 calls a minute. On current plans, Growth is 100 a minute with ticket create at 50, Pro is 400 with ticket create at 160, and Enterprise is 700 with ticket create at 280. A 429 includes Retry-After, in seconds. Invalid requests count. | Sleep for Retry-After. Size the job from the ticket-create cap, not the account total. |
| Attachments | partial | medium | Freshdesk says attachment bytes on create cannot exceed 20 MB in total. The request is multipart/form-data, and the filename you send is the filename stored. Local files are the documented upload. | Skip or split a conversation whose files exceed 20 MB. Keep the Help Scout copy. |
| Custom fields and companies | manual | medium | Contact custom fields must exist before the CSV, under Admin, Support Operations, Customer Fields. Ticket custom fields are a dictionary on create. company_id on a ticket works only when Multiple Companies is enabled, which Freshdesk's ticket page still describes as Estate and above. | Create fields first. Leave company_id off unless that feature is on. |
| Workflows and Docs | manual | high | Help Scout does not export workflows or saved replies as a file you can import. Docs use the Docs API. Freshdesk's customer article is contacts and companies, not automations. | Recreate the rules you still need after the tickets exist. |
| Tag-filtered contact export | lost | low | Freshdesk says you can filter contacts by tag in the UI, and the export still returns the whole contact list. | Filter your own CSV. Do not expect the export to honor the tag. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Customer name and email | Contact Name and Email | transform | UTF-8 CSV. Email overwrites a match. |
| Secondary emails | Up to 9 extra emails | transform | Use Freshdesk's multi-email column format. |
| Phone | Phone with country code | transform | Example shape +14088481234. |
| Active | status 2 Open | transform | Help Scout's table pairs Active with Open. |
| Pending | status 3 Pending | transform | Same word on both sides. |
| Closed | status 4 or 5 | manual | Resolved or Closed. Pick one. |
| Email conversation | source 1 | manual | The API default is 2, Portal. |
| Thread body | description | transform | HTML. Pull chat from List Threads. |
| Report CSV | No destination | unsupported | No thread text. |
Make the move recoverable.
Create the source-of-truth backup
Keep a Help Scout API archive and a contact CSV that Freshdesk has not overwritten yet.
- List conversations with status=all and save every page.
- Save List Threads for chat.
- Build the contact CSV and keep a copy of current Freshdesk contacts before import.
- Leave Help Scout forwarding in place until a Freshdesk sample ticket matches.
Proof to capture: The JSON archive, the contact CSV, and a pre-import Freshdesk export are stored.
Contacts, after 10 tickets exist
Load customers without breaking Freshdesk's import rule.
- Confirm the account has at least 10 tickets.
- Create custom fields first.
- Upload the UTF-8 CSV from Contacts, Import.
- Read the status email and fix every failed row.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Tickets under the create cap
Create history without ignoring Retry-After.
- Map status and set source.
- Send one requester identifier, usually email.
- Stay under the plan's ticket-create cap. On 429, wait Retry-After seconds.
- Attach files only when the set is within 20 MB, as multipart.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
Email overwrite
The CSV contains an email that already exists in Freshdesk.
- Consequence
- Freshdesk overwrites that contact, including with a checkbox value it treats as no.
- Mitigation
- Diff against a Freshdesk export first. Fix yes/no and dates.
Stop if: You have not exported current contacts.
Closed history stays Open
The create call omits status.
- Consequence
- Freshdesk defaults to Open, so old conversations look like a live queue.
- Mitigation
- Set 4 or 5 for Help Scout's Closed.
Stop if: The status map is not in the client.
The create cap is ignored
The script uses the account limit, or a trial's 50, as if every call can create a ticket.
- Consequence
- 429s, and failed calls still count.
- Mitigation
- Throttle to the ticket-create number for the plan and honor Retry-After.
Stop if: You do not know the plan's ticket-create cap.
Do the work in this order.
- Days 1 to 3 · inventory
Plan caps and status map
4 to 8 hours active2 to 3 days elapsedAPI keys waiting- Read the Freshdesk plan cap.
- Write Active, Pending, and Closed to 2, 3, and 4 or 5.
- Count conversations.
Depends on: Help Scout API and Freshdesk admin
Stop / go checkpointStart the archive?
Go when: The cap and the status map are written down.
Stop when: The account has no ticket-create budget you can name.
- Days 3 to 8 · backup
API archive
6 to 12 hours active3 to 5 days elapsedPaging waiting- Save status=all.
- Save chat threads.
- Export current Freshdesk contacts.
Depends on: Keys
Stop / go checkpointIs history on disk?
Go when: A known closed conversation is in the JSON.
Stop when: The list call used the default status.
- Days 8 to 12 · pilot
A small create and a contact file
4 to 8 hours active2 to 4 days elapsedFreshdesk's import email waiting- Create enough tickets to pass the 10-ticket rule if needed.
- Import a small contact file.
- Create a few historical tickets with explicit status.
Depends on: Archive and contact diff
Stop / go checkpointRun the rest?
Go when: Closed samples are not Open, and the failure CSV is empty or fixed.
Stop when: An existing contact was overwritten by mistake.
- Days 12 to 18 · cutover
The rest of the tickets, then mail
4 to 10 hours active3 to 6 days elapsedRate limit waiting- Create the remaining tickets under the cap.
- Switch forwarding.
- Stop Help Scout replies.
Depends on: Passed pilot
Stop / go checkpointFreshdesk owns new mail?
Go when: A test message arrives and the historical sample still has the right status.
Stop when: 429s are being ignored.
- Days 18 to 25 · observe
A week of the queue
3 to 5 hours active5 to 7 days elapsedLive mail waiting- Watch the open queue for old tickets.
- Keep the JSON.
- Rebuild the workflows you still need.
Depends on: Cutover
Stop / go checkpointClose Help Scout sending?
Go when: New mail is in Freshdesk and closed history is not in the open queue.
Stop when: A closed conversation was created as Open.
Cut over with a way back.
Cutover
Finish historical creates at the right status, then send new mail to Freshdesk.
- Confirm the contact failure CSV is handled.
- Confirm closed samples use status 4 or 5, not the default 2.
- Finish creates under the ticket-create cap.
- Switch forwarding and stop Help Scout replies.
- Send a test message to the public address.
Proof to capture: The test message is a Freshdesk ticket, and a known closed Help Scout conversation is not Open.
Rollback
Point mail back at Help Scout if Freshdesk contacts or statuses are wrong.
- Point forwarding back at Help Scout.
- Stop the create script.
- List Freshdesk tickets created since the switch.
- Review those before you copy them into Help Scout.
- Use the pre-import contact export if a CSV overwrite has to be repaired.
Proof to capture: New mail is in Help Scout, and the contact diff is saved.
- A known contact was overwritten
- Closed history is Open
- The failure CSV is unexplained
- Creates continued through 429 responses
- An attachment set over 20 MB was skipped with no note
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | status=all | Read the Help Scout request and find a known closed conversation. | It is in the saved pages, with chat loaded from List Threads when needed. | JSON archive. | |
V-02Blocking | Diff | Compare the CSV with a Freshdesk export taken first. | Overlapping emails are intentional overwrites. | Diff. | |
V-03Blocking | Dates, phones, checkboxes | Scan the CSV. | Dates are YYYY-MM-DD, phones have a country code, checkboxes are yes or no, and the file is UTF-8. | CSV. | |
V-04Blocking | 10 tickets | Confirm the account already has 10 tickets before the contact import. | Freshdesk's precondition is met. | Ticket count. | |
V-05Blocking | Status email | Open the failure CSV Freshdesk attaches. | Every failed row is fixed or explicitly dropped. | Email. | |
V-06Blocking | Not the default | Open a closed sample ticket. | Status is 4 or 5, matching the map. Source is 1 for email. | Ticket. | |
V-07Blocking | Retry-After | Read the client against the plan's ticket-create cap. | It waits on 429 and stays under the create cap. | Client log. | |
V-08Blocking | Forwarding | Send to the public address. | The message arrives in Freshdesk. | Test email. |
Remove the scaffolding safely.
Safe after: Historical closed tickets are not Open, contact failures are resolved, and new mail arrives in Freshdesk.
- Keep the JSON archive and the pre-import contact export.
- Leave Help Scout readable until rollback closes.
- Recreate workflows that had no export file.
- Note any attachment skipped for the 20 MB limit.
- Store the status map next to the create log.
- Schedule a queue check for old tickets that landed as Open.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Help Scout: data export optionsAccessed 2026-11-04
- Help Scout: list conversationsAccessed 2026-11-04
- Freshdesk: import and export customersAccessed 2026-11-04
- Freshdesk API: create a ticket and rate limitsAccessed 2026-11-04