Helpdesk migration guide

The Definitive Guide to Migrating to Zendesk

Zendesk is a multi-channel helpdesk whose import model rewards teams that pre-build ticket forms, ticket fields and brands, and that treat triggers, automations and macros as rebuild work rather than import work.

22 min read 9 sections Updated May 27, 2026
Zendesk
Tickets
Conversations
Customers
Attachments
Knowledge Base
Tags

Inside this guide

What you'll learn, section by section

  1. 01

    Why teams migrate to Zendesk

    The four shapes a Zendesk migration takes, and what makes the platform easier — or harder — than the category average.

  2. 02

    The Zendesk data model you need to map into

    Tickets, users, organizations, brands, custom objects, and the external-ID keys you'll wire on every field — the destination schema decoded.

  3. 03

    Pre-migration prep — the work before you touch Zendesk

    What must be true on the source, the destination, and across the team before the first row hits the Data importer.

  4. 04

    Import mechanisms: Data importer, Ticket Import, and ETL

    Multiple paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.

  5. 05

    Mapping your data into Zendesk

    The longest section — because field mapping is where almost every helpdesk migration that fails actually breaks.

  6. 06

    The pitfalls that derail Zendesk migrations

    Specific failure modes — ranked by impact, each tied to the exact Zendesk mechanism that breaks.

  7. 07

    Validation and cutover

    What to verify after the import job, in what order — and how to fail safely when something is wrong.

  8. 08

    Migration partners and tools

    Solutions partners, automated migration services, ETL vendors — what each is good for and how to choose.

  9. 09

    Frequently asked questions

    The questions every Zendesk migration team works through before they sign the scope.

Section 01

Why teams migrate to Zendesk

The four shapes a Zendesk migration takes, and what makes the platform easier — or harder — than the category average.

Zendesk, Inc. was founded in Copenhagen, Denmark in 2007 and is headquartered in San Francisco, California. The company went public in 2014 and was taken private in November 2022 by an investor group led by Hellman & Friedman and Permira for roughly $10.2 billion 1. The product is now sold primarily as the Zendesk Suite, which bundles Support, Guide, Chat, Talk and Explore under a single subscription.

The typical Zendesk customer is a B2C or B2B support organisation — anywhere from 5 to 5,000 agents — that runs multi-channel inbound volume across email, web widget, mobile, voice, chat and social. Compared with Freshdesk and Help Scout, Zendesk positions itself on workflow depth; compared with ServiceNow CSM and Salesforce Service Cloud, it positions on faster time-to-value and a flatter admin function.

The shapes of migration that actually land on Zendesk tend to fall into four patterns. First, consolidation projects: a company replacing a stack of Intercom plus Help Scout plus a homegrown ticket tool with Zendesk Suite. Second, exits from competing helpdesks — Freshdesk, Front, Kustomer, Gladly — usually triggered by feature gaps in routing, SLAs or Explore-style reporting.

Third, legacy replacements — Jira Service Management, Spiceworks, on-prem ServiceNow, or shared mailboxes — where the source has no real ticket model and the project is really a re-architecture. Fourth, M&A integration, where an acquired business runs on a different helpdesk and the parent standardises on Zendesk. Each shape has a different difficulty profile: a Freshdesk migration has clean ticket-and-user parity but messy tag spillover; a shared-mailbox migration has no schema at all.

What makes migrating *to* Zendesk easier than the category average is the dedicated Ticket Import path that preserves historical created_at, updated_at and solved_at timestamps, does not fire triggers or automations during import, and accepts batches of up to 100 tickets at a time 23.

What makes it harder than the average is that triggers, automations, macros, SLA policies, views and Guide content do not import — they are rebuilt from the source's documentation in Zendesk's own admin UI. Multi-brand customers also discover late that Sandbox availability is plan-gated (Suite Professional and above), which forces some teams to dry-run on production 27.

Ticket-field tagging, drop-down tag collisions and the 50-tag-per-ticket cap also reward teams that design the tag taxonomy before the first row is imported.

Teams that scope the trigger, macro and Guide rebuild work up front finish on time; teams that assume parity do not.

