Use cases · Appointments & healthcare
Fewer no-shows, without another unknown number
Dental practices, clinics, salons, and studios run on the appointment book. Handset gives your scheduling product per-practice numbers that remind, confirm by reply or keypress, and take after-hours voicemail with transcripts, all inside your UI.
Bayview Dental+1 415 259 5084
Hi Maria, reminder: cleaning tomorrow at 9:30 AM. Reply C to confirm.
C, see you then!
conversation cnv_01kzv9… · delivered
10–20%
of appointments no-show when reminders are one-way or come from a number nobody recognizes
1 chair-hour
is what a single no-show costs a practice, usually more than a month of Handset usage
2 channels
text first, call second, so the confirmation reaches the patient however they actually answer
The reminder ladder
Text first. Call if they don't answer. One webhook either way.
The ladder escalates by channel, not by nagging. Your scheduler owns the timing; Handset owns the delivery, the keypress, and the compliance underneath.
The reminder goes out
From the practice's own number, the one on the appointment card, the one patients already have saved. “Reply C to confirm, R to reschedule.”
The reply is the confirmation
A “C” arrives on your webhook; your scheduler flips the appointment to confirmed. An “R” opens your reschedule flow in the same thread.
No reply? The phone rings
A gather call speaks the reminder and asks for a keypress: press 1 to confirm, 2 to reschedule. Some patients answer calls, not texts, and the ladder covers both.
The keypress lands on the same webhook
call.gather delivers the digits with a reason: completed, timeout, or hangup. Your scheduler doesn't care which channel answered; the appointment is confirmed either way.
// Rung one: the text await sendMessage({ body: { from: practice.numberId, to: patient.phone, body: "Bayview Dental: cleaning tomorrow 9:30 AM. Reply C to confirm, R to reschedule.", }, }); → message.received "C" // confirmed
// Rung two: for patients who answer calls await gather(call.id, { body: { prompt: "Cleaning tomorrow at 9:30 AM. Press 1 to confirm, 2 to reschedule.", max_digits: 1, }, }); → call.gather { digits: "1", reason: "completed" }
The 9pm call still gets answered
After hours, the practice's number rolls to voicemail with a greeting you set per practice. The recording arrives transcribed on voicemail.created: a toothache at 9pm is a booked emergency slot at 8am, sitting in your product's inbox before the front desk sits down.
How voice routing worksConsent is a platform problem. So it's ours.
STOP and HELP keywords answer themselves, opt-outs are enforced at send time, and 10DLC registration is an API object with approval webhooks. Your customers run a practice; they never have to learn what a campaign is.
How compliance worksOne prevented no-show pays for the month.
Appointment-based verticals see the fastest payback of any Handset use case. Tell us about your scheduler.