Two seats: one for billing, one for the founder-doctor.
- He never opened his. It was too complex to learn.
- Reception used the billing seat and nothing else.
- Everything else lived on paper, WhatsApp and a notebook.
LIVE ELTH · Solace Life Clinic, Bangalore · 0→1 case study
A metabolic clinic ran on paper and four disconnected tools. We replaced all of it with one system, so patients stay on programs instead of paying single visits.
₹12k a month for clinic software so complex the owner never opened his seat. Bookings on paper, records scattered, the doctor walking in blind.
Two days at the desk, then billing first because day-end reconciliation was the owner's trust test. Booking came fifth. Parked the AI scribe when doctors said manual-first.
Reception, doctors, billing and the programs run on it daily. 1,517 appointments, 990 consultations, 823 prescriptions on WhatsApp. What they stopped using is on this page too.
01 Why this existed
Solace Life Clinic had been our agency's client for three years, so I heard the complaint long before it became an opportunity. DocuPulse was not missing features. It had more than ELTH would have for most of the year. It was simply too complex to navigate, so the people who needed it every day worked around it instead.
Two seats: one for billing, one for the founder-doctor.
Software nobody can navigate is not a tool, it is an expense with a login.
The licence lapsing was not the reason, it was only the moment. It meant nobody had to be talked out of a renewal first. three years of trust bought the meeting. discovery had to earn the rest.
02 The desk
Two days next to reception, an afternoon with the doctor, an hour with pharmacy. I wrote the users down by how much friction each one would tolerate before going back to paper, because that, not job title, decides what ships.
Register, book, check in, bill, collect, close the day.
History, prescription, tests, follow-up. Must beat the paper pad.
Vitals before the consult, injections, samples. On a phone, standing.
Dispense against the prescription, stock, lab orders and reports.
Diabetes and weight programs. The reason the clinic wants software at all.
Daily collection, who came, what was billed. Reads it on his phone at night.
Tolerance for friction, lowest to highest. Reception sets the ceiling for the whole product.
There is no pharmacy user. All 1,493 dispenses were done from the receptionist's account. The pharmacy desk was always reception wearing another hat, and I designed eight separate roles for a clinic where one person works three of them.
Not by how loudly they were complained about. That ordering is the whole case.
30 to 45 minutes every evening matching the receipt book, the UPI app and the card machine. Discrepancies get "adjusted". The moment reception hates most and the owner trusts least.
Search is scrolling a register. Families share one phone number, so searching by phone returns the wrong person. Duplicates mean the doctor sees no history.
Prescriptions live on paper the patient took home. Vitals are on a sticky note that reaches the doctor about 60% of the time.
Reception WhatsApps a picture of the prescription to the pharmacy desk. Stock is counted monthly and is always wrong.
20 to 30 calls a day, half of them "is the doctor in today". Real, but the fifth problem, not the first. It also needs the record to exist before it is useful.
the rule I held myself to: nothing ships that adds a step to what they do today.
03 The objective
Five pains, one cause: nothing wrote to the same place. Booking, reminders and care programs are all worth building, and every one of them is worthless on top of a record the clinic cannot trust. So v1 had exactly one job, and the sequencing of the whole year falls out of it.
One patient record that every desk writes into and reads from.
A booking that lands on a duplicate record is worse than a phone call. That is why booking shipped in February, not January.
04 What I chose between
All six are in the December spec, written before any code and never edited since. The first one set the order of everything that followed: the obvious thing to build was not the thing the clinic needed first. Each card shows what I chose, what I turned down, and why.
Money reconciliation is the daily pain and the owner's trust test. Booking is the marketing wedge, and a booking that lands on a duplicate record is worse than a phone call. Billing shipped in week two, booking on 12 February.
"No scribe, no suggestions. The doctor's trust is spent once." Written as a non-goal in December, tested in June, and the doctors confirmed it.
Reception said patients do not know their DOB, so age for v1 with DOB optional. Revisit if duplicates get worse. They did, and DOB became the second identity attribute in August.
Check-in, so no-shows never create invoices. The cost of that choice shows up later: 94 invoices sit open because the visit was never completed in the system.
Pharmacy desk, with cost price optional because they do not have it for half the stock. Optional cost price is how the stock list eventually went stale.
Solace has one branch but asked for the option. Multi-tenant from day one, every document carrying a clinic id, without building a feature nobody had asked to use yet.
05 What v1 had to do
v1 had to carry a patient from the front door to the receipt: register, book, check in, take vitals, see the doctor, dispense the medicine, raise the bill, take the money, close the day. Anything a patient would touch themselves waited for later.
A first-time walk-in, from the door to the receipt, written before any code existed.
Reception searches the phone number. No match. Registers in under 60 seconds. Record number issued.
Books the next open slot. Checks in. Consult invoice auto-created, marked due.
Nurse opens the patient from the queue and records vitals on the tablet.
Doctor opens the consult. Vitals are already there. Diagnosis, prescription, follow-up in four weeks. Prints.
Pharmacy sees the prescription in its queue, dispenses, stock decrements, second invoice created.
Reception collects both invoices in one payment by UPI. Receipt printed. Patient leaves.
06 How it had to be built
One Windows machine at the front desk, a few Android phones already in pockets, no procurement process, no second engineer, and me as the only person on call. Those facts decided the architecture far more than any preference of mine did. Six bets, all made before the first commit.
Every record carries a clinic id, checked on every read and write. Solace is clinic one, not the schema. Cross-clinic access is impossible by construction rather than by policy.
Patients do not have or check email. They never log in to the clinic system at all. The cost of that choice is families sharing a number, which is exactly where the duplicates came from.
Invoice, payment and stock change together or not at all. For online money the payment gateway is the source of truth, and refunds use the payment record rather than catalog prices.
Who did what, to which record. The owner asked for this before he asked for any feature, because it is the thing that lets him trust a number he did not watch being entered.
Desktop for reception and the doctor, phone for the nurse and coaches. It had to run on the clinic's existing Windows machine and whatever Android phones were already in their pockets.
Managed services, daily backups, scope held small. The rule I wrote for myself: anything I could not fix from my phone at 9pm does not go in.
Setup is done by me, not by the clinic. Catalog, staff, letterhead and shifts were all loaded before day one, so nobody ever saw an empty screen. Self-serve onboarding is a problem for a version of this product that has more than one customer. A clinic that opens a system already full of its own prices and its own doctors is not evaluating software, it is just working.
One patient, one thread, and every desk writing onto that thread instead of keeping its own copy. These are the collections a reader would care about.
07 Success, and reality
The spec set four thresholds at eight weeks and one leading signal, with a rule attached: if two of the four failed, stop adding features and fix adoption. Two failed.
From week three. 1,130 of 1,134 completed visits are invoiced, four are not, two of those from January. Every one of 2,542 paid invoices carries a payment mode.
It took two weeks. Her account first acted on 7 January, then twelve days of a handful of actions while both systems ran. On Monday 19 January she did 140 actions, and has run the desk every working day since, 207 of them.
The precondition holds: payment mode on 100% of paid invoices. But a timezone bug pushed evening collections onto the next day until 16 February, which became the first production fix. 8% of invoices still sit open, mostly duplicate check-in invoices rather than unpaid patients.
One in eight. 153 duplicate groups across about 1,240 registrations, and mostly from the online booking path, where a returning patient typed a new spelling of their own name. Fixed in two passes: a shared identity resolver in July, date of birth as a second attribute in August.
The doctor was the one I worried about. Zero visits written before 7 April, then 200 of the 221 completed appointments in August. Reception has run the desk alone since 19 January, 207 working days. And the writers I never counted are the patients: 71% of appointments now book themselves, and program members log their own weeks in the portal. The record stopped belonging to one seat and started belonging to the clinic and the people it treats.
08 What shipped
Billing came first, because the owner had to trust the numbers before he would trust anything else. The patient's own screens came last.
Patients book a doctor, a blood test or a health camp straight from the clinic's site. The phone number is the identity. Type it and the record fills itself in. Paying online earns a 10% discount, because a paid slot is a kept slot.
1,076 of 1,517 booked through the embed, 12 to 15 a day, at a 2% no-show rate.
No accounts, no passwords. Returning patients are recognised instantly.
Every role gets its own portal. Reception cannot see accounts, pharmacy cannot see consultations. Permission-scoped by design, not by policy document. Multi-clinic tenancy is built in, so a second location is a config change, not a rewrite.
Ten staff accounts live: 4 doctors, 3 coaches, nurse, receptionist, lab partner. In practice reception works the pharmacy and diagnostics desks too, which the role design did not anticipate.
Every action is attributable. When money or medicine moves, there's a name on it.
Trends since the last visit, diagnoses, current medications and a one-tap "Write Prescription", so the doctor sees it before the patient sits down. Vitals are charted against the last six readings, with deltas, not just today's numbers.
Six-reading history per vital; red/green deltas versus the previous visit.
Every past prescription, diagnosis and PDF, newest first. 990 consultations recorded since April.
ELTH scans past prescriptions and surfaces medicine combinations that were prescribed together before, and one tap applies the whole set. Doctors can save their own templates too. The finished prescription previews as a clinic-branded, signed PDF and goes to the patient on WhatsApp the moment the visit ends.
Suggestions come from what this clinic actually prescribes, not a generic drug list and not a language model.
Accessible anytime, on the channel patients already open fifty times a day.
Half of a clinic's work happens after the patient walks out. The portal tracks care programs week by week, weekly GLP-1 doses, weight logs, doctor reviews, and coaches exercise with video, reps, and a "why it helps" for every movement. It's a PWA: no app store, opens from a WhatsApp link.
Diabetes and weight-loss programs with phases, dose schedules and review dates.
Sixteen-step exercise routines with video, the plan patients actually follow.
one clinic os · itemised
thank you, come again (they do, daily)
09 What I got wrong
Sixty-plus features is a count, not a result. Here is what the clinic quietly stopped using, what I designed for a clinic that does not exist, and what broke once real money moved through it.
Nine of the eleven were cancelled. A camp is a marketing event, not a product surface.
Patients on a program do not book their coach. The coach books them.
254 attempts, none sent. Meta's template shape kept changing under us.
Six months of data. A blood test is a walk-in decision, not a planned one.
Wired, never switched on in production. Rate limiting carried the load alone.
the pattern: anything asking patients to plan what they normally do on the spot, died.
The stock module was used for six months, then abandoned. Pharmacy billing never left ELTH, 113 invoices in August alone, but stock tracking drifted until it was fiction: 118 medicines with only 30 showing stock, 59 of them re-seeded at ₹0 in August. Half of August's pharmacy sales skipped the dispense flow entirely. I made cost price optional at setup because the desk did not have it, and that is the decision the whole module eventually died of.
I designed eight roles for a clinic where one person works three desks. Every one of the 1,493 dispenses came from the receptionist's account. There was never a pharmacy user. Role separation was modelled on how a clinic is drawn, not on who actually sits there at 9am.
Six of the seven incidents are now written into the system's design document as invariants. The bug is the first draft of the rule.
A 30-second poll fetched every collection, unbounded. 1.9 million reads a day and a ₹2,560 July bill that scaled with usage, invisible to every user.
Sync. Every write stamps updatedAt, every hard delete is recorded, and clients pull only what changed since their last sync. Reads fell to about 50k a day. I had paid this lesson once already at GetMyCreative, for a great deal more.
Payment verification ran inside the booking iframe. The redirect hid its storage, so the cleanup sweep cancelled bookings that were already paid. 14 orders, ₹26,405, over two weeks in August.
Money. Cashfree is the source of truth for online payments. A booking is never cancelled for non-payment without asking the gateway first. Ledger corrected by hand; every patient had been seen, so no refunds were needed.
Expired payment holds stayed visible on the calendar and got checked in, creating appointments nobody had paid for.
Slots. An expired hold is dead for conflict checks, swept every fifteen minutes, and staff see a badge on any slot still holding.
A timezone fix pushed the daily report and the reminder cron onto the wrong calendar day. Evening collections landed on tomorrow's report until 16 February.
Time. Every calendar day is IST wall-clock, never a UTC conversion, and a missed cron run heals itself through a catch-up window.
A prefilled optional step re-saved July's HbA1c under an August date. 36 phantom lab rows in patient records.
Snapshots. The latest value shown on a chart is read-only display. It is never the seed of a new entry form. Forms start blank.
Families share one phone number and type their own names differently, so 153 duplicate patient groups formed, mostly through online booking. 132 merges done by hand.
Identity. A patient is resolved by phone plus a name tier, never phone alone. A different first name on the same number is always a new person, and date of birth is the second attribute.
The audit log records that an invoice changed, not what changed. Across 6,206 edits I cannot separate a routine line item added during a visit from a correction made after payment, which is exactly where a reconciliation gap would hide. I designed that log in week one and it is the thing I would rebuild before adding another feature.
10 Where it stands
One clinic, January 2 to September 6, 2026. Pulled from the system itself.
Not measured: calls the front desk stopped taking, and how long a receptionist took to learn it. I'd instrument both from day one next time.
11 What I learned
What this taught me isn't a stack. It's the product loop: find the trigger, pick the wedge, ship while they use it, count what happens, cut what nobody uses, own what breaks. That loop works on software exactly the way it worked on an agency, and it's what I bring to an AI product team next.