Skip to main content
Zoho CRM is a customer relationship management platform that helps businesses manage their sales pipeline, from capturing leads and tracking deals to managing accounts, contacts, activities, and after-sales support.

Configuring Zoho CRM 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 CRM option from the list of connectors. Click Next and you’ll be prompted to add your access.

1. Add account access

You’ll need to provide OAuth2 credentials to authorize Nekt to access your Zoho CRM data. The following configurations are available:
  • OAuth Client ID: The Client ID of the Self Client you registered in the Zoho API Console.
  • OAuth Client Secret: The Client Secret associated with your Client ID. (Masked as a password field).
  • Refresh Token: The Refresh Token generated for that Self Client. (Masked as a password field).
  • Zoho data center (default: com): The data center hosting your Zoho CRM account. You can infer it from the URL of your Zoho CRM instance — for example, crm.zoho.com is the United States data center. Supported values are com (United States), eu (Europe), in (India), com.au (Australia), jp (Japan), com.cn (China), and ca (Canada).
  • Initial sync date (optional): The earliest date from which records will be synced. Only records created or updated after this date will be extracted. If not provided, all historical data will be extracted.
Use a Zoho CRM user with access to every module you want to sync. A user with restricted profile permissions will cause those modules to be skipped.

Generating your credentials in the Zoho API Console

Follow these steps to obtain the three values above. The whole process takes a few minutes and is done only once.
1

Create a Self Client

Sign in to the Zoho API Console with a Zoho user that can read every module 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 CRM runs on crm.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 four scopes below, separated by commas and with no spaces.
  • 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 CRM 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, 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 CRM meters its API with a daily credit budget per organization, which depends on your Zoho edition — 5,000 credits per day on the Free edition, and progressively more on Standard, Professional, Enterprise, and Ultimate. If the limit is reached (HTTP 429), the connector waits for the period indicated by Zoho and then retries, so the extraction continues instead of failing. A run that hits the limit takes longer than usual. A few field types cannot be read through the query API Zoho exposes for bulk extraction:
  • Multi-select lookup and subform fields are not synced. Their data is stored in a separate linking module in Zoho.
  • Notes, Attachments, and Emails are served by dedicated Zoho APIs rather than the query API. If your organization exposes them as modules, the connector skips them and reports it in the run log.
If a module cannot be read — because it is not available in your Zoho edition, or the connected user has no permission on it — the connector skips that module and continues with the rest, reporting the skip in the run log.

Streams and Fields

Zoho CRM is fully customizable, so this connector does not use a fixed list of tables. On every run it reads your organization’s own module and field configuration and syncs all modules available to the connected user, including custom modules, with all of their standard and custom fields. This means the streams you see in step 2 mirror your Zoho account. Standard modules typically include:
Any custom module created in your Zoho CRM account is discovered automatically and appears in the stream list under its own name. No configuration or connector update is needed.

Field naming and types

Field names come from your Zoho configuration and are converted to lowercase with underscores. For example, the Zoho field Last_Name becomes the column last_name, and Annual_Revenue becomes annual_revenue. Every table includes these three fields, regardless of the module: The remaining fields are typed from your Zoho field configuration:
Fields that hold a structured value in Zoho — such as a lookup, which carries both the linked record’s ID and its name — are stored as a JSON string. You can read them in SQL with your warehouse’s JSON functions.