Section 01
Why teams migrate to Zoho Desk
The four shapes a Zoho Desk migration takes, and what makes the platform easier — or harder — than the category average.
Zoho Desk is the customer-support product inside Zoho Corporation's broader suite. Zoho was founded in 1996 by Sridhar Vembu and Tony Thomas and is headquartered in Chennai, India 1. Desk sits alongside Zoho CRM, Books, Projects, Campaigns and forty-plus sibling apps inside the Zoho One bundle, and it is the destination most often reached for by teams already invested in the Zoho ecosystem.
The typical Zoho Desk customer is a 10-to-200-agent support team buying on bundle economics and per-agent price. The Enterprise tier maxes out around €40 per agent per month — roughly a third of Zendesk's equivalent tier and meaningfully below Freshdesk's top plans. Teams already running Zoho CRM, Zoho Books or Zoho Projects get tight native integration that removes one of the larger setup-tax line items.
The shapes of migration that land on Zoho Desk tend to fall into four patterns. First, Zendesk exits, driven by per-agent pricing — Zendesk's mid-and-upper tiers sit at roughly $55 to $150+ per agent per month, and teams cite total-cost-of-ownership savings as the headline trigger. Second, Freshdesk consolidations, where teams already on other Zoho products fold support into the same suite 10.
Third, suite consolidation inside Zoho One — replacing a Zendesk-plus-Intercom-plus-knowledge-base stack with Desk plus SalesIQ plus the built-in Knowledge Base. Fourth, legacy ManageEngine / ServiceDesk Plus or shared-inbox replacements, where the source is an on-prem or email-only system and the project is really a re-architecture. Zoho's Zwitch service explicitly names Zendesk, Freshdesk, Salesforce Service Cloud, HappyFox and Help Scout as common source platforms 10.
What makes migrating *to* Zoho Desk easier than the category average is the dual import path. The native Import wizard accepts a single zipped CSV bundle covering Tickets, Contacts, Accounts, Agents, Tasks, Events, Calls, Custom Modules and Knowledge Base articles in one upload 11. On top of that, Zwitch — Zoho's free assisted-migration service at [email protected] — handles transfers from Zendesk, Freshdesk and a dozen other sources, with uploads up to 10 GB 10.
What makes it harder than the average is the Department-centric model, which forces every Ticket, every Layout, every Workflow Rule and every SLA to belong to a specific Department before import; the 30 MB / 10,000-row ceiling per CSV file in the native wizard; and a Created Time field that is system-managed on most modules and cannot be overwritten through the standard import path 1124.
Workflow Rules, Assignment Rules, Macros, Blueprint state machines and SLA escalations do not import — they are rebuilt from documentation. CSAT history via Happiness Ratings is similarly not migratable as historical scores. Teams that scope the rebuild work up front finish on time; teams that assume parity do not.
Zoho Desk's import is fast when the CSV bundle is clean and the Department/Layout/Agent scaffolding is built first — every shortcut on that scaffolding costs you in skipped rows.
Section 02
The Zoho Desk data model you need to map into
Departments, Layouts, Threads, Custom Modules, and the duplicate-check fields you'll wire on every record — the destination schema decoded.
Zoho Desk is organised around the Department — the platform's primary organising unit, equivalent to what other helpdesks call a Brand or Workspace. A Department owns its own Layouts, Workflow Rules, Assignment Rules, SLAs, Macros, Blueprint processes and Knowledge Base sections. A Ticket belongs to exactly one Department; a Contact and Account can be shared across all Departments 11.
Before mapping any source field, you need to know which destination module the row belongs in, which Department + Layout it inherits, and which value will serve as its match key. The table below summarises the modules a Zoho Desk migration will touch 1137.
| Object | Stores | Required on import | Tier |
|---|---|---|---|
| Tickets | Customer support requests across all channels | Subject, Contact, Department | All paid editions |
| Threads | Email replies and inbound channel messages on a Ticket | Ticket reference, Author, Direction, Content | All paid editions |
| Ticket Comments | Private notes and public comments by agents | Ticket reference, Author, Content | All paid editions |
| Contacts | End-customer records (the requester on Tickets) | Last Name, Email | All editions |
| Accounts | Customer organisations (parent of Contacts) | Account Name | All editions |
| Agents / Teams | Internal support users and team groupings | Email, Last Name, Department membership | All editions; light users on lower tiers |
| Knowledge Base Articles | Help Center content (categories, sections, articles, translations) | Title, Section, Status (draft / publish / review) | All paid editions |
| Products / Tasks / Events / Calls | Catalogue and activity records on Tickets | Per-module — see field requirements | All paid editions |
| Custom Modules | Customer-defined record types tied to a Department | Schema defined first; per-field requirements | Enterprise only |
Records get matched on import by what Zoho Desk calls duplicate-check fields. The default is Email on Contacts and Agents and Account Name on Accounts. Ticket matching is more nuanced — the wizard treats every ticket row as new unless you provide an explicit external identifier mapped against the Ticket Number custom field or a *Ticket External ID* you have created and marked unique 11.
Tickets, Knowledge Base Articles and Custom Modules do not carry a natural foreign-key — create a custom single-line field (commonly external_id), mark *Do not allow duplicate values*, and populate from the source platform's primary key. This becomes your reconciliation anchor and lets re-imports be idempotent rather than additive 70.
Custom field types determine validation, storage and edition availability. The wizard accepts string, decimal, integer, currency, checkbox, picklist, multi-line and date / date-time fields on Contracts, Time Entry, Agents, Tickets, Contacts, Accounts, Products, Calls, Tasks and Events 79. Custom fields are scoped to a Department — a custom field created on Tickets in the Sales Department is not available on Tickets in the Support Department unless explicitly added there 7.
| Field type | Limits | Notes |
|---|---|---|
| Single-line text | 255 characters | Plain string; can be marked unique 70 |
| Multi-line (small / large / rich) | 2,000 / 32,000 / 50,000 chars | Encryption supported on small only; large not filterable 71 |
| Number / Decimal / Currency / Percent | Up to 16 digits | Currency respects org base currency setup |
| Date / Date-Time | Org timezone | Date format must match org locale or row rejects 43 |
| Picklist (single-select) | Per-edition value count limit | Reference value can differ from display label |
| Multi-Select Picklist | Per-edition value count limit | Array format on import, e.g. [tag1,tag2,tag3] 149 |
| Checkbox / Boolean | True / false only | Stored as 1 / 0 |
| Lookup | One target module per field | Populated by parent ID or unique field value |
| Custom field scope | Per Department, per module | Adding to second Department requires explicit re-creation 7 |
Relationships in Zoho Desk are modelled mostly as Lookups. A Ticket has Lookups to one Contact, one Account, one Product, one Department and one Layout. The platform also ships a Parent-Child Ticketing extension that links a parent Ticket to one or more child Tickets — useful for incident grouping but not the same as a generic many-to-many relation 50. Cascade delete is not native: deleting a parent record nulls the child Lookup rather than removing the child 51.
Custom Modules participate in Lookups the same way standard modules do, with identical match semantics. They are Enterprise only, and their schema, Layouts and unique-ID fields must exist on the destination Department before any record can be imported 737. There is no global cross-Department custom module — a Custom Module created in one Department is invisible to records in another.
Section 03
Pre-migration prep — the work before you touch Zoho Desk
What must be true on the source, the destination, and across the team before the first row hits the Import wizard or Zwitch queue.
The single best predictor of a clean Zoho Desk migration is how much work happens on the source side before the first import button is pressed. Zoho's Assisted Migration Guide devotes most of its prep checklist to source-side hygiene — file naming, mandatory-field coverage, agent provisioning, picklist value alignment — because the wizard rejects rows quietly on any mismatch and surfaces the reasons only in Import History 45.
Build the Departments, Agents and Layouts first. The data lands cleanly when the destination scaffolding already exists; it lands in the default Department and reassigns to the import user when it doesn't.
Treat the source export as raw material that must be shaped to Zoho Desk's expected formats — agent assignments resolved to a Zoho Desk email or Agent ID, ticket-status values converted to the Department's status picklist, tags formatted as array-bracketed lists, dates rewritten in the org locale format, and CSV files saved as UTF-8.
Source-side prep
- Audit and dedup the source database before export. Zoho Desk's wizard offers Skip / Overwrite / Clone behaviour for duplicates 48, but catching case-only email duplicates and trailing-whitespace duplicates in the source is faster than reconciling them inside Desk.
- Convert source ticket-status values to the destination's status picklist in every Department. Article Status, for example, only accepts
draft,publishorreview— anything else rejects the row 149. Status, Priority, Classification and any Custom Picklist on Tickets all need the same alignment. - Save every CSV as UTF-8 before zipping. Excel saves CSVs as Windows-1252 by default on Western locales; non-UTF-8 produces mojibake on accented characters and full row rejection on Asian-language records 47.
- Stamp a stable external ID on every Ticket, Article and Custom Module record in the source export — a UUID or the source platform's primary key. This is the value you populate into the destination's external-ID custom field and use as your reconciliation anchor 70.
- Format tags in array brackets —
[urgent,high priority,refund]— separated by commas inside square brackets, on every Ticket row that carries tags 149. The wizard rejects unbracketed comma-separated tag values.
Destination-side prep
- Create a Sandbox from *Setup → Data Administration → Sandbox* on Enterprise. Sandbox supports change-set deployment back to production for Layouts, Layout Rules, Validation Rules, Fields, Assignment Rules, Workflow Rules, Macros, Skills, Blueprint and Supervise rules 4041.
- Build every Department that will own imported Tickets — Departments are the top-level container, and Tickets land in the default Department if the *Department* column on the import file is missing or unmappable 149.
- Provision Agents with the same email addresses they used in the source system. The wizard maps imported Agent rows to existing users when the email matches; unmatched agents need the *Add New Agent* dialog under *Setup → Agents* before import to avoid Ticket Owner falling back to the import user 45152.
- Pre-create every custom field per Department per module with the right type — Field Type cannot be changed after creation, so a Text field created when an Integer was needed has to be deleted and recreated 9.
- Build Layouts, Layout Rules and Validation Rules before importing Tickets — Validation Rules trigger on all fields during an update, even untouched ones 42, which can cascade rejections across rows that should otherwise be valid.
People prep
Cutover only works if humans cooperate. Lock down a source-system freeze window — 24 to 72 hours, longer for live chat and phone — and communicate it to every team. Train agents on Zoho Desk's daily-workflow patterns, Blueprint transitions and Help Center publishing flow before go-live. A clean Zendesk-to-Desk move under 25,000 Tickets often lands inside two business days via Zwitch; a Salesforce Service Cloud migration with Custom Modules and KB translations runs two to four weeks 10.
Section 04
Import mechanisms: native wizard and Zwitch
Two paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at the ZIP-size ceiling.
Zoho Desk exposes two load paths and the right one depends on dataset size, channel mix, and whether the load must be re-run idempotently. The native Import wizard handles most loads under 10,000 rows per file. Zwitch, Zoho's assisted Bulk Data Migration service, handles large source-helpdesk transfers end-to-end.
Native Import wizard
The native Import lives at Setup → Data Administration → Import 11. It accepts a single ZIP file containing one CSV per module — Tickets, Contacts, Accounts, Agents, Products, Tasks, Events, Calls, Custom Modules and Knowledge Base Articles all in one upload 1145. Naming matters: the CSV name must match the destination module (e.g. Tickets.csv, Contacts.csv) for auto-mapping to fire; mismatched names land in the *Unmapped Files* bucket and need manual drag-to-mapped.
Hard limits: the ZIP upload caps at 30 MB total, each CSV inside caps at 10,000 rows, and only the .csv format is supported inside the bundle 11. Domain-mapped portals additionally need third-party cookies enabled in the agent's browser, or the upload throws a session error. The wizard runs a sample of the first few rows for field-mapping review before committing, and surfaces an Error Log per file under *Completed with error* in Import History.
Duplicate handling is per-record: the wizard offers Skip (existing row wins, new row dropped), Overwrite (new row replaces existing values; new fields added if mapped) and Clone (a duplicate is created alongside the existing record) 48. The right call: the native Import for one-shot loads under 10,000 records per module, or any time the Departments and Layouts are fully built and the dataset fits the ZIP ceiling.
Zwitch — assisted Bulk Data Migration
Zwitch sits under *Setup → Data Administration → Data Migration* and is the larger-scope tool. It is operated by Zoho's in-house migration team, not self-serve: you submit a request describing source platform and dataset, the team queues the job, and the migration runs in two phases — Initial Migration (Phase 1, all data in bulk) and a follow-up Delta phase that captures changes from your test-import window 10.
Zwitch accepts file uploads up to 10 GB, with larger volumes routed through [email protected] 10. The service explicitly supports Zendesk, Freshdesk, Salesforce Service Cloud, HappyFox, Help Scout and many other source platforms 10. Migration cancellation is only allowed while the request status is Submitted in Queue; once the team has started, the run completes before changes are accepted.
Third-party staging tools
Tools like Help Desk Migration (the Migration Wizard SaaS at help-desk-migration.com), ClonePartner and KingswaySoft's SSIS components sit between source and Zoho Desk. They handle file generation, mapping and submission against the destination, and are often used where a customer warehouse holds the cleaned data and the tool feeds Desk. Pricing typically scales by record count.
Under 10,000 records per module and standard modules → native Import wizard. 10,000–500,000 records or KB articles with translations → Zwitch. Over 500,000, any Custom Modules, or any re-runnable load → a third-party Migration Wizard tool.
Section 05
Mapping your data into Zoho Desk
The longest section — because field mapping is where almost every Zoho Desk migration that fails actually breaks.
Mapping is where every helpdesk migration earns its scars. The decisions in your mapping spreadsheet determine whether agents trust ticket history on day two, whether SLA reports work on day five, and whether the Help Center has the right articles on day thirty.
Work module by module in import order: Agents first (so Ticket Owner resolves), then Accounts (so Contacts can associate), then Contacts (so Tickets can reference), then Tickets, then Threads and Ticket Comments, then Tasks and Calls, then Knowledge Base Articles, then Custom Modules. The Zoho assisted-migration checklist enforces this order through its file-pattern naming (Agents_XX.csv, Accounts_XX.csv, Contacts_XX.csv, Tickets_XX.csv, Threads_XX.csv, TicketComments_XX.csv) 45.
Contacts and Accounts
Common source → Zoho Desk Contact mapping
- email→Email (duplicate check field)
Lowercased pre-import; primary match key on upsert
- first_name / last_name→First Name / Last Name
Last Name is mandatory on Contacts and Agents 45
- phone / mobile→Phone / Mobile
Normalise to E.164; no enforced format
- company / organisation→Account Name (Lookup)
Import Accounts first; populate Lookup by Account Name or ID
- created_at→Custom Date-Time field (Legacy Created Date)
Created Time on Contacts is system-managed 24
- external system primary key→External ID (custom single-line, marked unique)
Reconciliation anchor for re-runs 70
Ticket history — threads, comments, status, priority, channel
Tickets are the centre of any helpdesk migration, and Zoho Desk splits a Ticket's conversation into three related records: the Description (set at ticket creation), one or more Threads (email replies, chat messages, social inbound — the customer-facing conversation), and Ticket Comments (private notes between agents, plus public comments) 121. A faithful migration moves all three.
The assisted-migration file pattern reflects this: Threads_XX.csv carries threadExtId, ticketExtId, author, direction (Inbound / Outbound), content (HTML supported), and createdTime; TicketComments_XX.csv carries commentExtId, ticketExtId, author, content, isPublic (true / false), createdTime 45. Threads accept the original timestamp in the createdTime field — this is one of the few places where backdating works natively rather than via a Legacy custom field.
Common source → Zoho Desk Ticket mapping
- ticket_id / case_number→Ticket Number / External ID
Built-in Ticket Number is auto-assigned; carry the source ID in a custom External ID 149
- subject→Subject
Required; truncated to 255 chars
- status→Status (picklist per Department)
Must exist on Department's Status picklist — Open, On Hold, Closed, etc. 42
- priority→Priority
Picklist; map Low / Medium / High to destination values
- channel / source→Channel
Email, Web, Phone, Chat, Twitter, Facebook, Forum, Forms
- assigned_to / owner→
- requester→Contact Name (Lookup)
Import Contacts first; populate by email or Contact ID
- department / brand→Department
Mandatory; falls back to default Department if unmapped 149
- tags→Tags
Array bracket format on import: [urgent,refund,billing] 149
- created_at→Custom Date-Time (Legacy Created Date)
Created Time is system-managed; original date import requires support ticket 158
Knowledge Base — articles, categories, translations
Zoho Desk's Knowledge Base is structured as Categories → Sections → Articles, with each article carrying a Status of draft, publish or review 149. The native Import path is under *Setup → Data Administration → Import → Import Articles*, where you select the target Section and upload a CSV; Zwitch imports articles, sections and categories together when migrating from a supported source 10.
Translations are the trap: each translated article is a separate record linked to its master article via a language field. The Migration Wizard SaaS at help-desk-migration.com explicitly lists *language versions of knowledge base articles* as a paid add-on for Zendesk, Salesforce Service Cloud, Intercom and Freshdesk source platforms — the native wizard handles primary-language articles, but multilingual stacks need either Zwitch or a third-party tool.
Article body is HTML — preserve formatting on export from the source. Inline images need to migrate as either external links or as Zoho-hosted media uploaded and then referenced in the article body. The migrate-inline-images-as-attachments option is available on Zwitch and on Migration Wizard for sources like Jira Service Management, HelpScout, Freshservice, Gorgias and HubSpot Service Hub.
Macros, Workflow Rules, Assignment Rules, Blueprint — rebuild, not migrate
Macros (one-click ticket updates such as Send Acknowledgement + Set Priority = High), Workflow Rules (time-based or event-based automations), Assignment Rules (routing to agents, teams, or skills), and Blueprint (visual state machines that enforce ticket-status transitions) do not import 120. Every one of them must be rebuilt from documentation in the destination Department under *Setup → Automation* and *Setup → Process Management*.
Sandbox helps here: build Macros, Workflows, Assignment Rules and Blueprint flows in a Sandbox copy of the destination, validate against the imported sample data, then deploy via change-sets to production 41. Zoho's pre-built Gallery Functions ship ready-to-use Deluge scripts for common patterns (Create CRM Contact for New Ticket, Auto-Merge Tickets with Identical Subject + Contact, Send Auto-Replies Outside Business Hours), which removes some rebuild surface 38.
SLAs, escalations, and CSAT history
SLAs in Zoho Desk are configured per Department under *Setup → Service Level Agreements*, with rule criteria (priority, channel, contact tier), response-time targets and escalation actions tier-gated to Professional and Enterprise editions 124. SLA timer values on existing tickets do not migrate — Desk recomputes SLA targets at the moment a ticket is created or reopened against the rules in force at that moment.
CSAT history via Happiness Ratings is similarly not migratable as historical scores. If you need historical CSAT for reporting continuity, the pattern is to create custom number and text fields on the Ticket (Legacy CSAT Score, Legacy CSAT Comment) and populate from the source export. Going forward, Desk's native Happiness Ratings collects new responses through the Help Center and email-signature widget.
Multi-channel inbox — email, web forms, chat, phone, social, ASAP
Zoho Desk handles inbound channels through *Setup → Channels*, configured per Department: Email (forwarding or SMTP/IMAP); Web Forms generated under *Setup → Channels → Web Forms* and embedded on customer sites; Chat through Zoho SalesIQ; Phone through Zoho Voice or third-party telephony (JustCall, Twilio, RingCentral); Social through Twitter, Facebook, Instagram; and the ASAP embeddable customer self-service widget that exposes Knowledge Base + ticket submission directly inside a product or website 97.
Channel configuration does not migrate — the inboxes, forwarding rules, web-form code snippets, chat-widget keys and phone numbers are all re-provisioned in the destination Department after the data load. Critically, do not switch DNS or email forwarding to Desk until the import is validated, or you will get new tickets landing in an unvalidated environment alongside the migrated history.
Files and attachments
Attachments do not import in the CSV flow. The supported paths are: (a) Zwitch, which transfers attachments with their parent Ticket as part of the assisted migration; or (b) external storage links in a custom URL field. Maximum file upload size is 1 GB per attachment 99, with external file sharing supported via Zoho WorkDrive. Email-template attachments cap at 3 MB across files.
Attachment Control under *Setup → Security and Compliance* lets admins restrict file types 101 — apply these rules after the import, not during, or ingestion may fail on blocked types. For large attachment estates (hundreds of GB of call recordings or signed PDFs), the pattern most teams adopt is: migrate the most-referenced subset inline via Zwitch, and store the rest in S3 or WorkDrive with deep links in a custom URL field.
Audit trail, ownership and original timestamps
Zoho Desk's standard Created Time and Modified Time fields are system-managed on most modules and cannot be overwritten on import — they stamp to the moment the row was processed 156. The historical Created Time and Closed Time can be imported, but only via the assisted route by emailing [email protected] and requesting the system override — it is not a self-serve option in the wizard 158.
Ticket Owner during import requires the agent's email address or Agent ID, not the agent's name. Rows that name a non-existent agent silently fall back to the import-running user as Ticket Owner 152. The same fallback applies to Created By and Modified By on records — without a pre-existing matching agent, every imported row credits its work to whoever ran the import 152.
Audit Log under *Setup → Privacy and Security → Audit Log* captures Add, Update, Delete, Export, Download and channel-availability actions per user, with date, IP address, Department and Entity 131. Audit log export is available as CSV for up to 30 days at a time, capped at 50 exports per day per admin 150. There is no native bulk export of three years of audit history — long-horizon compliance archives need to be built incrementally.
Section 06
The pitfalls that derail Zoho Desk migrations
Eight specific failure modes — ranked by impact, each tied to the exact Zoho Desk mechanism that breaks.
High impact
ZIP and per-CSV ceiling silently fragments the migration
Zoho Desk's native Import wizard caps every upload at a single ZIP file of 30 MB total, with each CSV inside capped at 10,000 rows 11. Teams with 80,000 Tickets discover they cannot use the wizard at all without splitting into eight batches. The split has to be stable — agent emails, status values and external IDs consistent across batches — or downstream Threads and Comments files fail to associate. The fix is to route through Zwitch (10 GB) or a specialist migration tool with explicit batch tracking. 11
High impact
Ticket Owner falls back to import user on unmatched agent email
Zoho Desk resolves the Ticket Owner column against existing Agent email or Agent ID at import. Rows naming an agent who is not yet provisioned silently import with the import-running user as Ticket Owner, not the intended owner 152. The same fallback hits Created By and Modified By 152. The downstream effect breaks agent-based reports, Assignment Rules and workload dashboards. Pre-provision every agent — including deactivated agents if you need their historical attribution — before the first row goes in. 152
High impact
Created Time and Closed Time stamp to import day on the standard path
Standard Created Time and Modified Time on Tickets, Contacts and most Desk modules are system-managed and cannot be overwritten through the wizard — they stamp to the moment the row was processed 24156. Original timestamps can be imported, but only via the assisted route by emailing [email protected] 158. Teams discover this on day two when SLA reports filtered by Created Date return everything stamped to import day. Mitigation: create Legacy Created Date custom Date-Time fields on every module. 158
High impact
Custom field scoped to one Department invisible in another
Custom fields in Zoho Desk are scoped to a Department and a module within that Department 7. A cf_account_number field created on Tickets in Sales is invisible to Tickets imported into Support unless explicitly recreated there. Multi-Department migrations that assume custom-field portability discover the gap when half the dataset imports with the value populated and the other half drops it as unmappable. Mirror the custom-field schema across every Department that will receive Tickets before import. 7
High impact
Macros, Workflow Rules, Assignment Rules and Blueprint do not import
Every automation in Zoho Desk — Macros, Workflow Rules, Assignment Rules, Skills, SLAs, Blueprint state machines — is configuration, not data, and none of it migrates from the source 10120. Teams that scope as a data migration consistently underestimate the rebuild work. A Zendesk source with 60 triggers, 20 macros and 8 SLA policies typically translates to two-to-three weeks of Sandbox configuration before a single ticket should be routed live. Document every automation in discovery and budget the rebuild explicitly. 120
Medium impact
Validation Rules trigger on untouched fields during update
Zoho Desk validation rules fire on all fields during an update, not just fields modified in the current edit 42. Practitioners discover this when a bulk update — including the Overwrite mode of the importer — triggers validation cascades against fields that were never in the source CSV but happen to violate a Rule because of legacy bad data. The result is partial-failure imports with cryptic per-row errors. Audit Validation Rule criteria before bulk operations, and disable non-critical Rules for the import window. 42
Medium impact
Character encoding corruption on non-UTF-8 CSV
Zoho's troubleshooting docs explicitly call out character encoding as a recurring import failure mode — non-UTF-8 CSVs produce garbled accented characters or full row rejection 47. Excel saves CSVs as Windows-1252 by default on Western locales and as Shift-JIS or GBK on Asian locales. Always export source data as UTF-8 explicitly (Excel: *File → Save As → CSV UTF-8*), and verify a sample row through a text editor before zipping. The error message itself is unhelpful — a single mojibake character drops the row. 47
Medium impact
Tags rejected unless wrapped in array brackets
Tags on Tickets must be entered in array format on import — each tag separated by a comma and the full set wrapped in square brackets, e.g. [urgent,high priority,refund] 149. Source exports that produce unbracketed comma-separated tags (urgent,high priority,refund) silently lose the tag column on those rows. Article Status has its own narrow allow-list — only draft, publish and review are accepted 149. Apply both transforms as part of the pre-export cleanup, not after the rejection report. 149
Low impact
Regional data centre cannot be flipped after account creation
Zoho operates regional data centres for US, EU, India, Australia, China and Japan, each at its own subdomain (desk.zoho.com, desk.zoho.eu, desk.zoho.in) 147. Accounts are pinned at signup and there is no self-serve cross-region migration. If your target is an account created in the wrong region (a common mistake for EU customers whose admin signed up from a US IP), plan the regional migration via Zoho support first — otherwise you will move all your tickets twice 147. 147
Section 07
Validation and cutover
What to verify after the import job, in what order — and how to fail safely when something is wrong.
Validation is the bridge between the import finishing and agents being allowed in. The pattern that works on Zoho Desk is three stages: a Sandbox or Sample Migration dry-run on 5–10 percent of tickets with stakeholder spot-checks; a production load with real-time monitoring of Import History per module; and a 30-day post-migration data-quality audit. Department leads verifying their own tickets is the most reliable signal — they know what right looks like.
Build a reconciliation queries spreadsheet that compares source and destination counts. Anything outside a 0.5 percent variance gets investigated before agents get login access.
- Total Tickets per Department per Status imported vs source — the wizard's Import History under *Setup → Data Administration → Import History* lists added, updated and skipped counts per file, retained for 60 days 136.
- Total Threads and Ticket Comments per Ticket vs source — a major gap signals that thread/comment association via ticketExtId broke during import.
- Total Contacts and Accounts vs source, minus deliberately excluded rows (role-based emails, archived accounts, opt-outs).
- Knowledge Base Article count per Category per Section vs source — and Status (
draft/publish/review) distribution to confirm publication state round-tripped. - Agent ownership distribution — group by Ticket Owner and confirm no Department landed with the import-running user owning the majority of tickets (the silent fallback signature 152).
- Tag coverage — count distinct tags imported vs source, and inspect tickets where tag values look truncated (the array-bracket transform failed).
- Attachment count per Ticket vs source — Zwitch reports this in its migration report; native-wizard migrations must reconcile by spot-checking the Attachments tab on a sample.
On top of reconciliation, run a manual spot-check protocol: pick 30 random Tickets across Departments and verify every field plus the full Thread + Comment graph against the source UI. Trace five high-priority Tickets end-to-end, including attachments and Contact / Account associations. If a discrepancy shows up in three or more of the 30, halt the load, fix the root cause, and re-import the affected rows by external ID.
Zoho Desk ships an Undo / Revert option in Import History — successful or completed-with-error imports can be reverted within two weeks 130. The catch is that only created records can be undone; updated records cannot, because original values are not retained. Mixed Create / Update imports support partial revert only on the Create side 130. Beyond two weeks, stamp every imported row with a custom *Import Batch ID* field and bulk-delete by that ID if catastrophe strikes.
Audit Log under *Setup → Privacy and Security → Audit Log* tracks every Add, Update, Delete and Export action per user with timestamp and IP, retained on a rolling window 131. Export to CSV is capped at 30 days per export and 50 exports per day per admin 150. For long-horizon compliance, build a scheduled export to your own storage rather than relying on in-product retention.
Cutover sequencing: (1) source goes read-only; (2) final delta export captures changes from the test-import window; (3) delta is imported via Zwitch Phase 2 or the same wizard flow; (4) reconciliation runs against the delta; (5) channel cutover — email forwarding, web-form snippets, ASAP widget keys and chat / phone routing are switched to Desk; (6) agents get login access with a 48-hour hyper-care window; (7) source decommission is scheduled 30 to 90 days out, never same-day.
Section 08
Migration partners and tools
Authorized Zoho Partners, Zwitch, specialist migration SaaS — what each is good for and how to choose.
The Zoho Partner Program credentials Authorized, Advanced and Premium Partners through certifications, customer count and revenue tiers, and exposes them through *Find a Zoho Partner* at zoho.com/partners 116. For Zoho Desk migrations specifically, partners with explicit Zendesk-to-Desk, Freshdesk-to-Desk or Salesforce Service Cloud-to-Desk practices tend to ship cleaner than generalist implementation shops.
Zoho also runs Zwitch, the in-house Bulk Data Migration service at [email protected] 10. Zwitch is typically included at no incremental fee on Enterprise contracts and handles end-to-end transfers from Zendesk, Freshdesk, Salesforce Service Cloud, HappyFox, Help Scout and other sources, with uploads up to 10 GB. The trade-off is throughput — the in-house team is best for clean schemas; deeper Custom Module work, multi-language KB and CSAT preservation tend to land with certified partners.
On the specialist-SaaS side, Help Desk Migration (the Migration Wizard at help-desk-migration.com) and ClonePartner both expose self-serve and assisted Zoho Desk migration flows with paid add-ons for KB translations, inline-images-as-attachments, and migration of side conversations and call recordings. They are commonly used where the source platform is supported but the dataset has shape constraints (multilingual articles, very large attachment estates) that the native wizard cannot handle.
For ongoing post-migration sync — keeping Zoho Desk in step with Zoho CRM, Books, Projects or external systems — Zoho's own integrations and the Deluge custom-function layer cover most patterns, with Workato, Make and Zapier filling the gap on third-party tools.
Managed-migration cost ranges vary widely. A clean Freshdesk-to-Desk or HappyFox-to-Desk move under 25,000 Tickets with standard modules and no KB translations often lands in the $2,500–$8,000 range with setup fee plus per-module pricing on a specialist SaaS, or runs through Zwitch at no incremental fee on Enterprise. A Zendesk-to-Desk project with Custom Modules, multilingual KB and integration re-pointing typically runs $15,000–$80,000, driven by ticket volume, attachment depth, language count and source-automation rebuild scope.
For teams that want to outsource the migration end-to-end, FlitStack specialises in Zoho Desk migrations and handles the Department + Layout + Agent scaffolding, picklist alignment, External ID match-key wiring, Threads-and-Comments association, the Created-Time-to-Legacy-Date pattern, Macro / Workflow / Blueprint rebuild scoping, and the validation work described in Sections 5 and 7. Pricing is fixed-fee by ticket count and source platform, with separate line items for KB translations, Custom Modules and CSAT depth.
This is one of several legitimate paths — the right choice depends on whether the team wants a Premium Partner, Zoho's in-house Zwitch service, a specialist migration SaaS, or a fixed-fee vendor. Explore FlitStack →
Section 09
Frequently asked questions
The seven questions every Zoho Desk migration team works through before they sign the scope.
References
Sources
- 1 Zoho Desk — Wikipedia
- 7 Managing Fields — Zoho Desk Online Help
- 9 Types of Custom Fields — Zoho Online Help
- 10 Migrate Data From Other Help Desk Servers to Zoho Desk (Zwitch) — Zoho Desk
- 11 Importing Data in Zoho Desk — Online Help
- 24 Import Created Time and Modified Time — Zoho Community
- 37 Zoho Desk Pricing & Editions
- 38 Gallery and Customized Functions — Zoho Desk Knowledgebase
- 40 Sandbox feature for Zoho Desk — Zoho Community
- 41 Working with Sandbox in Zoho Desk — Online Help
- 42 Validation Rules Trigger on Untouched Fields — Zoho Cares
- 43 Date Field Import Error — Zoho Cares
- 45 Assisted Data Migration Guide — Zoho Desk Knowledgebase
- 47 Character encoding on import (UTF-8 requirement) — Zoho Community
- 48 Import Data (Skip / Overwrite / Clone behaviour) — Zoho Desk
- 50 Understanding Parent-Child Ticketing System — Zoho Cares
- 51 Cascading deletes (lookup nulled, not cascaded) — Zoho Cares
- 70 Mark a Field as Unique — Zoho
- 71 Multi-line field types (small / large / rich) — Zoho
- 97 Omnichannel call center software — Zoho Desk
- 99 Attachment size — 1 GB max — Zoho Cares
- 101 Attachment Control for File Security — Zoho Desk
- 116 Work with a Zoho Partner — Zoho Partner Program
- 120 Creating and Using Macros — Zoho Desk
- 121 Ticket Views — Thread and Conversation Nested — Zoho Desk
- 124 Zoho Desk Feature Availability and SLA Tier-gating
- 130 Reverting Import — Zoho Desk (two-week window)
- 131 Monitoring Audit Log — Zoho Desk
- 136 Import History — Confirm or Undo Imported Data — Zoho Desk
- 147 Where your data is stored — Zoho data centers (US/EU/IN/AU/CN/JP)
- 149 Import file format rules — tags array brackets, agent identifiers, article status
- 150 Audit Log export limits (30 days, 50/day) — Zoho Desk
- 152 Migration — Owner / Created By / Modified By fallback to import user — Zoho Community
- 156 Unable to update Created Date/Time even via upsert — Zoho Cares
- 158 Original Created Time and Closed Time import via assisted route — Zoho Community
Need help running this migration?
FlitStack AI runs Zoho Desk 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.