Skip to main content
Zoho Desk is Zoho’s customer service platform. Support teams use it to handle customer requests (tickets) arriving by email, phone, chat, social media and help center, together with the contacts and accounts behind them, the agents and teams who answer, and the activities around each request.

Configuring Zoho Desk as a Source

In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the Zoho Desk option from the list of connectors. Click Next and you’ll be prompted to add your access.

1. Add account access

There are two ways to connect your Zoho Desk account:
  • Sign in with Zoho (recommended, United States data center only): you are taken to Zoho, sign in, and grant Nekt read access. If you belong to more than one Zoho Desk organization, Zoho asks which one to connect. Nothing else to fill in.
  • Use my own Zoho application: you register an application in the Zoho API Console yourself and paste its credentials. Choose this if your company requires the connection to run under its own application, or if your account is hosted outside the United States (see the note below).
The following configurations are available:
  • Zoho data center (default: United States): The data center hosting your Zoho Desk account. You can tell it from the address of your Zoho Desk: for example, desk.zoho.com is the United States data center and desk.zoho.eu is Europe. Sign in with Zoho works only with the United States data center (zoho.com); for any other data center, use your own Zoho application.
  • Organization ID (optional): Only needed when your connection reaches more than one Zoho Desk organization (portal). You can find it in Zoho Desk under Setup > Developer Space > API. Leave it empty to use the only organization available.
  • Initial sync date (required): Only records created or modified after this date are synced. Zoho Desk charges API credits for every request, so choose how much history you need: a recent date makes the first sync finish in fewer days (see API Limitations).
  • Include full thread content (Advanced): (Default: false) Also fetch the full content (the email or message body) of every ticket thread. Without it, threads carry the summary Zoho shows in its lists. Each thread costs one extra Zoho API credit.
  • API credits to keep free (Advanced, optional): Stop the sync when fewer than this many Zoho Desk API credits are left for the day, so your other Zoho integrations keep working. The next sync continues from where it stopped.
Sign in with a Zoho Desk user that can see every department you want to sync. If the user cannot read a module (for example, calls or events are not part of your Zoho Desk edition), the sync stops on its first run and tells you which streams to deselect.
Sign in with Zoho currently supports accounts hosted in the United States data center. If your Zoho Desk runs in another region, choose Use my own Zoho application and follow the steps below.

Using your own Zoho application

Only needed if you picked Use my own Zoho application. You will provide three values: Client ID, Client secret, and Refresh token. The process below takes a few minutes and is done only once.
1

Create a Self Client

Sign in to the Zoho API Console with a Zoho Desk user that can see every department you want to sync. Click GET STARTED, choose Self Client, and click CREATE NOW.A Self Client needs no name, homepage, or redirect URI. Open the Client Secret tab and copy the Client ID and Client Secret.
Use the API Console of your own data center. If your Zoho Desk runs on desk.zoho.eu, use api-console.zoho.eu, and so on.
2

Generate an authorization code

Open the Generate Code tab and fill in:
  • Scope: paste the scopes below, separated by commas and with no spaces. All of them are read-only.
  • Scope Description: any description, for example Nekt data extraction.
  • Time Duration: choose 10 minutes, so you have time for the next step.
Click CREATE, select your Zoho Desk organization (portal) when prompted, and copy the generated code.
The code expires within the duration you selected. If it expires before you finish the next step, simply generate a new one.
3

Exchange the code for a refresh token

Run the request below, replacing the three placeholder values. Use the accounts URL of your data center: accounts.zoho.com for the United States, accounts.zoho.eu for Europe, accounts.zohocloud.ca for Canada, and so on.
The response contains a refresh_token. Copy it: this is the third value Nekt needs.
The code can only be exchanged once. If you run the request twice, the second call returns invalid_code and you need to generate a new code.
4

Paste the credentials into Nekt

Fill in the Client ID, Client secret, and Refresh token fields, and select your data center.
The refresh token does not expire. It stays valid until you revoke it or delete the Self Client in the Zoho API Console, so you only go through this process once.
Once you’re done, click Next.

2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.
Tip: The stream can be found more easily by typing its name.
Select the streams and click Next.

3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.
  • Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
  • Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
  • Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
  • Sync Type: you can choose between INCREMENTAL and FULL_TABLE.
    • Incremental: every time the extraction happens, we’ll get only the new data, which is good if you want to keep every record ever fetched.
    • Full table: every time the extraction happens, we’ll get the current state of the data, which is good if you don’t want to have deleted data in your catalog.
Once you are done configuring, click Next.

4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Optionally, you can define some additional settings:
  • Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
  • Determine when to execute an Additional Full Sync. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.
Once you are ready, click Next to finalize the setup.

5. Check your new source

You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.
For you to be able to see it on your Catalog, you need at least one successful source run.

API Limitations

Zoho Desk meters its API with a daily budget of API credits per organization, which depends on your edition and number of users (for example, 5,000 credits per day on the Free edition, 75,000 plus 500 per user on Professional, and 100,000 plus 1,000 per user on Enterprise). The connector keeps its cost low:
  • Tickets, contacts, accounts, tasks, calls, events, and products cost about 3 credits per 100 records created or changed since the last run.
  • Threads and comments cost about 3 credits per ticket that changed. Include full thread content adds 1 credit per thread.
  • Time entries cost about 3 credits per agent for each month read, whatever the number of tickets: a daily sync is about 3 credits per agent, and a first sync of 12 months with 20 agents about 800 credits.
  • Agents, departments, and teams cost a few credits per run.
  • A sync that finds nothing new costs about 40 credits plus 3 per agent with every stream selected. Syncing every hour therefore uses about 1,000 credits a day before any data is loaded; on small Zoho Desk plans (the Free edition has 5,000 credits a day), schedule the source daily.
