With Zoho, the first thing you have to get right isn't a credential — it's geography. Zoho runs independent data centres (.com, .eu, .in, .com.au, .jp and .zohocloud.ca), each with its own login servers and its own copy of your org. An authorization issued in one region is meaningless in another, so Anexus asks which data centre you are in before it redirects you anywhere.
The second thing worth knowing before you start: Zoho calls its record types Modules — Leads, Contacts, Accounts, Deals. Anexus writes to the Contacts module, and Zoho's permission model is module-by-module, which is why the consent screen looks unusually specific.
Find your data centre first
Open Zoho CRM in a browser and read the address bar. The domain suffix is your data centre. Nothing else in this article will work until that choice matches.
| Your Zoho URL ends in… | Data centre to pick | Region |
|---|---|---|
.zoho.com | US | United States |
.zoho.eu | EU | Europe |
.zoho.in | IN | India |
.zoho.com.au | AU | Australia |
.zoho.jp | JP | Japan |
.zohocloud.ca | CA | Canada |
The data centre is fixed when the org is created — signing in somewhere else does not move it, and Zoho only relocates an org between regions through a support request. Sign in to the wrong region and Zoho simply tells you the account does not exist there.
Canadian teams: Zoho's CA data centre exists so CRM data stays resident in Canada. If your org was created there your URLs end in zohocloud.ca, and CA is the only option that will authorize.
Before you start
- A Zoho CRM account on any edition that exposes the API — the Free edition included.
- Your data centre, from the table above.
- The Zoho user who will sign in and approve the connection. Decide who that is before you start, because the authorization is made in that user's name.
- That user's Zoho Profile needs Create and Edit rights on the Contacts module. Administrator and Standard profiles have them; a locked-down custom Profile may not.
Connecting Anexus to Zoho CRM
In Anexus, open Settings → CRM Integrations and find the Zoho CRM card.
In the small dropdown beside the Connect button, select your data centre (US, EU, IN, AU, JP or CA).
Click Connect with Zoho CRM. You land on Zoho's sign-in page for that region.
Sign in as the user chosen above. A Zoho account can belong to several CRM orgs — glance at the org name before you continue, because the authorization binds to the org you are signed into.
Zoho shows its consent screen with the two scopes below. Click Accept.
Zoho redirects you back to Anexus and the Zoho card flips to a green "Connected" state.
The two scopes on the consent screen
Zoho scopes name the module and the operation, so the consent screen tells you exactly how far an app can reach. Anexus asks for two:
- ZohoCRM.modules.contacts.ALL — read and write on the Contacts module only. Leads, Accounts and Deals are outside the grant.
- ZohoCRM.users.READ — read your own Zoho user record, used to show the account name on the connected card.
If your Zoho org restricts third-party applications, an administrator has to approve Anexus once before anyone can get past this screen.
Where a captured contact lands in Zoho
Every captured contact becomes — or updates — a record in the Contacts module, not Leads. That distinction matters more in Zoho than in most CRMs: lead assignment rules and the Convert flow that turns one Lead into a Contact, an Account and a Deal all belong to the Leads module, and a record written straight into Contacts never passes through them. Teams that triage from Leads usually add a Contacts view or a Contacts-module workflow instead.
Anexus uses Zoho's upsert endpoint, so the same person filling in your exchange form twice updates the existing Contact rather than creating a second one.
Field mapping
Every field below lands on the Contacts module. The API name is what you would see in Zoho's developer tools or in an export.
| Anexus field | Zoho field label | API name | Zoho-specific note |
|---|---|---|---|
| First name | First Name | First_Name | Optional in Zoho. |
| Last name | Last Name | Last_Name | The only mandatory system field on a Zoho Contact. Falls back to "Unknown" when the person did not give one, because Zoho rejects the record otherwise. |
Email | A contact captured without a valid email address is never pushed to a CRM at all. | ||
| Phone | Phone | Phone | Zoho keeps Phone and Mobile as separate fields; this goes to Phone. |
| Job title | Title | Title | In Zoho, Title means job title — the honorific lives in the separate Salutation field. |
| Company | Account Name | Account_Name | A lookup into the Accounts module, not a free-text box. |
Account Name is the row that behaves unlike the others. On a Zoho Contact it is a lookup pointing at a record in the Accounts module rather than a free-text box, which is Zoho working differently from most CRMs.
Contacts captured before you connected do not travel on their own. Use Sync past contacts on the Zoho card to push them across.
Zoho limits worth knowing before a large backfill
- Zoho meters API usage org-wide, as a daily allowance derived from your edition and user count — not per integration. Anexus shares that allowance with every other tool plugged into the same Zoho org.
- Zoho's record endpoints accept at most 100 records per call, so a backfill of a few thousand contacts is unavoidably a long run of calls rather than one upload.
- There is also a ceiling on concurrent API calls per org. Cross either limit and Zoho answers
TOO_MANY_REQUESTS; the affected contacts stay pending until you click Sync past contacts again. - Zoho access tokens live about an hour and are renewed from the refresh token in the background. You never have to touch that.
If something goes wrong
"Invalid Client" on the Zoho consent screen
The most common Zoho failure by a wide margin, and it is always the data centre. Anexus is registered as a separate client in each Zoho region, so a client id known to the US servers means nothing to the EU ones. Disconnect, pick the data centre that matches your Zoho URL, and start again.
Connected, but nothing appears in Contacts
A Zoho account can belong to several CRM orgs, and the authorization binds to the one you were signed into. Check the org name in Zoho's account menu against the org you are looking at, and reconnect from the right one if they differ. Before assuming nothing arrived, search Zoho for the person's email address as well: an upsert that matched an existing Contact updates it in place instead of adding a new row at the top of the list.
MANDATORY_NOT_FOUND, or Contacts arriving with blank fields
Zoho layouts let an administrator mark custom fields as required. The sync sends the standard fields mapped above, so a required custom field is either left empty on the saved Contact or, where Zoho enforces it at the API, rejects the record with MANDATORY_NOT_FOUND. Ask your administrator to make those fields non-required on the Contacts layout, give them default values, or fill them in afterwards.
Zoho answers NO_PERMISSION
Scopes are granted at the app level, but Zoho also enforces the authorizing user's Profile on every API call, and returns NO_PERMISSION when that Profile does not allow the operation. Have an administrator grant Create and Edit on the Contacts module for that Profile, or reconnect as a user who already has them.
INVALID_TOKEN after months of working fine
Zoho refresh tokens die for concrete reasons: an administrator revoked Anexus in the connected-apps list, the user who authorized was deactivated or removed from the org, or the org was migrated to another data centre. Zoho also caps how many refresh tokens one application may hold per user, so reconnecting over and over without disconnecting first can quietly retire the oldest one. In every case the fix is the same — Disconnect in Anexus, then connect again.
TOO_MANY_REQUESTS during Sync past contacts
Your org has spent its daily API allowance or hit the concurrency ceiling — often because another integration shares it. Nothing is lost: the refused contacts stay pending. Wait a while, then click Sync past contacts again to retry them. Zoho shows the org's API consumption in Setup, under its developer/API section, if you want to see what is spending it.
Disconnecting, and revoking on Zoho's side
Click Disconnect in Anexus. Contacts already upserted stay in Zoho — nothing is deleted from your Contacts module.
To also invalidate the refresh token from Zoho's side, sign in to your Zoho account on your own region's domain — the data centre rule applies here too — click your profile, and open My Account → Active Authtokens (Zoho relabels this page from time to time, so look for connected or authorized applications). Find Anexus Connect and click Revoke. Revoking there is what actually kills the authorization; disconnecting in Anexus only stops us from using it.