The problem
Four clinics, one phone line each, and a receptionist who could not book and answer at the same time. The group estimated they were losing around a fifth of booking attempts to busy signals.
What I built
- Self-service booking: pick a location, a service, a clinician and a slot, in four screens.
- A real availability engine — clinician schedules, room capacity, service duration and buffers, not a naive calendar.
- A patient portal for upcoming appointments, history and documents.
- Reminders by email and SMS at 48 and 2 hours, with one-tap reschedule.
- A reception view, because the phone does not stop ringing just because there is a website.
Decisions worth explaining
Availability is computed, never stored. Slots are derived from schedules and existing bookings at request time, cached for sixty seconds. Storing slots means two sources of truth and eventually a double booking.
Accessibility was a requirement, not a pass. Keyboard-complete, screen-reader tested, AA contrast throughout. A meaningful share of these patients are over seventy.
Results
- 61% of bookings moved online within four months.
- No-shows down 28% after reminders went live.
- Reception call volume down by roughly a third.