Inspiration
Indian clinics lose 20–40% of booked slots to no-shows and late cancellations. Reminder SMS is a commodity; the money is lost in the gap between "Priya cancelled at 8 PM" and "someone on the waitlist would have taken that slot." No human calls the waitlist at night. SlotSaver does — reminders are the commodity, backfill is the product. The same evening loop fits any appointment business with a waitlist (salons, diagnostic labs, tuition and driving schools), so the addressable impact goes well beyond one dental clinic.
What it does
Every evening, "Asha" phone-calls tomorrow's patients to confirm. Confirmations are logged; no-answers are retried once; reschedules free the slot. The moment someone cancels, Asha calls the waitlist in order until a patient accepts the freed slot — then the morning report shows the clinic exactly how many rupees the agent recovered overnight.
EVENING RUN
- Read tomorrow's appointments + waitlist
- Confirm-call every patient
- confirms → CONFIRMED
- no answer → retry once, then flag NEEDS-ATTENTION
- reschedules → slot freed
- cancels → slot freed
- Freed slot → call the waitlist in order until someone accepts
- Morning report: X confirmed · Y cancelled · Z backfilled · ₹ recovered
How we built it
An AWS Strands Agents SDK agent is the brain: it holds tools (confirm_call, offer_slot, schedule readers) and decides which call to place next. CALL-E is the voice: each call sends a natural-language task plus a JSON result_schema, so the outcome (confirmed / cancelled / reschedule / no-answer) comes back already structured — no transcript parsing. All state changes live inside tools; the LLM sequences calls but cannot edit the schedule directly. A live browser board renders the schedule flipping in real time as calls land. A Cloudflare Worker backed by a KV state machine hosts that board publicly and exposes token-gated endpoints to trigger a real evening run (or a single real call) straight from the browser — rate-limited (60s cooldown, daily cap), with real phone numbers never reaching the client — so the demo is something a judge can actually exercise, not just watch on video.
Challenges we ran into
Real Indian telephony was the hard part: one carrier rejected VoIP-originated calls at the network level (SIP 480 before ringing), which we diagnosed via CALL-E's per-attempt failure codes. Idempotency keys dedupe server-side forever, so retry keys must be unique per run — and we learned to word call tasks carefully after an early prompt taught the bot to press DTMF keys on itself. We also had to explicitly design for a call reaching the wrong person or returning an unusable result: those cases stop the run and flag NEEDS-ATTENTION for a human to reconcile — never silently treated as a plain no-answer, and never allowed to trigger a real cancellation or backfill on their own.
Accomplishments that we're proud of
The full loop runs on real phone calls: a real confirmation, a real cancellation, and a real waitlist backfill, with the board updating live and ₹800 recovered on camera. Everything is also rehearsable end-to-end on a zero-cost mock — same cast, same call order — so the demo you see is exactly what the code does.
What we learned
Voice agents live or die on prompt wording ("never press more than once" taught the bot to press keys); structured result_schema beats transcript parsing; and idempotency keys are a feature and a trap.
What's next for SlotSaver
Reading real clinic sheets (Google Sheets / Practo export), multilingual calls via CALL-E locales, and morning-report delivery on WhatsApp.
Built With
- aws-strands-agents
- call-e
- cloudflare-workers
- groq
- html
- javascript
- python
Log in or sign up for Devpost to join the conversation.