Problem, approach, outcome
01Problem
I needed a way to manage all of my client domains and websites, and the invoicing that goes with them. After years of independent work, that information was spread across two hosting providers, several domain registrars, FreshBooks and folders of invoice PDFs. Each one answered its own small question. None of them could tell me, for a single client, what they own, when it renews, and whether I’ve billed them for it.
02Approach
Keep the data where I already work, and generate everything else from it. The spreadsheet is the single source of truth, with tabs for clients, domains, hosting, invoices, open work and billable items. Python scripts read it and write plain HTML pages, which are never edited by hand, and a verification script checks the pages against the spreadsheet and fails if they’ve drifted apart.
Each view answers one question: what renews soon with auto-renew turned off, what work is done but not yet invoiced, which clients haven’t been billed in more than a year, and what each client earns after domain and hosting costs. Small jobs are logged as billable items when they happen and stay on that client’s page until they’re invoiced, so they can’t slip between invoices. FreshBooks still sends the invoices; the tracker makes sure nothing is missing from them.
Bringing the history in was part of the work. Years of invoice PDFs were read back into the spreadsheet, and lapsed domains were matched to the clients they belonged to, so every client page shows the whole relationship.
03Outcome
It does the job I built it for: it keeps track of renewals, billing and domains for each client, in one place.