The first sync reads the whole history and can need more credits than your organization has in a day (for example, about 60,000 credits for 20,000 tickets with threads and comments). In that case the history loads over several days:
  • When the credits run out, the sync stops and keeps everything it already loaded. The next sync continues from the last point it fully loaded, so no record is skipped.
  • Only the very first sync of the source can be marked as failed when the credits run out (Nekt cannot tell it apart from a Full sync, where a half-loaded table would replace the complete one). Every following sync finishes successfully, with a warning in the log, until the history is complete, including streams that are still waiting for their turn or were added later. Agents, departments, and teams are always read first, so they are complete before the credits run out.
  • A Full sync or Additional Full Sync that runs out of credits is marked as failed, because it would replace your tables with partial ones. For large help desks, avoid scheduling Additional Full Syncs.
  • If a sync cannot load anything at all (for example, the credits left for the day are already below API credits to keep free), it is marked as failed, so the problem shows up instead of the source silently standing still.
  • If the credits run out before the same stream (for example, tickets) can make any progress in 3 syncs in a row, the third sync is marked as failed and names the stream, so a table cannot stay behind without notice while the others update. Adding threads or comments to an existing source counts as progress for tickets and for the other ticket streams.
  • A stream that is waiting while an earlier stream is still loading its history is not updated in that sync, and the run log says so every time (for example, “waiting for contacts; 3 syncs in a row”). If it waits 7 syncs in a row, the sync is marked as failed and names both streams, so you can decide: ask Zoho for more API credits, use a more recent Initial sync date, or deselect the stream that is loading its history until the others catch up.
To load faster, set an Initial sync date (for example, the last 12 months), start with fewer streams, or ask Zoho for more API credits. Each run reports in its log how many credits it used. If Zoho asks the connector to slow down for a short time, it waits and continues, so that run takes longer than usual.

Streams and Fields

Fields that hold a structured value in Zoho Desk (such as the ticket’s contact or assignee, or the custom fields under cf) are stored as a JSON string. You can read them in SQL with your warehouse’s JSON functions. Field names are converted to lowercase with underscores (for example, modifiedTime becomes modified_time).
Every ticket of the organization, with its status, assignment, contact and custom fields. Slug: tickets. Sync: Incremental, using modified_time as the replication key. Primary key: id.
Messages exchanged on each ticket (emails, chats, social and forum replies), incoming and outgoing. Slug: ticket_threads. Sync: Incremental, using ticket_modified_time as the replication key. Primary key: id.
Comments added to each ticket by agents, public or private. Slug: ticket_comments. Sync: Incremental, using ticket_modified_time as the replication key. Primary key: id.
Time logged by agents on tickets, with billing information. Read per agent, so a new or edited entry is loaded even when its ticket did not change. Slug: ticket_time_entries. Sync: Incremental, using modified_time as the replication key. Primary key: id.
The customers who raise tickets. Slug: contacts. Sync: Incremental, using modified_time as the replication key. Primary key: id.
The customer organizations contacts belong to. Slug: accounts. Sync: Incremental, using modified_time as the replication key. Primary key: id.
Tasks assigned to agents, related or not to a ticket. Slug: tasks. Sync: Incremental, using modified_time as the replication key. Primary key: id.
Support calls logged in Zoho Desk. Slug: calls. Sync: Incremental, using modified_time as the replication key. Primary key: id.
Meetings and other scheduled activities. Slug: events. Sync: Incremental, using modified_time as the replication key. Primary key: id.
Products and services associated with tickets, contacts and accounts. Slug: products. Sync: Incremental, using modified_time as the replication key. Primary key: id.
Help desk users, in every status (active, disabled, imported and deleted). Slug: agents. Sync: Full table: the whole list is read on every run. Primary key: id.
Departments of the help desk. Slug: departments. Sync: Full table: the whole list is read on every run. Primary key: id.
Teams of agents in each department. Slug: teams. Sync: Full table: the whole list is read on every run. Primary key: id.

Implementation Notes

How incremental sync works

  • Changed records only: tickets, contacts, accounts, tasks, calls, events, and products are read in the order Zoho last changed them, starting where the previous run stopped. Records changed in the last 15 minutes are picked up by the next run, because Zoho takes a few minutes to make a change searchable.
  • Threads and comments are read for each ticket that changed since the last run. If you add one of these streams to an existing source, its first run reads every ticket since the Initial sync date, while the other streams keep their progress.
  • Time entries are read by their own modification time, agent by agent and one month at a time, so a new or edited entry is loaded even when its ticket did not change.
  • Each sync re-reads the last few minutes before where the previous one stopped, in case Zoho made a change searchable later than usual. Those records are merged, not duplicated.
  • Deleted records are not removed from your tables by incremental syncs. Use a Full sync to rebuild a table without them.

Limitations to be aware of

  • Archived tickets are not included.
  • Time entries of agents deleted or deactivated in Zoho Desk cannot be read once Zoho stops serving them. Entries loaded before that stay in your table, and the run log says how many agents were affected.
  • Whether adding a comment counts as a change to the ticket is not documented by Zoho. If it does not, a new comment is loaded the next time its ticket changes.