A Clinic Network That Outgrew Its Booking Tool
A booking application could reserve a slot but could not represent referral readiness, clinical dependencies or cross-site hand-offs. A custom operations platform connected scheduling to the controlled states that made an appointment safe to deliver.
- Engagement
- Clinical operations software
- Duration
- Around nine months
- Team
- Full-stack engineers, a business analyst and a delivery lead

This account is anonymised. The client is described by sector rather than by name, and outcomes are described in words rather than figures — no percentage or saving is quoted because none can be independently evidenced here.
Availability was not the same as readiness
The incumbent booking tool treated an appointment as a person, a practitioner and a free interval. Operational staff had to determine everything else through inboxes and trackers: whether a referral had been reviewed, whether required records had arrived, whether the selected site could support the procedure and whether a follow-up depended on an earlier result. Changes were copied between systems, and a cancelled slot could remain blocked in one view while appearing free in another. Staff understood these discrepancies and compensated for them, but the process depended on memory and repeated checking rather than an accountable operational record.
The replacement was not designed as an electronic health record and did not attempt to reproduce one. Clinical systems remained authoritative for the formal record, while the new platform coordinated referral intake, readiness, scheduling, patient communications and operational hand-offs. This boundary reduced unnecessary clinical data while retaining enough context to make safe scheduling decisions. Integration had to tolerate delayed or unavailable upstream systems, and migration could not abandon appointments already communicated to patients. The engagement therefore centred on explicit state, provenance, access and correction, with a staged transition by workflow rather than a single switch across every site and pathway.
What shaped the build
Continuity of appointments
Existing bookings and patient communications had to remain valid while scheduling authority moved to the new platform.
Sensitive health information
The application needed purpose-based access, restrained data collection and audit history across screens, exports and integrations.
Uneven integrations
Connected clinical and communications systems offered different identifiers, availability and delivery guarantees.
Site-specific resources
Rooms, equipment, practitioner capabilities and pathway rules varied without fitting a universal appointment template.
How the engagement ran
- 01
Trace patient journeys
We followed referrals through triage, readiness, booking, attendance, result dependencies and follow-up, including exception and correction routes.
- 02
Define the data boundary
Operational fields, clinical-system references, access purposes, retention and audit events were agreed before interface design.
- 03
Build by pathway slice
Referral, scheduling and communication states were delivered together for selected pathways so hand-offs could be tested end to end.
- 04
Reconcile migration
Future appointments, waiting work and resource configuration were staged, matched and checked against source populations.
- 05
Transfer operational ownership
Sites moved when staff, integrations, exception queues and support routes were ready, after which duplicate trackers became read-only.
Represent the conditions around an appointment
The core model separated referral, episode, appointment and resource allocation. A referral could be received but not yet clinically reviewed; an episode could contain related appointments without merging their records; and a slot could be reserved while a defined prerequisite remained pending. Appointment types declared required practitioner capabilities, room features, equipment and preparation rules. Site configuration supplied available resources without copying those requirements into each booking. The scheduler searched only combinations capable of satisfying the declared constraints, then preserved the reason a selected resource was valid. Manual exceptions required an authorised role and an explanation rather than an undocumented override.
State transitions distinguished requested, provisional, confirmed, arrived, completed, cancelled and not attended, with pathway-specific extensions where necessary. They were commands, not freely editable labels. Cancellation reason, initiator and downstream consequence were captured so the platform could release resources, suppress obsolete reminders and return work to the correct queue. Rescheduling linked the old and new appointments rather than erasing the earlier commitment. Dependencies could require review after a result became available without copying the clinical result itself into the operations platform. This kept coordination visible while respecting the boundary around the formal clinical record.
Make integration failure an ordinary state
External systems were connected through adapters with stable internal contracts. Patient and referral identifiers retained source namespace, preventing coincident values from being treated as the same person. Inbound events were idempotent and version-aware; an older demographic update could not overwrite a newer accepted record merely because it arrived later. Outbound appointment updates used a transactional outbox so a committed local change remained available for delivery after an integration interruption. Each message progressed through pending, delivered, rejected or superseded states, and support staff could replay safe failures without editing payloads or invoking a hidden endpoint.
Patient communications followed the same discipline. A message was generated from an approved template and current appointment state, then passed to the communications provider with a durable reference. Provider acceptance did not imply patient receipt, and the interface displayed those states accurately. Rescheduling or cancellation invalidated pending reminders before another message was produced. Content was minimised for the channel, with sensitive details kept behind authenticated access where appropriate. Delivery failures entered an owned queue and alternative contact followed policy rather than an automatic cascade across every available address. The platform treated communication as an auditable operational process, not a side effect of saving a booking form.
Apply access by purpose and task
Broad access to a clinic did not imply a need to view every operational detail. Roles were composed from tasks such as triage coordination, scheduling, arrival management and pathway oversight, then restricted by site or service context. API policy governed individual records, work queues, search and export through the same rules. Lists returned only the fields required for the task; a reception workflow did not need referral narrative simply because it displayed an appointment. Temporary support access required approval, expiry and a recorded reason. Audit events captured viewing of sensitive records as well as modifications where the access risk justified it.
The application retained clinical-system references rather than duplicating documents and results. Links resolved through the target system’s access controls, and a user without that entitlement could not use the operations platform as a proxy. Corrections preserved before-and-after values, actor and reason. Identity matching avoided presenting a probable match as certainty: ambiguous records entered a review queue with restrained comparison fields. Data retention followed record class and operational purpose, while active preservation prevented ordinary disposal. These controls were exercised in end-to-end tests, including role change, site transfer, erroneous patient match and export, rather than inferred from the visibility of navigation links.
Migrate commitments, not just calendar rows
Existing appointments carried patient identity, pathway, type, location, practitioner, status, communication history and sometimes unresolved prerequisites across several sources. Migration staged these values with source lineage and applied explicit matching rules. A row that lacked a safe patient or resource match remained unresolved; it did not receive a convenient default. Reconciliation compared source and target populations by status and date boundary, then sampled the complete operational context of accepted appointments. Waiting work and pending referral review were migrated separately from booked activity because they represented different commitments and required different ownership after transfer.
Rollout followed pathway and site boundaries that staff could operate coherently. Before each transfer, resource configuration, identity links, templates, work queues and integration routes were checked together. The source became read-only for the transferred workflow while future changes entered the target. Support dashboards showed delayed messages, unmatched source updates, scheduling conflicts and records awaiting review, each with a defined owner and safe action. Feedback changed configuration or workflow rules through controlled releases rather than spawning another shared tracker. The platform succeeded by making readiness, responsibility and exceptions visible around scheduling while leaving clinical judgement and the authoritative patient record in their proper systems.
What changed
- Appointments reflected referral readiness and resource dependencies instead of time availability alone.
- Cancellations and rescheduling retained their history and triggered controlled downstream work.
- Integration outages produced visible queues that could recover without re-entering bookings.
- Operational roles saw the information required for their task without inheriting broad clinical access.
- Existing patient commitments moved through reconciliation rather than being recreated as bare calendar entries.
Stack
- React
- TypeScript
- .NET
- PostgreSQL
- Azure Service Bus
- Docker
Common questions
Does custom clinical operations software replace the electronic health record?
Not necessarily. It can coordinate referrals, readiness, resources and communications while the clinical system remains authoritative for formal notes, documents and results.
How are existing clinic appointments migrated?
Appointments move with identity, pathway, resource, status and communication context, then reconcile to the source population. Ambiguous matches stay in a review queue rather than receiving defaults.
What happens if a connected clinical system is unavailable?
Committed changes remain in durable delivery queues and inbound updates can be replayed idempotently. Staff see the delayed state and owned exceptions instead of assuming synchronisation succeeded.
How is patient information protected in operational workflows?
The platform minimises copied clinical data and applies purpose-based policy to records, queues, search and exports. Sensitive access and corrections retain an audit trail.
Describe your version of this.
The constraints are never identical, and that is usually where the interesting engineering is. Tell us what yours are.


