Dental Clinic · Custom Software & AI Voice Agent

DentaClinic

A Dental Practice Portal With an AI Receptionist That Books Appointments on the Phone

A multi-clinic dental practice portal. One login gives clinic staff appointments, doctors, patients, call logs and staff access, while Sarah, a self-hosted AI phone receptionist, answers calls and books, reschedules or cancels appointments in the same calendar.

DentaClinic patient call logs screen
Client

Multi-clinic dental practice

Industry

Healthcare · Dental

Services

Product Design, Full-Stack Web Development, AI Voice Agent, Database Engineering & Cloud Deployment

Platform

React 19, Node.js, SQL Server, self-hosted LiveKit

Project Overview

Never Miss a Patient Call Again

Dental clinics run on the appointment book. Every missed call can mean a lost patient, and front desk teams are often helping someone in the chair when the phone rings. The clinic also needed one place to manage doctors' shifts and rooms, treatments, patient history and staff access, so it could stop working across spreadsheets and separate tools.

360Techsys delivered a complete platform in three parts: a React web portal for clinic staff; a Node.js API on Microsoft SQL Server, where every read goes through a view and every write goes through a stored procedure; and an AI voice agent built on a self-hosted LiveKit server. The agent and the portal call the same booking API, so a booking made on the phone appears in the portal calendar straight away, along with a summary of the call.

The AI receptionist taking a booking, the resulting call log, the dashboard, the calendar and the role matrix.

Results at a Glance

24/7

AI receptionist answers inbound calls and books, reschedules or cancels appointments without staff involvement

6

Agent tools: check_availability, book_appointment, reschedule_appointment, cancel_appointment, transfer_to_staff, end_call

14+

Modules: dashboard, booking, calendar, doctor schedules, patients, visit history, call logs, AI and calendar configuration, user management, settings and support

5

System roles (Administrator, Senior Dentist, Junior Dentist, Receptionist, Dental Nurse) plus custom roles with per-module view and edit permissions

10 / 32

SQL views and stored procedures: no queries are written directly against the base tables

1 → Many

One agent worker and one API serve every clinic, each with its own prompt, voice, phone number and booking rules

These figures describe the delivered software, not measured clinic outcomes. All portal screenshots use demo clinic data; no real patient information is shown.

The Challenge

Calls to a dental clinic peak at the same times the clinic is busiest: early morning, lunchtime and after school hours. Off-the-shelf booking widgets did not cover phone patients. Hosted voice-AI platforms charged for every minute and left the clinic little control over voice, language or data. Staff also needed different levels of access: a receptionist should not change clinic settings, and a junior dentist needs their own schedule but not the whole practice's records.

The goal was a single platform with three properties. Phone bookings and front-desk bookings had to land in the same calendar, under the same rules. Each staff member should see only the modules their role allows. And the clinic had to own the full stack, including the voice infrastructure.

Solution Approach

How We Built It

A voice agent, a staff portal and a locked-down data layer, all sharing one booking API.

01

An AI Receptionist on Self-Hosted LiveKit

The voice agent is written in Python with LiveKit Agents. It uses Deepgram Nova-3 for speech-to-text, Deepgram Aura-2 for natural speech, an OpenRouter LLM (GPT-4o mini by default), Silero voice-activity detection and LiveKit's turn detector, which lets callers interrupt naturally.

Phone numbers connect through LiveKit SIP, so a clinic can bring any carrier's SIP trunk. One worker serves every clinic and loads that clinic's prompt, voice and language for each call. If the backend cannot be reached, the agent falls back to a generic receptionist, so a call is never dropped.

AI Voice Agent configuration: speech-to-text, LLM and text-to-speech pipeline, system prompt, agent functions and in-browser test call.
02

Every Call Summarised and Triaged

When a call ends, the agent posts the transcript, duration and cost to the portal. The call then appears in Call Logs with a written summary, its purpose and a status of Resolved, Follow-up Needed or No Answer, so the front desk can see which phone conversations still need a person.

