This workflow corresponds to n8n.io template #10214 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets Tool 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 →
{
"nodes": [
{
"id": "2ccdee26-1db9-4717-b1ad-79651d7d65dc",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
-96
],
"parameters": {
"color": 4,
"width": 336,
"height": 224,
"content": "\ud83d\udcac Workflow Overview\nThis workflow acts as an AI receptionist for hotels, built on n8n.\nGuests can message the hotel via WhatsApp, and the system automatically replies using AI with real booking or pricing details.\n\nIt combines WhatsApp \u2192 AI Agent \u2192 Database \u2192 WhatsApp in one seamless loop."
},
"typeVersion": 1
},
{
"id": "750f8f4d-35dd-4a82-90fd-0ef01a89888b",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1456,
-16
],
"parameters": {
"text": "={{ $('WhatsApp Trigger').item.json.messages[0].text.body }}",
"options": {
"systemMessage": "You are a helpful AI assistant tasked with answering questions about hotel bookings.\nYou have access to a MySQL database with tables like 'bookings', 'guests', 'rooms', etc.\n\nIMPORTANT SECURITY RULE: YOU ARE STRICTLY FORBIDDEN FROM PERFORMING ANY DATABASE WRITE OPERATIONS (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, etc.).\nYou must ONLY generate valid SQL SELECT statements.\n\nWhen a user asks a question, translate it into an appropriate SQL SELECT query."
},
"promptType": "define"
},
"retryOnFail": false,
"typeVersion": 2
},
{
"id": "1a267886-51fa-4500-ab95-6200cc512a1a",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
1600,
192
],
"parameters": {
"sessionKey": "={{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "75cab8e8-7d1d-4730-a4b4-f9ba7f4f651e",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1280,
384
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c3229f34-a2d5-4472-b54d-9c960a3baa0f",
"name": "Pricing",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
1728,
192
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/13yvxKTOWC4lgMLPWtVW_RELRZWdZHwUon_xOk4rF1X0/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "13yvxKTOWC4lgMLPWtVW_RELRZWdZHwUon_xOk4rF1X0"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "0ab80c8e-e0ae-48d3-ace7-7afa25cdadc1",
"name": "Google Gemini Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1456,
384
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "1f14faf9-f819-4a3d-9ca5-8dd35d814e95",
"name": "WhatsApp Trigger",
"type": "n8n-nodes-base.whatsAppTrigger",
"position": [
80,
-16
],
"parameters": {
"options": {},
"updates": [
"messages"
]
},
"credentials": {
"whatsAppTriggerApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "78022ecc-79b5-4f44-a209-155dd7c9e967",
"name": "Model Decider",
"type": "n8n-nodes-base.code",
"position": [
752,
-16
],
"parameters": {
"jsCode": "let data;\ntry {\n data = $json.value ? JSON.parse($json.value) : null;\n} catch (e) {\n data = null;\n}\n\nlet modelIndex;\nlet shouldSet = false;\n\nif (data && typeof data.modelIndex === 'number') {\n // Alternate: flip the previous modelIndex\n modelIndex = data.modelIndex === 0 ? 1 : 0;\n shouldSet = true; // store the new one\n} else {\n // If no data, default to model 0 and store it\n modelIndex = 0;\n shouldSet = true;\n}\n\nreturn [\n {\n json: {\n modelIndex,\n shouldSet\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "707df459-df55-4686-b64e-3d99c1380e03",
"name": "Send message",
"type": "n8n-nodes-base.whatsApp",
"position": [
2016,
-16
],
"parameters": {
"textBody": "={{ $json.output }}",
"operation": "send",
"phoneNumberId": "723548604171403",
"additionalFields": {},
"recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}"
},
"credentials": {
"whatsAppApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "8a9c3637-4e4d-4445-9c3b-c584e24dbdb5",
"name": "Execute a SQL query in MySQL",
"type": "n8n-nodes-base.mySqlTool",
"position": [
1856,
192
],
"parameters": {
"query": "{{ $('AI Agent').item.json.query }}",
"options": {},
"operation": "executeQuery"
},
"credentials": {
"mySql": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "e1b30ed3-0ad7-417f-95de-752ab618c89a",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
-256
],
"parameters": {
"color": 5,
"width": 544,
"height": 176,
"content": "\u2699\ufe0f Model Switching System\nThe workflow uses Redis to track each user\u2019s AI model assignment.\nEach user is automatically routed to a different Google Gemini model, helping:\nDistribute traffic evenly across models\nReduce overall API cost\nKeep performance fast and stable\nThis makes it ideal for large-scale or high-traffic hotel systems."
},
"typeVersion": 1
},
{
"id": "13bbf86c-a3cb-4fec-b66f-9f8cd912f494",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1216,
-272
],
"parameters": {
"color": 6,
"width": 448,
"height": 208,
"content": "\ud83e\udde0 AI-Powered Hotel Assistant\nThe AI Agent interprets the user\u2019s query and converts it into a read-only SQL SELECT statement.\n\nIt fetches information like room availability, guest check-ins, or booking data from MySQL, formats it naturally, and sends it back to the guest instantly on WhatsApp.\n\nThe workflow ensures safety (no write/delete queries) and delivers accurate, real-time hotel insights."
},
"typeVersion": 1
},
{
"id": "448b3618-9ccd-45d1-b905-bedf5540d877",
"name": "Check Message",
"type": "n8n-nodes-base.code",
"position": [
304,
-16
],
"parameters": {
"jsCode": "const msg = $json.messages?.[0]?.text;\n\nif (!msg) {\n // Exit early if no text message\n return [];\n}\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "f13bf318-7585-4787-a7ca-c083617a9e8f",
"name": "Store User Number",
"type": "n8n-nodes-base.redis",
"position": [
976,
-16
],
"parameters": {
"key": "=llm-user:{{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }}",
"ttl": 3600,
"value": "={{ JSON.stringify({ modelIndex: $json.modelIndex }) }}",
"expire": true,
"operation": "set"
},
"credentials": {
"redis": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "ca6ba30a-da25-42e2-b9c0-f30b0438ab8e",
"name": "Check User Number",
"type": "n8n-nodes-base.redis",
"position": [
528,
-16
],
"parameters": {
"key": "=llm-user:{{ $json.contacts[0].wa_id }}",
"options": {},
"operation": "get"
},
"credentials": {
"redis": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "eeeac186-0627-45f9-a122-c5b0ac50a537",
"name": "Choose Model",
"type": "@n8n/n8n-nodes-langchain.modelSelector",
"position": [
1328,
192
],
"parameters": {
"rules": {
"rule": [
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "61173b3f-c09e-4efb-aae0-5af12aed3b1e",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{$json.modelIndex}}",
"rightValue": 0
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "6fd19391-2c15-42a6-82db-152976b1d6d3",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{$json.modelIndex}}",
"rightValue": 1
}
]
},
"modelIndex": 2
}
]
}
},
"typeVersion": 1
},
{
"id": "a317cb5a-56a2-41e7-8ab8-3a0758c09c11",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
160
],
"parameters": {
"color": 3,
"width": 288,
"height": 192,
"content": "Redis Get Node\n\n\ud83e\udde9 What it does\nWhen a WhatsApp message arrives, this node checks Redis for a record matching that user\u2019s WhatsApp ID.\nThat stored record tells the workflow which AI model this user was last assigned to (e.g., model 0 or model 1)."
},
"typeVersion": 1
},
{
"id": "86bfc5ea-e65c-4a6c-bd53-1ef3d473b97f",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
160
],
"parameters": {
"color": 3,
"width": 288,
"height": 192,
"content": "Redis Set Node\n\n\ud83e\udde9 What it does\nAfter the Model Decider decides which model the user should use, this node stores that model index back into Redis.\nIt also sets an expiration (ttl = 3600 seconds \u2192 1 hour), meaning the assignment lasts for one hour."
},
"typeVersion": 1
}
],
"connections": {
"Pricing": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Send message",
"type": "main",
"index": 0
}
]
]
},
"Choose Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Check Message": {
"main": [
[
{
"node": "Check User Number",
"type": "main",
"index": 0
}
]
]
},
"Model Decider": {
"main": [
[
{
"node": "Store User Number",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"WhatsApp Trigger": {
"main": [
[
{
"node": "Check Message",
"type": "main",
"index": 0
}
]
]
},
"Check User Number": {
"main": [
[
{
"node": "Model Decider",
"type": "main",
"index": 0
}
]
]
},
"Store User Number": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Choose Model",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "Choose Model",
"type": "ai_languageModel",
"index": 1
}
]
]
},
"Execute a SQL query in MySQL": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"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.
googlePalmApigoogleSheetsOAuth2ApimySqlrediswhatsAppApiwhatsAppTriggerApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This project is an AI-powered hotel receptionist built using n8n, designed to handle guest queries automatically through WhatsApp. It integrates Google Gemini, Redis, MySQL, and Google Sheets via LangChain to create an intelligent conversational system that understands and…
Source: https://n8n.io/workflows/10214/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
This template is designed for businesses that provide customer support and appointment-based services over WhatsApp. It’s ideal for service providers (e.g., clinics, salons, repair shops, consultants)
Overview 📌
Transform your salon/service business with this streamlined WhatsApp automation system featuring Claude integration, zero-setup database management, and intelligent conversation handling. Claude MCP I
This template is designed for anyone who wants to use WhatsApp as a personal AI assistant hub. If you often juggle tasks, emails, calendars, and expenses across multiple tools, this workflow consolida