Healthcare · 2025

A multi-site clinic group that grew faster than its calendar did

6 min read
Eleven sites, one scheduling model, and a conflict count that stayed at zero

A clinic group had grown to eleven sites by acquiring practices that each arrived with their own calendar. Appointments, clinicians and rooms were booked in three different places, and the group had no way to answer a question as simple as whether a given room was free on Thursday. The fix was not a bigger calendar. It was modelling the resource — the room, the chair, the clinician — as the thing that gets booked, and letting the appointment be a consequence of that.

The Client

A multi-site clinic group that grew faster than its calendar did

Anonymised · NDA
  • Healthcare · 11 sites
  • Egypt · Saudi Arabia

Each acquired practice kept the booking system it came with, and head office reconciled them by phone. That worked at four sites. At eleven it produced a standing backlog of double-bookings that front desks absorbed by arriving early, and nobody could say how often it happened because nothing recorded it.

Diagnosis

What was broken

  1. [01]

    Three systems each believed they owned the calendar, and none of them could see the other two.

  2. [02]

    A room was booked as free text, so two clinics could reserve the same room without any collision.

  3. [03]

    Clinician availability lived in a shared spreadsheet that was edited by six people at once.

  4. [04]

    Double-bookings were resolved at the front desk and never recorded, so the rate was unknown.

  5. [05]

    Equipment that only two sites owned was booked informally, by asking whoever used it last.

  6. [06]

    Moving a patient between sites meant cancelling and rebooking, which lost the original history.

Business Impact

The visible cost was twenty minutes a day per front desk on the phone to another site. The real cost was that the group could not open a twelfth site without hiring a coordinator for it, because coordination was a person rather than a system.

Why previous attempts failed

Two previous attempts bought a better calendar. A calendar stores appointments, and the thing that was actually scarce was the room and the clinician, which no calendar modelled.

Our Approach

How we solved it

Phase 01 of 04 · Count the collisions first

  1. 01

    Count the collisions first

    Before proposing anything we exported four weeks from all three systems and cross-matched them. That produced the first real number the group had ever had for double-bookings, and it was roughly four times what management had assumed. Everything after this was argued against that number.

    Deliverables

    • Four-week collision audit across all sites
    • A baseline rate management agreed to
    • The twelve resource types actually booked
  2. 02

    Model the resource, not the slot

    Rooms, chairs, clinicians and the two shared imaging units became first-class records with their own availability. An appointment then became a claim on one or more of them, and the database — not a person — refused the second claim. This is the whole of why the conflict count went to zero.

    Deliverables

    • Resource schema with per-entity ownership
    • Exclusion constraint on overlapping claims
    • Cross-site transfer that keeps the history
  3. 03

    Migrate one site at a time

    We moved the smallest site first and ran it in parallel with its old calendar for three weeks, comparing both every morning. Nine of the remaining ten followed at one per week. The eleventh was left until last because it owned both imaging units and needed the others live first.

    Deliverables

    • Parallel-run comparison for every site
    • Per-site cutover with a rollback path
    • Front-desk training in Arabic and English
  4. 04

    Hand over the operation

    The group now adds a site themselves. Resource types, opening hours and clinician rotas are configuration rather than code, the deployment pipeline is in their GitHub organisation, and the on-call rota is theirs. We were out of the critical path two months after the last cutover.

    Deliverables

    • Site onboarding they run without us
    • Runbooks and an on-call rota
    • Cloud and repository accounts in their name
  5. End of approach

    Scroll on for the results →

Scroll · 4 phases · pinned

Tech Stack

Tools & technologies

  • PostgreSQL · btree_gist

    Constraints

  • TypeScript · Node

    Language

  • Next.js App Router

    Interface

  • Terraform · Actions

    Infrastructure

Results

Quantified outcomes

  • 11

    Sites on one model

    Migrated one per week, smallest first, each run in parallel for three weeks

  • 0

    Double-booking conflicts

    Not a report but a constraint: overlapping claims are rejected at write time

  • −20 min

    Front-desk calls daily

    Measured per desk across a full quarter after the last site went live

  • Same day

    Cross-site transfer

    The appointment history follows the patient instead of being cancelled

Key Takeaways

What we learned

  1. 01

    Book the scarce thing, not the appointment

    An appointment is an outcome. What is actually scarce is the room, the chair and the clinician. Model those as the bookable records and the conflict becomes a database constraint instead of a conversation at the front desk.

    Useful when: Any booking system where two bookings can quietly claim one physical thing.

  2. 02

    Measure the defect before you price the fix

    Management estimated the double-booking rate at a quarter of what it was. The four-week audit cost a few days and changed both the budget and the sequencing, because the real number made the imaging units the last migration rather than the first.

    Useful when: Before any project justified by a rate nobody has actually counted.

  3. 03

    A parallel run buys trust, not correctness

    Three weeks of running both calendars found almost no defects. What it did was let eleven front desks watch the new system agree with the old one every morning, which is why the tenth cutover needed no training at all.

    Useful when: Replacing a system whose users have been burned by a previous rollout.

  4. 04

    Configuration is what makes handover real

    The twelfth site opened without us. That was only possible because resource types, hours and rotas were data the group could edit, not code we would have had to deploy. The handover was decided months earlier, in the schema.

    Useful when: Any engagement that is meant to end rather than become a retainer.

FAQ

Frequently asked

01Why not just buy a scheduling product off the shelf?

Two had already been bought. Both model the appointment as the primary record, which is correct for a single practice and wrong for a group that shares rooms and equipment across sites. The constraint we needed — one physical resource, one claim at a time — was not expressible in either.

02How was the zero-conflict figure actually verified?

It is not a report, it is a constraint. Overlapping claims on the same resource are rejected by the database at write time, so a conflicting booking cannot be stored to be counted later. The figure is the number of exclusion-constraint violations that reached a user, which is zero because they are caught before the write commits.

03What happened to the appointments already in the old systems?

They were migrated, and about one in forty could not be: they were already in conflict with another booking and had been surviving because nothing checked. Those were listed per site and resolved by the site before its cutover, which is part of why cutovers ran one per week rather than all at once.

04Does the group still need us in order to open a twelfth site?

No. Site onboarding is configuration — resource types, opening hours, clinician rotas — and the twelfth site was added by their own operations team without our involvement. We review the schema if they want a genuinely new kind of resource, which has happened once.

05Why is this case study anonymised rather than named?

Patient-facing operations and site counts are commercially sensitive, and the engagement was covered by a mutual confidentiality agreement. The architecture, the sequencing and the numbers are reported exactly; the name is not.

The closing thought

Ready to write yours?

Every project on this site started as an operational problem somebody had stopped expecting to fix. If one of yours sounds like this, that is the conversation to have.

Edition № 001Case Study · Healthcare · 2025

Let's write yours.

Book a call
  • 11 Sites live on one model
  • 0 Booking conflicts since launch
  • SiaSol · siasol.ai
View all

Software products built in Egypt, Saudi Arabia and the UAE.