Built one day. Rebuilt the next.
The affiliate scheme worked. It took an afternoon, it shipped, and nothing about it looked like a defect. It was replaced the following day because both halves of the incentive pointed at the wrong thing.
It did not start as software.
The earliest document is a turnaround plan for a physical clinic: thirteen workstreams, of which technology is the eighth.
- Before
- A clinic with a recorded, specific problem: people get treatment and pay later.
- What forced it
- The checklist redesigned the commercial flow on paper, in five steps — consultation, recommendation, quotation, payment, treatment — before any code existed.
- The decision
- That sentence became the third rule the eventual system enforces: no delivery without payment. The business decision came first and the software was built to make it unavoidable, rather than offering a feature somebody might use.
- What it changed
- The checklist closes by naming the real ambition: we are no longer writing a renovation plan, we are writing a single source of truth, and if we do that well the physical clinic becomes just the first instance of a system that can be replicated elsewhere.
Workstream eight imagines the product a year before it existed — a scan on arrival, a structured assessment, a recommended package, the doctor editing it, payment, tracking, follow-up — and states the intended division of labour in one line: the humans become advisors, the system becomes the memory.
Six decisions taken back, in sixteen days.
The whole first build, discarded · 5 Aug
A working system existed. It printed credentials on its login page, showed one price and billed another on all eight packages, and let a phone number alone reach somebody else's clinical record. Baselined in version control rather than erased, and rebuilt from a fresh schema with the old data left as a fallback.
Payment at the centre, to paid in advance · 5 Aug
An explicit early decision said there would be no gateway and payment would happen at the centre. Reversed the same day: a hold expires in fifteen minutes and counts as occupied, and the appointment is created only after server-side verification.
The waiver, to what to expect · 17 Aug
A legally accurate consent page with five red warning blocks that read like a company expecting a dispute. Same protections, restated as things a patient would want to know. Red blocks to zero — and arguably the stronger legal position, because a document people actually read is better evidence of informed consent.
The review incentive, to a policy-safe split · 17 Aug
₹300 off for a five-star review screenshot — designed, then found to breach the review platform's policy outright. Split into ₹300 off for scanning and turning up, plus a separate unincentivised ask afterwards. Buying stars would have been the first dishonest thing on the whole site.
Affiliate commissions, to community partners · 17 → 18 Aug
Built one day, rebuilt the next. The one worth arguing about.
Sign-in, three generations · 5 → 20 Aug
Matching on email address locked out exactly the people who needed it, because an address that is a mailbox is not a login. The final shape starts a sign-up for an unknown identity at the patient door, refuses rather than links a phone number that already has a record, and creates nothing at all at the staff door.
The shape was the obvious one. Every marketplace on the internet works like this.
| Built on 17 August | Replaced it on 18 August | |
|---|---|---|
| The customer | ₹300 off the ₹800 assessment. | Pays the full ₹800 and earns ₹300 of credit towards a programme. Nothing comes off the door. |
| The partner | ₹150 when the person signs up. | ₹150 on attendance only, wired to the moment a staff member marks the appointment complete — a click that already happens. |
| Failure | A booking is a booking. | Cancelled or no-show moves the referral to lost and pays nothing. Only genuinely new patients count, or a gym can farm its own members. |
| The name | Affiliate commission. | Community partner. The role is still AFFILIATE in the database — renaming a live enum is not worth the risk — and every human-facing label changed. |
Why the discount moved: taking ₹300 off the assessment costs the centre ₹300 and tells the person that the assessment is the sort of thing that goes on sale. The second is much more expensive than the first. A person who came because it was cheap is not the person who finishes a six-week programme.
Why attendance became the paying event: bookings are free to make and easy to fake, and a gym paid per booking has been handed a reason to book slots. Paying on attendance means paying for somebody who got up and travelled to Panchkula. That cannot be manufactured — and it is exactly what the centre wants.
Shipping them enabled would have been faster and worse.
- Self-service patient accounts — built, and switched off until an authentication-category message template clears review, because the one-time code is the whole safety argument: a phone number alone must never be enough to claim somebody else's clinical record
- Four leaflet campaign codes — created, not activated. An active code is money leaving the till
- A messaging assistant that answers costs, hours and what happens in the room, then hands over a booking link — and will not give clinical advice, because a chat that engaged with symptoms would undo a site built around telling people when to see a doctor instead
- Each one waits on a price, a credential or a decision that was not the author's to make unilaterally
- The emergency-phrase guard is the only code with a dedicated test file, for a stated reason: it is the only list where being wrong hurts somebody
- The feature flag alone is not enough — self-service checks both a deliberate flag and a messaging configuration that can actually deliver a code, because the flag alone gets you a form asking for a code nobody will ever receive
The only question that matters at the end of a month could not be answered from the system at all.
- Before
- Orders, payments and collections were modelled in the first week. Money out was not modelled anywhere, so the answer lived in a notebook.
- What forced it
- A business that cannot answer what it kept is not being run from its own records.
- The decision
- A back office built around one figure: collected, less paid out, equals what the month did. One ledger for every outgoing, salaries deliberately included, because a salary is money out like any other and two ledgers is one you forget to add.
- What it changed
- Alongside it, the commercial model the strategy required: every price public in both languages, the per-session figure derived rather than stored and rounded upward, and programmes that cannot be bought online at all because everything follows a documented finding.
One detail is most of what the job actually is. A role enum in the live database still carries its commission-era name, because renaming a live enum is not worth the risk — so every human-readable label changed and the stored value did not. The same shape repeats: a column added for per-practitioner calendars and then dropped rather than left dead, a superseded credit model kept only so historic rows still read correctly. None of it appears in a portfolio.
It wrote most of the code. I set the constraints, made the calls it should not have made alone, and caught it inventing a logo when real artwork already existed. The decisions in this document are mine. Several of the mistakes in it are too.
BUILD-LOG.md, closing note
Switched off is a finished state.
Nirmalkaya · one of six perspectives on the same project