WhatsApp to Google Calendar, scheduling done for you
Your calendar breaks the moment scheduling lives in chat. A client sends a voice note, someone screenshots it “for later,” and the event either gets created wrong or not at all. That’s how double bookings happen.
This WhatsApp calendar automation hits office managers first, honestly. But agency owners juggling client calls and solo operators booking appointments feel it too. The outcome is simple: messages turn into clean Google Calendar events and updates without you copying anything.
You’ll see what the workflow does, what you need to run it, and the key spots you can tweak so it matches how your team schedules in real life.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: WhatsApp to Google Calendar, scheduling done for you
flowchart LR
subgraph sg0["Audio Transcription 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/webhook.dark.svg' width='40' height='40' /></div><br/>Incoming Webhook Trigger"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Detect Message Format", pos: "b", h: 48 }
n2@{ icon: "mdi:web", form: "rounded", label: "Unsupported Message Reply", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Audio Transcription", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Audio Text Mapping", pos: "b", h: 48 }
n5@{ icon: "mdi:web", form: "rounded", label: "Fetch Audio Base64", pos: "b", h: 48 }
n6@{ icon: "mdi:web", form: "rounded", label: "Retrieve Image Base64", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Text Fields", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Convert Image Binary", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Convert Audio Binary", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Image Analysis", pos: "b", h: 48 }
n11@{ icon: "mdi:brain", form: "rounded", label: "Gemini Chat Model", pos: "b", h: 48 }
n12@{ icon: "mdi:memory", form: "rounded", label: "Short-Term Memory", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Orchestration Agent", pos: "b", h: 48 }
n14@{ icon: "mdi:web", form: "rounded", label: "Fetch Document Base64", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Convert Document Binary", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Document Summary", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Document Text Mapping", pos: "b", h: 48 }
n19@{ icon: "mdi:web", form: "rounded", label: "Dispatch Response", pos: "b", h: 48 }
n20@{ icon: "mdi:wrench", form: "rounded", label: "Calendar MCP Tool", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Image Text Mapping", pos: "b", h: 48 }
n4 --> n13
n21 --> n13
n0 --> n1
n17 --> n13
n7 --> n13
n20 -.-> n13
n1 --> n7
n1 --> n6
n1 --> n5
n1 --> n14
n1 --> n2
n12 -.-> n13
n10 --> n21
n16 --> n17
n9 --> n3
n8 --> n10
n5 --> n9
n6 --> n8
n13 --> n19
n15 --> n16
n14 --> n15
n3 --> n4
n11 -.-> n13
end
subgraph sg1["MCP Calendar Server Flow"]
direction LR
n18@{ icon: "mdi:play-circle", form: "rounded", label: "MCP Calendar Server", pos: "b", h: 48 }
n22@{ icon: "mdi:location-exit", form: "rounded", label: "Create Calendar Event", pos: "b", h: 48 }
n23@{ icon: "mdi:location-exit", form: "rounded", label: "Retrieve Calendar Events", pos: "b", h: 48 }
n24@{ icon: "mdi:location-exit", form: "rounded", label: "Remove Calendar Event", pos: "b", h: 48 }
n25@{ icon: "mdi:location-exit", form: "rounded", label: "Modify Calendar Event", pos: "b", h: 48 }
n22 -.-> n18
n24 -.-> n18
n23 -.-> n18
n25 -.-> n18
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 n18 trigger
class n3,n10,n13,n16 ai
class n11 aiModel
class n20 ai
class n12 ai
class n1 decision
class n0,n2,n5,n6,n14,n19 api
classDef customIcon fill:none,stroke:none
class n0 customIcon
The Problem: Scheduling Requests Don’t Arrive “Calendar-Ready”
Most scheduling requests arrive messy. A WhatsApp text might say “tomorrow afternoon,” a voice note adds the address, and the document attachment has the agenda. Then you (or someone on your team) has to interpret it, translate it into a calendar event, and reply back with confirmation. The risk isn’t just time. It’s the mental load of holding details in your head while trying not to miss something small, like the correct timezone or which client it belongs to.
It adds up fast. The friction compounds when the request comes in different formats and your “process” is basically copying and pasting between apps.
- Each WhatsApp message becomes a mini project because you have to read, interpret, and re-type the same information into Google Calendar.
- Voice notes and images slow everything down since someone must transcribe or “guess” details from media.
- Small errors create real damage, like duplicate events, wrong meeting links, or showing up at the wrong time.
- Even when you do it right, you still owe the sender a confirmation message, which is another manual step.
The Solution: Convert WhatsApp Messages Into Google Calendar Actions
This workflow listens for incoming WhatsApp messages through the Evolution API, then turns whatever the person sent (text, image, audio, or a document) into structured information the system can act on. If it’s an image, it extracts the meaning. If it’s a voice note, it transcribes it. If it’s a document, it summarizes it into usable event details. From there, an AI Agent decides what the user is trying to do, like create a new event, retrieve upcoming events, modify an existing booking, or delete one. Finally, it executes that action through Google Calendar tools and replies back in WhatsApp with a clear result.
The workflow starts when a WhatsApp message hits your webhook. Then Gemini turns media into text, the AI Agent interprets the request using short-term memory, and MCP tools trigger the right Google Calendar action. The last step sends a confirmation back to the user so nobody is left guessing.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you handle 10 scheduling requests a week through WhatsApp. Manually, it’s often about 10 minutes each: listen to a voice note, confirm the date, create the event, then message back. That’s roughly 100 minutes, plus the interruptions. With this workflow, sending the message is the only “work” (about a minute), and the processing runs in the background for a couple minutes. You still review edge cases, but you’re no longer retyping calendars all week.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Evolution API account to receive WhatsApp messages and media
- Google Calendar to create and update real events
- Gemini API key (get it from Google AI Studio)
Skill level: Intermediate. You’ll connect credentials, paste webhook URLs, and test a few message types.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
WhatsApp message arrives through a webhook. Evolution API calls your n8n webhook as soon as someone sends a text, voice note, image, or document.
The workflow identifies what was sent. A message-type switch routes the request so an audio note goes to transcription, an image goes to analysis, and a document goes to summarization. Unsupported media gets a polite “not supported” reply instead of silently failing.
Media becomes clean text the agent can understand. The workflow fetches the Base64 for the file, converts it into a binary attachment, and uses Gemini to extract or generate the text instructions (like dates, times, titles, and descriptions).
The AI Agent chooses the correct calendar action. With short-term memory (last eight messages), it figures out if the user wants to create, retrieve, update, or delete an event, then uses MCP tools to call Google Calendar.
A WhatsApp confirmation is sent back. The final response goes out via Evolution API, so the sender sees what was booked (or changed) without waiting on a human.
You can easily modify the agent instructions to match your booking rules based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound webhook that starts the workflow and delivers incoming messages into the router.
- Add and configure Incoming Webhook Trigger.
- Set Path to
Calendarand HTTP Method toPOST. - Copy the production webhook URL for use in your messaging platform.
Step 2: Route Message Types and Map Text
Route each incoming message type through the correct parsing path and map text for the AI agent.
- In Detect Message Format, verify the four rules evaluate
{{ $json.body.data.messageType }}againstconversation,imageMessage,audioMessage, anddocumentMessage. - Confirm the fallback output is named Message not supported and connects to Unsupported Message Reply.
- In Map Text Fields, set text to
{{ $json.body.data.message.conversation }}so conversation messages go directly to the agent.
Execution Flow: Incoming Webhook Trigger → Detect Message Format → Map Text Fields → Orchestration Agent.
Step 3: Configure Media Retrieval and Conversion
Set up base64 retrieval and binary conversion for audio, images, and documents so they can be processed by Gemini.
- Configure Fetch Audio Base64, Retrieve Image Base64, and Fetch Document Base64 with Operation set to
get-media-base64and Message ID to{{ $json.body.data.key.id }}. - In Convert Audio Binary, set Operation to
toBinary, Source Property todata.base64, and Binary Property Name todata_1. - In Convert Image Binary and Convert Document Binary, set Operation to
toBinaryand Source Property todata.base64.
Execution Flow: Detect Message Format → Retrieve Image Base64 → Convert Image Binary → Image Analysis and Detect Message Format → Fetch Audio Base64 → Convert Audio Binary → Audio Transcription.
Execution Flow: Detect Message Format → Fetch Document Base64 → Convert Document Binary → Document Summary.
Credential Required: Connect your Evolution API credentials for all Evolution API nodes (5 nodes handle inbound and outbound media/messages).
Step 4: Set Up Gemini Processing and Mapping
Configure Gemini to transcribe audio, analyze images, and summarize documents, then map the resulting text for the agent.
- In Audio Transcription, set Resource to
audio, Input Type tobinary, and Binary Property Name todata_1. - In Image Analysis, keep the long analysis prompt in Text and set Resource to
imagewith Input Typebinary. - In Document Summary, set Text to
What is this document about? Please provide a summary of the subject matter. Be as brief as possible.and Resource todocument. - Map AI outputs in Audio Text Mapping and Document Text Mapping with text set to
{{ $json.content.parts[0].text }}. - In Image Text Mapping, set Imagem_description to
{{ $json.content.parts[0].text }}and image_caption to{{ $('Detect Message Format').item.json.body.data.message.imageMessage.caption }}.
Credential Required: Connect your Google Gemini credentials in Audio Transcription, Image Analysis, and Document Summary.
Step 5: Configure the AI Orchestration and Memory
Set up the agent that decides how to respond and uses memory and tools for calendar actions.
- In Gemini Chat Model, keep default settings to serve as the language model for Orchestration Agent.
- In Short-Term Memory, set Session Key to
{{ $('Incoming Webhook Trigger').item.json.body.data.key.remoteJid }}, Session ID Type tocustomKey, and Context Window Length to8. - In Orchestration Agent, set Text to
{{ $json.text }}and keep the defined system message instructions. - Attach Calendar MCP Tool as an AI tool in Orchestration Agent with Endpoint URL
https://hexagom-n8n.cloudfy.cloud/mcp/calendar.
Credential Required: Connect your Google Gemini credentials in Gemini Chat Model.
Short-Term Memory and Calendar MCP Tool are AI sub-nodes; they are configured through Orchestration Agent, so ensure the parent node is properly set up.
Step 6: Configure Calendar MCP Server and Google Calendar Tools
Expose calendar tools through the MCP server so the agent can create, retrieve, modify, and delete events.
- In MCP Calendar Server, set Path to
calendar. - In Create Calendar Event, set Start to
{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}and End to{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}. - In Create Calendar Event, set Calendar to
{{ '[YOUR_EMAIL]' }}, and map Summary and Description using the provided$fromAIexpressions. - In Retrieve Calendar Events, set Operation to
getAll, Time Min to{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}, and Time Max to{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}. - In Remove Calendar Event and Modify Calendar Event, set Event ID to
{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}and set Calendar to{{ '[YOUR_EMAIL]' }}.
Credential Required: Connect your Google Calendar credentials for Create Calendar Event, Retrieve Calendar Events, Remove Calendar Event, and Modify Calendar Event.
Step 7: Configure Response Dispatch
Send the agent’s response back to the original sender.
- In Dispatch Response, set Remote Jid to
{{ $('Incoming Webhook Trigger').item.json.body.data.key.remoteJid }}. - Set Message Text to
{{ $json.output }}.
Credential Required: Connect your Evolution API credentials in Dispatch Response and Unsupported Message Reply.
Step 8: Test and Activate Your Workflow
Validate end-to-end behavior and activate for production.
- Use Execute Workflow and send test POST requests to Incoming Webhook Trigger for conversation, image, audio, and document messages.
- Confirm successful execution: text routes through Map Text Fields, media routes through the conversion and Gemini nodes, and responses are delivered by Dispatch Response.
- Verify calendar actions through Create Calendar Event, Retrieve Calendar Events, Modify Calendar Event, and Remove Calendar Event when the agent decides tools are required.
- When ready, toggle the workflow to Active so the webhook runs in production.
Common Gotchas
- Google Calendar OAuth credentials can expire or need specific permissions. If things break, check n8n’s Credentials screen and the connected Google account access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Evolution API instance settings matter more than you think. If replies stop sending, confirm the instance name is filled in across Evolution API nodes and that the webhook URL is still active in the Evolution panel.
Frequently Asked Questions
About an hour if your accounts and APIs are ready.
No. You will mostly paste credentials and map a few fields. The “hard part” is testing different message types so you trust the outputs.
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 and any WhatsApp/Evolution API plan costs.
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 want to be explicit in the agent prompt about which calendar to use, and connect the right Google Calendar credentials. Many teams route “client bookings” to one calendar and internal tasks to another, then adjust the Create/Modify tool calls accordingly. If you add extra MCP tools, the overall structure stays the same.
Usually it’s an instance mismatch or a webhook configuration issue. Double-check the instance name in every Evolution API node, then confirm the webhook URL is correctly pasted in the Evolution API panel for that same instance. If it used to work and suddenly doesn’t, rotate credentials and verify the provider isn’t blocking requests from your server.
If you self-host, there’s no hard execution cap, so it mostly depends on your server and API limits.
Often, yes, because this workflow needs branching by message type, file handling, and an agent that can choose between create/update/delete actions. n8n is comfortable with that kind of logic, and you can self-host when volume grows. Zapier or Make can still work if your use case is simpler, like “every WhatsApp text creates a calendar event,” but they get awkward once you introduce voice notes, images, or documents. Cost is the other factor. High message volume can get pricey on per-task pricing. Talk to an automation expert if you want a quick recommendation for your exact setup.
Your WhatsApp inbox can be where requests start, not where scheduling goes to die. Set this up once, let it run, and keep your Google Calendar trustworthy again.
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.