Key takeaways
- Use the CSV importer for contacts and companies if it fits. Use the API for tickets.
- A flat CSV with one row per ticket often loses the thread. Check where replies, authors and internal notes live first.
- Keep every legacy ID: it links replies to tickets and tickets to people, and makes re-runs safe.
- Validate with counts per status and a read-through of your longest threads, not just a total.
What each helpdesk’s CSV import covers
| Destination | CSV import covers | Tickets go in through |
|---|---|---|
| Zendesk | Users and organizations | The Ticket Import API, which keeps original dates and does not run triggers on tickets that are not closed |
| Freshdesk | Contacts and companies | The Tickets API, which has no creation date on create, so the date goes in a custom field |
| Intercom | Users or leads; not companies | The API, following Intercom’s Import Tickets guide |
| Help Scout | A built-in import tool for the sources it lists | The Inbox API, with imported set to true so no emails go out |
Data preparation checklist
- IDs: a unique, stable ID for every company, person, ticket and reply, kept as text so leading zeros survive.
- Relationships: every ticket points to a requester ID, every reply to a ticket ID and an author ID.
- Timestamps: ISO 8601 with a time zone, or Unix time. A date without a zone is a guess.
- Authors and visibility: a flag for agent or customer, and for public or private, on every reply. An internal note imported as a public reply is visible to the customer.
- Statuses and dropdowns: the full list of values in use, each mapped to a destination value.
- Attachments: files on disk or URLs reachable at import time, with the reply they belong to.
- Encoding: UTF-8 throughout.
Load order and validation
- 1.Companies first, with your legacy ID stored on each.
- 2.People next, matched on email or an external ID so nobody is created twice.
- 3.Agents and teams created on the destination, then mapped.
- 4.Tickets, each looked up by legacy requester ID, with the legacy ticket ID stored in a field.
- 5.Replies and notes in date order, with attachments on the reply they came with.
- 6.Count tickets per status on both sides, and read your longest threads top to bottom.
Moving from an in-house or legacy tool?
DataGrine works from a written mapping, a sample you sign off and an itemised reconciliation report. Run it self-serve on the platform or have the migration team handle it end to end, with 24/7 support either way. Tell us what your export looks like.