Patient Call Logs: every AI-handled call is summarised, categorised and marked Resolved or Follow-up Needed.
03

One Portal for the Whole Practice

Built with React 19, TypeScript and Tailwind CSS v4, the portal gives each role a focused workspace:

  • Clinic dashboard: today's appointments, doctors on duty with live room status, urgent call alerts and a real-time activity stream.
  • Scheduling: a booking form that shows live open slots, filters doctors and treatments by department, and creates a booking reference.
  • Calendar and rosters: a monthly planner with one-click complete, reschedule and cancel, and a doctor roster that lets staff change a doctor's status.
  • Patients: a patient directory, an interactive tooth chart and a visit and treatment timeline.
  • AI agent configuration: voice, model and language, system prompt, functions, phone number, post-call data extraction, PII redaction and fallback number, plus an in-browser test call.
  • Doctors and treatments: working hours, appointment gaps, lunch breaks, licences and certifications for each doctor.
Clinic Manager Dashboard: today's KPIs, doctors on duty with live room status, and the real-time clinic activity stream.
04

Role-Based Access Down to the Module

Access control works at the level of each module. Every role has a view permission and an edit permission for each module, an authority level, and a permission matrix in User Management that administrators can edit.

New staff receive a temporary password and must change it at first login. Passwords are hashed with bcrypt, and every login is recorded.

User and Role Management: authority levels and the view/edit permission matrix for each module.
05

A Secure Data Layer

Raw SQL is never run against the base tables. The API reads data through 10 SQL views and writes it through 32 stored procedures, with every input parameterised. This hides the internal schema from the application layer and from error messages, and keeps business rules such as booking windows and double-booking checks in one place inside the database. Endpoints used by the voice agent are protected by a shared agent token, and provisioning endpoints by an admin secret.

06

Deployment and Operations

A GitHub Actions workflow on a self-hosted runner builds the frontend on every push to main and deploys it behind IIS. URL Rewrite sends /api to the Node.js server, so the browser only ever talks to a single origin. PM2 keeps the frontend, the API and the agent running. The LiveKit server and the voice agent run on a Debian VM under Docker and systemd, with Prometheus and Grafana dashboards monitoring the voice infrastructure.

Under the Hood

Technology Stack

Frontend
React 19, TypeScript 5.8, Vite 6, Tailwind CSS v4, Motion, Lucide icons, LiveKit client SDK
Backend API
Node.js, Express 4 (55 REST endpoints), bcrypt, LiveKit Server SDK
Database
Microsoft SQL Server, accessed only through views and stored procedures
AI Voice Agent
Python, LiveKit Agents, Deepgram Nova-3 (STT) and Aura-2 (TTS), OpenRouter (GPT-4o mini), Silero VAD, LiveKit turn detector, optional Cartesia voices
Telephony
Self-hosted LiveKit SFU and LiveKit SIP (inbound trunks and per-clinic dispatch rules)
Infrastructure
Windows Server with IIS and URL Rewrite, PM2, Debian 12 with Docker, systemd and nginx with TLS
DevOps & Monitoring
GitHub Actions (self-hosted runner), Prometheus, Grafana

Key Takeaways

01

Running the voice stack on the clinic's own LiveKit server keeps call data and costs under the clinic's control, and makes it possible to swap the speech or LLM provider later.

02

Because the agent and the portal call the same booking API, a phone booking and a front-desk booking follow exactly the same availability and booking rules.

03

Module-level permissions let one portal serve administrators, dentists, receptionists and nurses without exposing data a role should not see.

04

Keeping all data access in views and stored procedures keeps the schema private and puts validation in one place.

05

Call summaries and follow-up flags show the front desk which phone conversations still need a person.

Want an AI Receptionist for Your Clinic?

Stop losing patients to missed calls. 360Techsys designs and builds practice portals and AI voice agents that work with your calendar, your team and your phone line.