Zoho CRM & Bookings
This one integration plugs your assistant into two Zoho products at once: Zoho CRM for contacts and leads, and Zoho Bookings for appointment scheduling. If your team already runs on Zoho One, this is the path of least resistance to make every voice call and chat session land in the CRM your reps live in, and to take real bookings against the calendar your staff are already using.
What you can do with this tool
- Capture leads straight into Zoho CRM when a new caller wants to talk to sales.
- Look up and update existing contacts so the assistant can personalize the conversation.
- Offer appointment slots and book them on Zoho Bookings against a specific service and staff member.
Business use cases
Service-business lead intake
A landscaping company has a Zoho CRM full of past customers and active leads. Their voice assistant answers inbound calls outside business hours, qualifies the work (lawn care vs. tree removal vs. irrigation), captures the customer's name, email, phone, and property zip code, and calls create_lead to push the inquiry into Zoho with source set to Insighto. The owner's morning routine: open Zoho Leads, work through the new entries.
Existing-customer support that knows who's calling
A SaaS company runs a chat widget on their dashboard. Logged-in users get auto-identified by email when they open the widget. The assistant calls search_contact with the email — if Zoho returns a match, it greets them by first name and pulls their plan info from the response. Customers stop having to say "yes, the email on file is..." every time they open chat.
Consultation booking for a coaching practice
A business coach uses Zoho Bookings for her 30-minute discovery calls. Her assistant has the Zoho tool attached, with the Discovery Call service pre-selected. A caller asks to book — the assistant calls get_earliest_appointments to fetch the next few open slots, reads three options aloud, then calls book_appointment with the chosen slot and the caller's contact details. The booking lands in Zoho Bookings; the calendar invite goes out automatically; the coach sees it in her morning agenda.
Multi-region operations
A consulting firm has separate Zoho One tenancies for their US and EU operations. They connect Zoho twice — once for each region — and label the connections clearly. Their US-facing assistant gets the US connection; the EU-facing assistant gets the EU connection. Both teams' CRMs stay clean.
Connecting Zoho
Step-by-step
-
Go to Tools & Integrations → Zoho → Connect Zoho.
-
Pick your Zoho data center region. This is critical and gets people every time. Zoho hosts customer data in seven regions and the API endpoints are region-specific:
us—crm.zoho.comeu—crm.zoho.euin—crm.zoho.inau—crm.zoho.com.aucn—crm.zoho.com.cnjp—crm.zoho.jpca—crm.zoho.ca
Pick the one that matches the domain you see when you log into Zoho in your browser.
-
Approve the scopes below on Zoho's consent screen.
-
Back in Insighto, configure the Zoho Bookings side: pick a service and a staff member from the dropdowns Insighto auto-populates. If you skip this step, the booking functions won't work — only the CRM functions will.
-
Set the country code for the connection — used to normalize phone numbers to E.164 format when contacts are written back to Zoho.
Scopes requested
ZohoCRM.modules.ALL
zohobookings.data.ALL
The first scope covers contacts, leads, deals, accounts, and custom modules. The second covers Zoho Bookings appointments and slot lookups.
Prerequisites
- A Zoho CRM account on a paid edition (Standard or above — the Free tier doesn't include API access).
- For Bookings: at least one configured service and one staff member in Zoho Bookings.
- Admin permission to grant the OAuth scopes.
Functions the assistant can call
create_lead
Creates a new Lead in Zoho CRM with source automatically set to Insighto.
- Arguments
first_name(string, required)last_name(string, required)email(string, required)phone(string, optional)
- Returns —
"Lead added successfully."on success.
create_contact
Creates a new Contact in Zoho CRM.
- Arguments
firstname(string, optional)lastname(string, optional)email(string, optional)phone(string, optional)
- Returns —
"Contact added successfully."on success.
search_contact
Searches Zoho contacts by email and/or phone. If to_create is true and no match is found, falls through to creating the contact.
- Arguments
email(string, optional)phone(string, optional)to_create(boolean, optional) — create the contact if not found.
- Returns — the matching contact record, or null if no match (and
to_createis false).
update_contact
Updates fields on an existing Zoho contact. The assistant typically calls search_contact first to find the contact, then update_contact with the changes.
- Arguments
tool_contact(object, required) — the contact record returned by a previoussearch_contactcall.mapping(object, required) — the fields to update, e.g.{ "phone": "+15551234567" }. Phone numbers are normalized to E.164 using the connection's country code.
- Returns —
"Contact updated successfully."on success.
get_available_slots
Lists open Zoho Bookings slots for the configured service and staff member.
- Arguments
start_date(string, required) —YYYY-MM-DD.end_date(string, optional) —YYYY-MM-DD. Defaults to the same day if omitted.
- Returns — a list of formatted slot strings like
"2026-05-14 11:00 AM".
get_earliest_appointments
Convenience wrapper that builds a five-day window from today (or from a given appointment_date) and lists open slots.
- Arguments
appointment_date(string, optional) —YYYY-MM-DD. Defaults to today.
- Returns — the next several open slot strings.
book_appointment
Books a Zoho Bookings appointment. The configured service and staff are used automatically.
- Arguments
from_time(string, required) —YYYY-MM-DD HH:MM.name(string, required)email(string, required)phone_number(string, required)notes(string, optional)
- Returns —
{ "response": "Appointment booked successfully." }on success, or if the slot was just taken,{ "response": "Slot already reserved", "available_slots": [...] }with alternative open times.
Example invocation
The assistant books a discovery call:
{
"function": "book_appointment",
"arguments": {
"from_time": "2026-05-20 14:00",
"name": "Alice Patel",
"email": "alice@example.com",
"phone_number": "+15551234567",
"notes": "Initial consultation, mentioned interest in retainer pricing."
}
}
Result returned to the assistant:
{ "response": "Appointment booked successfully." }
If the slot was just claimed by someone else, the result includes the next available options so the assistant can offer them right away:
{
"response": "Slot already reserved",
"available_slots": ["2026-05-20 14:30", "2026-05-20 15:00", "2026-05-20 15:30"]
}
System prompt guidance
Spell out the flow:
When a caller wants to book a consultation, first call
get_earliest_appointmentsto see the next few open slots. Read at most three options to the caller. When they pick one, collect their full name, email, and phone, then callbook_appointment. If the slot is taken, offer the alternatives from the response.
For lead capture without booking:
When a new caller asks about pricing or services, capture their first name, last name, and email, then call
create_lead. Tell them a member of the team will follow up.
Multiple Zoho accounts or regions
Connect Zoho once per Zoho tenancy. Label each connection clearly ("Zoho - US Office", "Zoho - EU Office"). Each connection has its own region setting, its own service/staff selection, and its own country code. Attach the right connection to the right assistant.
Phone-number normalization
When you set the country code on the connection (e.g. US, GB, IN), Zoho contact updates have their phone numbers normalized to E.164 before being written back. If you don't set a country code, phone numbers get written through with whatever the caller said, which often causes match failures later. Set it.
Rate limits — read this
Zoho's API rate limits are tighter than most CRMs (roughly five requests per second per user, with a daily ceiling that varies by plan). For a single assistant handling sequential calls this is fine; for a deployment running dozens of concurrent voice calls, you may hit limits during spikes. Spread the writes — don't have the assistant fire search, update, and create_lead back-to-back in the same turn.
Failure modes
- Wrong region — every API call fails or returns a Zoho login page. Disconnect, reconnect, pick the correct region.
- Service or staff not configured — booking functions error out. Open the Zoho connection's settings, pick a service and staff member from the dropdowns, save.
- Token revoked — Zoho support revokes tokens occasionally; the next call fails. Reconnect.
- Slot taken between lookup and booking —
book_appointmentreturns the alternatives. The model usually re-offers them automatically.
Where to next
- For deal/opportunity creation or note attachment, build a Custom tool on Zoho's REST API.
- Compare with HubSpot or GoHighLevel if you're picking a CRM.
- See Google Calendar for a non-Zoho booking path.