Section 02

The Zendesk data model you need to map into

Tickets, users, organizations, brands, custom objects, and the external-ID keys you'll wire on every field — the destination schema decoded.

Zendesk platform Contacts Companies Deals Tickets Tasks Notes
Standard objects orbit the platform; every association can be many-to-many with optional labels.

Zendesk Support is built around a small set of standard objects, each with default and custom fields, and lookup relationships that connect them. The Suite layer adds Guide articles, Talk calls, Chat conversations and Sunshine custom objects on top of the same shared schema used by Support.

Before you can map a field on the source side, you need to know exactly which destination object the row belongs on, what fields it requires, and which value will serve as its upsert key. The table below summarises the objects you will touch in a Zendesk Suite migration.

Object Stores Required on import Tier
Tickets Support requests across all channels Requester, subject, comment body, status All tiers
Users (End users + Agents) Customers, agents, admins, light agents Name + email (or external_id) All tiers
Organizations Customer accounts; group end users Name (unique within instance) All tiers
Groups Agent assignment groups for routing Name All tiers
Brands Multi-brand routing + branded help centers Name, subdomain Suite Growth+ (Multi-brand)
Ticket Forms Templates that scope ticket fields per workflow Name, ordered field list Suite Growth+ (multiple forms)
Custom Objects (Sunshine) Customer-defined record types Object key, name field; plan-scaled fields Suite Team+ (counts scale by tier)
Guide articles, sections, categories Help Center knowledge base content Title, body, section, locale All Suites (Guide)
Macros, Triggers, Automations, SLAs, Views Business rules and routing logic Rebuilt manually, not imported All tiers (Automations: Growth+)

Users use email as the de facto unique identifier, but the most reliable upsert key is external_id — a free-form string you populate from the source system's primary key. Organizations also expose external_id and an organization name that is unique across the instance 4.

Tickets are typically matched on the Zendesk-assigned ID after creation, but during a migration the pattern is to stamp the source ticket ID into a custom ticket field (often called legacy_ticket_id) so re-runs and reconciliation are deterministic. Custom objects expose a first-class external_id field designed for exactly this purpose 6.

The Data importer upserts on the identifier you nominate: if a matching record exists, it updates; if not, it creates 7. The Ticket Import path does not upsert — it always creates — so any re-run requires you to delete failed rows or reconcile by legacy_ticket_id before retrying. Custom field types determine validation; the catalogue below covers what you can model and the limits you plan around.

Field type Limits Notes
Text / Textarea Free-form string Standard short and long text
Date YYYY-MM-DD Sell importer also accepts DD/MM/YYYY if account timezone matches 8
Integer / Decimal Standard numeric range Decimal stores numbers with decimal point
Checkbox Boolean + optional tag Optional tag writes a tag to the ticket on true
Dropdown (tagger) / Multi-select Tag value per option, 255-char regex caps Each option writes its tag to the ticket; tags must be unique across all custom fields 9
Regexp ≤255-char pattern Ruby regex syntax; validates string input 9
Lookup relationship Targets: ticket, user, organization, custom_object, brand, article Custom field type lookup; mapped via target object ID 10
Ticket fields per account ≤400 fields per account, or 400 per form Above this, performance degrades 11
Custom objects per plan 3 / 5 / 30 / 30 / 50 / 50 Team / Growth / Pro / Support Enterprise / Suite Enterprise / Enterprise Plus 12

Relationships in Zendesk are modelled three ways. Tags are the loose-coupling primitive — every ticket can carry up to roughly 50 tags. Lookup relationship fields are first-class typed references between tickets, users, organizations and custom objects, including dynamic filter definitions 10. Custom-object parent-child relationships were added in 2024 alongside roll-up summary fields, and many-to-many is modelled via a junction custom object 13.

Legacy Sunshine custom objects will be removed in June 2026 14. Plan to migrate object types, schemas, relationship types and records into the new custom-objects framework before the deprecation deadline, not as part of the cutover itself.

Section 03

Pre-migration prep — the work before you touch Zendesk

What must be true on the source, the destination, and across the team before the first row hits the Data importer.

