What you get
How it works
- Zoho calls your backend when a user clicks a number.
- The backend passes the number to that agent’s open softphone tab.
- The browser places the call to Vobiz, and Vobiz asks your backend’s
/answerURL what to do. The backend dials the customer with the agent’s caller ID. - Your backend reports ringing, answered and ended back to Zoho. The final state carries the duration and the recording link.
- Inbound calls reach the same
/answerURL. The backend rings the agents signed in to the Vobiz account that owns the dialled number. - Zoho is always reached in your organization’s own Zoho datacentre, worked out when you connect.
Ways to get started
Hosted by Vobiz: how setup works
Request access
Connect your Zoho organization
Agents sign in
Prerequisites
Vobiz account
Zoho organization
Your server (self-hosted only)
https://calling.example.com, and a persistent disk. There are no npm dependencies.Agents
Self-host it
These steps are for running the backend on your own server. If Vobiz hosts it for you, skip to Sign-in modes.Request access
https://calling.example.com/oauth/zoho/callback. You receive the PhoneBridge client ID and secret.Get the code and configure it
PUBLIC_BASE_URL, APP_SECRET, TOKEN_ENCRYPTION_KEY, ADMIN_TOKEN, DATA_DIR, ZOHO_PB_CLIENT_ID, ZOHO_PB_CLIENT_SECRET and ZOHO_PB_REDIRECT_URI. No Vobiz credential goes in .env. See Configuration.List your agents
agents.json (in DATA_DIR, or copy agents.example.json). One entry per agent, keyed by an agent ID you choose:email (matched to the Zoho user’s email) or zohoUser (the Zoho PhoneBridge user ID). No SIP login, password or number.Run it on a public HTTPS URL
PUBLIC_BASE_URL reaches it. Run exactly one instance.Install Vobiz Telephony in Zoho
Connect your Zoho organization
https://calling.example.com/admin/login and enter your ADMIN_TOKEN. In the same browser, open https://calling.example.com/zoho/phonebridge/connect and approve the request in Zoho. The response shows your orgId, for example org_1a2b3c4d5e6f7a8b.Register click-to-dial
agents.json, and registers click-to-dial for each pair. The response lists any unmatchedAgents and unmatchedZohoUsers. Run it again whenever you change agents.json.Send agents their sign-in links
Agents sign in
Sign-in modes
Opening the sign-in link starts a 12-hour agent session in that browser. The softphone then shows Sign in to Vobiz with two tabs.Vobiz account (recommended)
The agent enters the Auth ID (MA_XXXXXXXX) and Auth Token and clicks Sign in. The backend then:
- Checks the pair with Vobiz.
- Finds or creates one application in that account named Vobiz-Zoho-PhoneBridge, with answer URL
https://calling.example.com/answerand hangup URLhttps://calling.example.com/hangup. It never changes any other application. - Finds or creates one SIP endpoint for the agent (alias
zoho-<agentId>), sets a fresh random SIP password, and attaches it to that application. If the agent already has a softphone tab open, the current password is kept instead (see More than one tab). - Starts the softphone with that SIP login and asks for the microphone straight away. If it is blocked, the softphone says Microphone blocked — calls will have no audio.
Enable inbound calls
Choose a number in the Caller ID dropdown and click Enable inbound calls on this number. This attaches the number to the Vobiz-Zoho-PhoneBridge application, so calls to it ring your agents.SIP direct
For an endpoint you already have. The agent enters the endpoint’s SIP username, SIP password and a Caller ID in E.164 format (+91XXXXXXXXXX). The SIP password stays in the browser.
Before using it, point the endpoint and the number at an application whose answer URL is your backend’s /answer:
- Create an application with answer URL
https://calling.example.com/answer(POST) and hangup URLhttps://calling.example.com/hangup(POST). API: Create an application. - Attach the endpoint to that application. API: Update an endpoint with
application. - For inbound calls, attach the number to the same application. API: Attach a number.
Using it
Outbound calls
Click a phone number in Zoho. The agent’s softphone dials it and Zoho’s call bar follows the call. If the agent’s softphone tab is closed, or they have not signed in to Vobiz there, no call is placed and Zoho is told the call failed withAGENT_OFFLINE.
Agents can also type a number in the softphone and click Call. Those calls are logged in Zoho too, against the agent’s Zoho user.
More than one tab
An agent can open the softphone in a second tab. Signing in there while another tab is open keeps the same SIP password, so the first tab stays connected. Zoho click-to-dial goes to one tab only, the one opened most recently; the other tabs show where the call went.Inbound calls
A call to a number that rings this integration rings every agent signed in to the Vobiz account that owns it. The softphone shows Accept and Decline; Enter accepts and Escape declines. If nobody answers in 20 seconds, the caller can leave a voicemail of up to 2 minutes. If no agent of that account is signed in, the caller hears that no one is available.Call logging and recordings
Each call is logged in Zoho with its direction, numbers, start time, duration (billed duration from Vobiz when available) and Zoho user. For outbound calls that is the user who clicked, or the agent’s own Zoho user for a typed number. For inbound calls it is the agent who answered. Zoho’s ringing pop-up appears for the first ringing agent mapped to a connected Zoho organization, and an inbound call nobody answers is logged as missed against that agent. An unanswered call is logged with duration 0, or as missed withZOHO_PB_SEND_MISSED_STATE=true. The log is written when the recording is ready, or 90 seconds after the call ends if none arrives.
Outbound calls are recorded unless OUTBOUND_RECORD=false. Inbound calls are recorded with INBOUND_RECORD=true, and voicemail is always recorded. The call log links to a signed recording URL on your backend that expires after 30 days by default. It carries no Vobiz credentials and cannot be altered to fetch another recording.
Configuration
Running in production
- Serve the backend over HTTPS only, and run exactly one instance.
- To share a host with other services, put the backend under a path prefix such as
https://integrations.example.com/zoho, have your proxy strip/zoho, and setPUBLIC_BASE_URLto the full prefixed URL. Sign-in cookies are then limited to/zoho. If your registered redirect URI is<host>/oauth/zoho/callbackat the root, route that one path to the backend unchanged. - Keep
DATA_DIRon a persistent disk, and keep secrets in your host’s secret manager. - Set
REQUIRE_VOBIZ_SIGNATURE=trueonce your logs showsignature okon real calls. - Rate-limit
/zoho/phonebridge/clicktodial,/agent-sessionand/agent/vobiz-sessionat your proxy. GET /zoho/phonebridge/status(admin) shows connected organizations, signed-in accounts and calls in progress.POST /zoho/phonebridge/disconnectwith{"orgId":"…"}removes an organization and revokes its Zoho token.
Troubleshooting
Zoho shows an invalid redirect URI error
Zoho shows an invalid redirect URI error
ZOHO_PB_REDIRECT_URI must be <PUBLIC_BASE_URL>/oauth/zoho/callback and must be registered on the PhoneBridge client exactly. Ask Vobiz support to check the registered value.Zoho shows an invalid client error when connecting
Zoho shows an invalid client error when connecting
/zoho/phonebridge/connect?dc=in, replacing in with your datacentre (us, eu, au and so on).Zoho redirected to a different host after approval
Zoho redirected to a different host after approval
/zoho/phonebridge/complete on your backend and paste the full URL Zoho redirected to, within a minute. Then fix the redirect URI.Register fails at the integrate step
Register fails at the integrate step
Register says no agent matches a Zoho user
Register says no agent matches a Zoho user
zohoUsers list in the response to correct email or zohoUser in agents.json, then register again.Clicking a number fails with AGENT_OFFLINE
Clicking a number fails with AGENT_OFFLINE
Clicking a number fails with NO_CALLER_ID
Clicking a number fails with NO_CALLER_ID
The softphone says Not signed in
The softphone says Not signed in
Vobiz did not accept those credentials
Vobiz did not accept those credentials
Registration failed in the softphone
Registration failed in the softphone
Clicking a number dials in the wrong tab
Clicking a number dials in the wrong tab
The softphone says Microphone blocked
The softphone says Microphone blocked
Inbound callers hear that no one is available
Inbound callers hear that no one is available
No audio, or the call drops as it connects
No audio, or the call drops as it connects
A recording link returns 503
A recording link returns 503
Operating notes
- Early access. The Vobiz-hosted service is set up on request. One-click install from Zoho Marketplace comes once Zoho approves the listing.
- Run one backend instance. Calls in progress, agent sessions and Auth Tokens are held in memory.
- Sign in again after a restart. After the backend restarts, every agent reloads the softphone and signs in to Vobiz again. A call in progress during a restart is not logged.
- Sign in again after a page reload, and keep a softphone tab open. With several tabs open, Zoho click-to-dial reaches the most recently opened one.
- Inbound rings everyone on the account. Zoho’s ringing pop-up appears for one agent, and the call log goes to the agent who answered.
- Agent sessions last 12 hours. A backend restart ends all of them together.
Next steps
- Source code and full README: vobiz-ai/Vobiz-Zoho-Calling
- Zoho’s PhoneBridge V3 reference
- The same calling in other CRMs: Zendesk, HubSpot, Pipedrive, Freshdesk, ServiceNow
- Reference:
<Dial>, SIP endpoints, CDRs - Help: Contact support