47 ClientBook · Client book

Your clients, your jobs, and what they actually earn.

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.

My role
Designed and built it
Started
September 2026
Status
Live, invite only
Built on
Next.js · TypeScript

Why I built it

The problem.

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

The main screens, in the order you meet them.

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.

clientbook.fortysevenlab.com
ClientBookYour clients, and what they are worth

Today

Sunday 27 September · H. Rahman

Last synced just now
Needs you now3
Harbor CaféFee outstanding$18,500 · 12 days overdueReceived
Greenway GymDelivery due FridayInstallation · In progressNote
Atlas StudioProposal not followed upProposal sent · 9 days agoFollow up

Show 3 more (2 deadlines, 1 to collect) →

MoneyDetails →

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

PipelineProspects →

$96,000

proposed to 4 prospects

Contacted 2Proposal sent 1Won 1
Work by status
Planned 3In progress 4Report issued 2Completed 11

Note Harbor Café — chased the fee, promised by Sunday

Call Greenway Gym — delivery slot confirmed

How it works

Prospect, client, job, money, profit.

  1. 01

    Prospect to client

    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.

  2. 02

    Jobs carry the money

    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.

  3. 03

    Words that mean one thing

    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.

  4. 04

    Phone first

    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

Each one means exactly one thing.

Most of the design work was here: deciding what each figure counts, so a busy month and a profitable month can never be confused.

Booked

The agreed fee on every live job, finished or not.

Received

Cash in from clients, read from the recorded payments.

To collect

Unpaid fee on work that has started. Never on work that has not.

Agreed, not started

Fee still to be earned on jobs not yet started, net of any deposit. A commitment, not an invoice.

Profit

Fee, less the signatory fee, less other direct costs, on each job.

Cancelled

Counts for nothing in booked, owed or profit. Cash already received stays visible in Received.

What I decided

Four calls I made, and why.

01

Deliberately not a ledger

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.

02

The rules live in Postgres

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.

03

Tests run the real SQL

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.

04

One Supabase project, its own schema

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