Every dental clinic in India bleeds money to no-shows. A missed appointment isn'tjust an empty chair — it's ₹800–3,500 gone and a patient who needed care. Thefront desk should spend every morning calling the next day's list, but humanshate this job, and scripted phone bots break the moment a patient says"actually, Tuesday is tough for me."
CALL-E's goal-driven phone agents change that equation: an agent that plans acall, talks naturally, adapts mid-conversation, and returns structured results.We asked one question: what if every clinic could afford a front desk thatnever sleeps? SlotBack is that front desk.
🦷 What it does SlotBack runs a closed recovery loop with three automated flows:
Flow A — Morning confirmation wave: the agent calls every booked patient,confirms attendance, and captures a schema-validated outcome with acompletion-confidence score. Flow B — Auto-reschedule: hesitant patients (confidence < 0.70, orhedged language) get a second call that offers real open slots; acceptingone frees the old slot instantly. Flow C — Waitlist backfill: the moment a slot is freed, waitlistedpatients are called to backfill it — the chair is never empty. Plus: a patient-facing concierge site (/book) where visitors self-book,request an agent callback, or join the waitlist; a Calls tab for manual 1:1and batch CALL-E dialing; and a dashboard that converts all of it intorecovered-₹ metrics:
Recovered ₹=salvaged appointments∑price Everything is fail-closed: dispositions outside the schema or confidencebelow the threshold escalate to a human — never auto-confirmed. A killswitch halts all outbound calls instantly, and every action lands in anaudit log.
🏗 How we built it Next.js + TypeScript + Tailwind — a full multi-tab application: Today(live command center with streaming transcripts), Patients (CRM), Calls(manual dialer + batch), Flows (live A/B/C status). CALL-E Developer API — POST /v1/calls with task, recipients, regionIN, locales (en-IN/hi-IN/ta-IN), recipient_result_schema, webhook_urland Idempotency-Key; GET /v1/calls/{id} for transcripts, evidence andcompletion confidence; a webhook receiver plus a polling reconciler as asecond path. A provider abstraction (fixture ⇄ live) makes the entireproduct testable at zero credits. Prisma + SQLite engine — wave runner, call state machine, booking,native .xlsx import (SheetJS), audit trail. LLM chain (Gemini → platform SDK → deterministic fallbacks) powers the/book concierge and AI wave summaries — it never throws, degraded modesstill answer. Fail-closed result parsing — anything outside the schema becomesunknown and gets escalated, never guessed.
🧗 Challenges we ran into Trust-worthy automation: we refused to auto-confirm anything doubtful.Building the confidence-threshold + fail-closed state machine took realdesign iterations. Dual completion paths: webhooks can be missed, so we built a reconcilerthat polls CALL-E for terminal states — restart-safe idempotency included. The midnight bug: free slots seeded at fixed times went stale afterdark, quietly killing reschedule offers and backfill. Fixed by rollingslots forward — a lesson in time-aware test data. Zero-credit demos: a fixture provider replays realistic calls so judgessee the full product without burning the 20-call free tier; flipping tolive mode is literally one paste of an API key.
🏆 Accomplishments we're proud of The complete loop works end-to-end: wave → live transcript →disposition → reschedule → backfill → recovered ₹ on the dashboard. Manual control where it matters: a real dialer where staff can call onepatient or batch-call selected patients via CALL-E. Production-ready, not a demo toy: production mode (empty clinic,clinic setup UI), native Excel import, kill switch, audit logs.
📚 What we learned Schema-first AI integration (recipient_result_schema) is what makesvoice agents usable in business — the transcript is a story, thestructured result is the product. Fail-closed design is a feature you sell, not a limitation you hide. Provider abstraction (dry ⇄ live) pays for itself the first day.
⏭ What's next Auto-scheduled morning waves (cron), WhatsApp confirmations alongside calls,multi-tenant support for clinic chains, and native CALL-E batch recipientsfor very large rosters.
Built With
- call-e-api
- gemini
- next.js
- prisma
- react
- server-sent-events
- shadcn/ui
- sheetjs
- sqlite
- tailwind-css
- typescript
- zod
Log in or sign up for Devpost to join the conversation.