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.

T−24 hoursPOST /v1/messages

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.”

on replymessage.received

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.

T−3 hoursPOST /v1/calls/{id}/gather

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.

on keypresscall.gather

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.

reminder.ts
// 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
press-one.ts
// 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 works

Consent 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 works

One prevented no-show pays for the month.

Appointment-based verticals see the fastest payback of any Handset use case. Tell us about your scheduler.