WhatsApp Appointment Booking Automation (Twilio + Google Calendar) - tested end-to-end

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 }]] }
  }
}
```