Erstellen Sie einen automatisierten WhatsApp-Buchungsbot mit Google Calendar, Sheets & OpenAI
Verwandeln Sie Ihr Dienstleistungsunternehmen mit einem intelligenten Terminplaner, der über WhatsApp läuft. Dieses umfassende Tutorial zeigt Ihnen, wie Sie ein vollständig automatisiertes Buchungssystem mit n8n-Workflow-Automatisierung erstellen, manuelle Terminplanung eliminieren und gleichzeitig nahtlose Kundenerlebnisse bieten.
Perfekt für Gesundheitsdienstleister, Berater, Schönheitssalons und alle terminbasierten Unternehmen, die ihren Buchungsprozess ohne technische Komplexität optimieren möchten.
Laden Sie das Workflow-JSON herunter und verwenden Sie es!
🔧 Benötigte Tools
- Wassenger: Zum Empfangen und Senden von WhatsApp-Nachrichten
- Google Calendar: Zur Verwaltung und Überprüfung der Verfügbarkeit
- Google Sheets: Zur Speicherung von Kundendaten und Termindetails
- Gmail: Zum Versenden von Bestätigungs-E-Mails
- OpenAI (ChatGPT): Für Konversation und Sprach-zu-Text-Transkription
Systemarchitektur Überblick
Der automatisierte Buchungsablauf läuft in folgenden aufeinanderfolgenden Schritten ab:
- Nachrichtenempfang: WhatsApp-Nachrichten lösen den Workflow aus
- Inhaltsanalyse: System erkennt Text- oder Sprachnachrichten
- Sprachverarbeitung: Audionachrichten werden automatisch transkribiert
- KI-Konversation: Intelligenter Assistent führt die Kundeninteraktion
- Datenerfassung: Kundendaten werden in Google Sheets gespeichert
- Verfügbarkeitsprüfung: Echtzeit-Kalenderabfrage nach freien Slots
- Terminbestätigung: Erstellung eines Kalendereintrags und E-Mail-Benachrichtigung
Beginnen Sie damit, die Art und Weise zu verändern, wie Ihr Unternehmen Termine mit WhatsApp und KI verwaltet — ganz ohne Programmierung.
✅ Registrieren Sie Ihre WhatsApp‑Nummer bei Wassenger✅ Laden Sie das komplette JSON‑Workflow herunter, um es in Ihre n8n‑Instanz zu importieren✅ Beginnen Sie in wenigen Minuten mit der automatischen Terminbuchung
Implementierungsdurchgang
Schritt 1: WhatsApp‑Nachrichtenverarbeitung
Konfigurieren Sie den Wassenger-Trigger-Knoten, um eingehende Nachrichten auf Ihrem WhatsApp Business-Konto zu überwachen. Diese Integration erfasst nahtlos sowohl Textnachrichten als auch Sprachnachrichten.
Schritt 2: Nachrichtenformat‑Erkennung
Implementieren Sie einen Switch‑Knoten, der den Nachrichtentyp bestimmt:
- Textnachrichten: Direkt durch den KI‑Agenten verarbeiten
- Sprachnachrichten: Die Audiodatei herunterladen und an OpenAI Whisper zur Transkription senden
Schritt 3: Conversational AI‑Integration
Setzen Sie einen LangChain‑KI‑Agenten ein, der:
- die Kundenabsicht aus der Erstnachricht analysiert
- natürliche, kontextuelle Antworten liefert
- Benutzer durch den Buchungsprozess führt
- systematisch die erforderlichen Informationen sammelt
Der KI‑Assistent sammelt Kundendaten in folgender Reihenfolge:
- E-Mail‑Adresse (dient als eindeutiger Kundenidentifikator)
- Vollständiger Name
- Telefonnummer‑Bestätigung
- Zweck des Termins oder Gesprächsthemen
Holen Sie sich die Anweisungen für den KI‑Agenten kostenlos in der JSON‑Datei in unserer App
Beginnen Sie damit, die Art und Weise zu verändern, wie Ihr Unternehmen Termine mit WhatsApp und KI verwaltet — ganz ohne Programmierung.
✅ Registrieren Sie Ihre WhatsApp‑Nummer bei Wassenger✅ Laden Sie das komplette JSON‑Workflow herunter, um es in Ihre n8n‑Instanz zu importieren✅ Beginnen Sie in wenigen Minuten mit der automatischen Terminbuchung
Schritt 4: Google Sheets Datenverwaltung
Konfigurieren Sie die automatische Datenverarbeitung:
- Neue Kunden: Neue Tabellenzeilen anlegen
- Wiederkehrende Kunden: Bestehende Einträge anhand der E‑Mail aktualisieren
- Echtzeit‑Updates: Informationen werden nach jeder Interaktion gespeichert
Schritt 5: Intelligentes Terminplanungssystem
Die Kalenderintegration bietet verfügbare Zeitfenster basierend auf:
Geschäftszeiten:
- Montag bis Freitag
- Vormittags: 09:00–12:00
- Nachmittags: 13:00–17:00
- Automatischer Ausschluss der Mittagspause (12:00–13:00)
Here are the next available appointments:
- Thursday at 10:00 AM
- Friday at 11:30 AM
...
Intelligente Filterung:
- Nur zukünftige Termine (mindestens 24 Stunden im Voraus buchbar)
- Terminblockdauer: 30 Minuten
- Konfliktfreie Terminprüfung
- Berücksichtigung der Kunden‑Zeitzone
Beginnen Sie damit, die Art und Weise zu verändern, wie Ihr Unternehmen Termine mit WhatsApp und KI verwaltet — ganz ohne Programmierung.
✅ Registrieren Sie Ihre WhatsApp‑Nummer bei Wassenger✅ Laden Sie das komplette JSON‑Workflow herunter, um es in Ihre n8n‑Instanz zu importieren✅ Beginnen Sie in wenigen Minuten mit der automatischen Terminbuchung
Schritt 6: Terminabschluss
Sobald Kunden ihre bevorzugte Zeit auswählen:
- Erstellung eines Google Calendar‑Termins
- Vervollständigung des Tabellen‑Eintrags mit bestätigten Details
- Versand einer professionellen Bestätigungs‑E‑Mail
- Alle Zeitstempel werden zur Konsistenz in der System‑Zeitzone gespeichert
Workflow JSON‑Konfiguration
Kopieren und speichern Sie diesen Code als JSON und laden Sie ihn in Ihre n8n‑Instanz hoch
{
"name": "WhatsApp Appointment Setter",
"nodes": [
{
"parameters": {
"events": [
"message:in:new"
]
},
"type": "n8n-nodes-wassenger.wassengerTrigger",
"typeVersion": 1,
"position": [
1080,
700
],
"id": "2c24ff1f-8b4d-4341-b2c7-c81ba4c2208c",
"name": "Wassenger Trigger",
"webhookId": "83130e74-a519-4153-b901-f03769d2f04f",
"credentials": {
"wassengerApiKey": {
"id": "9du3UAbFSzEaTSQE",
"name": "WhatsApp API key"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.data.body }}",
"options": {
"systemMessage": "=You are a helpful assistant for a dental clinic based in London.\n\n# You have access to these tools:\n\n1.A Google Calendar Tool that allows you to create, reschedule, and delete events in the calendar.\n\n2.Google Sheets Tools:\n\n- Google Sheet - Add Row: Adds a new row to a Google Sheet.\n\n- Google Sheet - Update Row: Updates a row in the Google Sheet.\n\n- Google Sheet - Read: Reads content from the Google Sheet.\n\n3.Gmail - Send Confirmation User: Sends a confirmation email to the user after the appointment is confirmed.\n\nThe current time and date is in the German Time Zone:\n{{ $now }}\n\n# Your Task: \n\n1.When the conversation starts:\n\nAnalyze the first message sent by the user.\n\nRespond naturally based on its intent, tone, or content(for example: greeting, question, or request).\n\nKeep your reply short, polite, and friendly.\n\nThen, follow up with:\n\"Would you like to book an appointment?\"\n\nExamples:\n\nIf the user says: "Hi, how are you?"\n→ Respond: "I'm doing great, thanks for asking! Would you like to book an appointment?"\n\nIf the user says: "I need help with pricing"\n→ Respond: "Happy to help! Would you like to book an appointment so we can discuss it?"\n\nIf the user responds with yes, begin collecting their contact information.\n\nYou must collect the information in the following strict order:\n\n- First: Email address\n > This is used as the unique identifier for matching rows in the Google Sheet.\n > After receiving the email: Use \"Google Sheet - Read\" to check if the email exists.\n\nIf it exists, use Google Sheet - Update Row to update that row.\n\nIf it does not exist, use Google Sheet - Add Row to create a new one.\n\n- Then: Full name \n- Then: Confirm the phone number with the patient taken from:\n{{ $('Wassenger Trigger').item.json.data.fromNumber }}\n\nGuidelines:\n\n! Ask for only one piece of information at a time.\n! Wait for the user's response before asking the next question.\n! After every response, immediately update the Google Sheet using Google Sheet - Update Row, matched by the email address.\n\n2.You must always store all the user information(email address, name, phone number) in the Google Sheet.\n\nAfter collecting the information, ask the user:\n\"What would you like to discuss during your appointment?\"\n\n- Wait for their response.\n- Update the row in the Google Sheet with the topic or notes field using Google Sheet - Update Row to save the response as the appointment topic or notes.\n\n3.Offering Appointment Slots \nOnce the user's contact details and discussion topic have been collected:\n\nOffer 5 available time slots.\n\n- Use the assistant's local time zone(London) to determine available hours.\n\nOffice hours:\n\nMonday to Friday \nMorning: 09:00 to 12:00 \nAfternoon: 13:00 to 17:00\n\nDo not offer any times between 12:00 and 13:00.\n\nImportant:\n\n- Only offer time slots that fall within the office hours listed above.\n- You must check that a full 30-minute block is available:\n - The start and end time must not conflict with any existing calendar event.\n - The time slot must begin at least 24 hours in the future.\n\n- Always offer the next 5 available 30-minute time slots that meet the above criteria.\n\n- Only display the time slots in the user's time zone(London time).\n Do not mention time conversions or other time zones in your response.\n\n- Present the time slots in a simple, friendly format like: \n \"Here are the next available appointments for you: \n - Thursday at 10:00 AM \n - Friday at 11:30 AM \n...\"\n\n- If no valid slots match the user's requested period(e.g., afternoon), politely inform the user and offer the next closest options.\n\n- Never mention unavailable or already booked time slots.\n Only show the free ones.\n\n! You must not manually calculate or estimate time zone offsets.\nUse the Google Calendar tool to convert and format times.\n\n4.When the user confirms a preferred date and time, you must:\n\nCreate an event in the Google Calendar at the selected time.\n\nAppointments should always be scheduled for 30 minutes unless the user specifies otherwise.\n\nDo not create a new row in the Google Sheet.\n\nInstead, use \"Google Sheet - Update Row\" to update the existing row corresponding to the user(matched by email address), and add the selected date and time as the confirmed appointment.\n\nThe appointment time saved in the Google Sheet must always be in the assistant's local time(German time) - never in the user's time zone.\n\nAfter the booking is confirmed, send a confirmation email to the user using the \"Gmail - Send Confirmation User\" tool.\n\nThe email must include:\n\n- The confirmed appointment date and time(in London time) \n- The user's name and topic of discussion \n- A short, friendly message confirming the booking\n\nOnly send the confirmation email after the calendar event has been created and all data has been stored in the Google Sheet."
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.8,
"position": [
2440,
720
],
"id": "2df07709-f74d-4816-8969-141a8502cc64",
"name": "AI Agent"
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
2040,
960
],
"id": "5b974204-0b48-483a-9306-9f8a53bf0aa7",
"name": "OpenAI Chat Model"
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "={{ $('Message Type') }}",
"contextWindowLength": 20
},
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
2200,
960
],
"id": "7f3c1455-c110-48f0-b330-7da555dce523",
"name": "Simple Memory"
},
{
"parameters": {
"operation": "getAll",
"calendar": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Calendar', ``, 'string') }}",
"mode": "id",
"__regex": "(^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)"
},
"options": {}
},
"type": "n8n-nodes-base.googleCalendarTool",
"typeVersion": 1.3,
"position": [
2340,
960
],
"id": "a02cdef3-2958-4a31-b033-3c7472e6262e",
"name": "Calendar Read",
"credentials": {
"googleCalendarOAuth2Api": {
"id": "LL4HXXOSECspo8kd",
"name": "Google Calendar account"
}
}
},
{
"parameters": {
"calendar": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Calendar', ``, 'string') }}",
"mode": "id"
},
"additionalFields": {}
},
"type": "n8n-nodes-base.googleCalendarTool",
"typeVersion": 1.3,
"position": [
2480,
960
],
"id": "5bf56efe-4e6a-496f-992e-9463184d5a31",
"name": "Calendar Create"
},
{
"parameters": {
"operation": "delete",
"calendar": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Calendar', ``, 'string') }}",
"mode": "id"
},
"eventId": "={{ fromAI(\"id\", \"the id of the event\") }}",
"options": {}
},
"type": "n8n-nodes-base.googleCalendarTool",
"typeVersion": 1.3,
"position": [
2620,
960
],
"id": "3d4e631b-c9ef-43d7-b159-d5a677ee0e71",
"name": "Calendar Delete"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "1CTk-H0P6-ca8NK3T79_KL6LS0_7Xq8bVOP1Ldun281Q",
"mode": "list",
"cachedResultName": "Appointment Setter",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CTk-H0P6-ca8NK3T79_KL6LS0_7Xq8bVOP1Ldun281Q/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Sheet1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CTk-H0P6-ca8NK3T79_KL6LS0_7Xq8bVOP1Ldun281Q/edit#gid=0"
},
"options": {
"dataLocationOnSheet": {
"values": {
"rangeDefinition": "detectAutomatically",
"readRowsUntil": "firstEmptyRow"
}
},
"outputFormatting": {
"values": {
"general": "UNFORMATTED_VALUE",
"date": "FORMATTED_STRING"
}
}
}
},
"type": "n8n-nodes-base.googleSheetsTool",
"typeVersion": 4.5,
"position": [
2760,
960
],
"id": "f405d7a1-b830-4030-87a4-c9726f012661",
"name": "Google Sheets"
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Document', ``, 'string') }}",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Sheet', ``, 'string') }}",
"mode": "id"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Email": "={{ $fromAI(\"email\", \"the email address that the user tells you\") }}"
},
"matchingColumns": [],
"schema": [
{
"id": "Appointment Date",
"displayName": "Appointment Date",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Booking Status",
"displayName": "Booking Status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Time Zone",
"displayName": "Time Zone",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Phone",
"displayName": "Phone",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Email",
"displayName": "Email",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Intake Form",
"displayName": "Intake Form",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Reminder Sent",
"displayName": "Reminder Sent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheetsTool",
"typeVersion": 4.5,
"position": [
2900,
960
],
"id": "42769806-5ad3-4d01-b119-6002bd6e44aa",
"name": "Google Sheets - Add rows"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Document', ``, 'string') }}",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Sheet', ``, 'string') }}",
"mode": "id"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Email": "={{ $fromAI(\"email\", \"the email address that the user tells you\") }}",
"Appointment Date": "={{ $fromAI(\"date\", \"the appointment date and time converted to Central European Time that the user confirmed as his appointment\") }}",
"Booking Status": "={{ $fromAI(\"status\", \"the status of the appointment which is either confirmed or cancelled\") }}",
"Time Zone": "={{ $fromAI(\"timeZone\", \"the time zone and location the the user tells you\") }}",
"Name": "={{ $fromAI(\"name\", \"the name of the user\") }}",
"Phone": "={{ $fromAI(\"phone\", \"the phone number that the user tells you.\") }}",
"Intake Form": "={{ $fromAI(\"intake_form\", \"specific topics or issues the user likes to discuss during the appointment\") }}"
},
"matchingColumns": [
"Email"
],
"schema": [
{
"id": "Appointment Date",
"displayName": "Appointment Date",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Booking Status",
"displayName": "Booking Status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Time Zone",
"displayName": "Time Zone",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Phone",
"displayName": "Phone",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Email",
"displayName": "Email",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Intake Form",
"displayName": "Intake Form",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Reminder Sent",
"displayName": "Reminder Sent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheetsTool",
"typeVersion": 4.5,
"position": [
3060,
960
],
"id": "ad4b0c89-bfd2-4016-b9ff-599178632e75",
"name": "Google Sheets - Update Row"
},
{
"parameters": {
"sendTo": "={{ $fromAI(\"email\", \"the email address provided by the user earlier\") }}",
"subject": "={{ $fromAI(\"subject\", \"the email subjectline that just is [New Booking] + Booking date and time converted to Local Timezone that the user confirmed as this appointment\") }}",
"message": "={{ $fromAI(\"body\", \"the email body taht contains the message that the booking if thge user was confirmed along with booking date, email, name, timezone, what user wants to discuss during the appointment\") }}",
"options": {
"bccList": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('BCC', ``, 'string') }}"
}
},
"type": "n8n-nodes-base.gmailTool",
"typeVersion": 2.1,
"position": [
3180,
960
],
"id": "0510a247-2e16-4746-88ef-cf70a61ad409",
"name": "Gmail",
"webhookId": "6244c414-188e-4e55-a323-145b5238faf2"
},
{
"parameters": {
"url": "=https://api.wassenger.com{{ $('Wassenger Trigger').item.json.data.media.links.download }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "d85d8848-4a0a-44e2-8f33-032a51302f98",
"name": "Download Audio",
"type": "n8n-nodes-base.httpRequest",
"position": [
1640,
360
],
"typeVersion": 4.2,
"credentials": {
"httpHeaderAuth": {
"id": "GTzBwI8uSTXV0UvT",
"name": "Header Auth account"
}
}
},
{
"parameters": {
"resource": "audio",
"operation": "transcribe",
"options": {}
},
"id": "1637b236-94ea-4270-a0bf-980a8f3db218",
"name": "Transcribe Audio",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1880,
360
],
"typeVersion": 1.8,
"credentials": {
"openAiApi": {
"id": "LOYODT0dLN0xy31E",
"name": "OpenAi account"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "219577d5-b028-48fc-90be-980f4171ab68",
"name": "data.body",
"type": "string",
"value": "={{ $json.text }}"
}
]
},
"options": {}
},
"id": "ed7c9be2-bf82-4374-93af-3b40e9c0f1c1",
"name": "Audio Info",
"type": "n8n-nodes-base.set",
"position": [
2120,
360
],
"typeVersion": 3.4
},
{
"parameters": {
"device": "device_id",
"phone": "={{ $('Wassenger Trigger').item.json.data.fromNumber }}",
"message": "={{ $json.output }}",
"options": {}
},
"type": "n8n-nodes-wassenger.wassenger",
"typeVersion": 1,
"position": [
3020,
720
],
"id": "b2547711-f27a-43f0-8adb-f9d9e7606bd4",
"name": "Send Message",
"credentials": {
"wassengerApiKey": {
"id": "9du3UAbFSzEaTSQE",
"name": "WhatsApp API key"
}
}
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.data.media.type }}",
"rightValue": "audio",
"operator": {
"type": "string",
"operation": "equals"
},
"id": "94a56d29-cb88-4eb0-8d6b-07b1b91bfc3f"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Voice message"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "6ce0d87f-bdfc-4c65-a3fb-8d86bb682c4e",
"leftValue": "={{ $json.data.type }}",
"rightValue": "text",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Text message"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
1320,
700
],
"id": "3df50a7f-5ab3-421d-939b-ebb762a451ce",
"name": "Message Type"
},
{
"parameters": {
"content": "📅 WhatsApp Appointment Booking Workflow(n8n)\nThis n8n workflow automates appointment scheduling through WhatsApp for any business offering time-based services(e.g.clinics, consultancies, salons, etc.).It combines AI-driven messaging with Google services to streamline the entire booking process.\n\n🔧 Tools & Services Used\nWassenger Trigger: Captures incoming WhatsApp messages.\n\nLangchain AI Agent: Manages the conversational flow, understands intent, and gathers required info.\n\nGoogle Calendar: Checks for availability and books appointments.\n\nGoogle Sheets: Stores and updates client records and booking info.\n\nGmail: Sends personalized appointment confirmations.\n\nOpenAI(gpt-4o-mini): Generates intelligent and friendly chat replies.\n\nAudio Transcription(Optional): Converts voice messages to text for processing.\n\n📋 Step-by-Step Workflow Description\n1.Trigger: Incoming WhatsApp Message\nThe flow starts when a new message(text or voice) is received via Wassenger.\n\n2.Message Type Detection\nThe system checks whether the message is:\n\nText: Processes it directly.\n\nVoice: Downloads and transcribes it using OpenAI.\n\n3.AI Agent Engagement\nThe AI assistant analyzes the first message and responds naturally.\n\nIt then asks if the user would like to book an appointment.\n\nIf the user agrees, it collects the following information in strict order:\n\nEmail address(used as a unique identifier)\n\nFull name\n\nPhone number\n\nAfter each input, the AI updates Google Sheets(adding or updating rows as needed).\n\n4.Purpose of Appointment\nThe assistant asks what the user would like to discuss during the appointment.\n\nThis input is recorded in the sheet as notes or discussion topic.\n\n5.Appointment Slot Offering\nThe system checks Google Calendar for available 30-minute time blocks.\n\nOnly time slots during business hours are offered:\n\nMonday to Friday\n\nMorning: 09:00–12:00\n\nAfternoon: 13:00–17:00(noon hour excluded)\n\nThe next 5 available slots(at least 24h in the future) are displayed in the user's local time(e.g., London).\n\n6.Appointment Confirmation\nOnce the user picks a time:\n\nA calendar event is created.\n\nThe associated Google Sheets row is updated with the confirmed date/time(stored in system time).\n\nA confirmation email is sent via Gmail.\n\n🕒 Timezone Notes\nUsers are assumed to be in a fixed known timezone(e.g., London).\n\nInternally, scheduling and calendar checks are based on a consistent system timezone(e.g., German time).\n\n✅ Key Benefits\nFully automated booking via WhatsApp - no human intervention needed.\n\nWorks with both text and voice messages.\n\nEliminates double bookings by checking calendar availability.\n\nCentralized data collection in Google Sheets.\n\nProfessional email confirmations sent instantly.",
"height": 1700,
"width": 700
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
180,
-100
],
"id": "d5c7f667-e407-48e1-8403-91ed141bfb10",
"name": "Sticky Note"
}
],
"pinData": {},
"connections": {
"Wassenger Trigger": {
"main": [
[
{
"node": "Message Type",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Send Message",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Calendar Read": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Calendar Create": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Calendar Delete": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Sheets": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Sheets - Add rows": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Sheets - Update Row": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Gmail": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Download Audio": {
"main": [
[
{
"node": "Transcribe Audio",
"type": "main",
"index": 0
}
]
]
},
"Transcribe Audio": {
"main": [
[
{
"node": "Audio Info",
"type": "main",
"index": 0
}
]
]
},
"Audio Info": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Message Type": {
"main": [
[
{
"node": "Download Audio",
"type": "main",
"index": 0
}
],
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Erweiterte Funktionen und Anpassungen
Skalierbarkeitsoptionen
- Mehrere Kalenderintegrationen für Team‑Buchungen
- Abteilungsspezifische Planungsregeln
- Anpassbare Termindauer‑Einstellungen
- Ausschluss von Feiertagen und Urlaubszeiten
Integrationsmöglichkeiten
- CRM‑Systemanbindungen
- Automatisierung der Zahlungsabwicklung
- SMS‑Erinnerungssysteme
- Generierung von Video‑Call‑Links
Überwachung und Analytik
- Tracking der Buchungskonversionen
- Analyse der Kundeninteraktionen
- Messung der Reaktionszeiten
- Systemleistungsüberwachung
Zukünftige Verbesserungen
Geplante Funktionen:
- Möglichkeit zur Terminverschiebung
- Automatisierte Erinnerungsbenachrichtigungen
- Sammlung von Kundenfeedback
- Ausbau der Mehrsprachigkeitsunterstützung
Erweiterte Integrationen:
- Anbindungen an Videokonferenzplattformen
- CRM‑Systeme
- Entwicklung eines Analyse‑Dashboards
- Mobile App‑Benachrichtigungen
Heute starten
Bereit, diese leistungsstarke Buchungsautomatisierung zu implementieren? Folgen Sie diesen Schritten:
- Registrieren Sie Ihre WhatsApp‑Nummer: Richten Sie Ihr Business‑Profil bei Wassenger ein
- Laden Sie das Workflow herunter: Greifen Sie auf die vollständige n8n‑Vorlage zu
- Konfigurieren Sie Ihre Umgebung: Richten Sie alle erforderlichen Integrationen ein (Google, OpenAI, etc.)
- Gründlich testen: Überprüfen Sie, ob alle Funktionen wie erwartet arbeiten
- Aktivieren Sie Ihren Workflow: Beginnen Sie mit dem Akzeptieren automatisierter Buchungen
Dieses umfassende WhatsApp‑Buchungssystem verändert die Art und Weise, wie Dienstleistungsunternehmen Termine verwalten, und bietet professionelle Automatisierung ohne erforderliche technische Expertise. Die Kombination aus KI, Google‑Integration und WhatsApp‑Zugänglichkeit schafft eine leistungsstarke Lösung für moderne Geschäftsabläufe.
Support und Community
Für zusätzliche Unterstützung, Workflow‑Anpassungen oder die Implementierung erweiterter Funktionen verbinden Sie sich mit der n8n‑Community oder ziehen Sie professionelle Automatisierungsberatungen in Betracht, um das Potenzial Ihres Systems maximal auszuschöpfen.
🚀 Wassenger Flows kostenlos testen | 📚 Dokumentation ansehen | 💬 Support erhalten












