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
| Path | Trigger | Auth | Purpose |
|---|---|---|---|
POST /zoho/sync-contact | async registration.after / settings.after | X-Webhook-Secret | Exchanges 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
- Use
ory-actions.yamlas the snippet forselfservice.flows.{registration,settings}.after.hooks. - Body template is in
jsonnet/. - Set
response.ignore: trueso 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_URLandZOHO_ACCOUNTS_URLto 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
- Zoho CRM
- Ory Actions
- Reference: ory/integrates/crm/zoho-crm