The single best predictor of a clean Zendesk migration is how much work you do on the source side before the first import is queued. Help Desk Migration's own playbook notes that roughly 60 percent of total migration effort sits in the pre-transfer phase, and the fix is almost always pre-processing rather than post-cleanup.

Around 60 percent of total migration effort sits before any data moves — the fix is pre-processing, not post-cleanup.

Treat the source export as raw material that needs to be shaped to Zendesk's expected formats — CSV files saved as UTF-8 (not ISO-8859), dates rewritten to match account timezone, email lowercased, tags normalised with dashes instead of spaces, and source ticket IDs preserved in a legacy_ticket_id custom field 16.

Source-side prep

  • Audit the ticket estate. Count tickets per channel, per status and per year. Decide what window you actually need in Zendesk — most teams import 2 to 3 years of solved/closed and only the open backlog beyond that.
  • Dedup users by email. Two source rows with [email protected] and [email protected] will collapse into one Zendesk user on import; if you want them separated, deconflict the email before export.
  • Convert tags so they contain no spaces — Zendesk replaces spaces with dashes silently and you lose the ability to filter on the original string.
  • Stamp legacy_ticket_id and legacy_user_id custom fields on every record in the source export so re-runs are deterministic and conversation threads can be linked back to the source if a discrepancy appears post-cutover.
  • Decide what is in scope for ticket comments. Public comments and internal notes are both imported via the ticket comments[] array 3; deciding to drop internal notes is a one-time decision that cannot be reversed without a re-import.

Destination-side prep

  • Request a Sandbox if you are on Suite Professional or above — a single Sandbox is allowed at a time, and the typical procedure is to delete the existing one and create a new one based on current production settings 18.
  • Enable data imports — they are not enabled by default. The account owner or an admin must contact Zendesk Customer Support to turn on the Data importer and bulk export access 7.
  • Disable required conditions on ticket forms during the import window. Required ticket fields will reject historical rows where the source did not capture that value; flip the requirement off in Admin Center → Objects and rules → Tickets → Forms → Conditions before importing, and re-enable after.
  • Provision agents and groups first, ideally through SSO with Okta or Microsoft Entra ID, and create the role assignments before importing — ticket-assignment fails silently if the referenced assignee does not exist in Zendesk.
  • Pre-create every ticket field, ticket form, brand, organization custom field and user custom field with the correct type and tag value. Dropdown tag values must be unique across all custom fields on the account 9.

People prep

Cutover only works if humans cooperate. Lock down a source-system freeze window — typically 24 to 72 hours — and communicate it to every channel that touches the inbox. Train agents on the Zendesk macro library, the views they will work from, and the new SLA policies before go-live. A single-brand migration under 10,000 tickets runs one to two business days; a multi-brand, Talk + Chat + Guide consolidation runs two to six weeks.

Section 04

Import mechanisms: Data importer, Ticket Import, and ETL

Multiple paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.

Zendesk exposes several load paths and the right one depends on dataset size, object mix, and whether you need to re-run idempotently. The native Data importer covers users, organizations and custom-object records up to mid-volume. The Ticket Import path is the sanctioned route for historical tickets at scale. Third-party migration tools sit on top of both and add staging, transformation and reconciliation layers.

Data importer (UI)

The native importer lives at Admin Center → Objects and rules → Tools → Data importer and replaces the legacy Bulk actions page 19. It accepts a CSV file (UTF-8 only 16) and supports three record types: users, organizations and custom-object records. It does not import tickets — that path is Ticket Import. The legacy bulk-actions page caps at 2,000 rows per file 20; the new Data importer benefits from chunking at large volumes.

Bulk export of users via CSV is throttled to 100,000 results per hour per user 21. The right call: Data importer for any one-shot users / organizations / custom-object load under a few hundred thousand records where you want a visual mapping review before commit.

Ticket Import

The Ticket Import path is dedicated to moving historical tickets and is documented separately from standard ticket creation 3. The bulk form processes up to 100 tickets per batch 322.

