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

# Appointment scheduling assistant

> Build a voice AI appointment scheduling assistant with Google Calendar integration, availability checking, and automated confirmations using Vapi Assistants.

## Overview

Build an AI-powered appointment scheduling assistant that handles inbound calls for booking, rescheduling, and canceling appointments. This approach uses a single Assistant with tools for calendar availability, customer lookups, and confirmations.

**Assistant Capabilities:**

* Real-time availability checks and booking
* Reschedule and cancel with confirmation
* Customer verification and data lookups
* SMS/email confirmations via tools

**What You'll Build:**

* An assistant with a focused prompt for scheduling flows
* Tools for calendar availability and booking
* Optional CSV knowledge bases for customers/services
* A phone number attached to your assistant

## Prerequisites

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

## 1. Prepare data (optional)

Use sample CSVs for customers, services, and appointments during development.

Download services.csv

Download customers.csv

Download appointments.csv

1. Open your [Vapi Dashboard](https://dashboard.vapi.ai) → Files
2. Upload the three CSVs and note their 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(file: string) {
  const res = await vapi.files.create({ file: fs.createReadStream(file) });
  console.log(file, res.id);
  return res.id;
}

const servicesFileId = await upload("services.csv");
const customersFileId = await upload("customers.csv");
const appointmentsFileId = await upload("appointments.csv");
```

```python
import requests, os

def upload(path: str):
    r = requests.post(
        "https://api.vapi.ai/file",
        headers={"Authorization": f"Bearer {os.getenv('VAPI_API_KEY')}"},
        files={"file": open(path, "rb")},
    )
    r.raise_for_status()
    print(path, r.json()["id"]) 
    return r.json()["id"]

services_file_id = upload("services.csv")
customers_file_id = upload("customers.csv")
appointments_file_id = upload("appointments.csv")
```

***

## 2. Create calendar tools

Use the Google Calendar integration for availability and booking, or your own API via a custom tool.

See: [Google Calendar Integration](/tools/google-calendar)

Configure tools for:

* `check_availability(service, date)`
* `book_appointment(customer, service, time)`
* `reschedule_appointment(appointmentId, time)`
* `cancel_appointment(appointmentId)`

See: [Custom Tools](/tools/custom-tools)

Define function tools that call your scheduling backend. Attach CSV knowledge bases (customers/services) if using the sample data above.

***

## 3. Create the assistant

* Go to Assistants → Create Assistant → Blank template
* Name it `Receptionist`

```txt title="System Prompt" maxLines=12
You are an AI receptionist for a barbershop. Your goals:
1) Verify the customer
2) Offer booking, rescheduling, or cancellation
3) Confirm details and send a confirmation

When needed, call tools: check_availability, book_appointment, reschedule_appointment, cancel_appointment.
Keep replies under 30 words. Confirm date/time clearly.
```

Add your scheduling tools to the assistant and publish.

```typescript
import { VapiClient } from "@vapi-ai/server-sdk";

const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });

const systemPrompt = `You are an AI receptionist for a barbershop. Verify the customer, then offer booking, rescheduling, or cancellation. Use scheduling tools when needed. Keep replies under 30 words.`;

const assistant = await vapi.assistants.create({
  name: "Receptionist",
  firstMessage: "Welcome to Tony's Barbershop! How can I help you today?",
  model: {
    provider: "openai",
    model: "gpt-4o",
    messages: [{ role: "system", content: systemPrompt }],
    // toolIds: [ "CHECK_AVAILABILITY_ID", "BOOK_ID", "RESCHEDULE_ID", "CANCEL_ID" ]
  }
});
```

```python
from vapi import Vapi
import os

client = Vapi(token=os.getenv("VAPI_API_KEY"))

assistant = client.assistants.create(
    name="Receptionist",
    first_message="Welcome to Tony's Barbershop! How can I help you today?",
    model={
        "provider": "openai",
        "model": "gpt-4o",
        "messages": [{"role": "system", "content": "You are an AI receptionist for a barbershop. Verify the customer, then handle booking/rescheduling/cancel."}]
    }
)
```

***

## 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 and validate

Create a phone number and assign your assistant. See [Phone calls quickstart](/quickstart/phone).

* New booking → check availability → book → confirm
* Reschedule existing appointment → confirm
* Cancel appointment → confirm

## Next steps

* **Tools**: [Google Calendar](/tools/google-calendar), [Custom Tools](/tools/custom-tools)
* **Structured outputs**: [Extract structured data](/assistants/structured-outputs-quickstart)
* **Multichannel**: [Web integration](/quickstart/web)