Guida Completa al Sistema di Prenotazione Appuntamenti AI di WhatsApp con N8n

4 luglio 2025

Crea un bot di prenotazione WhatsApp automatizzato con Google Calendar, Sheets e OpenAI

Trasforma la tua attività di servizi con un pianificatore di appuntamenti intelligente che funziona tramite WhatsApp. Questo tutorial completo ti mostra come creare un sistema di prenotazione completamente automatizzato usando l'automazione dei workflow n8n, eliminando la gestione manuale degli appuntamenti e offrendo esperienze fluide ai clienti.

Perfetto per fornitori di servizi sanitari, consulenti, saloni di bellezza e qualsiasi attività basata su appuntamenti che voglia snellire il processo di prenotazione senza complessità tecniche.

Scarica il JSON del workflow e usalo!

🔧 Strumenti necessari

  • Wassenger: Per ricevere e inviare messaggi WhatsApp
  • Google Calendar: Per gestire e verificare la disponibilità
  • Google Sheets: Per memorizzare i dati dei clienti e i dettagli degli appuntamenti
  • Gmail: Per inviare email di conferma
  • OpenAI (ChatGPT): Per la conversazione e la trascrizione da voce a testo

Panoramica dell'architettura del sistema

Il flusso di prenotazione automatizzato opera attraverso questi passaggi sequenziali:

  1. Ricezione del messaggio: I messaggi WhatsApp attivano il workflow
  2. Analisi del contenuto: Il sistema identifica messaggi di testo o vocali
  3. Elaborazione vocale: I messaggi audio vengono trascritti automaticamente
  4. Conversazione AI: L'assistente intelligente gestisce l'interazione con il cliente
  5. Raccolta dati: Le informazioni del cliente vengono memorizzate in Google Sheets
  6. Controllo disponibilità: Consultazione in tempo reale del calendario per gli slot liberi
  7. Conferma prenotazione: Creazione dell'evento sul calendario e notifica via email

Inizia a trasformare il modo in cui la tua attività gestisce gli appuntamenti con WhatsApp e l'AI, senza bisogno di coding.

Registra il tuo numero WhatsApp su Wassenger Scarica il JSON completo del workflow per importarlo nella tua istanza n8n Inizia a prenotare appuntamenti automaticamente in pochi minuti

Guida all'implementazione

Passo 1: Gestione dei messaggi WhatsApp

Configura il nodo trigger di Wassenger per monitorare i messaggi in arrivo sul tuo account WhatsApp Business. Questa integrazione cattura senza problemi sia comunicazioni di testo che registrazioni vocali.

Passo 2: Rilevamento del formato del messaggio

Implementa un nodo switch che determina il tipo di messaggio:

  • Messaggi di testo: Elaborati direttamente dall'agente AI
  • Messaggi vocali: Scarica il file audio e invialo a OpenAI Whisper per la trascrizione

Passo 3: Integrazione dell'IA conversazionale

Distribuisci un agente AI LangChain che:

  • Analizza l'intento del cliente dal primo contatto
  • Fornisce risposte naturali e contestuali
  • Guida l'utente attraverso il processo di prenotazione
  • Raccoglie le informazioni essenziali in modo sistematico

L'assistente AI raccoglie i dettagli del cliente in questa sequenza specifica:

  • Indirizzo email (funziona come identificatore univoco del cliente)
  • Nome completo
  • Verifica del numero di telefono
  • Finalità dell'appuntamento o argomenti da discutere

Ottieni le istruzioni per l'agente AI gratuitamente nel file JSON disponibile nella nostra app

Inizia a trasformare il modo in cui la tua attività gestisce gli appuntamenti con WhatsApp e l'AI, senza bisogno di coding.

Registra il tuo numero WhatsApp su Wassenger Scarica il JSON completo del workflow per importarlo nella tua istanza n8n Inizia a prenotare appuntamenti automaticamente in pochi minuti

Passo 4: Gestione dei dati su Google Sheets

Configura la gestione automatica dei dati:

  • Nuovi clienti: Crea nuove voci nel foglio di calcolo
  • Clienti di ritorno: Aggiorna i record esistenti basandoti sulla corrispondenza dell'email
  • Aggiornamenti in tempo reale: Le informazioni vengono salvate dopo ogni interazione