Unlike standard ticket creation, the import path preserves historical created_at, updated_at and solved_at timestamps, supports an archive_immediately parameter for closed tickets, does not trigger business rules (triggers, automations, notifications) on import, and lets you set custom comment timestamps per element of the comments[] array 3. The requester user must already exist in Zendesk — pre-load users via the Data importer first.

Bulk operations that take longer than a single request queue background jobs. The platform ceiling is 30 queued-or-running jobs at once 23. Exceeding it returns TooManyJobs; respect the remaining and reset values and back off. Plan-tier throttles sit on top — Team plans run lower request caps than Enterprise 23. Choose the programmatic path when ticket volume is over a few thousand.

Third-party migration and ETL tools

Specialist Zendesk-targeted migration tools handle file generation, type coercion, attachment fetching and conversation-thread reconstruction before the result is fed to Zendesk. ETL platforms like Fivetran, Airbyte, Stitch and Talend Data Integration are commonly used for the reverse direction — staging Zendesk data into a warehouse — but on the inbound side they are typically used to land source data into a warehouse, transform in SQL, then push into Zendesk.

Rule

Under 10,000 tickets on a single brand → Data importer for users plus Ticket Import for tickets. 10,000–100,000 → programmatic path with controlled concurrency and job-status polling. Over 100,000, multi-brand, or any re-runnable load → migration tool plus a warehouse staging layer.

Section 05

Mapping your data into Zendesk

The longest section — because field mapping is where almost every helpdesk migration that fails actually breaks.

SOURCE ZENDESK FirstName, LastName firstname, lastname AccountName company AnnualRevenue annualrevenue Owner.Email hubspot_owner_id CreatedDate createdate
Field-mapping flow — every source field resolves to a destination property or an explicit drop.

Mapping is where every helpdesk migration earns its scars. The schema decisions you make in your mapping spreadsheet determine whether reports work on day two, whether SLA breaches fire correctly on day five, and whether your agents trust the ticket history on day thirty.

Work object by object, top to bottom of the import order: Organizations first (so users can associate), then Users, then Tickets (with comments inline), then Guide content, then Custom Objects.

Users and organizations

Common source → Zendesk User / Organization mapping

Source Destination
  • email
    email (primary identity)

    Lowercased on import; case-only duplicates collapse

  • source primary key
    external_id (User / Organization)

    First-class upsert key — populate on every row

  • name / full_name
    name

    Single string; concatenate first + last if needed

  • phone
    phone

    Normalise to E.164 before import

  • role
    role (end-user / agent / admin)

    Agents must hold a paid seat; light agents are read-only on Pro+

  • account / company
    organization_id via Organization name or external_id

    Pre-load organizations first; user import resolves the FK

  • custom attributes
    user_fields.{key} / organization_fields.{key}

    Field key must pre-exist; use snake_case lower

Tickets — history, comments and conversation threads

Tickets are the heart of the migration. Every public comment and internal note from the source needs to land in Zendesk's comments[] array in the right chronological order with the right authorship and the right public/private flag. The Ticket Import path accepts a fully composed ticket plus comments in a single payload 3, which means you do not have to make a second pass to backfill the conversation thread.

Common source → Zendesk Ticket mapping

Source Destination
  • subject / title
    subject

    Required

  • ticket_id
    Custom ticket field legacy_ticket_id (regex or text)

    Zendesk assigns its own ID; keep the source ID for reconciliation

  • requester_email
    requester_id via user lookup

    Requester must exist in Zendesk before the import

  • status
    status

    Map to new / open / pending / hold / solved / closed

  • priority
    priority

    low / normal / high / urgent

  • channel / source
    via.channel + custom field if richer mapping needed

    Native channels: email, web, mobile, voice, chat — keep original in a tag if consolidating

  • created_at, updated_at, solved_at
    created_at, updated_at, solved_at

    Preserved by Ticket Import; pre-1970 dates rounded to 1970 3

  • ticket form (if multi-product)
    ticket_form_id

    Form must pre-exist; tag values from form-scoped dropdowns must match

  • comments[].body + author + is_public
    comments[] with public, author_id, created_at

    Internal note = public: false; preserve per-comment timestamp 3

  • tags
    tags[]

    Replace spaces with dashes; ~50-tag soft cap per ticket

  • brand (if multi-brand)
    brand_id

    Brand must pre-exist; routing follows brand on Growth+

  • CCs / followers
    collaborator_ids / follower_ids

    Adding on create mirrors notification history

  • attachments
    comment_attachments via the Uploads path

    Upload binary first → receive token → attach to comment

