Organic Genetics Clinic App
A patient card, a patient app and a clinic console, joining a clinical record and a commercial one that had never spoken to each other. Three clinics run on it today.
The problem
A clinic ran on two systems that could not see each other. Elixir held the clinical record: patients, appointments, prescriptions, medicines. GoHighLevel held the commercial one: contacts, products, stock, invoices, payments. Neither could answer the only question that matters to an owner, how is the clinic actually doing.
Elixir has no reporting. It answers one patient at a time and pages appointments twenty to a row, so a query across a year would take hours. GoHighLevel reports on commerce and knows nothing clinical. Staff worked across five browser tabs and patients phoned to ask whether they were still covered.
The decision
Replace neither. ClinicApp sits between them as the only thing a patient or a staff member has to learn, and every field has exactly one owner. Who is a patient lives in GoHighLevel. Date of birth and NHI live in Elixir. Stock and prices live in GoHighLevel. The card is the one thing the app itself owns. If two systems disagree, the owner wins.
That single rule is what stopped the app quietly inventing a third version of the truth, which is how most integrations die. Clinical data flows out of Elixir and the only thing ever written back is a draft prescription that a doctor still has to sign.
For the patient
A printed card carrying a unique QR. Scanning it opens a verification page with no app and no login for whoever is checking, and it shows their name, photo and that they are a current patient. It never shows their NHI, their medicines, their dosage or their conditions. Lose the card and it reissues instantly, the old QR stops verifying the same moment. That is the difference between a card and a printed letter.
The app leads with the question every patient actually asks: am I still covered. Prescription status, in plain words, with the expiry date, first thing on the screen. Then their scripts, their orders, their bookings and a copy of the card, so a lost card is not a crisis.
Ordering is gated twice: a current prescription and shop access, every time. Checkout raises a real GoHighLevel invoice on their contact with the same numbering the clinic would have used by hand, and the order does not become a prescription until it is paid. Nothing reaches the doctor unpaid.
It installs from the browser. No app store, no download, no review process sitting between a bug and its fix. Patients get a link and a temporary password, set a PIN, and the app offers to install itself with the clinic’s own icon. Most never realise it was a web page.
For the clinic
One console instead of five tabs. The morning screen shows six live numbers chosen to answer one question, what needs doing today: cards to print, reviews overdue, scripts expiring, orders this week. Under them a live feed of sign ins, orders, payments, prescriptions and failed sign in attempts.
Every patient sits in exactly one of four states, active, invited, inactive or disabled, so the list doubles as the recall worklist. Cards mint automatically and print in batches at card size, ready without trimming by eye.
The quiet masterpiece is Products and medicines. A shop product is a trade name. A prescription needs a medicine code, a supply quantity and directions. One page where a person joins the two, once, and every future order raises a correct draft. A decision the team confirms is never overwritten by a later sync, and if a product has not been decided the app writes no medicine code at all, sending it to the doctor as an unmatched line to resolve. Nothing is ever guessed on a prescription. 182 products mapped across the clinics so far.
The reporting neither system could do
Eighteen sections, thirteen charts, one screen. Because neither source could be queried live, the app harvests appointments, prescriptions and every priced line into its own reporting mirror each night, then computes in SQL. The page states when it last looked, so nobody mistakes it for live.
Facts are stored raw and metrics computed on top, so changing the definition of churn is a query change rather than another year of harvesting. Revenue splits three ways: product measured line by line, consultations counted as attended appointments, and courier. Daily revenue sits beside daily grams, because the question is never only how much did we take, it is how much did we move.
Retention measures every patient on their own clock from first purchase, in 98 day cycles matching the clinic’s own fourteen week window. A patient who reached a cycle and spent nothing counts as zero rather than being dropped, because dropping them turns the metric into average spend among people still buying, which climbs reassuringly as a clinic loses its patients. That is the kind of detail that separates a report from a comfort blanket.
Three clinics, no bleed
Separation is the feature a group buys, so it is enforced rather than assumed. Each clinic has its own subdomain, branding, card design, catalogue, staff logins and reporting. Every request is scoped to the clinic making it and the rule fails closed: an unrecognised caller sees nothing rather than everything.
There is no cross clinic view for anyone, and the group wide option was removed rather than hidden, because a switch the interface no longer offers but the API still honours is not removed, only harder to find.
How it stays up
Correct in principle is not the same as proven in production. Before any deploy, eleven smoke tests run against live services: create a patient, render their card, load the shop, check every product resolves to a medicine, confirm the handbook still matches the app. Any failure blocks the deploy. A clinic runs its day on this, so a release that has never been run is not a release.
Sync failures are recorded per patient and replayed by reconciling against the source, never by blindly re-running a queue, which is how duplicates are born. Payments are reconciled rather than trusted. Both services and the database sit in Sydney, so patient data does not leave the region.
Twelve written procedures live inside the console, reachable from the screen you are standing on, and they are checked against the app on every release. If a procedure no longer matches the screen, the release does not ship.
What it is worth
Forty minutes saved onboarding a patient and twenty per twelve week cycle. At fifty dollars an hour that is two hours and a hundred dollars per patient in year one. At a thousand patients it absorbs two thousand hours, one full time administrator, and it is not a redundancy: it is the same team carrying several times the book without the wheels coming off.
Early estimate from the clinics running it: 37% more patients past their first cycle. Less admin lowers what a patient costs to take on, better retention raises what they are worth once taken on. Both ends of the same equation.