HELIOS DOCS

Zoho CRM

The Zoho CRM integration lets Helios agents call the Zoho CRM REST API through your own OAuth app, and run agents automatically when records in Zoho CRM's built-in modules are created, updated, or deleted.

What your agents can do

Helios agents call the Zoho CRM REST API with the connected user's permissions and granted OAuth scopes. Agents can work with records, COQL queries, notes, attachments, files, emails, bulk jobs, tags, users, and settings.

  • Create leads from an email or a form, and convert them to contacts, accounts, and deals
  • Find records with search or COQL, and update their fields
  • Move deals between stages, and add notes, tasks, and attachments to records that support them
  • Send email and mail merge documents from a record, and read the emails linked to it
  • Export or import many records at once with the bulk read and bulk write APIs
  • With Admin access, change fields, layouts, and workflow rules, and manage users

Agents can send GraphQL queries to /crm/graphql when the connected Zoho account supports them. Helios requests scopes to enable the profile's GraphQL schema and read data. See Zoho's GraphQL guide.

Agents can only call these Zoho hosts:

  • Your data center's API domain, such as https://www.zohoapis.eu.
  • upload.zoho.com for bulk write files, and the faster upload-accl.zoho.com, upload-accl.zoho.eu, or upload-accl.zoho.in in the US, EU, and IN data centers.
  • In the US data center, download.zoho.com and download-accl.zoho.com for audit log exports and backups. Zoho doesn't document these download hosts for other data centers, so agents there can't download those files.

Every call uses your organization's Zoho API credits. See Limits.

Authentication

MethodTypeDescription
Your own Zoho CRM OAuth appOAuth 2.0A server-based client you register in the Zoho API Console

See Integration authentication for how credentials are stored and injected.

Your own Zoho CRM OAuth app

You need a Zoho account to register the client in the Zoho API Console. Zoho records every change as the user who approves access, with that user's permissions. For Admin access, that user needs the Administrator profile in Zoho CRM.

  1. Open the Zoho API Console for your data center, such as api-console.zoho.com or api-console.zoho.eu. Click GET STARTED, or add a new client if you already have one.

  2. Choose Server-based Applications and click CREATE NOW. Enter a client name and a homepage URL, and add this redirect URI:

    https://api.heliosapp.com/integrations/zoho_crm/oauth_callback

    Click CREATE.

  3. Copy the Client ID and Client Secret from the client's Client Secret tab.

  4. In Helios, choose Your own Zoho CRM OAuth app. Enter Client ID and Client Secret.

  5. Check Admin access if a Zoho CRM administrator will approve access and agents need to change settings, manage users, or back up data.

  6. If your Zoho account isn't in the US data center, set Base URL to your data center's API domain from the table below. Helios sends you to that data center to approve access. US accounts can leave it empty.

  7. Save, then approve access in Zoho. If you belong to more than one Zoho CRM organization, pick the one Helios should use.

Data centerAccounts serverBase URL
United Stateshttps://accounts.zoho.comhttps://www.zohoapis.com (default)
Europehttps://accounts.zoho.euhttps://www.zohoapis.eu
Indiahttps://accounts.zoho.inhttps://www.zohoapis.in
Australiahttps://accounts.zoho.com.auhttps://www.zohoapis.com.au
Japanhttps://accounts.zoho.jphttps://www.zohoapis.jp
Canadahttps://accounts.zohocloud.cahttps://www.zohoapis.ca
Saudi Arabiahttps://accounts.zoho.sahttps://www.zohoapis.sa
United Kingdomhttps://accounts.zoho.ukhttps://www.zohoapis.uk
UAEhttps://accounts.zoho.aehttps://www.zohoapis.ae
Singaporehttps://accounts.zoho.sghttps://www.zohoapis.sg
Chinahttps://accounts.zoho.com.cnhttps://www.zohoapis.com.cn

Zoho lists its accounts servers at accounts.zoho.com/oauth/serverinfo. A sandbox or Developer Edition organization uses sandbox.zohoapis or developer.zohoapis instead of www.zohoapis, such as https://developer.zohoapis.com. Zoho tokens only work for the organization and environment they were issued for, so connect each one separately.

