← All posts
How-ToOctober 11, 2026 · 10 min

Build an AI agent lead qualification outbound calls system with Vapi or Twilio

An ai agent lead qualification outbound calls system autonomously dials prospects, asks discovery questions via natural language, detects buying signals in real time, and pushes qualified leads directly into your CRM using webhooks - eliminating manual triage. Vapi orchestrates the voice agent and call flow; Twilio or Vapi's Voice API handles telephony; OpenAI powers intent detection and conversation logic; and call transcription (via Deepgram or Whisper) extracts structured data. n8n or Make then routes qualified leads to your CRM based on scoring rules. The agent qualifies on criteria you define - budget confirmation, timeline, pain-point match - and only surfaces hot prospects, cutting your team's qualification time from hours to seconds per lead.

What you need

To run an ai agent lead qualification outbound calls system, you need a voice orchestration layer, speech recognition, text-to-speech, a workflow engine, and CRM integration. Here's what each component costs and does:

ToolPlan/PriceRole
VapiFrom $0.06/min for voice calls; $500/mo starter planVoice agent orchestration - handles call routing, prompt management, and real-time intent detection
TwilioFrom $0.0075/min inbound, $0.013/min outbound; pay-as-you-goTelephony carrier - dials prospects and manages call state
OpenAI$0.50-$2.00 per 1M input tokens (GPT-4 Turbo); $15/mo API tierLLM backbone for conversation logic and buying-signal extraction
Deepgram or WhisperDeepgram from $0.0043/min; Whisper API $0.02/minSpeech-to-text for call transcription and real-time intent detection
ElevenLabsFrom $0.30 per 1K characters; check current pricing for voice cloningText-to-speech for natural agent voice
n8n or Maken8n self-hosted free or cloud from $25/mo; Make from $9.99/moWorkflow engine - chains CRM webhooks, lead scoring logic, and call triggers
Your CRM (HubSpot, Pipedrive, Salesforce)HubSpot free tier; Pipedrive from $14/mo; Salesforce from $165/moLead storage and webhook receiver for qualified prospect push

How it works

  1. Prospect list ingestion. Your CRM or lead database (Salesforce, HubSpot, Pipedrive) exports a CSV or connects via API to n8n or Make. The workflow reads phone numbers, company names, and prospect context, then triggers the voice agent for each contact.
  1. Voice agent initialization. Vapi or Twilio initiates an outbound call using your chosen carrier. Vapi orchestrates the agent logic; Twilio handles raw telephony. OpenAI's GPT-4 powers the agent's conversational reasoning - it decides what questions to ask based on prospect responses and detects buying signals in real time (e.g., "we're looking to switch vendors next quarter").
  1. Real-time speech processing. As the prospect speaks, Deepgram or OpenAI's Whisper transcribes the call live. ElevenLabs or Twilio's built-in text-to-speech delivers the agent's responses with natural intonation. The agent listens for keywords: budget mentions, timeline statements, pain-point acknowledgments.
  1. Intent detection and scoring. The OpenAI prompt evaluates each response against your lead-scoring rubric (budget range, decision timeline, authority level). The agent assigns a qualification score (0-100) and stores it in memory during the call.
  1. Call transcription and webhook push. After the call ends, the full transcript and qualification score are logged. n8n or Make receives a webhook from Vapi/Twilio, parses the transcript, and uses intent detection rules to categorize the lead (hot, warm, cold).
  1. CRM sync. Qualified leads (score >70) are automatically created or updated as contacts in your CRM with tags, notes, and next-step tasks. Unqualified leads are marked for nurture sequences or archived.

How to build it

1. Set up your voice agent platform and API keys

Choose Vapi or Twilio as your orchestration layer. Vapi handles voice-agent logic natively and integrates with OpenAI for conversation intelligence; Twilio requires more manual wiring but offers deeper telephony control. Create accounts on both your chosen platform and OpenAI. Generate API keys for Vapi (or Twilio), OpenAI, and your CRM (HubSpot, Pipedrive, Salesforce). Store these securely in environment variables or your automation platform's credential store.

2. Build the outbound call workflow in n8n or Make

Create a new workflow in n8n or Make. Start with a trigger node (Webhook, Schedule, or CRM trigger - e.g., "new lead added"). Add a node to fetch prospect data from your CRM: company name, prospect name, phone number, and any known pain points or industry vertical. This data becomes context for the voice agent.

