Zendesk to Zoho Desk Migration: API Limits, Data Mapping & Methods
Complete guide to migrating Zendesk to Zoho Desk covering API rate limits, Zwitch limitations, field-by-field data mapping, and methods to avoid losing tags, inline images, and thread history.
Migrating from Zendesk to Zoho Desk is a data-model translation problem disguised as a platform switch. Zendesk organizes support around tickets with structured comments, side conversations, tags, and custom field types that do not have direct equivalents in Zoho Desk. Zoho Desk organizes support around tickets too — but with different thread structures, a department-centric hierarchy, and a credit-based API system that behaves nothing like Zendesk's rate-limited endpoints.
If you need a fast decision: Zwitch (Zoho's native migration tool) works for straightforward moves where some data loss is acceptable. CSV export is not a full migration method — it omits ticket comments and descriptions. API-led migration is the only safe path when you care about authorship, attachment fidelity, tags, inline images, or cutover without post-migration cleanup.
This guide covers the exact API constraints on both sides, a field-by-field mapping table, the specific limitations of Zwitch, and a direct comparison of migration methods — so you can pick the approach that matches your data volume and risk tolerance.
For a general framework on mapping fields between helpdesks, see Your Ultimate Guide to Data Mapping for a Flawless Helpdesk Migration.
Why Zendesk to Zoho Desk Migrations Lose Data
Data loss in a Zendesk to Zoho Desk migration rarely looks like a catastrophic failure. It looks like a completed import where agents open old tickets and find inline screenshots missing, tags gone, and every thread reply incorrectly marked as "Incoming."
The root cause is structural divergence between the two platforms. Zendesk exposes side conversations, satisfaction ratings, ticket audits, and metric events as first-class API objects. Zoho Desk has no native equivalents for most of these. When a migration tool — including Zoho's own Zwitch — encounters an object with no 1:1 target, it either drops the data or reshapes it in ways that break context. (help.zoho.com)
Three specific failure modes cause the most damage:
- Inline images are not migrated by Zwitch. Zoho's documentation states that inline images will remain visible only while the Zendesk account is active. Once you deactivate Zendesk, every inline image in every migrated ticket breaks permanently.
- Tags, groups, teams, and collaborators are not migrated. If your Zendesk workflows depend on tags for routing, reporting, or automation triggers, that operational context vanishes on import.
- Thread direction is flattened. All thread replies from Zendesk tickets are marked as "Incoming" in Zoho Desk, destroying the distinction between agent responses and customer messages. Thread replies without
fromortoaddresses are assigned to the organization admin and mapped to the Help Center channel.
Destination-side behavior changes are easy to miss in testing. Missing contacts can block ticket import entirely. Missing assignees cause the migration admin to become the ticket owner. Missing comment authors cause comments to be attributed to the admin who submitted the request. Those are not cosmetic changes — they affect search, reporting, ownership, and auditability. (help.zoho.com)
Ticket-count parity after migration is not a useful success metric. A migration can recreate the right number of tickets and still lose the internal context agents need to handle reopened cases.
For a deeper look at common migration pitfalls, see Common Helpdesk Migration Mistakes and How to Avoid Them.
Zendesk Export Limits: The 10 Requests/Minute Bottleneck
Every migration from Zendesk starts with data extraction, and every extraction hits the same wall: Zendesk's Incremental Export API is limited to 10 requests per minute, regardless of your plan tier. This limit applies to the cursor-based incremental export endpoints for tickets, users, and organizations. Exceeding this limit returns a 429 Too Many Requests error. (developer.zendesk.com)
The High Volume API add-on (available on Growth plans and above, minimum 10 agent seats) increases this to 30 requests per minute for incremental exports. Enterprise Plus plans include this add-on by default.
The 10 req/min limit applies only to incremental export endpoints. Fetching individual ticket comments, attachments, and side conversations uses the standard API, which has separate per-plan limits (e.g., 200 req/min on Team, 400 on Growth). But for bulk data extraction, the incremental export bottleneck is the one that matters.
Why this limit compounds during migration
- Each incremental export page returns up to 1,000 tickets.
- Ticket comments and attachments require separate API calls per ticket.
- A Zendesk instance with 50,000 tickets and an average of 5 comments per ticket requires at least 50,000 additional API calls just for comments.
- At the standard API limit, extracting comments alone takes hours — before you start downloading attachments.
Attachment downloads are the hidden bottleneck. Each attachment is a separate binary download. Zendesk supports ticket attachments up to 50 MB, but Zoho's ticket-creation limit is 20 MB. Any Zendesk attachment between 20 and 50 MB is a translation problem before you write a single line of import code. (developer.zendesk.com)
ZIP export limitations
If you use Zendesk's built-in data export (ZIP files) rather than the API, be aware of these constraints:
- Account exports are not enabled by default. The account owner must ask Zendesk support to enable them. The export UI is not available on Team plans, though the REST API remains available. (support.zendesk.com)
- JSON exports omit items with a system-generated timestamp within six minutes of the request. This creates a gap that requires a delta pass to close.
- Tickets exceeding 1 MB of data are exported without comments — a separate JSON file is emitted explaining that comments were excluded.
- CSV exports are not a migration format. They exclude deleted tickets, ticket comments, descriptions, multi-line text, multi-select fields, and custom date fields. CSV is a reporting snapshot, not ticket history.
- Zendesk recommends JSON exports for accounts with more than 200,000 tickets. Accounts over one million tickets are split into 31-day JSON increments.
The best extraction pattern for API-based migration is to pull ticket events with comment payloads, then fetch inline images separately:
# Incremental ticket events with comment data
curl 'https://{subdomain}.zendesk.com/api/v2/incremental/ticket_events?start_time=1710000000&include=comment_events'
# Per-ticket comments with inline images
curl 'https://{subdomain}.zendesk.com/api/v2/tickets/{ticket_id}/comments?include_inline_images=true'Zendesk marks inline attachments differently from normal file attachments, and inline images are not included in comment attachments by default — you must request include_inline_images=true. (developer.zendesk.com)
For advanced extraction techniques, see 3 Advanced Ways to Export Tickets from Zendesk.
Zoho Desk Import Limits: Credits, Concurrency, and Attachment Caps
The destination side has its own constraints. Zoho Desk does not use a simple requests-per-minute rate limit. Instead, it uses a credit-based system where each API call costs a specific number of credits, and your daily credit pool depends on your edition and user count. (help.zoho.com)
| Zoho Desk Edition | Base Credits + Per-User Credits |
|---|---|
| Free / Trial | 5,000 + 0 |
| Express | 25,000 + 100/user |
| Standard | 50,000 + 250/user |
| Professional | 75,000 + 500/user |
| Enterprise / Zoho One | 100,000 + 1,000/user |
Credits reset every 24 hours based on your data center's timezone. Creating a ticket costs 1 credit. Listing tickets costs 3 credits. Search operations cost 3 credits. Once your credits are exhausted, API calls fail with a 429 Too Many Requests response and a Retry-After header until the next reset.
Concurrency limits also apply — the maximum number of API calls that can be active simultaneously, ranging from 5 (Free) to 25 (Enterprise). Concurrency is shared across all OAuth-authenticated integrations for the portal, not per token or per client. That matters in real migrations: your import job competes with existing CRM syncs, marketplace apps, and custom integrations already running against the same Zoho org.
Pagination defaults to 10 records per request and usually tops out at 50 records per call for most listing endpoints. The tickets listing endpoint is a documented exception, supporting up to 100 tickets per call. Do not hard-code one global page size across all endpoints. (desk.zoho.com)
Attachment size limit: Zoho Desk enforces a 20 MB maximum attachment size for ticket creation. Zendesk attachments that exceed this limit will fail to import via the API. Workarounds include converting oversized attachments to secure cloud storage links (e.g., S3 or Google Drive) and embedding the URL in the ticket thread.
Custom field limits by edition: Zoho caps the total number of custom fields you can create — 50 in Standard, 150 in Professional, and 230 in Enterprise. Custom field labels are capped at 50 characters, and restricted characters are replaced with underscores. If your Zendesk build has years of organic field growth, you need a field consolidation pass before import or you will end up with renamed, truncated, or omitted fields. (help.zoho.com)
The practical implication: a Professional-edition Zoho Desk portal with 20 agents has roughly 85,000 daily credits. If each ticket creation costs 1 credit and each comment/thread creation costs another, migrating 40,000 tickets with comments could consume nearly your entire daily budget — before accounting for contact creation, attachment uploads, and validation queries.
Zendesk to Zoho Desk Data Mapping: What Zwitch Drops
Zoho's Zwitch migration tool is a free, built-in utility that ingests Zendesk's ZIP export files (the standard Tickets, Users, and Organizations exports from Zendesk's admin panel). Zoho's documentation says Zwitch also uses Zendesk APIs for custom fields and some knowledge base content, which is why Zoho instructs you not to close Zendesk immediately after export. (help.zoho.com)
Module-level mapping
| Zendesk Module | Zoho Desk Module |
|---|---|
| Ticket | Tickets, Ticket Comments, Threads, Attachments |
| User (agent) | Agents |
| User (end-user) | Contacts |
| Organization | Accounts |
| KB Sections, Root Categories, Article Translations | Knowledge Base (via API import) |
Field-level mapping
| Zendesk Field | Zoho Desk Field | Notes |
|---|---|---|
| Subject | Subject | Direct map |
| Description | Description | Direct map |
| Status | Status | Requires picklist value alignment |
| Priority | Priority | Requires picklist value alignment |
| Assignee | Assignee | Agent emails must match; missing agents fall back to migration admin |
| Requester | Contact | Contact must exist or ticket import fails |
| Group | — | Not migrated by Zwitch |
| Tags | — | Not migrated by Zwitch |
| Type | Classification | Manual mapping needed |
| Custom Fields | Custom Fields (cf_*) | Zwitch auto-creates fields, except nested custom fields |
| Ticket ID | Zendesk-ID (custom field) | Stored for cross-reference |
| Inline Images | — | Not migrated. Break when Zendesk is deactivated |
| Side Conversations | — | No Zoho Desk equivalent |
| Satisfaction Ratings | — | No direct equivalent |
| Collaborators | — | Not migrated |
| Department routing | Single department via Zwitch | Zwitch migrates all data into one department |
What Zwitch explicitly drops
Zoho's documentation confirms these items cannot be migrated via Zwitch: (help.zoho.com)
- Tags — If you use tags for routing, SLA assignment, or reporting, this data is gone.
- Groups, teams, and collaborators — Ticket assignment and collaboration context is lost.
- Inline images — Images embedded in ticket descriptions and comments are not transferred. They remain hosted on Zendesk's servers and become inaccessible after account deactivation.
- Nested custom fields — All other custom field types are auto-created, but nested (dependent) picklists are skipped.
- Thread direction — All imported thread replies are marked as "Incoming," erasing the distinction between agent and customer messages.
- Multi-department routing — Zwitch migrates all data into a single Zoho Desk department. If your Zendesk instance uses brands, groups, or queues to model multiple business units, Zwitch will not reproduce that structure. (help.zoho.com)
Tickets will fail to import if the associated contact (end user) does not already exist in Zoho Desk. Zwitch does not auto-create contacts from ticket data. You must import Users before Tickets, and ensure email addresses match.
Agent and author matching
If a ticket's assignee in Zendesk does not exist as an agent in Zoho Desk (matched by email), the ticket is reassigned to the admin who initiated the migration. The same applies to comments — if the commenting agent doesn't exist in Zoho Desk, the comment is attributed to the migration admin. This silently rewrites your ticket history. Migrated Zwitch records are also deleted 30 days after import.
Migration Methods Compared: Zwitch vs. CSV vs. Custom API vs. Engineer-Led
There are four paths to evaluate. Each trades off cost, coverage, and risk differently.
Method 1: Zoho Zwitch (Native Tool)
How it works: Export ZIP files from Zendesk's admin panel (Settings → Account → Data Export). Upload all three ZIPs (Organizations, Users, Tickets) to Zoho Desk → Data Administration → Zwitch.
Pros:
- Free
- No coding required
- Auto-creates custom fields
- Handles basic ticket, contact, and account mapping
Cons:
- Drops tags, groups, inline images, collaborators, and nested custom fields
- Flattens thread direction (all replies become "Incoming")
- Migrates all data into a single department
- No delta sync — tickets created during migration are missed
- Requires Zendesk account to remain active for inline image access
- Migrated records are deleted from Zwitch 30 days after import
Best for: Small teams (<1,000 tickets) with simple configurations, no tag-based workflows, no inline images, and a single-department structure.
Method 2: CSV Export
How it works: Export ticket data from Zendesk as CSV files and import into Zoho Desk.
Not a full migration method. Zendesk CSV exports omit ticket comments, descriptions, multi-line text, multi-select fields, and custom date fields. CSV is useful for lightweight contact or account data moves and reporting snapshots — not for ticket history migration. (support.zendesk.com)
Method 3: Custom API Scripts (DIY)
How it works: Engineers write scripts that extract data via Zendesk's REST API (incremental exports + per-ticket comment/attachment fetches) and write it into Zoho Desk via the Zoho Desk REST API.
Pros:
- Full control over field mapping
- Can preserve tags (via Zoho Desk's Tag API), thread direction, and inline images
- Can implement delta sync for near-zero-downtime cutover
- Can handle attachments over 20 MB by converting to cloud links
- Can route tickets to multiple departments
Cons:
- Must handle Zendesk's 10 req/min incremental export limit and Zoho's credit-based API budget
- Must implement retry logic, pagination, error handling, and idempotency
- Inline image migration requires downloading each image, re-uploading to Zoho, and rewriting HTML references in ticket descriptions
- Typical engineering effort: 2–6 weeks for a production-grade script, depending on data complexity
- No dedicated support if something breaks mid-migration
Best for: Teams with in-house engineering capacity, clear migration requirements, and time to build and test.
Method 4: Engineer-Led Migration Service
How it works: A dedicated migration team builds and runs custom scripts on your behalf, handling rate-limit management, field mapping, attachment conversion, inline image preservation, tag migration, and delta sync.
Pros:
- Preserves data that Zwitch drops: tags, inline images, thread direction, nested custom fields
- Handles both Zendesk's export throttles and Zoho's credit/concurrency constraints
- Converts oversized attachments to secure cloud links
- Runs delta sync to capture tickets created during the migration window
- Post-migration QA and validation
Cons:
- Higher cost than free tools
- Requires sharing API credentials with external team
Best for: Teams with >5,000 tickets, tag-based workflows, inline images in ticket history, multi-department structures, or zero tolerance for data loss.
| Method | Best fit | Main constraints | Honest verdict |
|---|---|---|---|
| Zwitch | Straightforward one-time move | Drops tags, groups, inline images, nested fields; single department; authorship fallback to admin | Good for a good enough move, not for strict fidelity |
| CSV | Reporting snapshots, lightweight data moves | Excludes comments, descriptions, and several custom field types | Not a full migration method |
| Custom API (DIY) | High volume, high fidelity, custom mapping | Highest implementation effort; must engineer retries, idempotency, attachment handling | Full control, but weeks of engineering |
| Engineer-led service | High volume, compliance-sensitive, zero-downtime | Higher cost; requires credential sharing | Safest option when native gaps are unacceptable |
The common mistake is choosing the cheapest-looking method before classifying the data. If your Zendesk instance has low attachment volume, no inline images, minimal custom fields, and one department, Zwitch may be enough. If you have brands, deep ticket history, large files, nested fields, or audit requirements, the cost center is not migration tooling — it is post-cutover cleanup and agent confusion.
For a framework on keeping your support team operational during the move, see Zero-Downtime Helpdesk Migration: How to Keep Support Running During the Move.
Step-by-Step: Running the Migration via Zwitch
If Zwitch meets your requirements, here is the exact process:
Step 1: Export data from Zendesk. Go to Zendesk Admin Center → Account → Data Export. Request full exports for Tickets, Users, and Organizations. Zendesk emails download links when exports are ready. Download all three ZIP files. Note: account exports must be enabled by Zendesk support first — they are not on by default.
Step 2: Prepare your Zoho Desk environment. Create departments, add agents (email addresses must match Zendesk agent emails), and configure any custom statuses or picklist values that need to exist before import. Trim or merge custom fields to fit your Zoho Desk edition's field limits.
Step 3: Upload to Zwitch. In Zoho Desk, go to Setup → Data Administration → Zwitch. Select Zendesk as the source. Upload all three ZIP files in a single Zwitch request.
Step 4: Map fields. Zwitch will display a mapping preview. Review auto-created custom fields. Verify that status and priority picklist values align between platforms.
Step 5: Initiate migration. Submit the Zwitch request. Monitor progress in the Zwitch dashboard.
Step 6: Validate. Spot-check tickets for missing data. Verify that contact-ticket associations are correct. Check for unassigned tickets (indicating agent email mismatches). Test tickets with inline images, private notes, and oversized attachments specifically — average-ticket sampling is how teams miss the real breakpoints.
Do not deactivate your Zendesk account until you have verified all data. Inline images in migrated tickets are still served from Zendesk's servers. Once you deactivate, those images break permanently.
What to Do Before You Start
Regardless of which method you choose, complete these steps first:
- Audit your Zendesk data. Count tickets, contacts, organizations, and attachments. Identify how many tickets contain inline images. List all tags in active use. Inspect attachment size distribution — anything above 20 MB needs a workaround plan.
- Map your custom fields. Document every custom field type, name, and picklist value. Identify nested/dependent fields. Check whether your field count exceeds Zoho's edition limits (50 Standard, 150 Professional, 230 Enterprise). Labels over 50 characters will be truncated.
- Align statuses and priorities. Zoho Desk's default statuses (Open, On Hold, Escalated, Closed) may not match your Zendesk configuration. Create custom statuses in Zoho Desk before import.
- Create agents first. Agent email addresses must match between platforms. Add all agents to Zoho Desk and assign them to the correct departments before migrating tickets.
- Decide on department structure. If your Zendesk instance uses brands, groups, or queues for multiple business units, decide whether a single-department Zwitch import is acceptable or whether you need custom import logic.
- Plan your cutover window. Decide whether you'll do a hard cutover (stop Zendesk, migrate, start Zoho) or a delta sync (migrate historical data, run both systems briefly, then sync the gap). Zendesk exports have a time gap near the request window, so a delta pass is almost always necessary for a clean cutover.
- Test against ugly tickets, not average ones. Pick examples with private notes, missing agents, oversized files, inline screenshots, non-English status values, and complex custom fields. Average-ticket sampling misses the real breakpoints.
- Do not deactivate Zendesk prematurely. Keep it active until all data — especially inline images — is verified in Zoho Desk.
For a complete pre-migration checklist, see The Go-Live Day Checklist: 15 Things to Do for a Smooth HelpDesk Migration.
How ClonePartner Handles Zendesk to Zoho Desk Migrations
Our approach is built around the specific failure modes described in this guide:
- Rate limit engineering. We manage Zendesk's 10 req/min incremental export cap and Zoho's credit budget with production-grade throttling and retry logic. No 429 errors, no skipped records.
- Inline image preservation. We download every inline image from Zendesk, re-upload it to Zoho, and rewrite the HTML references in ticket descriptions and comments so images render correctly after Zendesk is deactivated.
- Tag and group migration. We map Zendesk tags to Zoho Desk tags via the Tag API. We recreate group-based assignment structures using Zoho Desk's team and department features.
- Thread direction fidelity. We preserve the distinction between agent replies and customer messages, so agents reviewing old tickets see accurate conversation history.
- Nested custom fields and field normalization. We handle the custom field types that Zwitch drops, including dependent picklists, and normalize field labels and values to fit Zoho's edition constraints.
- Oversized attachments. Attachments exceeding Zoho's 20 MB limit are converted to secure cloud-hosted links embedded in the ticket thread.
- Delta sync. We run a final sync pass immediately before cutover to capture tickets created during the migration window, closing the time gap that Zendesk exports leave open.
- Multi-department routing. We map Zendesk brands and groups into Zoho Desk's department structure rather than collapsing everything into a single department.
Every migration ships with post-migration validation: ticket counts, attachment integrity checks, contact-ticket association verification, and custom field value spot-checks. We validate against the hardest tickets in your data, not the average ones.
Frequently Asked Questions
- Does Zoho Zwitch migrate tags and inline images from Zendesk?
- No. Zoho's Zwitch documentation explicitly excludes tags, groups, teams, collaborators, and ticket inline images. Tags must be migrated via Zoho Desk's Tag API using custom scripts. Inline images remain hosted on Zendesk's servers and break permanently once the Zendesk account is deactivated.
- What are the API rate limits for a Zendesk to Zoho Desk migration?
- On Zendesk, incremental exports are capped at 10 requests per minute (30 with the High Volume API add-on). On Zoho Desk, imports consume daily API credits based on your edition and user count, plus an org-wide concurrency limit shared across all integrations.
- Can I use a Zendesk CSV export for a full migration to Zoho Desk?
- No. Zendesk CSV exports omit ticket comments, descriptions, multi-line text, multi-select fields, and custom date fields. CSV is only suitable for lightweight contact or account moves and reporting snapshots — not ticket history migration.
- What happens to Zendesk attachments over 20 MB during migration?
- Zendesk supports attachments up to 50 MB, but Zoho Desk's ticket-creation limit is 20 MB. Attachments between 20 and 50 MB will fail to import via the API. The standard workaround is to rehost oversized files as secure cloud links embedded in the ticket thread.
- Can Zwitch migrate Zendesk tickets into multiple Zoho Desk departments?
- No. Zoho's Zwitch FAQ states that the migration engine currently places all data into a single Zoho Desk department. Multi-department routing from Zendesk brands or groups requires custom API import logic.