GrowthOS
Turns missed enquiries into booked revenue, in the language your customers speak.
A front-desk operating system for clinics and service businesses. Enquiries from Instagram, WhatsApp and the website land in one queue, the AI drafts the follow-up in the language the patient actually speaks, and staff send it in a tap.
- Take the product tour — Six steps, no signup
Why this
exists.
Indian clinics lose money at the front desk, not in the chair. An enquiry arrives on Instagram at 9pm, another on WhatsApp during a procedure, a third through the website nobody checks. Whether any of them turns into an appointment depends on who remembered.
The practice-management software that exists treats marketing as somebody else's problem, and the marketing tools treat the patient record as somebody else's problem. The gap between them is where the revenue goes.
And the follow-up itself has to sound right. A perfectly composed English paragraph is not how a receptionist in Indore talks to a patient, so the drafting has to work in Hinglish or it does not get sent.
Everything that’s actually built.
The front desk
- One enquiry inbox across channels, with a running count of the revenue recovered from it
- Patients, appointments, recalls and billing in the same system as the leads
- A treatment pipeline that handles several treatments in one case rather than one row each
- Built for Android Chrome first — 44px tap targets, tables that collapse into cards, a hamburger rail
Follow-up
- AI-drafted WhatsApp messages, in Hinglish where that is how the patient talks
- Sent as a wa.me deep link the human taps — the software never sends on its own
- Every send stamps a timestamp; the button then turns into a “✓ Sent” label so nobody double-messages a patient
Voice notes
- Dictate after a consultation; the transcript is turned into a structured proposal by a Claude tool-use loop
- The proposal is staged for review — follow-ups and recalls become real records only when a human confirms
- Every action the agent takes is written to an audit table
Marketing & billing
- A content studio with Claude, ChatGPT and Gemini behind one key, priced per model in credits
- AI photo backdrops for social posts, with hard no-people and no-text safety rails
- Plans, credits, top-up packs and trials, on live Cashfree payments
- A cross-tenant owner panel that clinic users cannot reach
The stack,
without mystique.
Standard, boring technology your next developer will recognise. That’s the point — nothing here is a proprietary runtime you’d be locked into.
- Framework
- Next.js 14 App Router, TypeScript
- Data
- Supabase — Postgres, Auth, row-level security, Edge Functions
- Migrations
- 49 applied
- Tenancy
- clinic_id on every table, enforced by RLS not only by queries
- AI
- Claude for the notes agent; Claude / ChatGPT / Gemini via OpenRouter in the studio
- Payments
- Cashfree, live
- Hosting
- Vercel
The decisions that took the longest.
Anyone can list features. These are the calls that decide whether the thing survives contact with real customers and real money — explained without jargon, because you should be able to judge them without being an engineer.
- 01
A leak between two clinics is the worst possible bug, so it is prevented twice
Every table carries the clinic id, every query filters on it, and row-level security in Postgres enforces the same rule independently. Application code alone is not treated as sufficient — if a page ever forgot its filter, the database still returns nothing. That redundancy is the whole tenancy model.
- 02
The AI physically cannot message a patient
The notes agent has no tool that sends anything. It can only build a proposal. Follow-ups, recalls and review requests become real records when a human presses Confirm, and patient messaging stays a link a person taps. This is a capability boundary rather than a prompt instruction, which is the only kind that holds.
- 03
Clinical content is never extracted or interpreted
Diagnoses, prescriptions and dosages stay verbatim inside the note. The agent never lifts them into structured fields and never adds an interpretation. Unknown fields are left empty rather than guessed. Software that reorganises a doctor's clinical wording is a liability, not a feature.
- 04
A dictated transcript is untrusted input
Transcripts arrive fenced and are treated as data, never as instructions. Text inside one that tells the agent to ignore its rules is noted and not obeyed — the same discipline you would apply to anything a stranger can type into your system.
- 05
The admin panel returns 404, never 403
A non-admin who guesses an admin URL is told the page does not exist, so the panel's existence is never advertised. It is gated in middleware and re-verified independently inside every admin page and action, because a server action is its own endpoint and the route guard does not cover it. Every admin mutation writes an audit row.
- 06
A new vertical is seed data, never a code fork
Dermatology or physiotherapy would be rows in a catalogue table, resolved through one shared fallback function — never an `if vertical === …` branch in feature code. The mechanism is built and live; the flag stays off in production until a paying non-dental clinic exists.
- 49
- migrations applied
- 1
- accent colour in the whole interface
- 44px
- minimum tap target
- 3
- AI models behind one key
Live Cashfree payments are verified end to end — by a real ₹599 charge I made to myself. There is no paying clinic on GrowthOS yet.
Want one of these for your business?
GrowthOStook the shape it did because of one specific business problem. Tell me yours and I’ll tell you what it would take — or watch me drive the back end of these first.
Got a project to scope? Start there. Just want to see it working first? Book the demo.