Skip to main content

Zoho CRM

Community-contributed integration

This integration is community-maintained. Reference: ory/integrates/crm/zoho-crm.

Sync contacts from Ory Network to Zoho CRM through Ory Actions webhooks. When a user registers (or updates their profile) in an Ory-powered application, the handler upserts the corresponding Zoho Contact keyed by email.

Endpoints

PathTriggerAuthPurpose
POST /zoho/sync-contactasync registration.after / settings.afterX-Webhook-SecretExchanges long-lived refresh token for short-lived access token (cached); upserts the Contact record by email via Zoho's bulk upsert endpoint.

Required env vars

ORY_WEBHOOK_SECRET Bearer / X-Webhook-Secret value Ory sends
ZOHO_CLIENT_ID Zoho OAuth client id
ZOHO_CLIENT_SECRET Zoho OAuth client secret
ZOHO_REFRESH_TOKEN Long-lived refresh token; handler exchanges for access tokens
ZOHO_API_BASE_URL default: https://www.zohoapis.com/crm/v2 (US)
Use https://www.zohoapis.in/crm/v2 (IN) or
https://www.zohoapis.eu/crm/v2 (EU)
ZOHO_ACCOUNTS_URL default: https://accounts.zoho.com
Use the region-matching accounts host.
PORT default: 3000

Run

cd webhook/
cp .env.example .env
npm install
npm start # runs `tsx server.ts`

Configure Ory

  1. Use ory-actions.yaml as the snippet for selfservice.flows.{registration,settings}.after.hooks.
  2. Body template is in jsonnet/.
  3. Set response.ignore: true so the handler returns 200 to Ory immediately; Zoho calls run in the background and Zoho availability never blocks user flows.

Notes

  • Multi-region: Zoho is regional. Match ZOHO_API_BASE_URL and ZOHO_ACCOUNTS_URL to the data-center your Zoho org lives in (US / IN / EU / AU / JP / CA / CN).
  • Access tokens have a 1-hour TTL; the handler caches and refreshes automatically using the refresh token.
  • Refresh tokens are rate-limited (15 tokens per 7 minutes per org) — don't generate a fresh refresh token per request; reuse the one in env.

Resources