3. Configure the Vapi voice agent with OpenAI

If using Vapi, create a voice agent via the Vapi dashboard or API. Set the model to gpt-4-turbo or gpt-3.5-turbo depending on latency tolerance. Configure the system prompt (see artifact below) to guide the agent through discovery, objection handling, and buying-signal detection. Enable call transcription via Deepgram or Whisper (Vapi supports both). Set the voice to ElevenLabs (e.g., "Aria" or "Sage") for natural tone. Configure the agent to listen for keywords like "budget approved," "timeline," "decision-maker," or "pain point confirmed."

4. Initiate the outbound call

In your n8n or Make workflow, add a Vapi node (or Twilio Make Call node if using Twilio). Pass the prospect phone number, the system prompt, and any prospect context as variables. Vapi will dial the number and begin the conversation autonomously. Set a timeout of 60-90 seconds per call; the agent should complete discovery in one call or schedule a follow-up.

5. Capture call transcription and intent signals

Configure Vapi to send call transcription and metadata to a webhook endpoint (your n8n or Make workflow URL). The webhook payload includes the full transcript, call duration, and any custom variables you defined in the system prompt (e.g., qualified: true, budget_range: "50k-100k"). Parse this payload in your workflow.

6. Implement intent detection and lead scoring

Add an OpenAI node to your workflow that analyzes the transcript. Send the transcript text to OpenAI with a prompt asking it to extract: (a) buying intent (high/medium/low), (b) timeline (immediate/3-6 months/no timeline), (c) budget range if mentioned, (d) key objections, and (e) next-step recommendation. Store the result as a JSON object.

7. Score and filter leads

Create a conditional node that assigns a lead score (0-100) based on the intent analysis. For example: buying intent "high" = +40 points, timeline "immediate" = +30 points, budget confirmed = +20 points, decision-maker confirmed = +10 points. Set a threshold (e.g., score ≥ 70 = qualified). Only qualified leads proceed to the next step.

8. Push qualified leads to CRM via webhooks

Add a CRM node (HubSpot, Pipedrive, or Salesforce) to your workflow. For qualified leads, create or update a contact record with: prospect name, phone, company, call transcript, intent score, timeline, budget, and a custom field "Qualified by AI Agent: Yes." Tag the lead with "AI-Qualified" for sales team filtering. Log the call outcome and timestamp.

9. Handle unqualified leads and follow-ups

For leads scoring below 70, create a separate branch. Log the call, store the transcript, and either schedule a manual follow-up or add the prospect to a nurture sequence. If the agent detected a specific objection (e.g., "budget not approved yet"), set a task reminder for 30 days later.


Artifact 1: n8n workflow structure (JSON excerpt)

