AutomationFlowsAI & RAG › Create a Whatsapp Voice Assistant with Twilio, Vapi, Google Calendar & Openai

Create a Whatsapp Voice Assistant with Twilio, Vapi, Google Calendar & Openai

ByNabin Bhandari @knabinbhandari on n8n.io

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…

Event trigger★★★★☆ complexityAI-powered18 nodesSupabase Vector StoreOpenAI EmbeddingsGoogle Calendar ToolGmail ToolMcp Trigger
AI & RAG Trigger: Event Nodes: 18 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

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 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

Telegram Trigger, Telegram, OpenAI +21
AI & RAG

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

WhatsApp Trigger, OpenAI, OpenAI Chat +13
AI & RAG

Dynamic Models. Uses lmChatOpenRouter, agent, gmailTool, airtableTool. Event-driven trigger; 43 nodes.

OpenRouter Chat, Agent, Gmail Tool +12
AI & RAG

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

Execute Workflow Trigger, OpenAI Chat, Google Calendar Tool +8
AI & RAG

Chatbot. Uses googleDrive, vectorStoreSupabase, googleDriveTrigger, documentDefaultDataLoader. Event-driven trigger; 23 nodes.

Google Drive, Supabase Vector Store, Google Drive Trigger +12