ChanlChanl
Side Hustle

A Dental Receptionist That Works Nights and Weekends

Build an AI receptionist for dental clinics that answers insurance questions, books appointments, and captures after-hours leads. Five clients pay $1,500/month.

DGDean GroverCo-founderFollow
March 27, 2026
14 min read
Warm illustration of a friendly AI assistant at a dental clinic front desk, answering calls while the office is dark and empty at night

Maria has been Dr. Patel's receptionist for eleven years. She knows every patient by name, remembers who's terrified of needles, and can schedule a root canal while simultaneously calming down a parent whose kid just chipped a tooth on the playground. She's irreplaceable.

She also spends four hours every day answering the same ten questions.

"Do you accept Delta Dental?" Yes. "How much is a cleaning without insurance?" $175 for adults, $125 for kids. "Do you have anything available this week?" Let me check. "Where are you located?" Corner of Main and 4th, across from the library.

Forty to sixty calls a day. Half of them are these repeat questions. Maria answers each one patiently because she's a professional, but those four hours are four hours she's not spending on the work that actually requires her eleven years of experience: handling complicated insurance pre-authorizations, calming anxious patients, coordinating multi-visit treatment plans.

And then there's the problem that keeps Dr. Patel up at night. When the office closes at 5 PM, the phone goes to voicemail. New patient inquiries that come in at 7 PM, or Saturday morning, or Sunday afternoon? Those potential patients hear a recording, hang up, and call the next dentist on Google. By Monday morning, they've already booked somewhere else.

Dr. Patel doesn't need to replace Maria. She needs a second receptionist. One that works nights, weekends, and holidays. One that answers insurance questions at 11 PM and books appointments at 6 AM. One that costs $350 a month instead of $3,500.

That's what you're going to build.

Why dental practices are the perfect first client

There are 200,000 dental practices in the United States. Most have one or two receptionists handling everything: phones, scheduling, insurance verification, patient check-in. The dental industry spent over $3 billion on practice management software in 2025, and almost none of it answers the phone.

The pitch to a dental practice is simple: your receptionist is too expensive to answer "do you take Cigna?" for the 40th time this week. Your after-hours calls are turning into someone else's patients. Here's an AI that handles both, for less than the cost of one day of temp staffing per month.

This isn't a theoretical business. It's a productizable service with clear unit economics:

Setup fee: $500 (one-time, covers knowledge base creation and tool configuration) Monthly fee: $300-400 (ongoing management, updates, API costs) Your API cost: ~$30-40/month per client Time to set up first client: One weekend Time for subsequent clients: 4-6 hours (you'll template everything)

Five dental clients at $350/month is $1,750/month in recurring revenue with $150-200 in API costs. That's $1,550 in monthly profit from a side project.

And dental practices are the perfect first client. They cluster geographically (every strip mall has one), they all have the same problem, and one happy dentist refers you to three more at their next study club meeting.

Step 1: Turn the fee schedule into a knowledge base

Every dental practice has a fee schedule. It's usually a PDF or spreadsheet listing every procedure code with the practice's fee, the typical insurance reimbursement, and the patient's estimated out-of-pocket cost. Maria has it memorized. Your agent needs it in a knowledge base.

Here's the structure. A dental fee schedule has three layers: the procedure itself, what insurance typically covers, and what the patient pays. The agent needs all three to answer the questions patients actually ask.

typescript
import { Chanl } from '@chanl/sdk'
 
const chanl = new Chanl({ apiKey: process.env.CHANL_API_KEY })

The fee schedule PDF goes in first. Most practices will email you this directly, or you can photograph it from the binder at the front desk.

typescript
// Upload the fee schedule PDF
import { readFileSync } from 'fs'
 
const pdf = readFileSync('./patel-fee-schedule-2026.pdf')
await chanl.knowledge.createFromFile(pdf, 'patel-fee-schedule-2026.pdf', {
  title: "Patel Family Dentistry - Fee Schedule",
  metadata: { category: 'fee-schedule' }
})

PDFs are a start, but structured data answers questions better. For the most common procedures, add explicit entries that map the way patients ask to the way dentists bill.

typescript
// Add structured entries for the top 15 procedures patients ask about
const commonProcedures = [
  {
    title: "Adult Cleaning - D1110",
    content: `Adult cleaning (prophylaxis, code D1110): $175 without insurance.
      With Delta Dental PPO: $0-25 copay (covered as preventive).
      With Cigna DPPO: $0-30 copay.
      With Aetna DMO: $20 copay.
      Without insurance: $175, or $150 with our membership plan.
      Recommended every 6 months. Takes about 45-60 minutes.
      Includes exam with Dr. Patel on your first visit.`,
    metadata: { category: 'preventive' }
  },
  {
    title: "Porcelain Crown - D2740",
    content: `Porcelain crown (code D2740): $1,200 without insurance.
      With Delta Dental PPO: typically $400-600 out of pocket after 50% coverage.
      With Cigna DPPO: typically $350-550 out of pocket.
      Requires two visits: prep and impression (60-90 min), then seating (30-45 min).
      We also offer same-day CEREC crowns for $1,350.`,
    metadata: { category: 'restorative' }
  },
  {
    title: "Emergency Exam - D0140",
    content: `Emergency exam (code D0140): $95 without insurance.
      Most insurance plans cover emergency exams at 80-100%.
      X-rays (D0220) additional $35-55 if needed.
      Same-day appointments available for dental emergencies.
      Call us or book online - we reserve emergency slots daily.
      If you're in severe pain, we'll fit you in today.`,
    metadata: { category: 'emergency' }
  }
]
 
for (const entry of commonProcedures) {
  await chanl.knowledge.create({ source: 'text', ...entry })
}

Then add the insurance and policy information. This is where half of Maria's repeat calls come from.

typescript
// Accepted insurance plans
await chanl.knowledge.create({
  title: "Accepted Insurance Plans",
  source: 'text',
  content: `Accepted insurance plans at Patel Family Dentistry:
    PPO plans (in-network): Delta Dental PPO, Cigna DPPO, Aetna DMO,
    MetLife PDP, Guardian, United Healthcare, BlueCross BlueShield,
    Humana, Principal, Ameritas.
    We accept most PPO plans even if not listed - call to verify.
    HMO plans: We are NOT an HMO provider.
    Medicaid/CHIP: Accepted for patients under 18 only.
    No insurance: We offer a membership plan at $299/year that includes
    2 cleanings, 2 exams, all necessary x-rays, and 20% off other procedures.`,
  metadata: { category: 'accepted-plans' }
})
 
// Office policies
await chanl.knowledge.create({
  title: "Office Policies and Location",
  source: 'text',
  content: `Office hours: Monday-Thursday 8am-5pm, Friday 8am-2pm.
    Closed Saturday and Sunday.
    Location: 1247 Main Street, Suite 200, Springfield.
    Cross streets: Main and 4th, across from Springfield Public Library.
    Parking: Free lot behind the building, enter from 4th Street.
    New patient process: arrive 15 minutes early to complete paperwork,
    or fill out forms online at our website before your visit.
    Cancellation policy: 24-hour notice required, $50 fee for no-shows.
    Payment: We accept cash, all major credit cards, and CareCredit financing.`,
  metadata: { category: 'office-info' }
})

Now test it. When a patient asks "do you take Cigna?", the agent should find the answer without Maria touching the phone.

typescript
// Test the knowledge base
const result = await chanl.knowledge.search({
  query: "do you accept Cigna insurance"
})
// Returns the accepted plans entry with Cigna DPPO highlighted

The knowledge base handles the information layer. The agent can now answer every question that Maria answers from memory. But answering questions isn't enough. The patient who calls at 7 PM asking about cleanings wants to book one.

Step 2: Build the booking tool

Dental appointments aren't generic calendar slots. A cleaning is 45 minutes with a hygienist. A crown prep is 90 minutes with the dentist. An emergency exam is 30 minutes, and the practice reserves two of those per day. The booking tool needs to understand this mapping.

typescript
// Create the appointment booking tool
const bookingTool = await chanl.tools.create({
  name: "book_appointment",
  description: `Book a dental appointment. Maps patient needs to appointment types:
    - "cleaning" or "checkup" → 45 min hygienist appointment
    - "toothache", "pain", "emergency" → 30 min emergency exam with dentist
    - "crown", "filling", "cavity" → 60 min restorative with dentist
    - "whitening", "cosmetic" → 60 min cosmetic consultation
    - "new patient" → 75 min new patient exam (includes x-rays and cleaning)`,
  type: "http",
  inputSchema: {
    type: "object",
    properties: {
      patientName: {
        type: "string",
        description: "Patient's full name"
      },
      patientPhone: {
        type: "string",
        description: "Patient's phone number for confirmation"
      },
      appointmentType: {
        type: "string",
        enum: ["cleaning", "emergency", "restorative", "cosmetic", "new-patient"],
        description: "Type of appointment based on patient's described need"
      },
      preferredDate: {
        type: "string",
        description: "Patient's preferred date, ISO format"
      },
      preferredTime: {
        type: "string",
        enum: ["morning", "afternoon", "no-preference"],
        description: "Morning (8-12) or afternoon (12-5) preference"
      },
      notes: {
        type: "string",
        description: "Any special notes: anxiety, accessibility needs, interpreter needed"
      }
    },
    required: ["patientName", "patientPhone", "appointmentType"]
  },
  configuration: {
    http: {
      method: "POST",
      url: "https://your-api.com/appointments/check-and-book",
      headers: {
        "Authorization": "Bearer {{DENTAL_PMS_API_KEY}}"
      }
    }
  }
})

The tool's execution endpoint is where you connect to the actual practice management system. For smaller practices, this might be the Google Calendar API. For larger ones, Dentrix and Open Dental both have APIs. The mapping logic lives in your middleware.

Here's what happens in the conversation. A patient says "I've had a toothache for two days, can I come in tomorrow?" The agent recognizes this as an emergency appointment, checks availability for tomorrow, and offers specific time slots. No hold music. No "let me transfer you." The patient gets an answer in twelve seconds instead of four minutes.

The key insight for dental specifically: appointment type detection matters more than in most industries. A patient who says "something is loose" could need a crown re-cement (15 minutes, low urgency) or have a failing implant (60 minutes, high urgency). When in doubt, the agent should book an exam and let the dentist triage in person. Build that logic into the tool description so the LLM defaults to caution.

Step 3: Remember the patient

A first-time caller says "I have Delta Dental, I'm looking for a cleaning for me and my two kids." The agent answers their questions and books the appointments. Three months later, they call back. If the agent asks "what insurance do you have?" again, the experience feels like talking to a machine.

Patient memory makes the difference between an automated phone tree and an AI receptionist. And the best part: it's automatic. You don't write code to store patient preferences. The agent handles the entire lifecycle on its own.

When a call starts, the agent auto-loads any stored memories for the caller, matched by phone number or customer ID, and injects them into the LLM context. If Sarah has called before, the agent already knows she has Delta Dental, prefers morning appointments, and has two kids.

During the call, the agent has a memory_add tool available. If Sarah mentions something new ("We switched to Cigna this year" or "My youngest is terrified of the drill"), the agent stores it in real-time without interrupting the conversation.

When the call ends, fact extraction runs automatically on the full transcript. An LLM reads the entire conversation and pulls out structured facts: insurance provider, preferred appointment times, family members, dental anxiety, and anything else worth remembering. Those facts are saved to Sarah's memory profile with no manual intervention.

Here's what that looks like across two calls:

text
FIRST CALL (new patient, no memory loaded):
 
  Patient: "Hi, I need to schedule cleanings for me and my two kids.
            We have Delta Dental. Mornings work best for us."
  Agent:   Books appointments, answers insurance questions from KB.
 
  → After call, automatic extraction saves:
    - Insurance: Delta Dental PPO
    - Family: two children (ages 8 and 11)
    - Scheduling preference: mornings
    - Asked about sealants for the 8-year-old
 
SECOND CALL (memory auto-loaded):
 
  Agent:   "Hi Sarah, I see you're with Delta Dental. Last time you
            came in for cleanings with your kids. Would you like to
            schedule the six-month follow-up? And you'd mentioned
            sealants for your youngest — want to add that too?"

That second call is the moment when a dental practice realizes this isn't a chatbot. It's a receptionist with perfect recall.

If Dr. Patel has existing patient preferences in Dentrix or Open Dental (appointment time preferences, insurance on file, family groupings), you can seed the memory before launch with a bulk import script. The agent starts day one already knowing the regulars.

Memory stores scheduling preferences, contact info, insurance plans, and conversational context. It does not store protected health information. Diagnoses, treatment notes, medications, and clinical records stay in the practice management system where they belong. See the HIPAA section below for the boundaries.

Step 4: Send pre-visit intake and reminders

Booking the appointment is half the value. The other half is what happens between booking and the actual visit. Every dental practice loses revenue to no-shows. Industry averages put no-show rates at 10-15%, and every missed appointment is 30-90 minutes of dead time for the provider.

Build two tools: one that sends pre-visit intake, and one that sends reminders.

typescript
// Pre-visit intake tool: sends after booking confirmation
const intakeTool = await chanl.tools.create({
  name: "send_intake_form",
  description: `Send pre-visit intake form to new patients after booking.
    Includes: insurance card upload, medical history questionnaire,
    emergency contact, and consent forms.
    Only send to first-time patients or patients not seen in 12+ months.`,
  type: "http",
  inputSchema: {
    type: "object",
    properties: {
      patientPhone: {
        type: "string",
        description: "Patient's phone number"
      },
      patientEmail: {
        type: "string",
        description: "Patient's email (optional, prefer text)"
      },
      appointmentDate: {
        type: "string",
        description: "Scheduled appointment date"
      },
      isNewPatient: {
        type: "boolean",
        description: "Whether this is a new patient"
      }
    },
    required: ["patientPhone", "appointmentDate", "isNewPatient"]
  },
  configuration: {
    http: {
      method: "POST",
      url: "https://your-api.com/intake/send",
      headers: {
        "Authorization": "Bearer {{DENTAL_PMS_API_KEY}}"
      }
    }
  }
})
 
// Reminder tool: triggered 48h and 2h before appointment
const reminderTool = await chanl.tools.create({
  name: "send_appointment_reminder",
  description: `Send appointment reminder via text message.
    48-hour reminder: includes date, time, location, what to bring.
    2-hour reminder: shorter, just time and address.
    If patient hasn't confirmed after 48h reminder, agent follows up
    with a call or second text asking to confirm or reschedule.`,
  type: "http",
  inputSchema: {
    type: "object",
    properties: {
      patientPhone: { type: "string" },
      patientName: { type: "string" },
      appointmentDate: { type: "string" },
      appointmentTime: { type: "string" },
      reminderType: {
        type: "string",
        enum: ["48-hour", "2-hour", "follow-up"]
      }
    },
    required: ["patientPhone", "patientName", "appointmentDate", "reminderType"]
  },
  configuration: {
    http: {
      method: "POST",
      url: "https://your-api.com/reminders/send",
      headers: {
        "Authorization": "Bearer {{DENTAL_PMS_API_KEY}}"
      }
    }
  }
})

The reminder system is where practices see the clearest ROI. A practice with 20 appointments per day and a 12% no-show rate loses 2-3 slots daily. Even cutting that rate in half recovers 5-7 appointments per week. At an average production of $250-400 per appointment, that's $1,250-2,800 in recovered weekly revenue. For a $350/month service.

That's the number you put in your sales pitch.

Step 5: Wire it all together

Now connect the knowledge base, the booking tool, the intake tool, and the reminder tool to a single agent. This is the receptionist.

typescript
const agent = await chanl.agents.create({
  platform: "custom",
  name: "Patel Family Dentistry Receptionist",
  useCase: "booking",
  configuration: {
    prompt: `You are the virtual receptionist for Patel Family Dentistry.
 
    Your personality: warm, professional, and efficient. You sound like a
    friendly dental office receptionist, not a robot. Use the patient's name
    when you know it. Be reassuring if someone mentions pain or anxiety.
 
    What you handle:
    1. Answer questions about services, pricing, insurance, office hours,
       and location using the knowledge base.
    2. Book appointments by understanding what the patient needs and mapping
       it to the right appointment type and duration.
    3. Send pre-visit intake forms to new patients after booking.
    4. Remember returning patients and reference their history.
 
    What you escalate to the office:
    - Billing disputes or complex insurance pre-authorization
    - Medical advice ("is this an emergency?")
    - Prescription questions
    - Complaints about care
 
    When in doubt about appointment type, book a general exam and note the
    patient's symptoms so Dr. Patel can review before the visit.
 
    Always confirm: patient name, phone number, preferred date/time.
    Always mention: cancellation policy (24h notice) and arrival time
    (15 min early for new patients).`
  }
})
 
// Connect tools and knowledge to the agent via the dashboard,
// or add them to a toolset and assign it to the agent

Your voice platform (VAPI, Retell, Bland, or any provider that supports MCP) connects to Chanl's MCP endpoint. This is how the agent gets access to the knowledge base, booking tools, and patient memory at runtime:

text
MCP Endpoint: https://{workspace}.chanl.dev/mcp
 
Your voice platform connects here. During each call, the agent:
  1. Auto-loads patient memory (by caller phone number)
  2. Searches the knowledge base for answers
  3. Calls booking/intake/reminder tools
  4. Stores new facts via memory_add
  5. Runs automatic fact extraction after the call ends

Test it with a realistic conversation. Not "book an appointment" but the way real patients actually talk.

typescript
const session = await chanl.chat.createSession(agent.id)
 
// Simulate a real patient call
const response = await chanl.chat.sendMessage(session.data.sessionId,
  "Hi, my son fell off his bike and his front tooth is loose. " +
  "He's 9. We've never been to your office before. " +
  "Do you take MetLife and can we come in today?"
)

The agent needs to handle three things in that single message: confirm MetLife is accepted (knowledge base), identify this as an emergency/urgent appointment (tool logic), and note that this is a new pediatric patient (memory + intake flow). A good agent does all three without asking the caller to repeat anything.

Test it before the first client sees it

Before you charge anyone $500 for setup, make sure the agent handles the conversations that actually happen in a dental office. Use scenarios to simulate the ten most common call types:

  1. Insurance verification ("Do you take [plan]?")
  2. Price inquiry without insurance
  3. New patient wanting to schedule
  4. Existing patient calling back
  5. Emergency/pain call
  6. Cancellation or reschedule
  7. After-hours call
  8. Non-English speaker (if the practice serves multilingual patients)
  9. Complex question that should escalate to staff
  10. Caller asking for medical advice (agent should not provide it)

Run each scenario ten times. Check that the agent gives consistent, accurate answers. Check that bookings land on the right appointment type. Check that the escalation paths actually escalate. Your monitoring dashboard will show you where conversations go off the rails.

The scenario where the agent handles an anxious parent calling about a child's dental emergency is the one that sells the practice. If the agent responds with warmth, books the appointment quickly, and texts the intake form before the parent even hangs up, Dr. Patel will sign the contract on the spot.

The HIPAA question

Any system handling patient health information in a dental practice needs to comply with HIPAA. Here's the practical reality for what you're building.

The FAQ and booking portions of the agent handle minimal protected health information. Answering "do you take Delta Dental?" involves zero PHI. Booking an appointment with a name and phone number is standard business contact information.

Where it gets real: intake forms that collect medical history, insurance ID numbers, and treatment notes. If your agent collects or stores this data, you need HIPAA-compliant infrastructure. That means a Business Associate Agreement (BAA) with your cloud provider, encrypted storage for conversation logs that contain health information, and access controls that limit who can see patient data. Don't store medical history details in general-purpose memory. Use a HIPAA-covered database with proper access controls, and keep your agent's memory focused on scheduling preferences and contact information rather than clinical details.

This isn't a blocker. It's a boundary. Structure the agent so that the high-volume work (FAQs, scheduling, reminders) stays clean, and route anything involving clinical information to the practice's existing HIPAA-compliant systems.

The business model

Here's the math for both sides.

For the dental practice (Dr. Patel's ROI):

Cost/BenefitMonthly
AI receptionist service-$350
Receptionist time recovered (4 hrs/day at $28/hr)+$2,240
After-hours leads captured (3 new patients at $400 avg first visit)+$1,200
Reduced no-shows (5 recovered appointments/week at $300 avg)+$6,000
Net monthly value+$9,090

Even if you discount the no-show recovery by half and the new patient capture by two-thirds, the practice is still up $3,000/month on a $350 investment. This sells itself.

For you (the developer):

MetricValue
Monthly revenue per client$350
Monthly API cost per client~$35
Monthly profit per client~$315
Clients needed for $1,500/mo side income5
Setup time (first client)1 weekend
Setup time (subsequent clients)4-6 hours
Annual recurring revenue at 10 clients$42,000

Your first client is the hardest. You're building the templates, learning the dental vocabulary, figuring out the PMS integration. Your second client takes a quarter of the time because you already have the knowledge base structure, the tool configurations, and the conversation flows. By client five, you're spending more time on sales than on setup.

Finding your first dental client

Cold calling dentists is a terrible strategy. Here's what works.

Start with your own dentist. You're already a patient. You've already experienced their scheduling process. Walk in for your next cleaning and say: "I build AI phone systems. I noticed your office gets a lot of repeat calls about insurance and pricing. I built something that handles those automatically and books appointments 24/7. Can I show your office manager a demo?"

Local dental Facebook groups and study clubs. Dentists are social within their profession. Most cities have dental study clubs that meet monthly. One demo at a study club meeting puts you in front of 20-30 practice owners.

The "free pilot" close. Offer your first client a free 30-day pilot. Set it up on a separate phone number so it doesn't disrupt their existing workflow. Track every call the AI handles, every appointment it books, every after-hours lead it captures. At the end of 30 days, show them the numbers. The conversion rate from free pilot to paid client in this model is extremely high because the data speaks for itself.

Referral pricing. Once you have one happy client, offer them one month free for every referral that signs up. Dentists know other dentists. One client becomes three in a quarter.

Scaling past five clients

At five clients, you're making $1,550/month in profit working maybe 5 hours per month on maintenance. At this point, you have a choice: stay at five and keep it as passive income, or scale.

Scaling in dental is straightforward because every practice has the same basic setup. The knowledge base structure is identical. The tools are identical. The only differences are fee schedules, accepted insurance lists, and office hours. You can template 90% of the work and customize the remaining 10% in under an hour.

The natural expansion: each practice also needs post-treatment follow-up ("How's your tooth feeling after the extraction?"), recall reminders ("You're due for your six-month cleaning"), and treatment plan follow-up ("Dr. Patel recommended a crown on tooth #14. Would you like to schedule that?"). Each of these is an upsell.

At 15-20 clients, you're clearing $5,000-6,000/month and spending maybe 15 hours per month on the business. That's a side hustle that pays better than most full-time junior developer positions. And once you have the dental template dialed in, the same architecture works for restaurants, HVAC companies, auto repair shops, and other local service businesses.

What you've built

Start to finish, the dental AI receptionist has four components:

  1. A knowledge base built from the practice's fee schedule, insurance list, and office policies. Patients get instant, accurate answers to the questions that eat up half of Maria's day.

  2. A booking tool that maps patient descriptions to appointment types and durations, checks availability, and books directly into the practice management system. Works at midnight, works on Sunday, works on Christmas.

  3. Patient memory that stores preferences and context so returning patients get recognized, not interrogated. The agent that remembers your insurance plan is the agent you don't want to replace.

  4. Intake and reminder tools that handle the post-booking workflow. Pre-visit forms go out automatically. Reminders go out at 48 hours and 2 hours. No-show rates drop. Revenue recovers.

Maria still works the front desk. She still calms nervous patients and handles complex insurance negotiations and greets everyone by name. She just doesn't spend four hours a day answering "do you take Delta Dental?" anymore.

And when the phone rings at 8 PM on a Tuesday, someone answers.

Build a Dental Receptionist Agent This Weekend

Fee schedule as knowledge base. Booking as a tool. Insurance answers in seconds, appointments booked automatically.

Start Building
DG

Co-founder

Building the platform for AI agents at Chanl — tools, testing, and observability for customer experience.

Learn Agentic AI

One lesson a week — practical techniques for building, testing, and shipping AI agents. From prompt engineering to production monitoring. Learn by doing.

500+ engineers subscribed

Frequently Asked Questions