Side Conversations — Zendesk's way to email or message out from a ticket without polluting the main thread — are an under-imported artefact. Most migration tooling collapses them into a private note at the bottom of the ticket because there is no public way to recreate them with their original participant graph intact. Decide whether you accept that trade-off or whether the lost context warrants a manual re-create for high-value historical tickets.

Knowledge base (Guide) — categories, sections, articles, translations

Help Center content imports as categories → sections → articles 28. Categories and sections are containers; articles carry the body HTML, locale, draft flag and labels. Translations are imported per-locale through the same path — the UI does not bulk-import translated content, so multi-locale knowledge bases require scripted work 28.

Inline image URLs in article bodies need to be rewritten — pointing at the source platform's CDN means the images break the moment that account is cancelled. The pattern is to download every referenced image, re-upload to the Articles Attachments path, capture the new URL, and rewrite the body HTML before insert. Article comments are kept in a separate object and are imported only if your historical knowledge base depended on community discussion.

Macros, Triggers, Automations and SLAs — the rebuild list

Macros (manual actions an agent applies to a ticket), Triggers (event-driven business rules that fire on ticket create or update), Automations (time-based rules that run hourly), SLA policies (response and resolution targets bound to ticket conditions), and Views (saved filters that agents work from) do not import. They are rebuilt from the source platform's documentation in Zendesk's own admin UI.

Plan for this as a parallel workstream, not a post-import task — the rebuild is the work, not the data move. Export the source's automation rules as a spreadsheet with three columns: *trigger condition*, *what it does*, *who owns it*. Filter out anything inactive in the last 90 days. Anything left over is the rebuild backlog. Business hours and schedules are also rebuilt: SLAs reference schedules, so the schedule definitions need to exist before SLA policies are created.

CSAT history and survey responses

Zendesk's CSAT survey writes a satisfaction_rating value (good / bad / offered / unoffered) and an optional comment to the ticket itself. Historical CSAT from a source platform cannot be backfilled into the native satisfaction_rating field on import — the recommended pattern is to land legacy survey scores in a custom ticket field (legacy_csat_score) and a legacy survey comment field, then rewrite historical-period CSAT reports to point at those fields rather than the native one.

Multi-channel inbox setup — Email, Web Widget, Mobile, Voice, Chat, Messaging

The migration moves historical tickets; the live channels still have to be cut over separately. Email is the simplest — point the source mailbox MX or a forwarding rule at {your-subdomain}.zendesk.com. The Web Widget and Mobile clients need to be re-embedded with the new account credentials. Zendesk Talk numbers are ported via a separate carrier porting process that runs in parallel and takes one to four weeks.

Chat (legacy) is being superseded by Messaging (Sunshine Conversations), and many migrations consolidate from third-party chat to Messaging at the same time as the helpdesk move. Social channels (Facebook, X, WhatsApp via Sunshine Conversations) reconnect through the Channel Framework. Brand-specific routing — assigning the right group, ticket form and SLA policy to each brand — is configured in Admin Center → Account → Brand management once Brands are pre-created.

Files, attachments and inline images

Email and web-form attachments cap at 50 MB per inbound file and outbound email attachments cap at around 7 MB total per email 29. Attachments are uploaded first, returning a token that you attach to a ticket comment in the same import call. For Guide articles, the per-attachment cap is 20 MB per file or image and community post images are capped at 2 MB 30.

Plan for storage tier consumption — Zendesk meters file storage by GB per agent, and the storage dashboard in Admin Center → Account → Usage → Storage refreshes every 24 hours 31. For large attachment estates (multi-TB), the pattern most teams adopt is: keep originals in S3 or Azure Blob, store a deep link in a custom ticket field, and only inline-upload the most recent or most-referenced subset to keep storage costs predictable.

Audit trail, ownership and original timestamps

