All work
05SaaS2025

A healthcare records provider

Six legacy clinical systems consolidated behind one auditable API, without a big-bang migration or a day of downtime.

Engagement
34 weeks
Year
2025
Disciplines
Backend · Consulting · UI/UX
Systems consolidated
6 → 1

The problem

The client had grown by acquisition and inherited six patient record systems, two of which no longer had a supported vendor. Clinicians were re-keying data between them, and no single system could answer 'what happened to this patient' — which is both a care problem and, under their regulator, a reportable one.

What we did

  1. 01

    Strangle, never big-bang

    A migration cutover for clinical records is an unacceptable risk profile: the failure mode is a clinician without a patient history. A façade API went in front of all six systems first, reads were moved to it, and the underlying systems were retired one at a time behind an interface that never changed.

  2. 02

    Make the audit trail the primary record

    Every read and write through the façade is logged immutably with actor, purpose and patient. This was a regulatory requirement, but it also turned out to be the migration's safety net — a discrepancy between old and new could always be traced to the exact call that caused it.

  3. 03

    Shadow-read for eight weeks

    Before each system was retired, the new path served every request in parallel with the old one and diffed the results without showing them to anyone. Three data-mapping errors surfaced this way, all before a clinician could ever have seen them.

What changed

The last legacy system was switched off in the thirty-first week with no downtime window and no clinical incident. The client's regulator closed the outstanding audit finding at the following review.

Systems consolidated
61
Downtime during migration
0 minutes
Clinical incidents attributed to migration
0
Mapping discrepancies caught pre-cutover
3
Record retrieval time
~4 min (manual)1.2s

Built with

  • Node.js
  • PostgreSQL
  • Python
  • AWS
  • OpenTelemetry
  • Next.js

Eight weeks of shadow reads felt slow at the time. It is the reason we had a boring cutover instead of an incident report.

Chief Clinical Information OfficerHealthcare records provider

Have a problem shaped like this one?

Start a project