AutomationFlowsAI & RAG › AI Restaurant Virtual Waiter Chatbot for Whatsapp & Website

AI Restaurant Virtual Waiter Chatbot for Whatsapp & Website

Original n8n title: AI Restaurant Virtual Waiter Chatbot 🤖🍕 for Whatsapp & Website

ByDavide Boizza @n3witalia on n8n.io

This workflow implements a WhatsApp-based virtual restaurant assistant that automates customer interaction from the first message to post-dining follow-up.

Event trigger★★★★★ complexityAI-powered35 nodesWhatsApp TriggerWhatsAppGuardrailsGoogle Gemini ChatChat TriggerChatGoogle SheetsHTTP Request Tool
AI & RAG Trigger: Event Nodes: 35 Complexity: ★★★★★ AI nodes: yes Added:

This workflow corresponds to n8n.io template #15479 — we link there as the canonical source.

This workflow follows the Agent → Chat Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "nuzeMUCQyZCTuLvJ",
  "name": "AI Restaurant Virtual Waiter Chatbot for WhatsApp",
  "tags": [],
  "nodes": [
    {
      "id": "ab0c732c-8597-4984-84e9-c5b2b4771dfe",
      "name": "WhatsApp Trigger",
      "type": "n8n-nodes-base.whatsAppTrigger",
      "position": [
        304,
        1664
      ],
      "parameters": {
        "options": {},
        "updates": [
          "messages"
        ]
      },
      "credentials": {
        "whatsAppTriggerApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cb5adbf0-eb1d-484a-819a-6b0d2e52cc10",
      "name": "Not supported",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        720,
        1936
      ],
      "parameters": {
        "textBody": "=You can only send text messages",
        "operation": "send",
        "phoneNumberId": "470271332838881",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f68714c5-7059-4ec7-a125-d4ec59998713",
      "name": "Input type",
      "type": "n8n-nodes-base.switch",
      "position": [
        672,
        1664
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Text",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "08fd0c80-307e-4f45-b1de-35192ee4ec5e",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.messages[0].text.body }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "32f07aa1-d158-46d3-8d02-cff1efa391b4",
      "name": "Guardrails",
      "type": "@n8n/n8n-nodes-langchain.guardrails",
      "position": [
        2096,
        1584
      ],
      "parameters": {
        "text": "={{ $json.message }}",
        "guardrails": {
          "jailbreak": {
            "value": {
              "threshold": 0.7,
              "customizePrompt": true
            }
          }
        },
        "customizeSystemMessage": true
      },
      "typeVersion": 2
    },
    {
      "id": "0503afb8-057c-4c1f-913e-a2ac825e4551",
      "name": "Google Gemini Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        2032,
        1808
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-flash-lite"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a544701b-038c-4473-bbdb-fc76c7634099",
      "name": "Send message1",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        2944,
        2208
      ],
      "parameters": {
        "textBody": "=What was communicated does not reflect our policies or is not relevant.",
        "operation": "send",
        "phoneNumberId": "470271332838881",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "10e7da52-82d0-4744-82d1-8c03b7e483dd",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        288,
        1232
      ],
      "parameters": {
        "options": {
          "responseMode": "responseNodes"
        }
      },
      "typeVersion": 1.4
    },
    {
      "id": "5b62a3a0-fa30-4498-98c1-58044926fa99",
      "name": "Normalize",
      "type": "n8n-nodes-base.set",
      "position": [
        1824,
        1424
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "125c9831-791b-4b6e-979b-ceda1d77ad7a",
              "name": "message",
              "type": "string",
              "value": "={{ $json.message }}"
            },
            {
              "id": "a802bf83-f88a-4eb1-b4bd-5b253a15e2cb",
              "name": "sessionId",
              "type": "string",
              "value": "={{ $json.sessionId }}"
            },
            {
              "id": "3014000a-962e-449c-93a9-99fe74a1a21e",
              "name": "type",
              "type": "string",
              "value": "={{$json.type}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "380fded1-8350-431b-b508-565e7190661d",
      "name": "Chat1",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        2944,
        2400
      ],
      "parameters": {
        "message": "=What was communicated does not reflect our policies or is not relevant.",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "b89f1298-2d52-4241-9613-0df6eec8c3a5",
      "name": "Message",
      "type": "n8n-nodes-base.set",
      "position": [
        1136,
        1568
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c53cd9f9-77c1-4331-98ff-bfc9bdf95a3c",
              "name": "message",
              "type": "string",
              "value": "={{ $('WhatsApp Trigger').item.json.messages[0].text.body }}"
            },
            {
              "id": "87dbdb41-66ba-4c02-a441-a6b44777dcbd",
              "name": "sessionId",
              "type": "string",
              "value": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
            },
            {
              "id": "6e097caf-b3d4-4a17-8f63-57aa735e12ac",
              "name": "type",
              "type": "string",
              "value": "whatsapp"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ab2b7498-eb59-4cd2-8ace-a016be6f1c87",
      "name": "From Chat",
      "type": "n8n-nodes-base.set",
      "position": [
        1392,
        1232
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c53cd9f9-77c1-4331-98ff-bfc9bdf95a3c",
              "name": "message",
              "type": "string",
              "value": "={{ $json.chatInput }}"
            },
            {
              "id": "e355708a-2353-46c9-9423-9e15ea731955",
              "name": "sessionId",
              "type": "string",
              "value": "={{ $json.sessionId }}"
            },
            {
              "id": "66727ae5-1767-4c3a-83c5-d1f632b9083f",
              "name": "type",
              "type": "string",
              "value": "chat"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8dc3d90b-26f7-47a1-a77b-69e57a3223c6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        1072
      ],
      "parameters": {
        "color": 7,
        "width": 1392,
        "height": 368,
        "content": "## STEP 1 - Chat Input (for testing)\nMessage from chatbot"
      },
      "typeVersion": 1
    },
    {
      "id": "51c1824b-3bce-4183-ac19-9cb5cb203a68",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        1472
      ],
      "parameters": {
        "color": 7,
        "width": 1392,
        "height": 656,
        "content": "## STEP 1 bis - WhatsApp Input\nMessage (text or audio with speech to text) from WhatsApp"
      },
      "typeVersion": 1
    },
    {
      "id": "f58f7359-71bc-4705-8b58-fcff8c3195f7",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        1072
      ],
      "parameters": {
        "color": 7,
        "width": 880,
        "height": 1056,
        "content": "## STEP 2  - Guardrails\nA jailbreak attempt is any deliberate attempt to circumvent, deceive, or manipulate the AI's safety, ethical, or policy constraints."
      },
      "typeVersion": 1
    },
    {
      "id": "5411bc62-39f9-43f0-b5e2-6beb8dd424e9",
      "name": "Menu?",
      "type": "n8n-nodes-base.switch",
      "position": [
        2608,
        1136
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Menu",
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "f43bfc1b-411b-449d-9b65-a3f02e01e2f8",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.guardrailsInput }}",
                    "rightValue": "I would like to see the menu"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra",
          "renameFallbackOutput": "Other"
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "4694ab95-fd33-4d0c-8400-d3ee9cc9b0a9",
      "name": "Add new client",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3488,
        1120
      ],
      "parameters": {
        "columns": {
          "value": {
            "DATE": "={{$now.format('yyyy-MM-dd')}}",
            "CLIENT": "={{ $('Normalize').item.json.sessionId }}"
          },
          "schema": [
            {
              "id": "DATE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "DATE",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CLIENT",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "CLIENT",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "CLIENT"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Pzs_xlK6drjIhHnI7S1i2amLgT15dzuzkTKLbKcGpE4/edit#gid=0",
          "cachedResultName": "Clients"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Pzs_xlK6drjIhHnI7S1i2amLgT15dzuzkTKLbKcGpE4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Pzs_xlK6drjIhHnI7S1i2amLgT15dzuzkTKLbKcGpE4/edit?usp=drivesdk",
          "cachedResultName": "Restaurant Database Clients"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "56c91059-abdf-4159-b56a-321f041fea96",
      "name": "Send message2",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        3968,
        880
      ],
      "parameters": {
        "textBody": "=Hi, this is the Menu: https://go.forkmenu.com/demo",
        "operation": "send",
        "phoneNumberId": "470271332838881",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "42c252a8-8b76-4bf8-bbfe-30a1701c358a",
      "name": "Chat2",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        3968,
        1120
      ],
      "parameters": {
        "message": "=Hi, this is the Menu: https://go.forkmenu.com/demo",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "60e47c14-eaab-4a63-8131-82d52cf1a493",
      "name": "Wait 2 Hours",
      "type": "n8n-nodes-base.wait",
      "position": [
        4336,
        880
      ],
      "parameters": {
        "unit": "hours",
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "a8dd2f94-0a73-41e9-a222-751e0b1a0864",
      "name": "Send message3",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        4736,
        880
      ],
      "parameters": {
        "textBody": "=We hope you enjoyed your experience at our restaurant. Please consider leaving us a review. https://search.google.com/local/writereview?placeid=xxx",
        "operation": "send",
        "phoneNumberId": "470271332838881",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "97b11345-88f1-4674-9d55-8c6ed3bf6fe4",
      "name": "Chat3",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        4736,
        1120
      ],
      "parameters": {
        "message": "=We hope you enjoyed your experience at our restaurant. Please consider leaving us a review. https://search.google.com/local/writereview?placeid=xxx",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "2d97f036-8584-4126-b1db-b8b895dfbda5",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        3312,
        1792
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-3.1-flash-lite-preview"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6676bcc4-b231-47f1-b205-ddec9f83a074",
      "name": "Wait 1 Minute",
      "type": "n8n-nodes-base.wait",
      "position": [
        4352,
        1120
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "1feeea47-2b50-4aba-ae93-74268d610167",
      "name": "Chat",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        4048,
        1696
      ],
      "parameters": {
        "message": "={{ $json.output }}",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "10cf10a6-0b97-490d-8c54-2d30e589869e",
      "name": "Menu dishes",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        3632,
        1776
      ],
      "parameters": {
        "url": "https://demo.forkmenu.com/api/menu/piatti/2?key=MjAyNjA0MjQwOTI0Mjc=",
        "options": {},
        "toolDescription": "Menu dishes"
      },
      "typeVersion": 4.4
    },
    {
      "id": "c22cb678-c255-40a9-b290-9b1eed452caf",
      "name": "Send message",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        4048,
        1536
      ],
      "parameters": {
        "textBody": "={{ $json.output }}",
        "operation": "send",
        "phoneNumberId": "470271332838881",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "58961035-d1d6-4b5c-84a6-d40cc35f87b0",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        3472,
        1792
      ],
      "parameters": {
        "sessionKey": "={{ $('Normalize').item.json.sessionId }}",
        "sessionIdType": "customKey",
        "contextWindowLength": 10
      },
      "typeVersion": 1.3
    },
    {
      "id": "56260fc9-0455-4294-850f-4b98183b5d6c",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        3008,
        1584
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "ca0f5da6-a5c1-41ac-ae8c-642aa0f60a6a",
      "name": "Calculator",
      "type": "@n8n/n8n-nodes-langchain.toolCalculator",
      "position": [
        3760,
        1792
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "54ae6a93-699b-4e02-8ac1-7f912c2de2a5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2880,
        1392
      ],
      "parameters": {
        "color": 7,
        "width": 2160,
        "height": 640,
        "content": "## STEP 4  - Virtual Waiter\nThe virtual waiter responds to the dishes on the menu (available dishes, price, allergens, recommended dishes) based on the Virtual Menu API (Demo Menu https://go.forkmenu.com/demo)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0f86f8c0-b913-4fae-82c2-438ebe66d218",
      "name": "Virtual waiter",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3488,
        1584
      ],
      "parameters": {
        "text": "={{ $json.guardrailsInput }}",
        "options": {
          "systemMessage": "You are a helpful assistant about the restaurant.\n\nYou are a helpful assistant for this restaurant.\n\n## Core Rules\n- NEVER invent or assume information. Only use data retrieved from available tools.\n- Always respond in the same language the user wrote in.\n- Keep answers relevant and concise, based strictly on retrieved data.\n\n## Menu Requests\nWhen the user asks anything related to the menu (dishes, ingredients, prices, availability, allergens, recommendations, etc.):\n1. Call the \"Menu dishes\" tool\n2. Wait for the response\n3. Elaborate the retrieved data to answer the user's question accurately\n\n## Out-of-Scope Requests\nIf the user asks about something you have no data for, politely let them know you don't have that information \u2014 do not make anything up."
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 3.1
    },
    {
      "id": "d2cd13b4-5d36-49a4-b70c-a1f3e820cc7c",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2880,
        720
      ],
      "parameters": {
        "color": 7,
        "width": 1328,
        "height": 640,
        "content": "## STEP 3  - Send Virtuale Menu\n[Clone this Sheet](https://docs.google.com/spreadsheets/d/1Pzs_xlK6drjIhHnI7S1i2amLgT15dzuzkTKLbKcGpE4/edit?usp=sharing) Send virtual menu links via chatbot (or WhatsApp) and save customer data in a database (Google Sheets)"
      },
      "typeVersion": 1
    },
    {
      "id": "23c3b1a6-a3d4-49ee-80af-c2d5144521fa",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4240,
        720
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 640,
        "content": "## STEP 5  - Request review after dinner\n\nOnce dinner is over (after 2 hours for WhatsApp) or after 1 minute for the Chatbot (for the test), a link to the restaurant review is sent to the device used."
      },
      "typeVersion": 1
    },
    {
      "id": "6211234f-ed90-4a45-a969-2727930d717e",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        640
      ],
      "parameters": {
        "width": 1392,
        "height": 400,
        "content": "## AI Restaurant Virtual Waiter Chatbot for WhatsApp & Website (Menu, Orders & Review)\n\nThis workflow implements a **WhatsApp-based virtual restaurant assistant** that automates customer interaction from the first message to post-dining follow-up.\n\nThe system can receive messages either from **WhatsApp or a chatbot interface**, normalize the input, and process it through **AI guardrails** to ensure safe and relevant communication. \n\nIt is possible to replace the chatbot on the restaurant website with a WhatsApp bot\n\n### How it works\n\nThis workflow automates a WhatsApp and chat-based restaurant assistant. It receives customer messages, filters unsupported formats, applies AI guardrails against jailbreaks, and routes safe requests either to menu delivery or a virtual waiter agent.\n\nMenu requests are logged in Google Sheets, followed by an automated menu link and delayed review request. General questions are handled by an AI agent using Gemini, memory, a calculator, and a ForkMenu API tool, ensuring answers are based only on real menu data.\n\n### Setup steps\n\nAdd credentials for WhatsApp, Gemini, and Google Sheets, then configure WhatsApp phone IDs and the Meta webhook. Clone or prepare a Google Sheet with `CLIENT` and `DATE` columns.\n\nUpdate the ForkMenu API URL/key, customize customer-facing messages, adjust Wait node timers for review follow-ups, and activate the workflow. For website chat, enable the n8n chat trigger and embed the chat widget on your site.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2fe2bff6-76c6-4e43-9a9d-a08300b5ad1a",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1632,
        304
      ],
      "parameters": {
        "color": 7,
        "width": 736,
        "height": 736,
        "content": "## MY NEW YOUTUBE CHANNEL\n\ud83d\udc49 [Subscribe to my new **YouTube channel**](https://youtube.com/@n3witalia). Here I\u2019ll share videos and Shorts with practical tutorials and **FREE templates for n8n**.\n\n[![image](https://n3wstorage.b-cdn.net/n3witalia/youtube-n8n-cover.jpg)](https://youtube.com/@n3witalia)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "81614725-8a67-413c-b502-174b1685591d",
  "connections": {
    "Chat2": {
      "main": [
        [
          {
            "node": "Wait 1 Minute",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Menu?": {
      "main": [
        [
          {
            "node": "Add new client",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Virtual waiter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message": {
      "main": [
        [
          {
            "node": "Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "From Chat": {
      "main": [
        [
          {
            "node": "Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize": {
      "main": [
        [
          {
            "node": "Guardrails",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Calculator": {
      "ai_tool": [
        [
          {
            "node": "Virtual waiter",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Guardrails": {
      "main": [
        [
          {
            "node": "Menu?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Chat1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Input type": {
      "main": [
        [
          {
            "node": "Message",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Not supported",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Menu dishes": {
      "ai_tool": [
        [
          {
            "node": "Virtual waiter",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Wait 2 Hours": {
      "main": [
        [
          {
            "node": "Send message3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send message2": {
      "main": [
        [
          {
            "node": "Wait 2 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Virtual waiter",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Wait 1 Minute": {
      "main": [
        [
          {
            "node": "Chat3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add new client": {
      "main": [
        [
          {
            "node": "Chat2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Virtual waiter": {
      "main": [
        [
          {
            "node": "Chat",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WhatsApp Trigger": {
      "main": [
        [
          {
            "node": "Input type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Virtual waiter",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Guardrails",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "From Chat",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow implements a WhatsApp-based virtual restaurant assistant that automates customer interaction from the first message to post-dining follow-up.

Source: https://n8n.io/workflows/15479/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow implements an AI-powered WhatsApp booking assistant for a hair salon. The system allows customers to book, reschedule, or cancel appointments automatically via text or voice messages on

Google Calendar Tool, Google Sheets Tool, Error Trigger +15
AI & RAG

WhatsApp AI Assistant for Clinic Appointment Booking Automate your entire appointment lifecycle with an intelligent AI assistant that lives on WhatsApp. This workflow empowers any clinic or independen

Google Gemini Chat, WhatsApp Trigger, Memory Buffer Window +9
AI & RAG

This AI agent manages your Streak CRM via WhatsApp. Send messages to create contacts, add boxes to pipelines, update stages, link contacts to boxes, and retrieve information, add and get tasks all thr

WhatsApp, WhatsApp Trigger, HTTP Request +8
AI & RAG

Streamline restaurant reservations on WhatsApp

WhatsApp, WhatsApp Trigger, Agent +5
AI & RAG

The Recap AI - Whats App Chatbot Agent. Uses formTrigger, agent, lmChatGoogleGemini, toolThink. Event-driven trigger; 19 nodes.

Form Trigger, Agent, Google Gemini Chat +7