The challenge
The client operates a group of outpatient clinics offering physiotherapy, diagnostics and specialist consultations. Almost every booking happened by phone. At peak times patients waited on hold for long stretches, and many gave up. Front-desk staff spent much of their day on calls instead of with the patients standing in front of them.
Intake was paper-based. Patients filled in the same forms at every visit, and staff typed them into the practice management system afterwards, which introduced errors and delayed appointments. Reminders went out inconsistently, and missed appointments left gaps in clinicians' schedules that were hard to fill at short notice.
An earlier attempt at a patient portal had stalled. It was hard to use on a phone, did not work with screen readers, and was not connected to live availability, so patients still had to call to confirm. The client wanted a mobile-first experience that patients of every age could use, built on top of the practice system rather than beside it.
Our approach
We began with a two-week discovery sprint. Our designer spent time at the front desks, listened to booking calls with permission, and interviewed patients across age groups, including people who rely on screen magnification and voice control.
From that research we chose a narrow first release: booking, rescheduling, digital intake and reminders. Payments, messaging and test results were deliberately deferred.
Key decisions included:
- One codebase for iOS and Android. React Native met every requirement and halved ongoing maintenance compared with two native apps.
- A web version with the same features, so patients without the app can book from a link in a text message.
- Accessibility as an acceptance criterion. Every screen was tested against WCAG 2.2 AA, with VoiceOver and TalkBack, before it counted as done.
- Minimal data. The app stores no clinical records on the device and collects only what intake requires.
We tested a clickable prototype with twelve patients and six staff members before writing production code, and changed the booking flow twice based on what we saw.
What we built
The patient app is built in React Native with TypeScript, with a matching React web app sharing the same design system and API. Patients can find availability by clinic, service or clinician, book and reschedule, and complete intake forms before they arrive. Returning patients only confirm what has changed since their last visit.
A Node.js backend on AWS sits between the apps and the practice management system. It reads live availability and writes bookings through the vendor's supported FHIR API, caching availability briefly to protect the practice system at peak times. Intake answers are validated and written to the patient record, so staff no longer re-type forms.
Reminders go out by push notification or SMS, at intervals the clinics can configure, with a one-tap link to confirm or reschedule. Cancelled slots are offered to patients on a waitlist automatically.
Data is encrypted in transit and at rest, access is logged, and staff tools use the clinic group's existing single sign-on. Automated tests with Playwright and Detox, including accessibility checks, run on every change before release.
The results
Within four months of launch, around 45% of bookings were made through the app or web booking, and inbound calls to front desks fell by about 30%. Patients who still prefer the phone get through faster as a result.
Digital intake removed most re-keying, and check-in now takes minutes rather than a clipboard and a queue. Missed appointments fell by roughly 20%, helped by reminders and the automatic waitlist.
Accessibility feedback from patients has been consistently positive, including from people who use screen readers. The client's in-house developers now own the codebase. We continue on a small support plan for operating system updates and new features.