The Ticket Import path is the only route that preserves created_at, updated_at and solved_at on historical tickets — standard ticket creation stamps them to import time. For users and organizations, there is no equivalent override: the Data importer always sets created_at to the moment the row is processed. If you need the original user-created date for reporting, capture it in a legacy_created_at user field.

Ownership during import works through the submitter_id and assignee_id fields on the ticket, both of which must resolve to existing Zendesk user IDs at the moment of import. Rows whose assignee cannot be resolved are imported unassigned, which silently breaks downstream group-based views and reports. The Ticket Audits view exposes the full event timeline post-import 32 — useful for reconciliation but not for backfilling: import-generated audits are stamped to import time, not to the source events.

Section 06

The pitfalls that derail Zendesk migrations

Specific failure modes — ranked by impact, each tied to the exact Zendesk mechanism that breaks.

High impact

Side Conversations and Sunshine custom-object data are not in the native CSV export

Practitioners report that Zendesk's native CSV export flattens via.channel so you lose whether a message was a public reply or an internal note, and that Sunshine custom-object records are not in the native export at all — they sit in a nested JSON structure the CSV path cannot reach 33. Teams discover this only after cancelling the source seat. Mitigation: pull custom-object records in parallel with the ticket export, and validate row counts before any source-side cancellation. 33

High impact

Required ticket-form conditions reject historical rows

Ticket forms can mark fields as required via conditional rules. If your historical rows do not contain that value (because the source platform never captured it), the Ticket Import path rejects the row. The fix is to go to Admin Center → Objects and rules → Tickets → Forms → Conditions, set every condition's *Required* dropdown to *Never* for the import window, run the import, then re-enable required conditions for live ticketing. Forgetting the re-enable step is its own data-quality bug.

High impact

Tag values must be unique across all custom fields

Dropdown (tagger) and multi-select fields write a tag value to the ticket when an option is selected. Zendesk enforces tag-value uniqueness across every custom field on the account — you cannot use priority_high as a tag on two different fields 9. A migration that mirrors source dropdowns one-for-one without checking the existing tag namespace will throw tag is already in use errors mid-import. Pre-flight: dump every existing dropdown option's tag value, deduplicate the proposed new values, and prefix collisions with the field name. 9

High impact

100-record cap on bulk operations, 30-job cap on background queue

Zendesk's bulk operations — Create Many Tickets, Create Or Update Many Users, ticket bulk imports — cap at 100 records per call 22. Above that the request returns a 400 Bad Request. A migration loop tuned to 500 silently fails. Worse, the platform caps queued-or-running background jobs at 30 concurrently 23. Sizing parallelism above either ceiling returns TooManyJobs. 22

High impact

UTF-8 encoding errors stop the import dead

Bulk CSV imports fail with invalid byte sequence in UTF-8 when the file is encoded as ISO-8859 or another single-byte charset 16. Excel on Windows defaults to a non-UTF-8 codepage when you save as CSV, which is the most common cause. The fix is to re-save as CSV UTF-8 (Comma delimited) in Excel, or to pass the file through Google Sheets which always exports UTF-8 16. Build the encoding check into the migration script — read the first 1 KB and verify charset before sending the file. 16

Medium impact

Triggers, automations, macros and SLAs do not import

Every event-driven trigger, time-based automation, macro and SLA policy is rebuilt manually in Admin Center. Teams that assume a 1:1 import discover on day three that incoming tickets are not being assigned, that auto-responders are not firing, and that SLA breaches are not being tracked because the destination is configured but empty. Scope the rebuild as a parallel workstream from day one — export the source automation rules as a spreadsheet, filter to anything used in the last 90 days, and treat that list as the build backlog.

Medium impact

Sandbox is plan-gated and limited to one at a time

Zendesk Sandboxes are available on Suite Professional and above 27. Teams on Team or Growth plans cannot dry-run on a true sandbox and end up testing the import on production. Even Pro+ accounts are limited to a single sandbox at a time — the typical procedure is to delete the existing sandbox and create a fresh one based on current production settings, which wipes any in-progress dry-run work 18. Plan the dry-run window tightly and snapshot every config decision externally before refreshing. 18

