A 3-location outpatient clinic. EHR, scheduling platform, and insurer billing portal, three logins, 45 minutes every morning before the first patient arrived. Here is what we connected, the five tiles we built, and the three outcomes, including a billing denial pattern worth €9,200 that had been running unnoticed for four months.

This is a case study from a build we completed in early 2026. The client is a private outpatient clinic group operating across three sites in the Netherlands, physiotherapy, sports medicine, and occupational health. Twelve clinicians, around 220 appointments a day. We have anonymised the practice name. The numbers are as close to real as we are able to share.

Before: 45 minutes of system-checking before the first patient arrived

The practice manager, we will call her Anita, started every working day with the same sequence. Not by choice. She had tried to get it faster and had not managed to.

First: the EHR. She logged in to pull today's appointment list and cross-check it against yesterday's late cancellations and no-shows. The EHR held the clinical schedule, but the no-show history was not surfaced anywhere useful, she was looking for patterns from memory.

Second: the scheduling platform. A separate login, because the clinic had moved scheduling to a dedicated tool two years earlier. Room assignments lived here, as did the waiting list for rebooked slots. She was checking whether the morning sessions were going to run over, a signal that came from comparing scheduled treatment times against available rooms, which required mental arithmetic on the spot.

Third: the insurer billing portal. The clinic billed three private insurers directly. Each submission had to be checked individually: accepted, pending, or flagged for correction. The portal refreshed overnight, so this was the window to catch denials before they aged. But it required a third login and a manual review of a list that had no sorting or priority flagging.

The full sequence took 45 minutes on a normal morning. On a Monday, catching up from the weekend, it was closer to 70. The 8am clinical handover meeting started with Anita having already done the equivalent of a full admin shift before the day began.

What the process regularly missed: no-show risk for that day's high-risk slots (only visible the night before if she remembered to check), room utilisation gaps that became visible only when a provider finished early and no-one had a patient to send in, and denial patterns that only became obvious when several months of the same error stacked up.

What we built

The discovery call lasted 30 minutes. Anita had one ask: she wanted to open one thing in the morning and know what needed her attention. She did not want a tool she had to learn. She wanted something that already knew the signals.

We connected three sources: the EHR (via HL7 feed, pulling appointment, patient, and encounter data), the scheduling platform (REST API, pulling room assignments and wait-list status), and the insurer billing portal (nightly export via SFTP, formatted to a standard claims schema). The board has five tiles:

No-show risk today. By provider and appointment type, based on 12 months of historical no-show data combined with same-day appointment characteristics (time of day, days-since-booking, insurance type, slot length). High-risk slots are flagged the evening before so the reception team can run confirmation calls. Not a prediction, a prioritised list.

Room utilisation this morning. Booked treatment time vs available room hours, by site, for the current day's sessions. Shows the gap Anita was calculating mentally: where there is slack to absorb a walk-in or a wait-list patient, and where there is not.

Claim status from last night. Submissions from the previous 48 hours by insurer: accepted, pending, flagged. Flagged claims sorted by age and grouped by denial reason. The thing the billing portal showed, but required three logins and a manual scan to see.

Encounter cycle time. Check-in to discharge, by provider and session type, averaged over the prior 30 days. Flags providers or session types running more than 20% over the scheduled slot duration, a leading indicator of schedule creep before it affects the day.

Rebooking rate. Appointments completed that resulted in a follow-up booking within 14 days, by provider and treatment type. A proxy for clinical continuity and a revenue health signal, the clinic's experience was that rebooking rate correlated closely with patient outcomes and revenue predictability.

Build time was seven days. Day one: discovery, data mapping, and a conversation about how the HL7 feed was structured, the EHR vendor had a non-standard segment ordering that required a translation layer before the data was usable. Days two and three: HL7 ingestion and the scheduling API connection, followed by validation against Anita's manual records to confirm the no-show history was reading correctly. Days four and five: the billing SFTP pipeline and the claims schema normalisation. Day six: Anita reviewed the full board and requested one change, the room utilisation tile needed to show site-by-site, not aggregate, because the three sites had different room configurations. Day seven: live, with a one-hour handover.

After: 8 minutes, and a billing problem that had been running for four months

The first morning after go-live, Anita opened the board at 7:52am and was done with her preparation before 8:00. She described the difference as moving from reading three books to reading a summary that already knew which chapters mattered.

Three outcomes that were measurable within the first quarter:

Morning preparation time: 45 minutes to 8. The sequence that had previously taken most of an hour, three logins, manual cross-checking, mental arithmetic on room utilisation, now takes eight minutes. The 8am handover starts on time. Anita describes the evenings as better too: she was previously spending time on Sunday evenings mentally rehearsing the Monday morning ritual. That stopped.

No-show rate for high-risk slots fell from 23% to 14% over three months.The no-show risk tile surfaces flagged appointments the evening before, allowing the reception team to run confirmation calls on the highest-risk slots. The clinic had always known that confirmation calls reduced no-shows, they simply had not had a reliable way to know which appointments to call about. Prioritised by risk, the calls took 20 minutes rather than two hours.

A billing denial pattern that had been running for four months was caught in the first week. The claims status tile grouped denials by reason code. In the first review, a cluster of denials from one insurer stood out: all the same reason code (procedure code not covered under the submitted plan type), all for the same treatment category (an occupational health assessment the clinic had started offering in November). The insurer's billing requirements for that assessment type had changed, and the clinic had been submitting with the old code since launch. Twenty-two claims, totalling just under €9,200, were resubmitted with the corrected code. Nineteen were accepted. The pattern would have been visible in a monthly billing review, but that review had not been scheduled yet because the treatment category was new and no-one had set up the process.

What made it work

The HL7 translation layer was the unexpected complexity. Most of the work on days two and three was not connecting the EHR, it was understanding the vendor's specific segment ordering well enough to trust the output. We have done this enough times to have a validation pattern: we compare the derived no-show counts against Anita's own records for a 90-day back-period before we treat the feed as reliable. In this case, the derived counts matched within one percentage point. That check is not optional.

The rebooking rate tile was the one Anita had not asked for. We proposed it during discovery after she mentioned that the clinic tracked follow-up bookings informally but had never put a number on it. It turned out to surface a meaningful pattern in the first month: one provider's rebooking rate was 14 points below the clinic average for the same treatment type. That conversation had not been possible before because the data had not been visible. We do not know what happened next, that is clinical management. But Anita said it was the tile she would not remove even if she removed everything else.