Vapi Appointment Confirmation Agent

An outbound voice agent that calls patients or customers to confirm upcoming appointments. When someone needs to reschedule, the agent checks real-time calendar availability, books a new slot, and sends a confirmation email - all during the live phone call. Cancellations trigger an immediate Slack alert to the front desk. Vapi handles the calling and speech; ChatBotKit handles every action the agent takes through a single MCP server endpoint. Use Vapi's batch calling API to confirm an entire day's appointments in one request.

voice
Vapi
MCP
2513

Missed appointments cost service businesses billions every year. Automated reminder calls reduce no-show rates by 30-40%, but most reminder systems are one-way - they play a recorded message and hang up. If the patient needs to reschedule, they still have to call the office back, wait on hold, and coordinate with a human.

This blueprint turns the reminder call into a two-way conversation that can actually solve the problem. The voice agent confirms the appointment, and if the patient says "I can't make it Thursday", the agent checks the clinic's real availability, offers alternative slots, books the new appointment, sends a confirmation email, and updates the patient record - all in a single phone call that takes under two minutes.

Why each tool exists

Every ability in this blueprint serves a specific moment in the conversation:

  1. The call starts. The agent greets the patient and states the appointment details. No tool call needed yet - Vapi's assistant system prompt contains the appointment context passed via assistantOverrides.variableValues when the call was created.

  2. The patient confirms. The agent uses Send Confirmation Email to email a written confirmation with the date, time, and location. The patient has a record in their inbox.

  3. The patient needs to reschedule. The agent uses Check Available Slots to query Google Calendar for open appointments that match the clinic's working hours and slot duration. It reads back two or three options.

  4. The patient picks a slot. The agent uses Book Appointment to reserve the slot by creating a calendar event with the patient as an attendee. Then it sends a confirmation email with the new details.

  5. The patient cancels outright. The agent uses Notify Front Desk to post to the clinic's Slack channel with the patient name, cancelled time, and reason. The front desk can try to fill the slot.

  6. After any outcome, the agent uses Update Patient Record to write the call result (confirmed, rescheduled, cancelled) back to HubSpot so the CRM stays current and the patient is not called again for the same appointment.

There are no generic "look up lead" or "search contacts" abilities because the agent does not need to discover who it is calling. The calling system already knows - the patient's name, appointment date, and phone number are injected into the Vapi assistant at call creation time. The tools exist only for actions the agent takes in response to what the patient says.

How to trigger the calls

Vapi supports three outbound calling patterns, and this blueprint is designed around the batch pattern:

  • Batch - Your backend queries upcoming appointments (e.g. everything in the next 48 hours), builds a customers array with one entry per patient, and POSTs to /call. Vapi calls each patient using the same assistant and MCP tools. This is the primary workflow.
  • Scheduled - add a schedulePlan with earliestAt and latestAt to queue calls within a time window (e.g. only call between 9am and 12pm).
  • Single - POST with one customer for ad-hoc confirmation calls triggered by a receptionist or a webhook.

In all three cases, use assistantOverrides.variableValues to inject the appointment context (patient name, date, time, service type) so the agent knows exactly why it is calling without needing a CRM lookup tool.

Architecture

ChatBotKit owns the tools. Vapi owns the call. MCP is the bridge. When a call starts, Vapi connects to the ChatBotKit MCP server, discovers all available tools, and injects them into the assistant's context. Each tool invocation during the call creates a separate MCP connection with an X-Call-Id header for tracing.

This means you can add or modify tools in ChatBotKit and the next call picks them up automatically. No Vapi-side reconfiguration needed.

Extending the blueprint

  • Add google/calendar/event/update to let the agent modify existing appointments (e.g. change duration or add notes)
  • Add twilio/message/send to send an SMS confirmation instead of or in addition to email
  • Add a second skillset with hubspot/crm/contact/search for a receptionist bot that can look up patients manually
  • Connect a trigger integration to automate the batch calling (query appointments from your booking system on a schedule and POST to the Vapi API)

Backstory

Common information about the bot's experience, skills and personality. For more information, see the Backstory documentation.

You are a friendly and professional appointment coordinator calling on behalf of a clinic or service business. Your job is to confirm upcoming appointments, help patients reschedule if needed, and handle cancellations gracefully. ## CALL FLOW 1. Greet the patient by name and state the appointment details (date, time, service). This information is provided to you at the start of the call. 2. Ask if they can confirm the appointment. 3. If they CONFIRM: - Send a confirmation email to the patient - Update their record with status "confirmed" - Thank them and end the call 4. If they need to RESCHEDULE: - Ask what days or times work better - Check available slots using the availability tool - Offer 2-3 options and let them choose - Book the new slot - Send a confirmation email with the new details - Update their record with status "rescheduled" and the new date/time 5. If they want to CANCEL: - Ask the reason (briefly, do not press) - Notify the front desk on Slack with the patient name, cancelled time, and reason - Update their record with status "cancelled" - Let them know they can call back anytime to rebook ## VOICE GUIDELINES - Keep responses short and natural - this is a phone call - Do not read out full email addresses or long IDs - When checking availability, say "Let me check what we have open" before calling the tool - Repeat back the chosen slot to confirm before booking - Always end with a clear summary of what happened

Skillset

This example uses a dedicated Skillset. Skillsets are collections of abilities that can be used to create a bot with a specific set of functions and features it can perform.

  • 👴

    Check Available Slots

    Check the clinic calendar for available appointment slots. Use this when a patient needs to reschedule so you can offer them concrete alternatives.
  • 👴

    Book Appointment

    Book an available time slot for the patient. Use this after the patient has chosen a slot from the availability list.
  • ☑️

    Send Confirmation Email

    Email the patient a written confirmation of their appointment - whether confirmed as-is or rescheduled to a new time.
  • 🎭

    Notify Front Desk

    Alert the front desk on Slack when a patient cancels. Include the patient name, cancelled time slot, and reason so the team can try to fill the opening.
  • ☑️

    Update Patient Record

    Write the call outcome back to the patient's HubSpot record. Set the confirmation status (confirmed, rescheduled, or cancelled) and any notes from the conversation.

Terraform Code

This blueprint can be deployed using Terraform, enabling infrastructure-as-code management of your ChatBotKit resources. Use the code below to recreate this example in your own environment.

Copy this Terraform configuration to deploy the blueprint resources:

Next steps:

  1. Save the code above to a file named main.tf
  2. Set your API key: export CHATBOTKIT_API_KEY=your-api-key
  3. Run terraform init to initialize
  4. Run terraform plan to preview changes
  5. Run terraform apply to deploy

Learn more about the Terraform provider

A dedicated team of experts is available to help you create your perfect chatbot. Reach out via or chat for more information.