Medium impact

CSV export throttling traps reconciliation scripts

Bulk CSV exports are limited to 100,000 results per hour per user 21. A reconciliation script that pulls users, organizations and ticket samples in parallel on the same admin account will hit this cap and start returning Your CSV file request frequency limit has been exceeded. Try again later. Spread the work across multiple admin accounts or pace the script with sleeps. Use the Incremental Exports path for full-table reads instead of paginated bulk export — it is purpose-built for this case. 21

Low impact

Data residency cannot be flipped after account creation

Zendesk offers a Data Center Location add-on with AWS regions in the US, EU and APAC, but it is purchased separately and the region is committed at account setup. Migrations into the wrong-region account require a Zendesk-run regional migration before the data move, scheduled by Zendesk's data residency team. If your project has GDPR, Australian Privacy Act or German BDSG constraints, validate the region of the destination account in writing before the first import starts.

Section 07

Validation and cutover

What to verify after the import job, in what order — and how to fail safely when something is wrong.

1 Read-only Source goes write-frozen 2 Final delta Export incremental changes 3 Import Load into Zendesk 4 Validate Reconcile + spot-check 5 Cut over Users on new system
Cutover sequencing — five gated phases between source read-only and full user access.

Validation is the bridge between the import finishing and agents being allowed in. The Supportbench playbook recommends a three-stage validation: a small-scale test load with stakeholder spot-checks, the full load with real-time monitoring of ticket counts and conversation integrity, and a post-migration data-quality audit that runs for 30 days. The most reliable signal is having team leads verify their own ticket queues — they know what right looks like better than any reconciliation script.

Build a reconciliation queries spreadsheet that compares source and destination on each of these counts. Anything outside a 0.5 percent variance gets investigated before agents get login access.

  • Total tickets imported vs source — minus deliberately excluded rows (spam, closed-no-comment, out-of-scope years).
  • Tickets per status (new / open / pending / hold / solved / closed) vs source — a non-trivial drift usually signals a status-mapping error.
  • Tickets per brand and per ticket form vs source — confirms multi-brand routing landed correctly.
  • Comments per ticket — sum of public + private comments vs source, sampled across 100 high-traffic tickets to confirm the comments[] array round-tripped intact.
  • Attachments per ticket — count + bytes; missing attachments are usually a token-expiry or content-type problem on the upload step.
  • Users imported vs source distinct emails — confirms email-case-only collisions did not over-merge.
  • Tags distribution — top 50 tags by frequency vs source; tags with spaces should appear with dashes and counts should match.
  • Original timestamps — sample 50 historical tickets and confirm created_at matches source within 1 second; this is the single most common silent failure on the Ticket Import path.

On top of reconciliation, run a manual spot-check protocol: pick 30 random tickets across statuses, channels and brands and verify each comment, attachment and tag against the source UI. Pick five highest-touch tickets and trace the full conversation graph — every public reply, every internal note, every attachment, every Side Conversation collapse. If a non-trivial discrepancy shows up in three or more of the 30, halt the load, fix the root cause, and re-import the affected rows by legacy_ticket_id.

Zendesk does not offer a native bulk-undo. The Data Recovery Policy is explicit that Zendesk will not restore data the customer deletes 36. The supported pattern is: export every object to your own storage before the import starts, stamp every imported ticket with an Import Batch ID custom field, and if catastrophe strikes, bulk-delete by that batch ID and re-import from the cleaned source 36.

Cutover sequencing: (1) source helpdesk goes read-only; (2) final delta export captures changes during the test-import window; (3) delta is imported with archive_immediately: true for closed tickets; (4) reconciliation queries run; (5) email MX / forwarding flips to the new Zendesk subdomain; (6) Web Widget and Mobile clients are re-pointed; (7) agents get login with a 48-hour hyper-care window; (8) source decommission is scheduled 30 to 90 days out, never the same day.

Section 08

Migration partners and tools

Solutions partners, automated migration services, ETL vendors — what each is good for and how to choose.

