Sharing a workflow I built and tested with real WhatsApp messages: it listens for an incoming WhatsApp message via Twilio, detects booking intent, creates the appointment directly in Google Calendar, and sends a confirmation back to the customer.
What it does:
- Webhook receives incoming WhatsApp messages (via Twilio)
-
- If node checks the message for booking keywords
-
- Google Calendar node creates the appointment
-
- Twilio node sends a WhatsApp confirmation back to the customer
- Nodes used: Webhook, If, Google Calendar, Twilio (all core n8n nodes, no community nodes needed).
- Tested end-to-end with real WhatsApp messages - confirmed working, including the calendar event creation with the customer’s number saved in the event description.
- Sharing the sanitized workflow JSON below (credentials and personal info removed). Happy to answer questions!
Want the fully documented version with a setup guide and support? Get it here: WhatsApp Appointment Booking Automation (n8n Template)
json
{
"name": "WhatsApp Appointment Booking",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "whatsapp-booking",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [0, 0],
"name": "Webhook"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $json.body.Body.toLowerCase() }}",
"rightValue": "book",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [224, 0],
"name": "If"
},
{
"parameters": {
"calendar": {
"__rl": true,
"value": "YOUR_CALENDAR_ID@gmail.com",
"mode": "list"
},
"start": "={{ $now.plus(1,'day').startOf('day').plus(10,'hours') }}",
"end": "={{ $now.plus(1,'day').startOf('day').plus(11,'hours') }}",
"additionalFields": {
"description": "={{ 'Customer WhatsApp: ' + $('Webhook').item.json.body.From }}",
"summary": "WhatsApp Appointment Booking"
}
},
"type": "n8n-nodes-base.googleCalendar",
"typeVersion": 1.3,
"position": [448, -96],
"name": "Create an event"
},
{
"parameters": {
"from": "whatsapp:+14155238886",
"to": "={{ $('Webhook').item.json.body.From.replace('whatsapp:','') }}",
"toWhatsapp": true,
"message": "Your appointment is booked for tomorrow at 10:00. Reply CANCEL to cancel.",
"options": {}
},
"type": "n8n-nodes-base.twilio",
"typeVersion": 1,
"position": [672, -96],
"name": "Send an SMS/MMS/WhatsApp message"
}
],
"connections": {
"Webhook": { "main": [[{ "node": "If", "type": "main", "index": 0 }]] },
"If": { "main": [[{ "node": "Create an event", "type": "main", "index": 0 }]] },
"Create an event": { "main": [[{ "node": "Send an SMS/MMS/WhatsApp message", "type": "main", "index": 0 }]] }
}
}
```