Helios also stores the data center that Zoho reports when you connect. A Base URL you set takes precedence over it.

A client in another data center

If you registered the client in one data center's console and your Zoho account is in another, enable your data center on the client:

  1. In the Zoho API Console, open the client and go to the Settings tab.
  2. Turn on the toggle next to your data center.
  3. Select Use the same OAuth credentials for all data centers and click OK.

Helios stores one client secret for the connection. By default, Zoho gives each data center its own client secret, and the token request fails with invalid_client when the secret doesn't match. See Zoho's multi data center guide.

Scopes and tokens

Helios asks for these scopes:

ScopeWhat it's for
ZohoCRM.modules.ALLRead and change records, notes, attachments, and emails in every module
ZohoCRM.modules.entity_scores.READRead the scores that scoring rules give records
ZohoCRM.settings.READRead settings, such as modules, fields, layouts, and workflow rules
ZohoCRM.settings.wizards.READ, ZohoCRM.settings.assignment_rules.READ, ZohoCRM.settings.fiscal_year.READ, ZohoCRM.settings.currencies.READRead wizards, assignment rules, the fiscal year, and currencies, which ZohoCRM.settings.READ doesn't cover
ZohoCRM.settings.audit_logs.READ, ZohoCRM.settings.audit_logs.CREATEExport the audit log. Zoho shows users who aren't administrators only their own and their subordinates' entries
ZohoCRM.settings.recycle_bin.READ, ZohoCRM.settings.recycle_bin.UPDATERead the recycle bin and restore records from it
ZohoCRM.users.READ, ZohoCRM.org.READRead users and the organization, and test the connection
ZohoCRM.bulk.READ, ZohoCRM.bulk.CREATERun bulk read and bulk write jobs
ZohoCRM.notifications.ALLCreate, renew, and remove the notification channel for triggers
ZohoCRM.coql.READRun COQL queries
ZohoCRM.graphql.READ, ZohoCRM.GraphQL.UPDATEEnable the GraphQL schema and run GraphQL queries, on the editions that offer them
ZohoCRM.files.CREATE, ZohoCRM.files.READUpload and download files
ZohoCRM.mass_update.READ, ZohoCRM.mass_update.UPDATEUpdate many records at once
ZohoCRM.mass_delete.READ, ZohoCRM.mass_delete.DELETEDelete many records at once
ZohoCRM.mass_convert.leads.READ, ZohoCRM.mass_convert.leads.CREATE, and the same for quotes and salesordersConvert many leads, quotes, or sales orders at once
ZohoCRM.change_owner.READ, ZohoCRM.change_owner.CREATEChange the owner of records
ZohoCRM.send_mail.all.CREATESend email from records
ZohoCRM.templates.email.READ, ZohoCRM.templates.inventory.READRead email and inventory templates
ZohoCRM.share.ALLShare records with other users
ZohoCRM.features.READ, ZohoCRM.apis.READRead the organization's features and the available APIs
ZohoCRM.composite_requests.CUSTOMSend up to five API calls in one request
ZohoCRM.Zia.enrichment.ALLEnrich records with Zia
ZohoCRM.settings.mailmerge.CREATE, ZohoCRM.settings.emails.ALLSend, sign, and download mail merge documents
ZohoSearch.securesearch.READUse the search API
ZohoFiles.files.ALLUpload bulk write files, and download audit log exports and backups
ZohoWriter.documentEditor.ALL, ZohoWriter.merge.ALLMerge records into Zoho Writer templates for mail merge
ZohoSign.documents.ALLSend mail merge documents for signature with Zoho Sign

With Admin access checked, Helios also asks for these:

ScopeWhat it's for
ZohoCRM.settings.ALLChange settings, such as fields, layouts, workflow rules, profiles, and territories
ZohoCRM.settings.fiscal_year.UPDATE, ZohoCRM.settings.currencies.CREATE, ZohoCRM.settings.currencies.UPDATEChange the fiscal year and currencies, which ZohoCRM.settings.ALL doesn't cover
ZohoCRM.settings.recycle_bin.DELETEEmpty the recycle bin
ZohoCRM.users.ALLAdd, change, and remove users
ZohoCRM.org.ALLChange the organization's details and photo
ZohoCRM.bulk.backup.ALLSchedule and read data backups

Zoho checks each call against the profile of the user who approved access. A call that the profile doesn't allow, such as a mass update without the Mass Update permission, fails with NO_PERMISSION. The other calls still work.

Access tokens last one hour, and Helios renews them with the refresh token. Zoho refresh tokens don't expire until they're revoked. Zoho keeps at most 20 refresh tokens for each user, and creating the 21st invalidates the oldest. Each time you approve access, Zoho issues a new one. A user who connects many times can end an older connection's access. Connect that connection again. See Zoho's token validity.

If you change the client secret in the Zoho API Console, enter the new one in Client Secret through Manage and connect again. Connect again after you change Admin access too, so Zoho issues a token with the new scopes.

Triggers

Zoho CRM can start a Workflow when a record in one of its built-in modules is created, updated, or deleted. Helios creates a Zoho notification channel when you connect, so there is nothing to set up in Zoho. This needs the ZohoCRM.notifications.ALL and ZohoCRM.settings.READ scopes above. Zoho ends a channel after at most a week, so Helios replaces it every five days. When you delete the connection, Helios attempts to remove the channel. If removal fails, the channel stays active in Zoho until it expires.

The channel covers every module in the table below that your organization has. When a module is missing, or Zoho refuses to watch it, its events show as unavailable in the trigger picker with the reason.

If renewing the channel fails, for example because access was revoked, events stop. Save the connection again, or connect again, and Helios creates a new channel.

EventDescriptionFilters
lead.createdA lead was createdNone
lead.updatedA lead was updatedchanged field (pattern)
lead.deletedA lead was deletedNone
account.createdAn account was createdNone
account.updatedAn account was updatedchanged field (pattern)
account.deletedAn account was deletedNone
contact.createdA contact was createdNone
contact.updatedA contact was updatedchanged field (pattern)
contact.deletedA contact was deletedNone
deal.createdA deal was createdNone
deal.updatedA deal was updatedchanged field (pattern), moved to stage (pattern)
deal.deletedA deal was deletedNone
campaign.createdA campaign was createdNone
campaign.updatedA campaign was updatedchanged field (pattern)
campaign.deletedA campaign was deletedNone
task.createdA task was createdNone
task.updatedA task was updatedchanged field (pattern)
task.deletedA task was deletedNone
case.createdA case was createdNone
case.updatedA case was updatedchanged field (pattern)
case.deletedA case was deletedNone
meeting.createdA meeting was createdNone
meeting.updatedA meeting was updatedchanged field (pattern)
meeting.deletedA meeting was deletedNone
call.createdA call was createdNone
call.updatedA call was updatedchanged field (pattern)
call.deletedA call was deletedNone
solution.createdA solution was createdNone
solution.updatedA solution was updatedchanged field (pattern)
solution.deletedA solution was deletedNone
product.createdA product was createdNone
product.updatedA product was updatedchanged field (pattern)
product.deletedA product was deletedNone
vendor.createdA vendor was createdNone
vendor.updatedA vendor was updatedchanged field (pattern)
vendor.deletedA vendor was deletedNone
price_book.createdA price book was createdNone
price_book.updatedA price book was updatedchanged field (pattern)
price_book.deletedA price book was deletedNone
quote.createdA quote was createdNone
quote.updatedA quote was updatedchanged field (pattern)
quote.deletedA quote was deletedNone
sales_order.createdA sales order was createdNone
sales_order.updatedA sales order was updatedchanged field (pattern)
sales_order.deletedA sales order was deletedNone
purchase_order.createdA purchase order was createdNone
purchase_order.updatedA purchase order was updatedchanged field (pattern)
purchase_order.deletedA purchase order was deletedNone
invoice.createdAn invoice was createdNone
invoice.updatedAn invoice was updatedchanged field (pattern)
invoice.deletedAn invoice was deletedNone
appointment.createdAn appointment was createdNone
appointment.updatedAn appointment was updatedchanged field (pattern)
appointment.deletedAn appointment was deletedNone
service.createdA service was createdNone
service.updatedA service was updatedchanged field (pattern)
service.deletedA service was deletedNone

