> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.vapi.ai/llms.txt.
> For full documentation content, see https://docs.vapi.ai/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.vapi.ai/_mcp/server.

# Lead qualification assistant

> Build a voice AI outbound sales assistant with BANT data capture, CRM integration, objection handling, and automated follow-ups using Vapi Assistants.

## Overview

Create an outbound sales assistant that calls prospects, qualifies them using BANT signals, and books meetings. The assistant uses tools to look up leads, score qualification, update CRM, and schedule on a calendar.

**Assistant Capabilities:**

* BANT data capture with structured outputs
* Objection handling and call outcome logging
* Calendar booking and follow-up creation
* CRM updates with next steps

**What You'll Build:**

* Focused sales prompt with clear call flow
* Tools for lead lookup, scoring, CRM update, and scheduling
* Optional CSV knowledge bases for demo leads/products

## Prerequisites

* A [Vapi account](https://dashboard.vapi.ai/)
* CRM or spreadsheet data; Google Calendar or scheduling backend

## 1. Prepare sample data (optional)

Download leads.csv

Download products.csv

Download call\_outcomes.csv

Upload `leads.csv`, `products.csv`, and `call_outcomes.csv` and note file IDs.

```typescript
import { VapiClient } from "@vapi-ai/server-sdk";
import fs from "fs";
const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });
async function upload(p: string) { return (await vapi.files.create({ file: fs.createReadStream(p) })).id; }
const leadsFileId = await upload("leads.csv");
const productsFileId = await upload("products.csv");
const outcomesFileId = await upload("call_outcomes.csv");
```

***

## 2. Create sales tools

Configure function tools or your CRM API for:

* `lookup_lead(leadId)`
* `score_lead(budget, authority, need, timeline)`
* `update_crm(leadId, callOutcome, nextSteps)`
* `book_meeting(prospect, time)`

See [Custom Tools](/tools/custom-tools) and [Google Calendar](/tools/google-calendar).

***

## 3. Define the assistant

* Name: `Outbound SDR`
* First message: concise opener asking permission to talk

```txt title="System Prompt" maxLines=12
You are an outbound SDR. Goals: get permission, qualify with BANT, schedule a meeting, and log the outcome. Keep answers ≤ 25 words and be respectful. Use tools when needed.
```

Capture: `permission_status`, `bant_budget`, `bant_authority`, `bant_need`, `bant_timeline`, `meeting_time`, `call_outcome`.
See [Structured outputs](/assistants/structured-outputs).

```typescript
import { VapiClient } from "@vapi-ai/server-sdk";
const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });
const systemPrompt = `Outbound SDR. Get permission, qualify with BANT, then book. Keep responses short. Use lookup_lead, score_lead, update_crm, book_meeting.`;
const assistant = await vapi.assistants.create({
  name: "Outbound SDR",
  firstMessage: "Hi, this is Alex from TechFlow. Is now a good time to chat for 2 minutes?",
  model: { provider: "openai", model: "gpt-4o", messages: [{ role: "system", content: systemPrompt }] }
});
```

***

## 4. Make calls

```typescript title="create web call"
import { VapiClient } from "@vapi-ai/server-sdk";
const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });
await vapi.calls.create({ transport: { type: "web" }, assistant: { assistantId: "your-assistant-id" } });
```

```typescript title="create phone call"
await vapi.calls.create({ phoneNumberId: "your-phone-number-id", customer: { number: "+15551234567" }, assistant: { assistantId: "your-assistant-id" } });
```

```python title="create web call"
import os
from vapi import Vapi
client = Vapi(token=os.getenv("VAPI_API_KEY"))
client.calls.create(transport={"type": "web"}, assistant_id="your-assistant-id")
```

```python title="create phone call"
client.calls.create(phone_number_id="your-phone-number-id", customer={"number": "+15551234567"}, assistant_id="your-assistant-id")
```

```bash
curl -X POST "https://api.vapi.ai/call/web" \
  -H "Authorization: Bearer $VAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "assistant": { "assistantId": "your-assistant-id" } }'
```

```bash
curl -X POST "https://api.vapi.ai/call" \
  -H "Authorization: Bearer $VAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "assistant": { "assistantId": "your-assistant-id" }, "phoneNumberId": "your-phone-number-id", "customer": { "number": "+15551234567" } }'
```

## 5. Test outbound calls

Create a phone number or trigger an outbound call. See [Phone calls](/quickstart/phone).

## Next steps

* **CRM integration**: Connect your CRM via [Custom Tools](/tools/custom-tools)
* **Calendar**: [Google Calendar](/tools/google-calendar)
* **Escalation**: Use a [Squad](/squads) to hand off to a specialized closer