Automatically Manage Appointments On WhatsApp With Wassenger And N8n Agents Ready To Use Workflow

May 26, 2025

Calendar WhatsApp appointment Agent

Managing appointments can be time-consuming for small businesses. From scheduling to sending reminders and handling cancellations, the process often requires significant manual effort. By automating appointment management on WhatsApp with Wassenger and n8n, you can streamline this entire process without any coding skills, while avoiding the restrictions and delays of traditional WhatsApp Business API providers.

🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥

Why Choose Wassenger for WhatsApp Appointment Management?

Wassenger offers several unique advantages that make it the ideal platform for appointment management:

  • Instant activation: Start automating appointments immediately without waiting for Meta’s WABA approval process
  • No template restrictions: Create natural, conversational appointment messages without pre-approved templates
  • Visual flow builder: Design appointment workflows without coding using Wassenger’s intuitive Flows feature
  • Team inbox with role-based permissions: Allow different staff members to manage specific types of appointments
  • Multiple phone numbers per account: Set up dedicated appointment lines for different services or departments
  • Advanced webhook system: Receive real-time events for seamless calendar integration

🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥

Benefits of Automated Appointment Management with Wassenger

  • Reduced no-shows: Automatic reminders significantly decrease missed appointments
  • Time savings: Eliminate manual scheduling and confirmation tasks
  • 24/7 availability: Allow customers to book appointments anytime
  • Better customer experience: Provide instant confirmations and easy rescheduling
  • Optimised schedule: Fill gaps in your calendar automatically
  • Rich media capabilities: Send appointment confirmations with location maps, images, or documents

What You’ll Need

  • A Wassenger account (7-day free trial available, no credit card required)
  • An n8n account (self-hosted). A cloud-hosted version will be released soon within the Wassenger app
  • An OpenAI account for AI capabilities (or another AI service provider)
  • A calendar service (Google Calendar, Microsoft Outlook, etc.)

Setting Up Automated Appointment Management

Step 1: Create Your Wassenger Account

Sign up for a Wassenger account and choose a plan that fits your business needs. Wassenger offers flexible options from the entry-level Starter Plan to the feature-rich Business and Enterprise Plans.

Step 2: Install the Official Wassenger Node in n8n

Wassenger has its official node in n8n called n8n-nodes-wassenger. This pre-built integration makes setup significantly easier than with other WhatsApp providers:

1. In n8n, go to Settings > Community Nodes 2. Search for “n8n-nodes-wassenger” and install it 3. Add your Wassenger API key to n8n (find it in your Wassenger dashboard)

Step 3: Create a New n8n Workflow

Create a new workflow in n8n and name it “Wassenger Appointment Manager.”

🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥

Step 4: Add a Wassenger Trigger

Unlike other WhatsApp solutions that require complex HTTP configurations, simply add a “Wassenger Trigger” node that activates whenever someone sends a message to your WhatsApp number.

Step 5: Detect Appointment Requests

Add the agent node that analyses incoming messages to identify appointment requests, cancellations, or rescheduling requests. All the data is included in the JSON file :)

Step 6: Connect Your Calendar

Add a node for your calendar service (like Google Calendar) and connect it using your account credentials.

🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥

Step 7: Create Data Management Tool

Set up conditional nodes that perform different actions based on the type of request:

  • For new appointments: Check availability and create calendar events
  • For cancellations: Find and remove existing appointments
  • For rescheduling: Update existing appointments with new times

Step 8: Send Confirmation Messages via Wassenger and Gmail

Add Wassenger nodes to send confirmation messages to customers, including appointment details, cancellation confirmations, or rescheduling information. Unlike other providers, Wassenger allows you to include rich media like location maps or branded images in your confirmations.

Example n8n Workflow with Wassenger

Here’s a sample n8n workflow in JSON format that you can import directly into your n8n instance:

{
  "name": "Calendar WhatsApp Appointment",
  "nodes": [
    {
      "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": [80, 240],
      "id": "1fca8296-93f4-44fd-a7f7-e587807322a8",
      "name": "Sticky Note"
    },
    {
      "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": [1220, 1040],
      "id": "a8407569-9177-40b5-a290-b19657f8b74f",
      "name": "Message Type"
    },
    {
      "parameters": {
        "device": "66d1a54430541033576feca2",
        "phone": "={{ $('Wassenger Trigger').item.json.data.fromNumber }}",
        "message": "={{ $json.output }}",
        "options": {}
      },
      "type": "n8n-nodes-wassenger.wassenger",
      "typeVersion": 1,
      "position": [2920, 1060],
      "id": "3b89fd3b-e294-4ecc-8d1b-11428101d1ac",
      "name": "Send Message",
      "credentials": {
        "wassengerApiKey": {
          "id": "uB0cff3egkmqplwa",
          "name": "Wassenger Key account 2"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "219577d5-b028-48fc-90be-980f4171ab68",
              "name": "data.body",
              "type": "string",
              "value": "={{ $json.text }}"
            }
          ]
        },
        "options": {}
      },
      "id": "06e1d94b-3ab8-46a7-af60-2112e9bc24ea",
      "name": "Audio Info",
      "type": "n8n-nodes-base.set",
      "position": [2020, 700],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "options": {}
      },
      "id": "4859652b-4946-4bef-ab56-66f4e98e7a95",
      "name": "Transcribe Audio",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [1780, 700],
      "typeVersion": 1.8,
      "credentials": {
        "openAiApi": {
          "id": "RG1FFB2OobOO6yEI",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "url": "=https://api.wassenger.com{{ $('Wassenger Trigger').item.json.data.media.links.download }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {}
      },
      "id": "efba8356-fd5e-44f1-9214-d544f1d01227",
      "name": "Download Audio",
      "type": "n8n-nodes-base.httpRequest",
      "position": [1540, 700],
      "typeVersion": 4.2,
      "credentials": {
        "httpHeaderAuth": {
          "id": "2hu1WYM3viRGU4Cl",
          "name": "Header Auth account"
        }
      }
    },
    {
      "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": "pablo@aparicio.me"
        }
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [3080, 1300],
      "id": "d496b5eb-80e1-4a21-b113-c0c3139483f3",
      "name": "Gmail",
      "webhookId": "6244c414-188e-4e55-a323-145b5238faf2"
    },
    {
      "parameters": {
        "operation": "update",
        "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"
        },
        "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": [2960, 1300],
      "id": "ef7e0920-d058-4eae-beb1-7c436099953b",
      "name": "Google Sheets - Update Row",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "NfCKbHvTN7pDuvWA",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "operation": "append",
        "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"
        },
        "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": [2800, 1300],
      "id": "fdd9f3db-ad27-43cc-9a73-9e220ce16e68",
      "name": "Google Sheets - Add rows",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "NfCKbHvTN7pDuvWA",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "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": [2660, 1300],
      "id": "76179473-17d7-41b5-8cf0-ad5971162f65",
      "name": "Google Sheets"
    },
    {
      "parameters": {
        "operation": "delete",
        "calendar": {
          "__rl": true,
          "value": "pablo@aparicio.me",
          "mode": "list",
          "cachedResultName": "pablo@aparicio.me"
        },
        "eventId": "={{ fromAI(\"id\", \"the id of the event\") }}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [2520, 1300],
      "id": "74013bf1-afa6-407b-8df9-dab0595639e1",
      "name": "Calendar Delete",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "zEd66c7WOVgYTAtl",
          "name": "Google Calendar account"
        }
      }
    },
    {
      "parameters": {
        "calendar": {
          "__rl": true,
          "value": "pablo@aparicio.me",
          "mode": "list",
          "cachedResultName": "pablo@aparicio.me"
        },
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [2380, 1300],
      "id": "5e295dae-6d14-4a45-9035-4776cc1a3f9c",
      "name": "Calendar Create",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "zEd66c7WOVgYTAtl",
          "name": "Google Calendar account"
        }
      }
    },
    {
      "parameters": {
        "operation": "getAll",
        "calendar": {
          "__rl": true,
          "value": "pablo@aparicio.me",
          "mode": "list",
          "cachedResultName": "pablo@aparicio.me"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [2240, 1300],
      "id": "5e97ecc8-063c-464b-968e-67780e5167fd",
      "name": "Calendar Read"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Message Type') }}",
        "contextWindowLength": 20
      },
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [2100, 1300],
      "id": "ccbacba7-4a59-4d52-8797-5889e5f3011a",
      "name": "Simple Memory"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [1940, 1300],
      "id": "4f84f418-56ca-4762-9f60-2da44a733d25",
      "name": "OpenAI Chat Model"
    },
    {
      "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": [2340, 1060],
      "id": "a5d06228-318c-473f-b2ca-7df27bde1e84",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "events": ["message:in:new"]
      },
      "type": "n8n-nodes-wassenger.wassengerTrigger",
      "typeVersion": 1,
      "position": [980, 1040],
      "id": "6aa3c071-903e-494d-91e6-fdad7a36c26d",
      "name": "Wassenger Trigger",
      "webhookId": "83130e74-a519-4153-b901-f03769d2f04f"
    }
  ],
  "pinData": {},
  "connections": {
    "Message Type": {
      "main": [
        [
          {
            "node": "Download Audio",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Audio Info": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe Audio": {
      "main": [
        [
          {
            "node": "Audio Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Audio": {
      "main": [
        [
          {
            "node": "Transcribe Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets - Update Row": {
      "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": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Calendar Delete": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Calendar Create": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Calendar Read": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Send Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wassenger Trigger": {
      "main": [
        [
          {
            "node": "Message Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ec2f8d79-144d-4106-a6d0-e45e4010bd85",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "e0068234f79a24a9e742a890448a0e2b15e9d37c6573c9f745a55311e3237506"
  },
  "id": "8W0pJ4yB48d4Jkvj",
  "tags": []
}

Advanced Features Only Possible with Wassenger

Unlike other WhatsApp API providers, Wassenger enables several advanced appointment management capabilities:

1. Rich media confirmations: Send appointment confirmations with location maps, branded images, or PDF documents

2. No template restrictions: Create natural, conversational appointment messages without pre-approved templates

3. Instant implementation: Start your appointment system immediately without waiting for Meta’s WABA approval

4. Team collaboration: Use Wassenger’s team inbox to allow different staff members to manage specific types of appointments

5. Visual flow design: Combine Wassenger’s visual flow builder with n8n for even more sophisticated appointment workflows

Enhancing Your Appointment System with Wassenger

To make your appointment management system even more effective:

1. Add natural language processing: Improve the message parsing to better understand various ways customers might request appointments.

2. Implement appointment slots: Define specific time slots when appointments are available.

3. Create a confirmation flow: Add a step where customers must confirm appointments to reduce no-shows.

4. Set up multiple reminders: Send reminders 24 hours before and again 1 hour before appointments.

5. Add feedback collection: Automatically request feedback after appointments are completed.

Why Wassenger Outperforms Other WhatsApp API Solutions for Appointment Management

  • No approval delays: Start your appointment system immediately without waiting for Meta’s WABA approval
  • No template restrictions: Create natural, conversational appointment messages without pre-approved templates
  • Richer interactions: Send appointment confirmations with location maps, branded images, or documents
  • Easier setup: The official n8n node eliminates complex configuration steps
  • More affordable: Wassenger is often more cost-effective than WABA-based providers

Ready to Transform Your Appointment Management?

By implementing this automated appointment management system with Wassenger and n8n, your small business can provide a professional scheduling experience that saves time, reduces no-shows, and improves customer satisfaction, all without writing a single line of code.

🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free