Case Study · Healthcare Platform

PhysioSync — software that speaks a clinician's language.

A practice management platform for physiotherapy clinics, covering the whole arc of care: a patient walks in with a problem, gets assessed, treated over a course of sessions, sent home with exercises, and billed — with the clinical record and the money staying in step the entire way.

PhysioSync — physiotherapy practice management platform built by OET
Domain
Physiotherapy practice management
Surfaces
Clinician app, API, admin console
Core build
TypeScript · Expo · MySQL
Status
Built & audited, pre-launch
The Brief

Most clinic software is a calendar with a patient list bolted on.

Physiotherapy doesn't fit that shape. A patient isn't a booking — they're a course of care for a specific problem, which might run twelve sessions across six weeks. They might come back a year later with something unrelated, and that has to be a separate story in the same chart.

Progress isn't a feeling, either. It's a measurement: range of motion in degrees, muscle strength on a nought-to-five scale, pain on a numeric rating, and a validated questionnaire score that has to be calculated exactly right or it means nothing.

So the build started from the clinical vocabulary rather than the database. Episodes, not appointments. Assessments with real instruments. Sessions structured the way a physiotherapist already writes their notes.

The design test: could a practising physiotherapist look at a screen and recognise their own workflow, without anyone explaining the software to them first?

The Clinical Model

One problem, one episode, start to finish.

Every record hangs off a treatment episode — so a patient's frozen shoulder in March and their knee in November are separate stories with separate outcomes, not one undifferentiated pile of visits.

Intake

Demographics, history, allergies, medications, referral source.

Episode

A course of care opens for this specific complaint.

Assessment

Pain mapping, range of motion, strength, special tests, neuro screen.

Sessions

SOAP notes with modalities, exercises and pre/post pain scores.

Home plan

A prescribed exercise programme with a printable handout.

Billing

Per session or drawn down from a prepaid package.

The Hard Parts

Where the detail actually lives.

Outcome scores, computed not typed

Six standardised instruments are scored by the system from raw answers, then charted across the episode. The scoring maths carries its own unit tests — a mis-scored questionnaire is a clinical error, not a display bug.

Money as integers, always

Every amount is stored in paise as a whole number, never a float. Invoice totals are stored rather than recalculated, so a historical invoice always renders exactly as it was issued.

Packages that can't be over-spent

A prepaid block of sessions is frozen as a snapshot when sold, so later price changes never rewrite what a patient already bought. Consumption runs under a row lock, so two receptionists can't spend the last session twice.

Permissions read live, not from the token

Roles resolve from the database on every request rather than being baked into the login token — so revoking a departing employee's access takes effect immediately, not whenever their session happens to expire.

Slots from real working hours

Availability is generated from each branch's hours with breaks, buffers and leave applied — then the booking itself takes a row lock, so simultaneous bookings can't collide on the same slot.

Subscriptions that survive a race

Clinic subscriptions run through two payment gateways. Activation is idempotent across the client callback, the webhook and the reconcile job — whichever arrives first, the clinic is activated exactly once.

Clinical Instruments

The measures a physiotherapist actually uses

Each of these is a published questionnaire with its own scoring rules. The system implements the maths and plots the result over the course of treatment.

Oswestry Disability Index Neck Disability Index DASH / QuickDASH Lower Extremity Functional Scale WOMAC Berg Balance Scale VAS / NPRS pain Range of motion Manual muscle testing Special tests Neuro screening
Three Surfaces

One codebase for the clinic, on every screen it uses.

The clinician app is a single Expo codebase that ships to iOS, Android and the web — a physiotherapist on an iPad at the treatment table and a receptionist on a desktop are running the same build.

Expo · Clinic staff

Clinician app

The working surface — iOS, Android and web from one codebase.

  • Day view: arrived → in treatment → completed
  • Patient chart with episodes and history
  • Assessment capture with body-region pain map
  • SOAP session notes
  • Home exercise programme builder
  • Invoices, packages and payments
  • Progress charts and clinic reports
Express · TypeScript

The API

Where the clinical and commercial rules actually live.

  • Thirteen feature modules, ~52 tables
  • Row-level clinic scoping throughout
  • Permission checks on every route
  • PDF handouts and invoices
  • Presigned uploads for imaging and media
  • Background jobs for expiry and reminders
React · Platform

Admin console

The operator's own back office, outside the clinic paywall.

  • Clinic directory and account status
  • Subscription payments and refunds
  • Pricing plans and coupons
  • Admin users with a superadmin tier
  • Audit log of platform actions
Engineering Practice

Every build ships with its own audit.

Before calling anything finished, the codebase was put through a written audit — not a skim of folder names, but tracing each feature from route to controller to service to migration, running the type checker and the full test suite, and verifying every claim against the code itself.

The audit confirmed what the platform was built to guarantee: both apps typecheck clean, the unit suite passes, money handling is exact to the paisa throughout, and concurrency is guarded at the two points where a clinic's data genuinely depends on it — package consumption and slot booking.

That document is a deliverable, not an internal note. When we hand over a platform, the client gets a written account of how it was verified — feature by feature, with the evidence. It's the difference between “trust us, it works” and “here's how we know it works.”

Status: PhysioSync is in final pre-launch hardening ahead of onboarding its first clinics.

By The Numbers

Scale of the build

3 Surfaces from one TypeScript codebase
~52 Tables across 27 migrations
38 Screens in the clinician app
6 Auto-scored outcome instruments
The Stack

What it's built on

Clinician App

  • Expo · React Native · React 19
  • expo-router (iOS, Android, web)
  • TanStack Query · Zustand
  • Secure token storage
  • Charts and body-region SVG
  • TypeScript throughout

API & Data

  • Node.js · TypeScript · Express
  • MySQL / MariaDB via Knex migrations
  • JWT with server-side session revoke
  • Zod validation · ULID ids
  • BullMQ + Redis, cron jobs
  • PDFKit · S3 presigned uploads

Console & Services

  • React 19 + Vite SPA
  • Razorpay & PhonePe subscriptions
  • WhatsApp exercise sharing
  • Email and push notifications
  • Jest · Supertest · Playwright
  • Helmet · rate limiting
TypeScript React Native Expo Node.js MySQL Knex Redis React

Building software for a profession with its own vocabulary?

Clinics, labs, workshops, practices — the value is in modelling how the work actually happens, not in another appointment table.

Start a conversation → See more work