This workflow corresponds to n8n.io template #8284 — we link there as the canonical source.
This workflow follows the OpenAI Embeddings → Supabase Vector Store 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 →
{
"id": "hSC68gkBlh2XuLpG",
"name": "Demo- Whatsapp Voice Agent",
"tags": [],
"nodes": [
{
"id": "43b9c5a5-4d0b-4713-a9c5-ea00e24cc320",
"name": "Supabase Vector Store",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
1216,
-32
],
"parameters": {
"mode": "retrieve-as-tool",
"options": {},
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
},
"toolDescription": "Retrieve this tool to get pricing Informatio or any other General Inquiry."
},
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "07c67c64-9390-472d-807c-3c0c4a0405a7",
"name": "Embeddings OpenAI",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
1216,
112
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "15ee6172-40e2-439b-bfce-a64850fdf4d1",
"name": "Create Calendar Event",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-240,
32
],
"parameters": {
"end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
"start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "user@example.com"
},
"additionalFields": {}
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "e5a95d98-88ee-4557-84f7-ee3a4bf56ad1",
"name": "Fetch Calendar Events",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-96,
32
],
"parameters": {
"options": {},
"timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}",
"timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "user@example.com"
},
"operation": "getAll"
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "f22f3c2d-1e22-45d8-9cfd-8895733b862b",
"name": "Update Calendar Event",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
48,
48
],
"parameters": {
"eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "user@example.com"
},
"operation": "update",
"updateFields": {}
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "d56e75ab-7086-45cb-bf2c-dca53cfbbe8d",
"name": "Delete Calendar Event",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
176,
80
],
"parameters": {
"eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
"options": {},
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "user@example.com"
},
"operation": "delete"
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "d8c9f9d7-1fb2-4293-b411-1d72afd03c63",
"name": "Send Email Notification",
"type": "n8n-nodes-base.gmailTool",
"position": [
720,
352
],
"parameters": {
"sendTo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('To', ``, 'string') }}",
"message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
"options": {},
"subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "45496f90-c8a7-40a5-bbe3-2f0b183828e4",
"name": "MCP Server \u2013 Calendar",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
-240,
-240
],
"parameters": {
"path": "1902a1d2-f8a8-4601-b20c-90e824fe478d"
},
"typeVersion": 2
},
{
"id": "9ebb9d32-59ea-4f52-ba5a-f6a57356ac8d",
"name": "MCP Server \u2013 Gmail",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
576,
160
],
"parameters": {
"path": "41a2ab5f-1a7d-440b-a1e3-1b2308dee744"
},
"typeVersion": 2
},
{
"id": "566c8afb-cb1b-4216-a543-5b26cb5182e8",
"name": "MCP Server \u2013 Knowledge Base",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
1152,
-240
],
"parameters": {
"path": "3643c062-c554-43d8-84d1-692b886b780f"
},
"typeVersion": 2
},
{
"id": "61ded9b5-737a-42bf-956e-60614c87fbe2",
"name": "Incoming Webhook (VAPI)",
"type": "n8n-nodes-base.webhook",
"position": [
480,
-112
],
"parameters": {
"path": "81e240fc-d3fb-4ccd-b91a-0aacbf2d8f2a",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2.1
},
{
"id": "fe90d72c-fef0-4646-8d07-f90851015ed0",
"name": "Respond to Webhook (VAPI)",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
816,
-112
],
"parameters": {
"options": {
"responseHeaders": {
"entries": [
{
"name": "Content-Type",
"value": "application/xml"
}
]
}
},
"respondWith": "text",
"responseBody": "=<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n <Dial>\n <Sip>sip:15795503867@sip.vapi.ai</Sip>\n </Dial>\n</Response>\n"
},
"typeVersion": 1.4
},
{
"id": "2000941e-5340-4f44-91a2-4068a172f316",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-272,
-432
],
"parameters": {
"color": 4,
"width": 592,
"height": 768,
"content": "\ud83d\udcc5 Calendar MCP\nHandles Calendar actions:\n- Create\n- Fetch\n- Update\n- Delete\n"
},
"typeVersion": 1
},
{
"id": "e2af4a5c-aaac-4458-a26e-fda5db9c4fa5",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
464,
64
],
"parameters": {
"color": 5,
"width": 496,
"height": 448,
"content": "\ud83d\udce7 Gmail MCP\nSends confirmation/reminder emails\nbased on voice commands.\n"
},
"typeVersion": 1
},
{
"id": "68569b1b-a853-47f2-90b3-284594f44c53",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
-384
],
"parameters": {
"color": 6,
"width": 400,
"height": 656,
"content": "\ud83d\udcda Knowledge Base MCP\nOpenAI generates embeddings from content.\nSupabase Vector Store saves/retrieves data\nfor knowledge base queries.\n"
},
"typeVersion": 1
},
{
"id": "36ab17f2-52f8-401b-af07-419cc50ccb4e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-592
],
"parameters": {
"color": 2,
"width": 640,
"height": 624,
"content": "## Entry Point \u2013 Incoming Webhook (VAPI)\n\nThis is the starting point of the workflow. \n- A WhatsApp message or voice input is received via Twilio. \n- Twilio routes the audio stream to VAPI through the TwiML app. \n- VAPI processes the voice command and decides which MCP Server (Calendar, Gmail, Knowledge Base) should handle the request. \n- The request is then passed into this webhook in n8n for execution. \n\n### Flow:\nWhatsApp \u2192 Twilio (TwiML app) \u2192 VAPI \u2192 n8n Incoming Webhook \n"
},
"typeVersion": 1
},
{
"id": "22d6f683-025c-4023-9151-c5ef3f9b0dc8",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-304
],
"parameters": {
"color": 3,
"width": 272,
"height": 336,
"content": "This webhook is triggered by VAPI when a WhatsApp voice command is received via Twilio. \nVAPI interprets the user\u2019s request and forwards it here. \nFrom this point, the workflow decides which MCP server (Calendar, Gmail, Knowledge Base) should process the action.\n"
},
"typeVersion": 1
},
{
"id": "74243893-60e4-4289-a9d5-8c9f363b897d",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
752,
-304
],
"parameters": {
"color": 3,
"width": 272,
"height": 336,
"content": "This node sends the processed response back to VAPI. \nIt ensures that the result of the MCP server execution (e.g., calendar update, email confirmation, knowledge base query) \nis returned to the user via WhatsApp.\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "09fcb8e2-ec67-4f88-a908-d558030605fe",
"connections": {
"Embeddings OpenAI": {
"ai_embedding": [
[
{
"node": "Supabase Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Create Calendar Event": {
"ai_tool": [
[
{
"node": "MCP Server \u2013 Calendar",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete Calendar Event": {
"ai_tool": [
[
{
"node": "MCP Server \u2013 Calendar",
"type": "ai_tool",
"index": 0
}
]
]
},
"Fetch Calendar Events": {
"ai_tool": [
[
{
"node": "MCP Server \u2013 Calendar",
"type": "ai_tool",
"index": 0
}
]
]
},
"Supabase Vector Store": {
"ai_tool": [
[
{
"node": "MCP Server \u2013 Knowledge Base",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update Calendar Event": {
"ai_tool": [
[
{
"node": "MCP Server \u2013 Calendar",
"type": "ai_tool",
"index": 0
}
]
]
},
"Incoming Webhook (VAPI)": {
"main": [
[
{
"node": "Respond to Webhook (VAPI)",
"type": "main",
"index": 0
}
]
]
},
"Send Email Notification": {
"ai_tool": [
[
{
"node": "MCP Server \u2013 Gmail",
"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.
gmailOAuth2googleCalendarOAuth2ApiopenAiApisupabaseApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow turns WhatsApp voice messages into an AI assistant using Twilio, VAPI, and modular MCP servers. It handles scheduling, email, and knowledge queries all by voice. WhatsApp → Twilio → VAPI A WhatsApp Business number (via TwiML app) receives a voice message. Twilio…
Source: https://n8n.io/workflows/8284/ — 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.
This workflow implements an advanced AI automation agent (OpenClaw Agent) that interacts with users through Telegram and integrates multiple AI models, external tools, and cloud services to automate c
Who is this for? This workflow is ideal for HR teams, startups, and enterprises that want to handle employee interactions through WhatsApp and automate responses using LLM (OpenAI) and intelligent rou
Dynamic Models. Uses lmChatOpenRouter, agent, gmailTool, airtableTool. Event-driven trigger; 43 nodes.
This template is for businesses, customer support teams, and professionals who want to deliver AI-powered WhatsApp assistance. It helps automate conversations, schedule meetings, answer FAQs, and send
Chatbot. Uses googleDrive, vectorStoreSupabase, googleDriveTrigger, documentDefaultDataLoader. Event-driven trigger; 23 nodes.