```json { "nodes": [ { "name": "Trigger: New Lead from CRM", "type": "webhook", "typeVersion": 1, "position": [250, 300] }, { "name": "Fetch Prospect Data", "type": "hubspot", "operation": "getContact", "parameters": { "contactId": "{{ $json.body.contactId }}" } }, { "name": "Call Vapi Initiate", "type": "httpRequest", "method": "POST", "url": "https://api.vapi.ai/call", "headers": { "Authorization": "Bearer {{ $env.VAPI_API_KEY }}" }, "body": { "phoneNumber": "{{ $json.phone }}", "systemPrompt": "{{ $json.systemPrompt }}", "customer": { "name": "{{ $json.firstName }}", "number": "{{ $json.phone }}" }, "assistantOverrides": { "model": { "provider": "openai", "model": "gpt-4-turbo" } } } }, { "name": "Wait for Webhook: Call Complete", "type": "webhook", "typeVersion": 1, "waitForWebhook": true }, { "name": "Analyze Transcript with OpenAI", "type": "openai", "operation": "chat", "parameters": { "messages": [ { "role": "system", "content": "Extract buying signals from this call transcript. Return JSON: {intent: 'high'|'medium'|'low', timeline, budget, objections, recommendation}" }, { "role": "user", "content": "{{ $json.transcript }}" } ] }

What it costs to run

Component100 calls/mo1,000 calls/mo10,000 calls/mo
Vapi voice agent$5-15$50-150$500-1,500
Twilio outbound$0.01-0.03/min$15-45$150-450
OpenAI (GPT-4 mini reasoning)$2-5$20-50$200-500
Speech-to-text (Deepgram)$3-8$30-80$300-800
Text-to-speech (ElevenLabs)$5-10$50-100$500-1,000
n8n or Make automation$10-20$20-50$50-100
CRM webhook ingestionFree-$10Free-$10Free-$10
Total (low-high)$30-71$185-485$1,700-4,360

Assumptions: 5-8 min avg call duration; Vapi pricing check current pricing for exact per-minute rates; Twilio $0.01-0.03/min for US outbound; OpenAI at $0.15/1M input + $0.60/1M output tokens (reasoning model); Deepgram at $0.0043/min; ElevenLabs at $0.30/1K characters; n8n at $20/mo starter or Make at $9.99/mo base tier; CRM webhooks typically included in platform tier or free API calls.

Where this breaks

Agent hangs up on legitimate prospects because intent detection fires too early. The voice agent classifies a prospect as "not interested" after hearing a single objection ("We're happy with our current vendor") and disconnects before the prospect finishes their thought. Fix: Add a confirmation step - when intent detection confidence drops below 0.75, have the agent ask a clarifying follow-up ("I hear that. Are you open to a brief comparison?") before terminating the call. Adjust your OpenAI system prompt to require two consecutive negative signals, not one, before triggering the hangup.

Call transcription arrives 30 seconds after the call ends, so lead scoring happens on stale data. Your CRM webhook fires before Deepgram or Twilio's speech-to-text service returns the full transcript, so the lead enters your system with empty intent fields and no buying signals captured. Fix: Use Vapi's built-in call transcription (which streams partial transcripts during the call) instead of post-call processing, or implement a polling loop in n8n or Make that waits for the transcript before firing the CRM webhook - add a 5-10 second delay and retry logic.

High-value prospects get marked as low-priority because your lead scoring weights are backwards. A prospect who says "budget approved" and "timeline is Q1" scores lower than one who says "sounds interesting" because your Make or n8n scoring formula counts keyword frequency instead of semantic weight. Fix: Replace keyword matching with OpenAI's intent classification - send the transcript excerpt to GPT-4 with a structured prompt asking for buying signal categories (budget confirmed, timeline set, authority confirmed) and score based on the presence of those categories, not word count.

Twilio or Vapi rate limits kill your outbound campaign mid-run. You queue 500 calls in parallel and hit Twilio's concurrent-call limit (typically 50-100 depending on your account tier), causing calls to fail silently and leads to drop out of your pipeline. Fix: Implement exponential backoff in your n8n or Make workflow - space outbound calls 2-3 seconds apart and monitor Twilio's API response codes (429 = rate limit). Check your account's concurrent-call tier before launch and request an increase if needed.

Can an AI agent really qualify leads without a human listening in?

Yes. The agent listens for specific intent signals - budget mentions, timeline statements, competitor complaints, pain-point confirmations - and flags them in real time. Modern speech-to-text (Deepgram or OpenAI Whisper) captures the full call, intent detection logic scores responses against your qualification criteria, and the agent decides whether to push the lead to your CRM or log it as unqualified, all without human intervention.

What happens if the prospect hangs up or gets angry?

The call ends, the transcription is logged with a sentiment flag, and the lead is marked as "not ready" or "do not contact" depending on your workflow rules. Vapi and Twilio both support early-termination handling - you can configure fallback behaviors like "end call gracefully" or "transfer to human" if aggression or refusal is detected in the voice stream.

How do I know the agent didn't miss a qualified lead?

Pull the call transcription and review it against your scoring rubric; most teams run a weekly audit on 5-10% of calls flagged as "unqualified" to catch false negatives. You can also lower the intent-detection threshold in your n8n or Make workflow to be more permissive, then manually review borderline cases before they hit your CRM - this trades automation speed for accuracy.

What's the cost per qualified lead using Vapi or Twilio?

Vapi charges from $0.05/min for voice calls; Twilio's Voice API starts at $0.0085/min for inbound and $0.013/min for outbound (check current pricing for both). Add OpenAI API costs (~$0.01-$0.03 per call for intent detection) and your CRM webhook overhead is negligible, so expect $0.10-$0.25 per call, or $5-$15 per qualified lead depending on your hang-up rate and qualification bar.

For a deeper technical reference, see n8n's documentation.

Get the full toolkit

Grab the free guide with the node-by-node build for all 10 automations.

No spam. Unsubscribe anytime. Just the good stuff.