AutomationFlowsAI & RAG › Multilingual Voice Calling Bot with GPT-4o, ElevenLabs & Twilio

Multilingual Voice Calling Bot with GPT-4o, ElevenLabs & Twilio

Original n8n title: Create Multilingual Voice Calling Bot with Gpt-4o, Elevenlabs & Twilio

ByShiva @shivp1413 on n8n.io

Transform your business with an intelligent voice calling bot that handles customer calls automatically in 25+ languages. This N8n workflow integrates OpenAI GPT-4o, ElevenLabs text-to-speech, and Twilio for seamless appointment scheduling, pizza orders, and service bookings.…

Webhook trigger★★★★☆ complexityAI-powered10 nodesOpenAIElevenLabsHTTP RequestGoogle Sheets
AI & RAG Trigger: Webhook Nodes: 10 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Google Sheets → HTTP Request 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": "ai-voice-calling-bot",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Voice Calling Bot - OpenAI GPT-4o + ElevenLabs + Twilio Integration",
  "tags": [
    {
      "id": "ai-voice-bot",
      "name": "AI Voice Bot",
      "createdAt": "2024-01-01T00:00:00.000Z",
      "updatedAt": "2024-01-01T00:00:00.000Z"
    }
  ],
  "nodes": [
    {
      "id": "webhook-start",
      "name": "Twilio Voice Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "voice-webhook",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1
    },
    {
      "id": "check-speech-input",
      "name": "Check Speech Input",
      "type": "n8n-nodes-base.if",
      "position": [
        460,
        300
      ],
      "parameters": {
        "conditions": {
          "options": {
            "leftValue": "={{ $json.SpeechResult }}",
            "operation": "exists",
            "caseSensitive": true
          }
        }
      },
      "typeVersion": 1
    },
    {
      "id": "openai-gpt",
      "name": "OpenAI GPT-4o Response",
      "type": "n8n-nodes-base.openAi",
      "position": [
        680,
        200
      ],
      "parameters": {
        "model": "gpt-4o",
        "options": {
          "maxTokens": 150,
          "temperature": 0.7
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a helpful AI assistant for a service business. You can help customers:\n1. Schedule appointments (collect name, phone, preferred date/time, service type)\n2. Order pizza (collect size, toppings, address, phone)\n3. Book other services (collect relevant details)\n\nAlways be polite, concise, and gather necessary information step by step. Keep responses under 100 words for voice calls. End with a clear question or next step."
            },
            {
              "role": "user",
              "content": "={{ $json.SpeechResult || 'Hello, how can I help you today?' }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "elevenlabs-tts",
      "name": "ElevenLabs Text-to-Speech",
      "type": "n8n-nodes-base.elevenLabs",
      "position": [
        900,
        200
      ],
      "parameters": {
        "text": "={{ $json.choices[0].message.content }}",
        "model_id": "eleven_monolingual_v1",
        "voice_id": "21m00Tcm4TlvDq8ikWAM",
        "voice_settings": {
          "style": 0,
          "stability": 0.75,
          "similarity_boost": 0.75,
          "use_speaker_boost": true
        }
      },
      "credentials": {
        "elevenLabsApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "upload-audio",
      "name": "Upload Audio to Storage",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1120,
        200
      ],
      "parameters": {
        "operation": "upload",
        "additionalFields": {
          "fileName": "response.mp3",
          "contentType": "audio/mpeg"
        },
        "binaryPropertyName": "data"
      },
      "typeVersion": 3
    },
    {
      "id": "twilio-response",
      "name": "Twilio TwiML Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1340,
        200
      ],
      "parameters": {
        "twiml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n  <Play>{{ $json.audio_url }}</Play>\n  <Gather input=\"speech\" timeout=\"10\" speechTimeout=\"auto\" action=\"{{ $node.webhook.getWebhookUrl() }}\" method=\"POST\">\n    <Say voice=\"alice\">Please speak after the tone.</Say>\n  </Gather>\n  <Say voice=\"alice\">I didn't hear anything. Goodbye!</Say>\n  <Hangup/>\n</Response>"
      },
      "typeVersion": 1
    },
    {
      "id": "initial-greeting",
      "name": "Initial Greeting",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        680,
        400
      ],
      "parameters": {
        "twiml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n  <Say voice=\"alice\">Hello! I'm your AI assistant. I can help you schedule appointments, order pizza, or book services. How can I help you today?</Say>\n  <Gather input=\"speech\" timeout=\"10\" speechTimeout=\"auto\" action=\"{{ $node['Twilio Voice Webhook'].getWebhookUrl() }}\" method=\"POST\">\n    <Say voice=\"alice\">Please speak after the tone.</Say>\n  </Gather>\n  <Say voice=\"alice\">I didn't hear anything. Please call back. Goodbye!</Say>\n  <Hangup/>\n</Response>"
      },
      "typeVersion": 1
    },
    {
      "id": "log-conversation",
      "name": "Log Conversation",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        900,
        400
      ],
      "parameters": {
        "columns": {
          "value": {
            "call_sid": "={{ $json.CallSid }}",
            "caller_id": "={{ $json.From }}",
            "timestamp": "={{ $now }}",
            "ai_response": "={{ $json.choices[0].message.content }}",
            "speech_input": "={{ $json.SpeechResult }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": "Call_Logs",
        "documentId": "your-google-sheet-id"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "check-appointment",
      "name": "Check for Appointment",
      "type": "n8n-nodes-base.if",
      "position": [
        1120,
        400
      ],
      "parameters": {
        "conditions": {
          "options": {
            "leftValue": "={{ $json.choices[0].message.content.toLowerCase() }}",
            "operation": "contains",
            "rightValue": "appointment",
            "caseSensitive": false
          }
        }
      },
      "typeVersion": 1
    },
    {
      "id": "save-appointment",
      "name": "Save Appointment Request",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1340,
        500
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "pending",
            "call_sid": "={{ $json.CallSid }}",
            "caller_id": "={{ $json.From }}",
            "timestamp": "={{ $now }}",
            "request_details": "={{ $json.SpeechResult }}"
          },
          "mappingMode": "defineBelow"
        },
        "operation": "append",
        "sheetName": "Appointments",
        "documentId": "your-appointments-sheet-id"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "1",
  "connections": {
    "Log Conversation": {
      "main": [
        [
          {
            "node": "Check for Appointment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Speech Input": {
      "main": [
        [
          {
            "node": "OpenAI GPT-4o Response",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Initial Greeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Twilio Voice Webhook": {
      "main": [
        [
          {
            "node": "Check Speech Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for Appointment": {
      "main": [
        [
          {
            "node": "Save Appointment Request",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "OpenAI GPT-4o Response": {
      "main": [
        [
          {
            "node": "ElevenLabs Text-to-Speech",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log Conversation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Audio to Storage": {
      "main": [
        [
          {
            "node": "Twilio TwiML Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ElevenLabs Text-to-Speech": {
      "main": [
        [
          {
            "node": "Upload Audio to Storage",
            "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

Transform your business with an intelligent voice calling bot that handles customer calls automatically in 25+ languages. This N8n workflow integrates OpenAI GPT-4o, ElevenLabs text-to-speech, and Twilio for seamless appointment scheduling, pizza orders, and service bookings.…

Source: https://n8n.io/workflows/6309/ — 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

Instantly map all internal URLs, perform AI-powered (ChatGPT) analysis, and deliver results in HTML via webhook, Google Sheets, or email. All from your own n8n instance!

OpenAI, HTTP Request, XML +3
AI & RAG

Watch on Youtube▶️

HTTP Request, Email Send, Google Sheets +3
AI & RAG

This workflow is perfect for marketing agencies, SEO consultants, and growth specialists who need to scale personalized outreach without spending hours on manual research.

Google Sheets, HTTP Request, OpenAI
AI & RAG

This workflow automates the creation of Journal Entries in SAP Business One (SAP B1). Depending on the source of the input data, it dynamically transforms and sends accounting records in the appropria

HTTP Request, Google Sheets, OpenAI
AI & RAG

How it works: Send notes from Obsidian via Webhook to start the audio conversion OpenAI converts your text to natural-sounding audio and generates episode descriptions Audio files are stored in Cloudi

OpenAI, HTTP Request, Google Sheets