Zoho CRM Implementation Cost in India: What You Actually Pay
Real INR figures for Zoho CRM implementation cost in India across DIY, boutique partner, and…
Indian customer service teams face a specific set of constraints that generic telephony guides never address: TRAI-regulated caller ID presentation, DND scrubbing before outbound calls, regional language IVR requirements, and per-second billing that makes every second of hold time a real cost. Exotel, a Bengaluru-based cloud telephony provider with TRAI licensing, was built for exactly this environment. When you connect Exotel to Zoho Desk and Zoho CRM, your agents get screen pops, automatic call logging, and click-to-call directly inside the tools they already use every day.
This guide covers the complete implementation: Exotel account setup, Zoho Desk telephony connector configuration, CRM screen pop via the Exotel passthru API, IVR flow design, a Deluge function for call logging, inbound webhook handling, agent routing rules, and click-to-call activation. Pricing references use INR throughout. If you are also handling WhatsApp alongside voice, see our guide on Zoho CRM WhatsApp integration for a parallel channel setup.
Before touching any configuration, it helps to understand what each system contributes. Exotel manages the telephony layer: virtual numbers, IVR trees, call routing, recordings, and the webhook callbacks that fire when a call starts, connects, or ends. Zoho Desk handles ticketing: it receives the call event, creates or updates a ticket, links the caller to an existing contact, and gives the agent a screen pop with ticket history. Zoho CRM sits alongside Desk, storing the full customer record, previous deals, and any notes your sales team has added.
The integration connects these three systems through two main mechanisms:
Together, every inbound and outbound call becomes a logged, searchable record in both Desk and CRM, linked to the correct customer.
Exotel offers three number types relevant to Indian businesses: 10-digit mobile numbers (starting with 70-99 series), geographic landline numbers (city STD codes like 080, 022, 044), and toll-free numbers (1800 series). For customer service, a landline number tied to your city gives callers a familiar, trusted format. Toll-free works well if your customer base spans multiple states and you want to absorb the call cost.
You purchase virtual numbers through the Exotel dashboard under Numbers > Buy Number. Number provisioning typically takes 24-48 hours for mobile numbers and 2-5 business days for landlines, as Exotel must complete DID (Direct Inward Dialing) activation with the underlying telecom operator.
Before going live with outbound calls, complete the following:
| Plan | Monthly Cost (INR) | Agents | Virtual Numbers |
|---|---|---|---|
| Starter | 4,999 | 3 | 1 |
| Growth | 9,999 | 10 | 2 |
| Enterprise | 19,999 | Unlimited | 5 |
Call costs are billed separately. Inbound calls typically run INR 0.25-0.40 per minute. Outbound calls to mobile numbers are INR 0.40-0.60 per minute. Toll-free inbound is INR 0.65-1.00 per minute (you pay both sides). These rates vary by volume and negotiated contracts for larger accounts.
For a thorough introduction to the ticketing platform itself, see our Zoho Desk setup guide before proceeding with the telephony integration steps below.
In Zoho Desk, go to Setup (gear icon, top-right) > Channels > Telephony. You will see a list of supported providers. Select Exotel from the list. If Exotel is not visible, click “Other Providers” and search for it — Zoho periodically adds providers to the native list.
You need three pieces of information from your Exotel dashboard (Settings > API Credentials):
Paste these into the corresponding fields in Zoho Desk’s Exotel connector form. Save.
Each Zoho Desk agent needs a phone number mapped in their agent profile. This is the number Exotel will dial when connecting an inbound call to that agent. Go to Setup > Agents, open each agent profile, and enter their direct number (mobile or desk extension) in the Phone field. This number must be reachable — Exotel bridges the inbound caller to this number when the agent answers.
With the connector saved and at least one agent number mapped, call your Exotel virtual number from a mobile phone that is already saved as a contact in Zoho Desk. The agent’s Desk interface should display a call notification banner with the contact name and any open tickets. If the screen pop does not appear, check that the calling number is stored in the contact record with the country code prefix +91.
Exotel’s IVR builder is called ExoIVR. You access it under Flows > Create New Flow in the Exotel dashboard. A flow is a visual graph of nodes — each node represents an action like playing a message, collecting DTMF input, or transferring a call.
A well-designed IVR for a mid-size Indian business typically looks like this:
In the ExoIVR editor, each branch maps to a Zoho Desk agent group. You enter the Desk agent’s phone number (or a ring group number if using Exotel ring groups) as the Transfer destination in the Connect Agent node.
In Zoho Desk, create a Department for each IVR branch (Sales, Billing, Technical Support). Under Setup > Telephony > Call Routing, map each department to the corresponding agent group. When the IVR routes a call and the agent answers, Zoho Desk creates the ticket under the correct department automatically.
Zoho Desk handles ticketing, but your sales agents work inside Zoho CRM. The Exotel passthru API lets you push a custom URL-based event to a CRM URL when a call connects. You use this to open the matching CRM contact record in the agent’s browser.
In your Exotel flow, on the Connect Agent node, there is an optional “Passthru URL” field. Enter a Zoho CRM custom function webhook URL that accepts the caller’s number as a query parameter. The URL format is:
https://creator.zoho.com/api/v2/{org}/{app}/report/{report}/trigger?phone={caller_number}
Replace {org}, {app}, and {report} with your Zoho Creator app details, or use a Zoho Flow webhook if you prefer a no-code approach. The webhook looks up the CRM Contact or Lead by phone number and returns the record URL, which you can use to auto-open the contact in the agent’s CRM tab.
The following Deluge function runs inside Zoho CRM as a custom function. It accepts an inbound phone number, strips the country code prefix to handle both +91XXXXXXXXXX and 0XXXXXXXXXX formats, and searches for a matching Contact:
phone = input.get("phone");
// Normalise to 10-digit format
if(phone.startsWith("+91")) { phone = phone.substring(3); }
if(phone.startsWith("91") && phone.length() == 12) { phone = phone.substring(2); }
if(phone.startsWith("0")) { phone = phone.substring(1); }
contacts = zoho.crm.searchRecords("Contacts", "Phone:equals:" + phone);
if(contacts.size() > 0)
{
record_id = contacts.get(0).get("id");
return {"status": "found", "record_url": "https://crm.zoho.in/crm/org{ORG_ID}/tab/Contacts/" + record_id};
}
else
{
leads = zoho.crm.searchRecords("Leads", "Phone:equals:" + phone);
if(leads.size() > 0)
{
record_id = leads.get(0).get("id");
return {"status": "found", "record_url": "https://crm.zoho.in/crm/org{ORG_ID}/tab/Leads/" + record_id};
}
return {"status": "not_found", "phone": phone};
}
Replace {ORG_ID} with your Zoho CRM organisation ID (found in Setup > Developer Space > API Key). Deploy this function and expose it as a custom function URL.
When a call ends, Exotel sends a POST request to your configured webhook URL. This webhook fires for every completed call — inbound and outbound. The payload contains the caller number, called number, call duration in seconds, call status (completed, busy, no-answer), the agent who answered, and a recording URL if recording is enabled.
In Exotel, go to Settings > Webhooks. Create a new webhook with the following event types selected: call.completed. Enter your Zoho Flow webhook URL or a Zoho Creator function URL as the destination. Exotel will POST a JSON body to this URL after every call.
// Called by Zoho Flow when Exotel posts call.completed webhook
payload = input.get("payload");
caller = payload.get("From");
duration_sec = payload.get("Duration").toLong();
status = payload.get("Status");
recording_url = payload.get("RecordingUrl");
agent_number = payload.get("To");
call_sid = payload.get("CallSid");
// Normalise caller number
if(caller.startsWith("+91")) { caller = caller.substring(3); }
if(caller.startsWith("0")) { caller = caller.substring(1); }
// Find matching CRM record
contacts = zoho.crm.searchRecords("Contacts","Phone:equals:" + caller);
related_id = null;
related_type = "Contacts";
if(contacts.size() > 0) {
related_id = contacts.get(0).get("id");
} else {
leads = zoho.crm.searchRecords("Leads","Phone:equals:" + caller);
if(leads.size() > 0) {
related_id = leads.get(0).get("id");
related_type = "Leads";
}
}
// Build call activity map
call_map = map();
call_map.put("Subject","Exotel Call - " + caller);
call_map.put("Call_Type","Inbound");
call_map.put("Call_Status",if(status == "completed","Completed","Missed"));
call_map.put("Call_Duration",duration_sec / 60 + " min " + (duration_sec mod 60) + " sec");
call_map.put("Description","Recording: " + recording_url + " | SID: " + call_sid);
call_map.put("Call_Start_Time",zoho.currenttime.toString("yyyy-MM-dd HH:mm:ss"));
if(related_id != null) {
call_map.put("$se_module", related_type);
call_map.put("Who_Id", related_id);
}
response = zoho.crm.createRecord("Calls", call_map);
return response;
Deploy this function in Zoho Flow as a webhook trigger. The function normalises the phone number, finds the matching CRM record, and creates a Call activity with the recording URL in the description. You can modify the field mappings to match your CRM layout. For teams using SMS-based follow-up alongside voice, consider pairing this with our guide on Zoho CRM WhatsApp integration to log multi-channel interactions in a single timeline.
Click-to-call lets agents initiate a call directly from a phone number field in Zoho CRM or Zoho Desk by clicking the number. The call connects the agent first (Exotel calls the agent’s phone), then bridges to the customer once the agent answers. This is called a two-leg outbound call.
Go to Zoho CRM Setup > Channels > Telephony. If you have already configured Exotel as your Desk telephony provider, you can use the same credentials here. Enter the Exotel Account SID, API Token, and virtual number. Save.
Once enabled, phone number fields in Contact, Lead, and Deal records display a small phone handset icon. Clicking it triggers Exotel’s call API with the following flow:
For outbound calls, configure the Exotel virtual number as the outbound caller ID. This is set in the Exotel API call parameters under the “CallerId” field. Presenting your registered virtual number ensures TRAI CLI compliance and gives customers a consistent number to call back on.
Exotel stores call recordings on their servers for 60 days by default (extendable to 180 days on higher plans). The recording URL is included in the webhook payload and is written to the CRM Call activity description field by the Deluge function above. Agents can click the URL directly from the CRM activity to play back the recording in their browser. Ensure your Zoho CRM permissions restrict recording access to supervisors and quality assurance roles only — call recordings contain personally identifiable information and must be handled under your data retention policy.
A production deployment needs rules for what happens when agents are unavailable. Exotel and Zoho Desk together give you several options:
In Exotel, a Ring Group calls all agents in a department simultaneously. The first agent to answer gets the call. Sequential routing calls agents one by one in a defined order. For small teams (2-3 agents), ring groups minimise wait time. For larger teams, sequential routing paired with a queue reduces simultaneous ring fatigue.
Exotel flows support time-based branching. Add a “Time Condition” node to your IVR flow and configure your business hours (for example, Monday through Saturday, 9 AM to 7 PM IST). Outside these hours, route callers to a voicemail node that sends the recording to your support email. Zoho Desk can create a ticket automatically from the emailed voicemail if you configure the email channel to parse these messages.
When a caller hangs up before connecting to an agent, Exotel fires a call.missed webhook event. You can use a Zoho Flow automation triggered by this webhook to create a CRM Task assigned to the team lead, with the subject “Missed call from +91XXXXXXXXXX — call back within 30 minutes.” This ensures no missed call goes unactioned. For teams that also use Slack for internal coordination, see our guide on Zoho Desk Slack integration to send missed call alerts to the right Slack channel simultaneously.
| Factor | Exotel | Twilio |
|---|---|---|
| TRAI licensing | Yes (licensed in India) | No direct TRAI license |
| Indian number types | Mobile, landline, toll-free | Limited Indian DIDs |
| DND scrubbing API | Built-in | Not built-in |
| Billing currency | INR | USD |
| Support | India-based support team | Global support (slower for IST) |
| Entry pricing | INR 4,999/month | Pay-per-use (higher at scale) |
| Zoho Desk native connector | Yes | Yes (see Twilio integration) |
For purely Indian operations with a full-time customer service team, Exotel is the more practical choice. Twilio may be preferable if your team handles calls from multiple countries or if you need advanced programmable voice features with global PSTN reach.
The most common cause is a phone number format mismatch. Zoho Desk matches the inbound caller number against contact records. If your contacts are stored as 9XXXXXXXXX (without country code) and Exotel passes the number as +919XXXXXXXXX, there is no match. Fix this by standardising all contact phone numbers in Desk to include the +91 prefix. A bulk update via the Zoho Desk import CSV handles this in one step.
If your Zoho Flow webhook is not receiving Exotel callbacks, verify two things: the webhook URL is publicly accessible (not localhost or a VPN-only address), and the Exotel webhook configuration uses the correct event type (call.completed, not a legacy callback URL field). Test the endpoint manually using a tool like webhook.site before connecting it to Exotel.
If the Deluge function runs multiple times per call (which can happen if Exotel retries the webhook on a 5xx response), add a deduplication check using the call_sid. Before creating the Call record, search for an existing CRM Call with the Description containing the SID. If found, skip creation and return a success response to prevent further retries.
Exotel’s text-to-speech for IVR messages uses a default voice that many callers find robotic. For professional deployments, record your IVR prompts as MP3 files (8kHz, mono, 128kbps works well for telephony) and upload them as audio clips in the ExoIVR flow editor. A human-recorded greeting in both English and Hindi noticeably improves caller experience. Teams using live chat alongside voice can also connect live chat integration for customers who prefer text over phone.
Setting up Exotel with Zoho Desk and CRM? Aaxonix is a Zoho-certified implementation partner based in India. Get in touch for a scoped implementation.
Talk to Our TeamOur team builds systems that actually work. No fluff, just honest architecture and clean implementation.