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).
- 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.comis the United States data center anddesk.zoho.euis 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.
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.
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: The response contains a
accounts.zoho.com for the United States, accounts.zoho.eu for Europe, accounts.zohocloud.ca for Canada, and so on.refresh_token. Copy it: this is the third value Nekt needs.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.
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.
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.
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.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.
- 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.
Streams and Fields
Fields that hold a structured value in Zoho Desk (such as the ticket’s contact or assignee, or the custom fields undercf) 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).
Tickets
Tickets
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.Ticket Threads
Ticket Threads
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.Ticket Comments
Ticket Comments
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.Ticket Time Entries
Ticket Time Entries
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.Contacts
Contacts
The customers who raise tickets. Slug:
contacts. Sync: Incremental, using modified_time as the replication key. Primary key: id.Accounts
Accounts
The customer organizations contacts belong to. Slug:
accounts. Sync: Incremental, using modified_time as the replication key. Primary key: id.Tasks
Tasks
Tasks assigned to agents, related or not to a ticket. Slug:
tasks. Sync: Incremental, using modified_time as the replication key. Primary key: id.Calls
Calls
Support calls logged in Zoho Desk. Slug:
calls. Sync: Incremental, using modified_time as the replication key. Primary key: id.Events
Events
Meetings and other scheduled activities. Slug:
events. Sync: Incremental, using modified_time as the replication key. Primary key: id.Products
Products
Products and services associated with tickets, contacts and accounts. Slug:
products. Sync: Incremental, using modified_time as the replication key. Primary key: id.Agents
Agents
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
Departments
Departments of the help desk. Slug:
departments. Sync: Full table: the whole list is read on every run. Primary key: id.Teams
Teams
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.