The Zendesk Solutions Partner Directory tiers Premier, Select and Member partners by certifications, customer count and regional coverage. For a Suite migration specifically, partners with explicit Freshdesk-to-Zendesk, Intercom-to-Zendesk or shared-mailbox-to-Zendesk practices tend to ship cleaner than generalist implementation shops because the failure modes in helpdesk migrations are pattern-matched rather than discovered live.

Alongside certified consultancies, a second category exists: automated migration services that wrap the Ticket Import and Help Center paths in a SaaS UI with field-mapping, demo migrations and delta-sync. These services typically price per-record on a sliding scale, with separate line items for inline-image rebuild, custom-object records, Side Conversations preservation and post-cutover delta runs.

On the ETL and iPaaS side, Fivetran, Airbyte, Stitch, Matillion and Talend Data Integration all have Zendesk connectors. Their role in a migration is rarely the migration itself — it is the staging layer that lands source data into a warehouse, the transformation layer that converts tag conventions and resolves owner IDs, and the ongoing-sync layer that takes over once the one-time migration is complete.

Managed-migration cost ranges vary widely. Automated tool quotes start around $800 for under-10,000-ticket transfers, but practitioners report true project cost lands 4×–40× higher once configuration rebuild, inline-image fixes, retry orchestration and custom-object recovery are factored in. Implementation, migration and training services for enterprise Zendesk deployments are quoted in the $5,000–$50,000+ range. Drivers: ticket volume, custom-field complexity, multi-brand count and integration rebuilds.

For teams that want to outsource the migration end-to-end, FlitStack specialises in Zendesk migrations and handles the field mapping, ticket-history and comment preservation, KB article and inline-image rebuild, custom-object record migration, and validation work described in Sections 5 and 7 of this guide. Pricing is fixed-fee, based on ticket count and source platform, with separate line items for multi-brand setups and Side Conversation preservation so the scope is transparent before signature.

This is one of several legitimate paths — the right choice for any given team depends on whether they want a Zendesk Solutions Partner, an automated migration service, an iPaaS-first approach, or a specialist migration vendor. Explore FlitStack →

Section 09

Frequently asked questions

The questions every Zendesk migration team works through before they sign the scope.

References

Sources

  1. 1 Zendesk — Wikipedia
  2. 2 About Zendesk Suite — Zendesk help
  3. 3 About ticket import — Zendesk help
  4. 4 How can I bulk update users — Zendesk help
  5. 6 About custom objects — Zendesk help
  6. 7 Bulk importing user data with the data importer — Zendesk help
  7. 8 How do I format the date field in Sell — Zendesk help
  8. 9 About custom ticket fields — Zendesk help
  9. 10 About lookup relationship fields — Zendesk help
  10. 11 About custom fields and custom field types — Zendesk help
  11. 12 About custom objects — Zendesk help
  12. 13 Announcing parent-child relationships and roll-up summary fields for custom objects — Zendesk help
  13. 14 Legacy custom objects deprecation — Zendesk help
  14. 16 How can I fix the UTF-8 error when bulk uploading users — Zendesk help
  15. 18 Testing changes in your standard sandbox — Zendesk help
  16. 19 About the data importer — Zendesk help
  17. 20 Bulk importing user data (legacy) — Zendesk help
  18. 21 Errors when importing users or organizations — Zendesk help
  19. 22 About ticket import limits — Zendesk help
  20. 23 Account usage limits — Zendesk help
  21. 27 Zendesk Sandbox — Zendesk
  22. 28 Migrating existing content to your help center — Zendesk help
  23. 29 Allowing attachments in tickets — Zendesk help
  24. 30 Attachment limits in help center — Zendesk help
  25. 31 Managing data storage in your Zendesk account — Zendesk help
  26. 32 Reviewing the ticket audit trail — Zendesk help
  27. 33 We talk a lot about switching from Zendesk, but nobody talks about the Data Ransom phase — r/SaaS
  28. 36 What if you accidentally delete data in Zendesk — r/Zendesk

Need help running this migration?

FlitStack AI runs Zendesk migrations end-to-end.

Fixed-fee pricing, a hands-on migration engineer, full field mapping and validation. The work described in this guide — done for you.