All Case Files
01 / PROJECT OVERVIEW◆ ARCHIVED

Seven hours, one person. One working business.

A GST-compliant invoice system for a 35-year theatre company — proforma-to-tax lifecycle, audit trail, PDF generation, WhatsApp share. Built end to end by the person who files the invoices.

Seven hours, one person. One working business.
FIG · COVER · MONEYTORVIEW DEMO ↗

ROLE

Solo Designer + Full-Stack Developer + User

TIMELINE

7 hours, end to end

TEAM

1 person — Janam

SCOPE

Full-Stack Product, Domain Architecture, AI-Assisted Build

Ideas Unlimited Productions is a Mumbai theatre company founded in 1990 — 35+ years, 113+ productions, clients including NCPA and Reliance, 2–3 invoices a month, ₹34.5L+ tracked in FY 2025-26. Manoj Shah, my father, runs it. I'm the one who makes the invoices.

And I was bad at it: wrong dates, wrong play names, wrong GST splits. The accountant charged ₹40,000/year for work that was structured, repeatable, and rule-based. So I built the software that runs the business — a GST-compliant invoice system, proforma-to-tax lifecycle, audit trail, PDF generation, WhatsApp share. End to end, in seven hours.

Designer + developer + user, one person.I designed it, built the full stack, and I'm the person who files the invoices it produces. The requirements came from doing the job badly for seven months.

02 / THE CHALLENGE

Google Sheets is not a system. An accountant is not software.

What existed

What should exist

Google Sheets.

One source of truth.

Phone calls to the accountant.

GST encoded as software, not human memory.

Manual GST splits.

Proforma → tax as one lifecycle, not two documents.

Wrong dates, wrong numbers.

An audit trail by default.

Proforma + tax as two unrelated docs.

An Indian small-business sharing flow (WhatsApp first).

Payment proof trapped in WhatsApp chats.

Built and owned by the person who uses it.

₹40K/year for rule-based work.

₹0 — software you own.

The problem wasn't that no tool existed. It was that every tool was built for a generic small business — not for someone billing ₹14L for one performance, with a 50% advance, a 9%+9% GST split, an Indian-numbered amount-in-words, and a payment proof that lives in a WhatsApp screenshot.

03 / THE PROBLEM

The tools weren't missing. They were built for a user who wasn't me.

The obvious read was “there's no software, so build software.” That's not the gap. SaaS invoicing tools exist by the hundred at ₹500–2,000/month. The actual gap was that every one assumes a generic small business, and none models the three things that define this one:

Lifecycle

Proforma becomes a tax invoice

One entity that evolves through an advance receipt — not two separate documents.

Voice

Descriptions in IU's exact words

Auto-written the way the CA already accepts them, not a generic template.

Numbering

Lakhs and Crores, not millions

An Indian CA expects 'One Lakh Twenty Thousand.' No global tool gets this right.

So build-vs-buy wasn't about cost. It was fit and ownership: a ₹500/month tool that still needs a manual workaround on every invoice isn't cheaper than ₹0/month software you own. And this is Phase 1 of a 14-phase production-management platform — you don't build your foundation on someone else's SaaS.

04 / THE WORK

Five screens. The whole product.

Lifecycle as architecture — one invoice, four states, one source of truth.

Most tools treat proforma and tax invoices as separate documents. Ideas Unlimited's evolve through an advance receipt, so the schema collapses both into one entity with a status enum: proforma → advance_received → invoice_generated → paid, with cancelled as a side branch. No proformas table, no payments table — one row that grows.

IU Invoice — invoice detail with a four-state lifecycle progress tracker.
FIG · 01LIFECYCLE · ONE ROW, FOUR STATES

Description builder — rule-based generation, manual override one click away.

