AutomationFlowsAI & RAG › Automated Lead Qualification Voice Agent with Openai Gpt, Twilio, Elevenlabs…

Automated Lead Qualification Voice Agent with Openai Gpt, Twilio, Elevenlabs…

Original n8n title: Automated Lead Qualification Voice Agent with Openai Gpt, Twilio, Elevenlabs and Gmail

ByJainik Sheth @jainik on n8n.io

The workflow is triggered when a new lead is added to your data source (such as a new row in Google Sheets, using the “Google Sheets Trigger” node). The trigger node captures essential lead information (e.g., name, phone number, service of interest) from the new entry. The…

Event trigger★★★★☆ complexityAI-powered20 nodesGoogle Sheets TriggerOpenAIGoogle SheetsGmailHTTP Request
AI & RAG Trigger: Event Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Gmail → Google Sheets 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": "o6QHC3fXUypkp711",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Lead Qualification Voice Agent",
  "tags": [],
  "nodes": [
    {
      "id": "36381180-1a71-435f-ba1d-8c2d64ec53a6",
      "name": "Google Sheets Trigger",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        -208,
        -144
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1245574619,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit#gid=1245574619",
          "cachedResultName": "Form Responses 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit?usp=drivesdk",
          "cachedResultName": "Lead Qualification Voice Agent Demo v1 (Responses)"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "206d9715-ee90-4a40-8f1e-ddc5978674bf",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -192,
        224
      ],
      "parameters": {
        "path": "030f0967-0d16-43db-aa72-ad2d5909f945",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8ca3c8e3-55a1-4785-8619-74e6cb1722ff",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        832,
        224
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={\n  \"type\": \"conversation_initiation_client_data\",\n  \"dynamic_variables\": {\n    \"voiceopener\": \"{{ $json.choices[0].message.content['Voice Opener'] }}\"\n  }\n}\n"
      },
      "typeVersion": 1.4
    },
    {
      "id": "f2d03e6c-a85f-4a11-9bf4-d1a57cfbccf8",
      "name": "Webhook1",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -208,
        624
      ],
      "parameters": {
        "path": "37e8d818-8265-43e9-803e-00119da5f3cb",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7ef04ab0-ee54-4ff7-b23b-178b1519a33e",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        16,
        624
      ],
      "parameters": {
        "jsCode": "// Get the webhook data from the input\nconst webhookData = $input.item.json;\n\n// Access the transcript array\nconst transcript = webhookData.body.data.transcript;\n\n// Format the transcript into a clean string\nconst formattedTranscript = transcript.map(entry => {\n  // Capitalize the role for better readability\n  const role = entry.role.charAt(0).toUpperCase() + entry.role.slice(1);\n  return `${role}: ${entry.message}`;\n}).join('\\n'); // Join each line with a newline\n\n// Return the formatted transcript\nreturn {\n  json: {\n    clean_transcript: formattedTranscript\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "7dde1ba5-34f2-44ec-b244-2c93aec36b57",
      "name": "Message a model",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        240,
        624
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "={{ $json.clean_transcript }}"
            },
            {
              "role": "system",
              "content": "=You are an expert AI assistant specializing in analyzing sales call transcripts for \"ThinkSpire,\" a custom AI agency. You will be given the full transcript of a conversation between an AI agent named Sarah and a potential client.\n\nYour task is to carefully read the transcript and extract the key information. You MUST respond ONLY with a valid JSON object and nothing else. Do not include any introductory text, backticks, or explanations.\n\nThe JSON object must have the following structure:\n\n{\n  \"callSummary\": \"A concise, one-paragraph summary of the entire conversation, written in the third person.\",\n  \"leadStatus\": \"Analyze the conversation and classify the lead's status. Must be one of the following strings: 'Qualified', 'Not Qualified', 'Follow-up'. 'Qualified' means they explicitly agreed to a follow-up call. 'Not Qualified' means they explicitly said no or were a bad fit. 'Follow-up' means the call was inconclusive or they asked for more information via email first.\",\n  \"projectDetails\": \"Summarize the core requirements and features of the AI solution the client wants to build.\",\n  \"budget\": \"Extract the client's stated budget. Must be one of the following strings: '< INR 50k', 'INR 50k - INR 200k', 'INR 200k - INR 500k', 'INR 500k+', or 'Not Mentioned'.\",\n  \"timeline\": \"Extract the client's stated timeline. Must be one of the following strings: 'ASAP', '1-3 weeks', '3-6 weeks', '6+ weeks', or 'Not Mentioned'.\",\n  \"painPoints\": \"List the key business problems or pain points the client mentioned they are trying to solve.\"\n}"
            }
          ]
        },
        "simplify": false,
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "f24c1e5f-8b7d-4d36-bead-5a24841bd1f1",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        592,
        768
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1526b36e-0225-48b5-9839-71b4f4a2e017",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.choices[0].message.content.leadStatus }}",
              "rightValue": "Qualified"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "7e85f631-f7c9-48b1-a215-d1780d4a2628",
      "name": "Get row(s) in sheet1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1040,
        736
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $('Webhook1').item.json.body.data.conversation_initiation_client_data.dynamic_variables.system__called_number }}",
              "lookupColumn": "Phone Number (Please enter + country code)"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1245574619,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit#gid=1245574619",
          "cachedResultName": "Form Responses 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit?usp=drivesdk",
          "cachedResultName": "Lead Qualification Voice Agent Demo v1 (Responses)"
        },
        "combineFilters": "OR"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "f03074cd-cb71-455e-a58e-93df49da4f84",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        592,
        528
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f90161bd-2afe-472c-bb45-22b2da435bb9",
              "name": "country_code",
              "type": "string",
              "value": "={{$('Webhook1').item.json.body.data.metadata.phone_call.external_number.match(/^\\+(\\d{1,2})/)[1]}}"
            },
            {
              "id": "fe128657-11d8-457f-b31e-27806ae3ab3f",
              "name": "phone_number",
              "type": "string",
              "value": "={{$('Webhook1').item.json.body.data.metadata.phone_call.external_number.replace(/^\\+\\d{1,2}/, '')}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ec82a8cd-ade2-4692-a04d-6e945e3d4d32",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        832,
        736
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "f6990d40-3847-4fbb-98ac-9226dbe93707",
      "name": "Message a model1",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        512,
        224
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Hi  {{ $json['First Name'] }}, your request: {{ $json['Service Request'] }}"
            },
            {
              "role": "system",
              "content": "=Your name is Anika. You work with Thinkspire AI. You are an expert in following up with potential leads.\n\nWrite a friendly, yet concise, outbound call opener using the lead\u2019s {{ $json['First Name'] }} and referencing their requested service: {{ $json['Service Request'] }} . Make sure the sentence is grammatically correct.\n\nLabel the output as \"Voice Opener\""
            }
          ]
        },
        "simplify": false,
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "3238a22e-782e-408a-b494-606177ff4652",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        128
      ],
      "parameters": {
        "width": 1296,
        "height": 288,
        "content": "## 2. Fetch Client Data ##"
      },
      "typeVersion": 1
    },
    {
      "id": "43db9c00-5e99-4648-ac9f-d00090ebc270",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 1728,
        "height": 464,
        "content": "## 3. Outbound Call Processing ##"
      },
      "typeVersion": 1
    },
    {
      "id": "55b994a2-d9af-42c1-a1e8-ae65de7430bf",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        -224
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 272,
        "content": "## 1. Initiate Call ##"
      },
      "typeVersion": 1
    },
    {
      "id": "6319684e-a732-4643-8840-21ff133caa29",
      "name": "Edit Fields1",
      "type": "n8n-nodes-base.set",
      "position": [
        48,
        224
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e726c247-bf1a-451a-910c-49beee3fe548",
              "name": "country_code",
              "type": "string",
              "value": "={{$json.body.called_number.match(/^\\+(\\d{1,2})/)[1]}}"
            },
            {
              "id": "058cde1e-76ba-4dee-9da8-141e154f6a8c",
              "name": "phone_number",
              "type": "string",
              "value": "={{$json.body.called_number.replace(/^\\+\\d{1,2}/, '')}}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4,
      "alwaysOutputData": true
    },
    {
      "id": "757c530d-0864-4ad9-8b0d-44d8c9817fb2",
      "name": "Update Call Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        832,
        528
      ],
      "parameters": {
        "columns": {
          "value": {
            "Budget": "={{ $('Message a model').item.json.choices[0].message.content.budget }}",
            "Timeline": "={{ $('Message a model').item.json.choices[0].message.content.timeline }}",
            "Transcript": "={{ $('Webhook1').item.json.body.data.analysis.transcript_summary }}",
            "Lead status": "={{ $('Message a model').item.json.choices[0].message.content.leadStatus }}",
            "Call summary": "={{ $('Message a model').item.json.choices[0].message.content.callSummary }}",
            "Phone Number (Please enter + country code)": "={{ $('Webhook1').item.json.body.data.conversation_initiation_client_data.dynamic_variables.system__called_number }}"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "First Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "First Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Last Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone Number (Please enter + country code)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Phone Number (Please enter + country code)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Service Request",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Service Request",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Budget",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Budget",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Timeline",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timeline",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Call summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Call summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Transcript",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Transcript",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Voice opener",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Voice opener",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Modified At",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Modified At",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Phone Number (Please enter + country code)"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1245574619,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit#gid=1245574619",
          "cachedResultName": "Form Responses 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit?usp=drivesdk",
          "cachedResultName": "Lead Qualification Voice Agent Demo v1 (Responses)"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b7277703-20a6-4360-9499-dd09d6cc4bdb",
      "name": "Look up Customer Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        288,
        224
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.body.called_number }}",
              "lookupColumn": "Phone Number (Please enter + country code)"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1245574619,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit#gid=1245574619",
          "cachedResultName": "Form Responses 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VxAAFch57KhXmRpgClLpklDeB4naAqr8LrLoBd3SiWw/edit?usp=drivesdk",
          "cachedResultName": "Lead Qualification Voice Agent Demo v1 (Responses)"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "81bc117a-acfb-485d-9ebe-2fd4b6e60361",
      "name": "Send Schedule Request",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1264,
        736
      ],
      "parameters": {
        "sendTo": "={{ $json.Email }}",
        "message": "=Hi {{ $json['First Name']}},\n\nIt was great talking to you, below is our meeting calendar - https://calendar.app.google/Zs7VjMjbwWeaPvAH7 \n\nJust click the link, pick a time that works best for you, and we will see you in the meeting!\n",
        "options": {
          "appendAttribution": false
        },
        "subject": "Thinkspire Meeting",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "832bf94b-659e-4c74-8367-aba68c34a167",
      "name": "Outbound Call",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        16,
        -144
      ],
      "parameters": {
        "url": "https://api.elevenlabs.io/v1/convai/twilio/outbound-call",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "agent_id",
              "value": "agent_0501k5kszqfxe65byc7m2ebkg498"
            },
            {
              "name": "agent_phone_number_id",
              "value": "phnum_1201k5ksx9cmehgah78rf8es27jf"
            },
            {
              "name": "to_number",
              "value": "={{ $json[\"Phone Number (Please enter + country code)\"] }}"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "twilioApi": {
          "name": "<your credential>"
        },
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "6c4960da-78fc-4119-b281-7bed1c16f9b4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1200,
        -432
      ],
      "parameters": {
        "color": 3,
        "width": 832,
        "height": 1760,
        "content": "## What is this?\n\n### This workflow is a Lead Qualification Voice Agent automation template built in n8n. It automates the process of qualifying leads by initiating outbound calls, analyzing call transcripts, updating lead data, and sending follow-up emails. The workflow integrates Google Sheets, OpenAI, and Twilio (via ElevenLabs API) to streamline lead management for sales or customer success teams.\n\n## 1. Initiate Call\n### Purpose: This step starts the lead qualification process by detecting new leads and preparing to contact them.\n### How it works:\n- The workflow is triggered when a new lead is added to your data source (such as a new row in Google Sheets, using the \u201cGoogle Sheets Trigger\u201d node).\n- The trigger node captures essential lead information (e.g., name, phone number, service of interest) from the new entry.\n- The workflow then prepares a personalized call script or opener, often using an AI node (like OpenAI) to generate a friendly and relevant introduction based on the lead\u2019s details.\n- An outbound call is initiated to the lead\u2019s phone number using a telephony integration node (such as HTTP Request to ElevenLabs or Twilio).\n### Note:\n- Ensure your trigger node is correctly set up to monitor the right data source and columns.\n- Configure the telephony node with valid API credentials and the correct phone number field.\n- Optionally, customize the AI prompt to tailor the call opener to your business context.\n\n## 2. Fetch Client Data\n### Purpose: This step retrieves detailed information about the lead from your data source (such as a CRM, database, or Google Sheets).\n### How it works:\n- The workflow uses a data retrieval node (such as Google Sheets, HTTP Request, or a database node) to fetch client details based on a unique identifier (like phone number or email) captured in the trigger step.\n- The node is configured to query the data source for all relevant fields, such as the lead\u2019s name, company, previous interactions, and any custom attributes important for your qualification process.\n- The fetched data is then made available to subsequent nodes, allowing for dynamic personalization of the call script and follow-up actions.\n### Note:\n- Ensure your data source is up-to-date and contains all necessary fields for lead qualification.\n\n## 3. Outbound Call Processing\n### Purpose: To manage the workflow after the outbound call is initiated, including handling call results, analyzing transcripts, and updating lead status.\n### How it works:\n- After the call is placed (using a telephony integration node), the workflow waits for the call to complete. This can be achieved using a webhook node (if your provider supports callbacks) or a polling node to check call status.\n- Once the call is finished, the workflow retrieves the call outcome (e.g., answered, voicemail, failed) and, if available, the call transcript.\n- The transcript can be sent to an AI node (like OpenAI) for analysis\u2014such as extracting intent, sentiment, or key information discussed during the call.\n- Based on the analysis, the workflow updates the lead\u2019s status in your data source (e.g., marking as \u201cQualified,\u201d \u201cNeeds Follow-up,\u201d or \u201cUnreachable\u201d).\n- Optionally, the workflow can trigger additional actions, such as sending a follow-up email, notifying a sales rep, or logging the interaction in your CRM.\n\n### Note:\n- Use webhook nodes for real-time call result processing if your telephony provider supports it.\n- Log all call results and analysis for future reference and reporting.\n\n## Prerequisities\n- OpenAI\n- Google Sheets\n- Twilio\n- Elevenlabs: \n  - Import the twilio number into Elevenlabs\n  - Set up an agent in Elevenlabs\n  - Set up prompt into Elevenlabs\n  - Set up webhooks for fetch client initiation data and post call data\n\n\n## Customization\n- Change Data Source: Swap the Google Sheets node for another data source (e.g., Airtable, MySQL) as needed.\n- Modify Call Script: Edit the OpenAI prompt to generate different call openers or scripts based on your use case.\n- Adjust Call Logic: Modify the outbound call node to use a different telephony provider or to handle call scheduling.\n- Notification Options: Integrate with email, chat, or notification services to alert your team of qualified leads.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "executionOrder": "v1"
  },
  "versionId": "53e78dbd-0186-4da5-9db1-28782b50b717",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "Message a model",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook1": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Update Call Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "Look up Customer Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message a model": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          },
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message a model1": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet1": {
      "main": [
        [
          {
            "node": "Send Schedule Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Trigger": {
      "main": [
        [
          {
            "node": "Outbound Call",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Look up Customer Data": {
      "main": [
        [
          {
            "node": "Message a model1",
            "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

The workflow is triggered when a new lead is added to your data source (such as a new row in Google Sheets, using the “Google Sheets Trigger” node). The trigger node captures essential lead information (e.g., name, phone number, service of interest) from the new entry. The…

Source: https://n8n.io/workflows/9862/ — 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 is designed for sales teams, call centers, and businesses handling both outbound and inbound lead calls who want to automate their qualification, follow-up, and call documentation proces

Google Sheets Trigger, Twilio, HTTP Request +3
AI & RAG

Build a Phone Agent to qualify outbound leads and inbound calls with RetellAI -vide. Uses googleSheetsTrigger, twilio, httpRequest, googleSheets. Event-driven trigger; 18 nodes.

Google Sheets Trigger, Twilio, HTTP Request +3
AI & RAG

This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p

OpenAI Chat, Output Parser Item List, HTTP Request +10
AI & RAG

This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.

OpenAI Chat, Memory Buffer Window, Output Parser Structured +11
AI & RAG

This workflow automates the process of generating, reviewing, and publishing blog posts across multiple platforms, now enhanced with support for RSS Feeds as a content source. It streamlines the manag

HTTP Request, Html Extract, RSS Feed Read +9