Zoho CRM + Google Calendar, demos booked faster
New leads come in hot, and then… nothing. Someone has to email, ask for times, realize the prospect is in a different timezone, check the rep’s calendar, and restart the thread when there’s a conflict.
This Zoho meeting scheduling automation hits sales teams first, but CRM admins and founders feel it too. You will book demos faster, with fewer scheduling mistakes, and every booked meeting gets logged back into Zoho CRM automatically.
Below you’ll see exactly how the workflow works, what it automates, and what you need to set it up without turning your week into a mini IT project.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Zoho CRM + Google Calendar, demos booked faster
flowchart LR
subgraph sg0["Generate Personalize Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/zoho.svg' width='40' height='40' /></div><br/>New Lead Trigger"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Workflow Configuration", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/zoho.svg' width='40' height='40' /></div><br/>Get Sales Rep Details"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Detect Lead Timezone"]
n4@{ icon: "mdi:location-exit", form: "rounded", label: "Get Rep Calendar Availability", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Find Available Slots with Bu.."]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Slots Available", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Generate Meeting Link"]
n8@{ icon: "mdi:robot", form: "rounded", label: "Generate Personalized Invite", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Send Meeting Invite", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/zoho.svg' width='40' height='40' /></div><br/>Log Meeting in Zoho CRM"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "No Slots Available Message", pos: "b", h: 48 }
n12@{ icon: "mdi:message-outline", form: "rounded", label: "Send No Availability Email", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Zoho CRM Lead Webhook"]
n14@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request"]
n15 --> n8
n0 --> n1
n9 --> n10
n3 --> n4
n6 --> n7
n6 --> n11
n7 --> n15
n2 --> n3
n13 --> n0
n1 --> n2
n14 -.-> n8
n11 --> n12
n8 --> n9
n4 --> n5
n5 --> n6
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n8 ai
class n14 aiModel
class n6 decision
class n7,n13,n15 api
class n3,n5 code
classDef customIcon fill:none,stroke:none
class n0,n2,n3,n5,n7,n10,n13,n15 customIcon
The Problem: Demo Scheduling Turns Into a Time Sink
Booking a “simple” demo is rarely simple. A lead submits a form or gets added by a rep, then your team starts the back-and-forth: “What times work?” “Which timezone are you in?” “Sorry, that slot just got taken.” Multiply that by a handful of inbound leads per day and it becomes a quiet productivity leak. Worse, the details often end up scattered across inbox threads, calendar notes, and half-updated CRM fields. That’s how meetings get missed, double-booked, or never booked at all.
The friction compounds. Here’s where it breaks down in real life.
- A rep can spend about 20 minutes per lead just coordinating a time that works.
- Timezone confusion causes preventable no-shows, especially with international leads.
- Calendar conflicts force reschedules, which slows the deal down and makes you look disorganized.
- Meeting details don’t reliably get logged in Zoho CRM, so managers lose visibility and follow-ups slip.
The Solution: Auto-Schedule Meetings From New Zoho CRM Leads
This workflow starts the moment a new lead hits Zoho CRM (through a Zoho webhook connected to n8n). It pulls the lead record and the assigned owner’s details, then detects the lead’s timezone using their location fields (country/state). Next, it checks the sales rep’s Google Calendar for upcoming events and calculates conflict-free meeting slots based on your rules like working hours, meeting duration, buffer time, and how many days ahead to look. If an opening exists, it creates a Zoom meeting, generates a polished HTML invitation using an AI agent (Gemini Chat Model in the workflow), and sends it to the lead via Gmail. Finally, it writes the meeting details back into Zoho CRM so the team has a clean, auditable record.
The workflow triggers on “new lead created.” It then moves through timezone detection, calendar availability, and slot evaluation, before it either books the earliest Zoom option and emails the invite or sends a clear fallback message when there’s no availability. Only booked meetings get recorded in Zoho CRM, which keeps your pipeline data honest.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team gets 10 inbound demo leads in a day. Manually, if each one takes about 20 minutes of calendar-checking, timezone clarification, and emailing, that’s roughly 3 hours of admin work. With this workflow, the “work” is basically the trigger (lead created) plus a few minutes of automated processing to check Google Calendar, create the Zoom meeting, and send the Gmail invite. You get those 3 hours back, and the meetings are logged in Zoho CRM without anyone remembering to do it.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Zoho CRM for lead + owner data and logging.
- Google Calendar to check rep availability.
- Gmail to send invites and fallback messages.
- Zoom to create the meeting automatically.
- Gemini AI / Google PaLM API key (get it from Google AI Studio / your Google Cloud project).
Skill level: Intermediate. You’ll connect OAuth accounts, edit a few configuration fields (hours, duration, buffers), and test with a real Zoho lead.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new lead arrives in Zoho CRM. Zoho sends a webhook to n8n when a lead is created, so the workflow starts immediately while the lead is still “warm.”
The workflow gathers context and figures out timezone. It fetches the full lead record and the lead owner (your sales rep), then uses the lead’s country/state to determine the most likely timezone so you’re not scheduling blind.
Availability is checked and slots are calculated. Google Calendar events are pulled for the rep, and the workflow computes open time slots based on your working hours, meeting duration, and buffer rules. It then evaluates whether anything valid exists.
Either a meeting is booked, or a fallback email is sent. If slots exist, it requests the meeting token, creates the Zoom meeting, generates the email content with the AI agent, sends the invite via Gmail, and records the meeting back in Zoho CRM. If nothing is available, it sends a “no availability” email and intentionally skips the CRM update because no meeting was created.
You can easily modify working hours and meeting duration to match your sales process. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
This workflow starts when a new lead hits your webhook endpoint.
- Add and open Incoming Lead Webhook.
- Set HTTP Method to
POST. - Set Path to
zoho-lead-webhook. - Set Response Mode to
lastNode.
Step 2: Connect Zoho CRM and Scheduling Inputs
Next, fetch the lead and set scheduling defaults that downstream nodes reference.
- Open Fetch New Lead Record and connect Zoho CRM: Credential Required: Connect your
zohoOAuth2Apicredentials. - In Fetch New Lead Record, set Resource to
leadand Operation toget. Map the lead ID from the webhook payload. - Open Set Scheduling Options and confirm the values: meetingDuration
30, bufferTimeBefore15, bufferTimeAfter15, daysToLookAhead7, workingHoursStart09:00, workingHoursEnd17:00, meetingLinkServicezoom. - Open Retrieve Rep Profile and connect Zoho CRM: Credential Required: Connect your
zohoOAuth2Apicredentials.
Step 3: Determine Timezone and Calendar Availability
This stage enriches the lead, pulls calendar events, and calculates open slots.
- In Identify Lead Timezone, keep the JavaScript logic that sets
detectedTimezonebased onCountryandState. - Open Pull Rep Calendar Slots and connect Google Calendar: Credential Required: Connect your
googleCalendarOAuth2Apicredentials. - In Pull Rep Calendar Slots, set Operation to
getAlland choose the correct calendar ID. - In Compute Open Slots, keep the JS code that computes
availableSlotsusing values from Set Scheduling Options and Identify Lead Timezone. - In Evaluate Slot Availability, set the condition to
{{ $json.hasSlots }}with a booleantruecheck.
Step 4: Create the Meeting in Zoom
When slots exist, the workflow retrieves a Zoom token and schedules the meeting.
- Open Request Meeting Token and connect HTTP Basic Auth: Credential Required: Connect your
httpBasicAuthcredentials. - In Request Meeting Token, set URL to
https://zoom.us/oauth/token, Method toPOST, and query parametersgrant_type=account_credentialsandaccount_id=[YOUR_ID]. - Open Create Zoom Meeting and keep URL as
https://api.zoom.us/v2/users/me/meetings, Method asPOST, and Send Body/Send Headers enabled. - Set start_time to
{{ $('Evaluate Slot Availability').item.json.availableSlots[0].startTime }}and timezone to{{ $('Evaluate Slot Availability').item.json.availableSlots[0].timezone }}. - Set the Authorization header to
{{ 'Bearer ' + $json.access_token }}.
Step 5: Generate and Send the Invite Email
Use the AI node to draft a personalized email and send it via Gmail.
- Open Gemini Chat Model and connect the model: Credential Required: Connect your
googlePalmApicredentials. - In Craft Invite Email, keep the Text prompt as
=Lead details: {{ JSON.stringify($('Identify Lead Timezone').first().json) }} Available slots: {{ JSON.stringify($('Compute Open Slots').first().json.availableSlots) }} Meeting link: {{ $json.join_url }}. - Confirm Gemini Chat Model is connected as the language model for Craft Invite Email (credentials are applied on Gemini Chat Model, not the agent node).
- Open Dispatch Invite Email and connect Gmail: Credential Required: Connect your
gmailOAuth2credentials. - Set Send To to
{{ $('Identify Lead Timezone').item.json.Owner.email }}, Message to{{ $json.output }}, and Subject to{{ $json.output.split('Subject:')[1].split('\\n')[0].trim() }}. - Open Record Meeting in CRM and connect Zoho CRM: Credential Required: Connect your
zohoOAuth2Apicredentials.
Step 6: Configure the No-Availability Branch
If no slots are available, the workflow sends a fallback email.
- Open Prepare No-Slot Message and keep subject as
Unable to Schedule Meeting - Let's Connect. - Keep the message body as
=Hi {{ $('Identify Lead Timezone').first().json.Full_Name }}, Thank you for your interest! Unfortunately, our sales representative doesn't have any available slots in the next {{ $('Set Scheduling Options').first().json.daysToLookAhead }} days. We'd still love to connect with you. Please reply to this email with your preferred times, and we'll do our best to accommodate. Best regards, The Team. - Open Send No-Availability Email and connect Gmail: Credential Required: Connect your
gmailOAuth2credentials. - Set Send To to the actual recipient address instead of
[YOUR_EMAIL].
[YOUR_EMAIL] — replace it with a valid address to avoid failed sends.Step 7: Test and Activate Your Workflow
Validate the end-to-end flow with a test lead before enabling it in production.
- Click Execute Workflow and send a sample POST request to the Incoming Lead Webhook URL.
- Confirm that Fetch New Lead Record pulls lead data and that Compute Open Slots outputs
hasSlotsandavailableSlots. - Verify that either Dispatch Invite Email or Send No-Availability Email sends a message successfully.
- Check that Record Meeting in CRM logs the meeting in Zoho CRM after successful email dispatch.
- When everything works, toggle the workflow to Active for production use.
Common Gotchas
- Zoho CRM credentials can expire or need specific permissions. If things break, check the Zoho connection in n8n credentials and confirm your Zoho webhook is still active.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your Zoho, Google, and Zoom accounts are ready.
No. You’ll mainly connect accounts and edit a few configuration values like working hours and meeting length.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gemini API usage (usually small for email generation) and your Zoom/Google Workspace plan.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll swap out the Zoom creation portion. Replace the “Request Meeting Token” and “Create Zoom Meeting” actions with a Google Meet-capable approach (often done by creating a Google Calendar event with a Meet link). Common customizations include changing working hours by rep, increasing the buffer before/after, and adjusting the number of days the workflow searches ahead.
Usually it’s expired OAuth credentials or the Zoho user lost permission to read leads or owners. Reconnect Zoho CRM in n8n, then confirm the Zoho webhook still points to the correct n8n URL. If it fails only on some leads, check required fields like Email and Country/State because missing data can break timezone detection and downstream steps.
On a typical n8n Cloud plan, it can handle hundreds to thousands of lead-triggered runs per month, depending on your plan limits. If you self-host, execution limits aren’t the bottleneck; server resources and Google/Zoom API rate limits are. In practice, most small teams can run this all day without noticing, and you can always add basic throttling if you spike after a campaign.
Often, yes, because this workflow has branching logic, code-based slot calculations, and a full “fallback path” when there’s no availability. Zapier/Make can do parts of it, but multi-step scheduling logic gets messy and can get expensive once you add filters, paths, and AI steps. n8n also gives you self-hosting, which matters when you want to scale without counting every task. The honest caveat: if you only want a simple “create calendar event and email,” Zapier might feel quicker. Talk to an automation expert if you want help choosing.
Once this is live, demo booking becomes a background process instead of a daily scramble. The workflow handles the repetitive parts, and your team can focus on the conversations that actually close deals.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.