This workflow corresponds to n8n.io template #6387 — we link there as the canonical source.
This workflow follows the Agent → Google Docs 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 →
{
"meta": {
"templateId": "4966"
},
"nodes": [
{
"id": "02f761e2-83c4-488b-91f4-f4ae11b15c00",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"maxTries": 5,
"position": [
1420,
680
],
"parameters": {
"text": "={{ $json.finalPrompt }}\n\n\n",
"options": {
"systemMessage": "You are [Company]\u2019s support assistant for Black Ball Sporting Club.\n\u2022 Do NOT include any preamble such as \u201cBased on the document you provided\u201d or \u201cOkay, [Name].\u201d Just jump straight to the answer.\n* don't ever start your response with\"based on the document you provided\" , or \"According to the document\", don't mention any documents at all , also don't mention today's date unless you asked\n"
},
"promptType": "define",
"hasOutputParser": true
},
"retryOnFail": false,
"typeVersion": 1.7,
"alwaysOutputData": true,
"waitBetweenTries": null
},
{
"id": "57ecb397-5772-4db3-8a5a-ce28a4e01e63",
"name": "cleanAnswer",
"type": "n8n-nodes-base.code",
"position": [
2680,
580
],
"parameters": {
"jsCode": "// cleanAnswer \u2013 run once per item\nlet txt = $('AI Agent').first().json.output || '';\n\n// 1. Remove bold / italic / strike markers\ntxt = txt.replace(/[*_~]+/g, '');\n\n// 2. Convert [Texto](https://url) \u2192 Texto https://url\ntxt = txt.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '$1 $2');\n\n// 3. Collapse 3+ blank lines\ntxt = txt.replace(/\\n{3,}/g, '\\n\\n').trim();\n\n// 4. Remove the unwanted source-reference preamble\ntxt = txt.replace(/^.*?based on the document you provided[,:]?\\s*/i, '');\n\nreturn [{ json: { answer: txt } }];\n"
},
"typeVersion": 2
},
{
"id": "d70cf8b1-8c24-44f2-9b37-5205b130cff2",
"name": "24-hour window check",
"type": "n8n-nodes-base.code",
"position": [
2240,
680
],
"parameters": {
"jsCode": "// within24h? \u2013 run once per item\n// Meta (WhatsApp) timestamp arrives as seconds since epoch\nconst lastTs = Number($('when message received').first().json.messages[0].timestamp) * 1000; // \u2192 ms\nconst withinWindow = Date.now() - lastTs < 24 * 60 * 60 * 1000;\n\nreturn [{ json: { withinWindow, answer: $json.answer, userId: $json.userId } }];"
},
"typeVersion": 2
},
{
"id": "66c83de5-413a-440f-804e-15b137beb873",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
2460,
680
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d33e218e-a49a-49ed-9c6b-55b9ea0b0dbb",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.withinWindow }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c9d931c3-d88c-4d15-b8fe-787327c0200a",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1380,
900
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash-preview-04-17-thinking"
},
"typeVersion": 1
},
{
"id": "df46b528-cbbd-49c2-9b83-4402ef0c8ac7",
"name": "Prepare Prompt",
"type": "n8n-nodes-base.aiTransform",
"position": [
1200,
680
],
"parameters": {
"jsCode": "const googleDocs = $input.all().map((item) => item.json);\nconst whatsappMessages = $(\"when message received\")\n .all()\n .map((item) => item.json);\n\nconst date = new Date();\nconst formattedDate = `${date.getMonth() + 1} ${date.getDate()}, ${date.getFullYear()}`;\n\nconst docText = googleDocs[0].content.split(\"\\n\").join(\" \");\n\nconst body = whatsappMessages[0].messages[0].text.body;\n\nconst finalPrompt = `Today's date is: ${formattedDate}\\n\\n${docText}\\n\\nUser's question:\\n${body}`;\n\nreturn { finalPrompt };\n",
"instructions": "Write code to:\n\u2022 Get today\u2019s date formatted \u201cMonth Day, Year\u201d\n\u2022 Extract the Google Doc\u2019s plain text by joining its body.content textRuns\n\u2022 Extract the WhatsApp message from messages[0].text.body\n\u2022 Build a field finalPrompt exactly as:\n\nvbnet\nCopy\nEdit\nToday's date is: [date]\n\n[doc text]\n\nUser's question:\n[body]\n\u2022 Return finalPrompt only.",
"codeGeneratedForPrompt": "Write code to:\n\u2022 Get today\u2019s date formatted \u201cMonth Day, Year\u201d\n\u2022 Extract the Google Doc\u2019s plain text by joining its body.content textRuns\n\u2022 Extract the WhatsApp message from messages[0].text.body\n\u2022 Build a field finalPrompt exactly as:\n\nvbnet\nCopy\nEdit\nToday's date is: [date]\n\n[doc text]\n\nUser's question:\n[body]\n\u2022 Return finalPrompt only."
},
"typeVersion": 1
},
{
"id": "19de46dc-add8-4cad-81a9-6e5b341f1f33",
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
2020,
680
],
"parameters": {},
"credentials": {},
"typeVersion": 4.6
},
{
"id": "b622392e-65dc-4d27-a5f9-d27ea57aae61",
"name": "Date & Time",
"type": "n8n-nodes-base.dateTime",
"position": [
1800,
680
],
"parameters": {
"options": {}
},
"typeVersion": 2
},
{
"id": "a6ae2118-9d68-4fb0-b975-b9c6d4170e00",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
380,
240
],
"parameters": {
"height": 1520,
"content": "# WhatsApp AI Assistant \n\n**No Business Verification Required\nInstant activation with full WhatsApp Group support.**\n\n**Instantly answer WhatsApp questions using your internal documents. No AI training required.**\n\n*Skip the complex WhatsApp Business Cloud API setup - WhapAround solve that problem for you.*\n\n## How It Works\nYour assistant reads a live Google Doc, processes incoming WhatsApp messages, generates AI responses using OpenAI/Gemini, and sends replies automatically.\n\n## Requirements\n- **WhapAround Account**: https://whaparound.pro/ (eliminates need for WhatsApp Business Cloud API configuration)\n- **Google Doc** with your business content\n- **API Key**: OpenAI or Gemini\n- **Database** (optional): PostgreSQL memory setup - https://www.youtube.com/watch?v=JjBofKJnYIU\n\n## Quick Setup\n1. Add your Google Doc ID to the Docs node\n2. Connect WhatsApp webhook (follow provided guidance)\n3. Map the message field\n4. Connect your AI provider (OpenAI/Gemini)\n5. Test with a live message\n\n## Professional Setup Services\nNeed help with implementation? We provide:\n- **Easy WhatsApp connection** (bypass WhatsApp Business Cloud API complexity entirely)\n- Google OAuth & document structure\n- AI model configuration\n- Custom branding & tone\n- Logging & escalation systems\n\n**Contact**: andrea@jamot.pro | WhatsApp: +16508665016"
},
"typeVersion": 1
},
{
"id": "8f4a786b-fc6d-4e2f-b8df-c605475afc81",
"name": "company's knowledge",
"type": "n8n-nodes-base.googleDocs",
"position": [
980,
680
],
"parameters": {
"operation": "get",
"documentURL": "=1Uv1WYCcXNlp-jaeJ7-3MNxWYfPj-wcYnJv4_colXSvk"
},
"typeVersion": 2
},
{
"id": "a6de89dd-ada0-432c-9f8e-ece38264ad81",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
1500,
900
],
"parameters": {
"sessionKey": "={{ $('when message received').item.json.contacts[0].wa_id }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "bc950073-fd3c-45e6-bb14-d2d361418725",
"name": "WhapAround - Listeing",
"type": "n8n-nodes-base.webhook",
"position": [
720,
680
],
"parameters": {
"path": "30720c7c-18f4-4815-be3b-03343d53ee45",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "ce59dedc-9e76-4d68-a3d7-721a58593c92",
"name": "WhapAround - Respond Message ",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2920,
580
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "b88bce3f-8aa1-4cc1-9d0f-31f229cc19de",
"name": "WhapAround - Respond Template ",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2700,
800
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
}
],
"connections": {
"If": {
"main": [
[
{
"node": "cleanAnswer",
"type": "main",
"index": 0
}
],
[
{
"node": "WhapAround - Respond Template ",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Date & Time",
"type": "main",
"index": 0
}
]
]
},
"Date & Time": {
"main": [
[
{
"node": "Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"cleanAnswer": {
"main": [
[
{
"node": "WhapAround - Respond Message ",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets": {
"main": [
[
{
"node": "24-hour window check",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Prepare Prompt": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"company's knowledge": {
"main": [
[
{
"node": "Prepare Prompt",
"type": "main",
"index": 0
}
]
]
},
"24-hour window check": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"WhapAround - Listeing": {
"main": [
[
{
"node": "company's knowledge",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Your WhatsApp AI Assistant automatically handles customer inquiries by linking your Google Docs knowledge base to incoming WhatsApp messages. The system instantly processes customer questions, references your business documentation, and delivers AI-powered responses through…
Source: https://n8n.io/workflows/6387/ — 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.
Document-Aware WhatsApp AI Bot for Customer Support Google Docs-Powered WhatsApp Support Agent 24/7 WhatsApp AI Assistant with Live Knowledge from Google Docs
This workflow turns a spreadsheet row into a fully formatted, media-rich WordPress article. It pulls the outline and brand context from Google Sheets/Docs, drafts the article with Anthropic or Gemini,
**Get Started **
Line_Chatbot_Extract_Text_from_Pay_Slip_with_Gemini. Uses memoryBufferWindow, stickyNote, httpRequest, agent. Webhook trigger; 17 nodes.
Extract text from image using AI is worth because you need no code. It incorporates Google Gemini 2.0 Flash model for important text extraction from image. If you code without AI, you have to use mult