Booked
The agreed fee on every live job, finished or not.
47 ClientBook · Client book
47 ClientBook is one book for one person's own client work. Its whole model is a single chain: prospect, client, job, money, profit. I built it to answer one question: once the signatory and the costs are paid, what did this job actually leave?
The app sits behind a sign-in and is invite only for now.
Why I built it
Independent audit work runs on agreed fees, deposits, a signatory's fee and the odd direct cost. In a spreadsheet those blur together, and it is hard to tell what is owed, what is merely agreed, and what a job really earned. I wanted something small enough to update from a phone between meetings, with every money word meaning exactly one thing.
The application
Redrawn live from the application’s own layout with sample figures, not customer records.
What needs attention now, then the money, the pipeline and the state of the work, on one screen.
Sunday 27 September · H. Rahman
Show 3 more (2 deadlines, 1 to collect) →
To collect
$39,500
$18,500 of it is finished work
Received
$101,000
of $176,500 booked
Profit booked
$82,400
34% margin on the work
In the pipeline
$96,000
proposed, not yet won
$96,000
proposed to 4 prospects
Note Harbor Café — chased the fee, promised by Sunday
Call Greenway Gym — delivery slot confirmed
Prospects and clients with their stage, so nobody sits in the pipeline unattended.
6 records · 4 active
One client and one job: its fee, its dates, its status, and everything that has happened on it.
Changing rooms · 2026
Value
$42,000
Owner
K. Menon
Dates
01 Aug → 30 Sep 2026
Delivered
Not yet
Collected in a period, what is still to collect, profit booked, and who owes whom.
Year to date · 1 January to 27 September 2026
To collect
$39,500
$18,500 of it is finished work
Received
$101,000
of $176,500 booked
Profit booked
$82,400
34% margin on the work
In the pipeline
$96,000
proposed, not yet won
Profit is the fee, less the signatory fee and direct costs. Outstanding counts started work only.
How it works
A prospect moves from New to Contacted to Proposal sent to Won, then becomes a client on the same record. Lost and archived are states, not deletions.
Each job has an agreed fee, a signatory fee and direct costs, and moves from Planned to In progress to Report issued to Completed. Payments are recorded against the job.
Booked, Received, To collect, Agreed not started and Profit each have a single definition. A fee is only 'to collect' once the work has started; work not yet started is a commitment, not a debt.
Laid out for a phone, with one add button for a client, a note or a payment. Several businesses can sit under one login.
The money words
Most of the design work was here: deciding what each figure counts, so a busy month and a profitable month can never be confused.
The agreed fee on every live job, finished or not.
Cash in from clients, read from the recorded payments.
Unpaid fee on work that has started. Never on work that has not.
Fee still to be earned on jobs not yet started, net of any deposit. A commitment, not an invoice.
Fee, less the signatory fee, less other direct costs, on each job.
Counts for nothing in booked, owed or profit. Cash already received stays visible in Received.
What I decided
ClientBook is independent of 47 Ledger: no journal, no chart of accounts, no invoices or PDFs. Keeping it small is what keeps it quick to use.
Every change goes through a database function, and row-level security with owner-checked foreign keys means an account can only touch its own rows. Money cannot go negative and a prospect converts once, however the request is crafted.
The test suite runs the shipped migrations against an in-process Postgres (PGlite), so ownership, the money rules and the invitation gate are tested exactly as deployed, with no credentials and no cloud.
The free plan allows two projects and both were taken, so ClientBook lives in its own schema inside the Financials project. I wrote down exactly what that isolates and what it shares.
Built withNext.jsTypeScriptSupabase Postgres (RLS, plpgsql)Server ActionsPGlite testsHand-written CSS
Questions about it
I am happy to walk through the design, the data model or the decisions above. Send me a message.
The other two tools