Passo 5: Sistema di pianificazione intelligente

L'integrazione del calendario offre slot disponibili basati su:

Orario di lavoro:

  • Operatività dal lunedì al venerdì
  • Mattina: 09:00–12:00
  • Pomeriggio: 13:00–17:00
  • Esclusione automatica della pausa pranzo (12:00–13:00)
Here are the next available appointments:
- Thursday at 10:00 AM
- Friday at 11:30 AM
...

Filtri intelligenti:

  • Solo appuntamenti futuri (prenotazione minima con 24 ore di anticipo)
  • Blocchi per appuntamento della durata di 30 minuti
  • Verifica che non vi siano conflitti nella pianificazione
  • Considerazione del fuso orario del cliente

Inizia a trasformare il modo in cui la tua attività gestisce gli appuntamenti con WhatsApp e l'AI, senza bisogno di coding.

Registra il tuo numero WhatsApp su Wassenger Scarica il JSON completo del workflow per importarlo nella tua istanza n8n Inizia a prenotare appuntamenti automaticamente in pochi minuti

Passo 6: Finalizzazione dell'appuntamento

Una volta che i clienti selezionano l'orario preferito:

  • Creazione dell'evento in Google Calendar
  • Completamento del record nel foglio di calcolo con i dettagli confermati
  • Invio di un'email di conferma professionale
  • Tutti i timestamp vengono memorizzati nel fuso orario del sistema per coerenza

Configurazione del JSON del workflow

Copia e salva questo codice come JSON e caricalo nella tua istanza n8n

{
"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"
}
}

Funzionalità avanzate e personalizzazione

Opzioni di scalabilità

  • Integrazione di più calendari per prenotazioni di team
  • Regole di pianificazione specifiche per reparto
  • Impostazioni personalizzate per la durata degli appuntamenti
  • Esclusioni per festività e periodi di ferie

Possibilità di integrazione

  • Connessioni a sistemi CRM
  • Automazione dei processi di pagamento
  • Sistemi di promemoria via SMS
  • Generazione di link per videochiamate

Monitoraggio e analisi

  • Tracciamento della conversione delle prenotazioni
  • Analisi delle interazioni con i clienti
  • Misurazione dei tempi di risposta
  • Monitoraggio delle prestazioni del sistema

Miglioramenti futuri

Funzionalità pianificate:

  • Capacità di riprogrammazione degli appuntamenti
  • Notifiche di promemoria automatiche
  • Raccolta di feedback dei clienti
  • Espansione del supporto multilingue

Integrazioni avanzate:

  • Connessioni a piattaforme di videoconferenza
  • Sistemi di gestione delle relazioni con i clienti (CRM)
  • Sviluppo di dashboard analitiche
  • Notifiche per app mobile

Inizia oggi

Pronto per implementare questa potente automazione per le prenotazioni? Segui questi passaggi:

  1. Registra il tuo numero WhatsApp: Configura il profilo aziendale su Wassenger
  2. Scarica il workflow: Accedi al template completo per n8n
  3. Configura il tuo ambiente: Imposta tutte le integrazioni richieste (Google, OpenAI, ecc.)
  4. Esegui test approfonditi: Verifica che tutte le funzionalità funzionino come previsto
  5. Attiva il tuo workflow: Inizia ad accettare prenotazioni automatizzate

Questo sistema completo di prenotazione WhatsApp trasforma il modo in cui le attività di servizi gestiscono gli appuntamenti, offrendo un'automazione professionale senza richiedere competenze tecniche. La combinazione di AI, integrazione con Google e accessibilità via WhatsApp crea una soluzione potente per le operazioni aziendali moderne.

Supporto e community

Per assistenza aggiuntiva, personalizzazione del workflow o implementazione di funzionalità avanzate, connettiti con la community di n8n o considera servizi di consulenza professionale per massimizzare il potenziale del tuo sistema.

🚀 Prova Wassenger Flows gratis | 📚 Consulta la documentazione | 💬 Ottieni supporto

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free