Meetings are called Events in Zoho's API, so their API name is Events.

  • Changed field is on every *.updated event. It matches the API name of a field that the update changed, such as Lead_Status or Owner. It's a pattern, such as Lead_*. Case matters. It's optional.
  • Moved to stage is on deal.updated. It matches updates whose new Stage value matches, such as Closed Won. It's a pattern, and case matters. It's optional. It uses the new field values that Zoho sends with each update. An update that arrives without a new Stage value doesn't match.

Each event carries the module, the record ID, the operation, and for updates the changed fields with their new values. It doesn't carry the whole record, so the agent reads the record from Zoho. When one action changes several records, such as a mass update, each record starts its own run. Actions on related records, such as a note added to a deal, don't send an event for the deal.

Zoho doesn't sign notifications. Each one carries a random token that Helios sets on the channel, and Helios rejects notifications without it. Zoho also returns that token when a channel is read or changed through /crm/v8/actions/watch. Helios removes it from those responses before an agent sees them, and from the events it passes to workflows.

An agent that updates a record can start another run of that module's *.updated event, such as deal.updated. An agent that creates a record, such as a task, can start a *.created run. Filter on a field the agent doesn't change, or say in the prompt which changes to ignore. See Guarding against events you don't want.

Check that it works

  • The connection: after you approve access, the connection's status shows Connected. Error means Zoho rejected the token. See Common errors.
  • A trigger:
    1. Add lead.created to a workflow with no filters.
    2. Create a test lead in Zoho CRM.
    3. Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.

Common errors

What you seeCauseFix
invalid_client from ZohoThe client ID or secret is wrong, or the client is in another data center with its own secret for yoursCheck the values on the Client Secret tab. For another data center, turn on Use the same OAuth credentials for all data centers
invalid_redirect_uri from ZohoThe redirect URI on the client doesn't matchAdd https://api.heliosapp.com/integrations/zoho_crm/oauth_callback to the client
This Zoho account is in another data center. Set Base URL to that data center's API domain, such as https://www.zohoapis.eu, or clear it, and connect again.Base URL names a different data center than your accountSet Base URL to your data center from the table, or clear it, and connect again
Set the base URL to your Zoho API domain, such as https://www.zohoapis.euBase URL isn't a Zoho API domainUse a Base URL from the table
Zoho returned an unknown accounts serverYour Zoho account is in a data center that isn't in the table aboveHelios supports only the data centers in the table
Authorize the Zoho CRM OAuth app firstThe approval in Zoho wasn't finishedOpen the connection and connect again
The connection's status shows Error after it workedThe refresh token was revoked, or invalidated because the user has more than 20Connect again
Zoho CRM did not create the notification channel: …Zoho refused the channel. The message says whyFix the cause, then save the connection again
An event shows as unavailable in the trigger pickerThe organization doesn't have that module, or Zoho refused to watch it. The picker shows the reasonTurn on the module in Zoho CRM if your edition includes it, then save the connection again
NO_PERMISSION from Zoho in a runThe profile of the user who approved access doesn't allow that actionGive the user's profile the permission in Zoho CRM, or connect as a user who has it
OAUTH_SCOPE_MISMATCH from Zoho in a runThe token doesn't have the scope the call needs, such as an admin scope without Admin accessCheck Admin access through Manage and connect again
No run starts after an eventThe channel wasn't created or has ended, the module is unavailable for the organization, or the filters don't matchSave the connection again, check the trigger picker, and remove filters to test

Limits

  • API credits: Calls count toward your organization's Zoho API limits. See Zoho's API limits.
  • Notification channels: a channel lasts at most one week. Helios replaces it every five days.

Last updated on