Pick a play, an advance percentage (25 / 40 / 50 / 75 / custom — IU's actual percentages, known from years of doing the math by hand), and a date — the description writes itself in IU's exact voice (“Towards 50% of total fees to be paid as advance for the play ‘Adbhut’ on the 6th of May 2026”). “Edit manually” sits one click away for the exceptions.

IU Invoice — description builder generating invoice copy in Ideas Unlimited's voice.
FIG · 02DESCRIPTION BUILDER · IU'S VOICE, AUTO-WRITTEN

Dashboard — the financial year, at a glance.

FY filter, four KPI cards (invoices, revenue, paid, pending), a sortable invoice table with payment status. The accountant's monthly reconciliation report — replaced by the homepage.

IU Invoice — financial-year dashboard with KPI cards and a sortable invoice table.
FIG · 03DASHBOARD · THE FY AT A GLANCE

PDF — a real Indian tax invoice, server-rendered.

@react-pdf/renderer, two templates (proforma and tax), field-for-field compliant with what IU's CA already accepts: letterhead + logo + seal, Bill From / Bill To / GSTIN / SAC, a CGST + SGST split (9%+9%), bank details, signature block, and Indian numbering (“Eighty Eight Thousand Five Hundred”). SAC 998596 is hard-coded — for performing arts, that's the service accounting code.

IU Invoice — server-rendered Indian tax invoice PDF with CGST/SGST split and Indian numbering.
FIG · 04PDF · A REAL INDIAN TAX INVOICE

Built for phones — Manoj checks invoices on his phone. So do I.

Same lifecycle, same tracker, same actions — 430px to 1440px, Tailwind 4, no separate mobile build.

IU Invoice — new-invoice flow on mobile
MOBILE · 430px
IU Invoice — invoice detail on desktop
DESKTOP · 1440px
05 / THE PROCESS

Seven hours, because seven months of filing badly told me what to build.

The build was fast because the requirements were already compiled — by me, the hard way, over seven months of wrong dates and wrong GST splits. Architect for fast feedback: schema first, UI last. Hour 1 was 7 migrations and an ER diagram in my head; after that the UI was a view layer over decisions already made.

HOUR 1 · ARCHITECTURE

7 Supabase migrations. Data model: clients ↔ plays ↔ invoices ↔ activity_log ↔ whatsapp_sessions ↔ business_settings. Status enum, audit trail, GST split logic.

HOURS 2–3 · INVOICE CRUD

Create, edit, lifecycle state machine. Description builder. GST auto-detection from client state code. Advance percentage presets.

HOURS 4–5 · PDF + SHARING

@react-pdf/renderer, two templates. Letterhead, tax breakdown, bank details, signature. WhatsApp + Email share flows.

HOURS 5–6 · DASHBOARD & MGMT

Financial dashboard with FY filtering. Client + play management with inline creation. Payment-proof upload.

HOURS 6–7 · POLISH + AUDIT

Activity log with device fingerprint. Settings page (company, bank, SAC). Mobile pass. Email OTP + phone allowlist.

The calls a generic SaaS wouldn't make, because its user isn't this user:

Decision

What it reveals about how Janam thinks

Collapsed proforma + tax into one row with a status enum.

Models the domain, not the document. A proforma becomes a tax invoice; it isn't a separate thing. The schema mirrors reality, so the UI has less to reconcile.

GST split auto-detected from the first two digits of the GSTIN.

Encodes a rule the user used to hold in their head. gstin[0:2] → state code → intra (CGST+SGST) or inter (IGST). The software remembers so the human doesn't.

Amount-in-words in Lakhs and Crores, not millions.

Designs for the actual reader. An Indian CA expects 'One Lakh Twenty Thousand.' The detail no global tool gets right is the whole point.

Advance presets are 25 / 40 / 50 / 75 — not generic defaults.

Picks the options from the real workflow. The presets are the user's history, encoded.

Modal-less inline client/play creation — form expands below the picker.

Eliminates context loss. Keep the user on one surface through a multi-step action.

Email OTP + phone allowlist instead of OAuth/SSO/passwords.

Right-sizes auth to the real user count. A 1–2-user family tool needs a 6-digit code and an audit log, not enterprise auth.

SAC code 998596 hard-coded, not configurable.

Knows the difference between a setting and a fact. The service is always performing arts; a config option here would only ever be wrong to change.

Inline creation — keep the user on one surface.

Creating a new client or play doesn't open a modal — the form expands below the picker and auto-selects on save. The same principle as inline OTP entry: don't break a multi-step action across screens.

IU Invoice — client picker with inline creation
PICKER
IU Invoice — inline client-creation form expanding below the picker
INLINE FORM · AUTO-SELECTS

Audit ≠ auth — both matter. Every write — created, advance received (with proof URL), converted, shared, paid, cancelled (with reason) — is logged with device info and timestamp, and survives the user. Auth is deliberately minimal: email OTP, a 1–2-user allowlist, two-step confirmation for writes. They solve different problems, and the system needs both.

IU Invoice — activity log with device fingerprint and timestamps
AUDIT · EVERY WRITE LOGGED
IU Invoice — email OTP entry, right-sized auth
AUTH · EMAIL OTP + ALLOWLIST

Three honest overrides — where I corrected the AI:

AI: two tables

→ one entity

Claude generated proformas + tax_invoices as two tables; I collapsed it to one row with a status enum. A proforma becomes a tax invoice — not a separate document.

AI: generic copy

→ IU's voice

Claude wrote 'Payment for the play…'; I rewrote it in Ideas Unlimited's exact voice. Generic doesn't pass the CA; specific does.

AI: enterprise auth

→ email OTP

Claude scaffolded OAuth + password reset + 2FA; I cut it to email OTP + a phone allowlist. A family tool doesn't need enterprise auth.

The AI compiled the code; the judgment about what was correct for this userwas the part that couldn't be prompted.

06 / THE OUTCOME

Built in seven hours. Live for a real business since.

7 hours
Build time, end to end
₹34.5L
Tracked, FY 2025-26
10
Invoices this FY
0
Manual errors

₹40K/year of rule-based invoicing work → ₹0, replaced by a system the user owns, built in one afternoon. This is Phase 1 of a 14-phase production-management platform: once the data model is right, scheduling, cast/crew, contracts, and revenue splits are additions, not rewrites. Phase 2 — a WhatsApp chatbot (Meta Cloud API webhook, Anthropic SDK for Hindi/Hinglish parsing, schema already migrated) — is designed, not yet deployed.

The fastest way to ship the right thing is to be the user who needs it. Seven hours of build is only credible because of the seven months before it — the AI compiled the code; I compiled the requirements every time I sent a wrong invoice.

// end of case study

Need someone
who ships?

JANAM.WORKCASE STUDIES© 2026