6 min read
£1,330 a year off three clients' bills
I kept telling people I save clients money without ever putting a number on it. So I built a running total that works itself out daily, and made it show where every line came from.

For about a year I have been saying a version of the same sentence. "I build sites that cost almost nothing to run." True, and completely unverifiable, which makes it worth roughly nothing to the person hearing it.
So I added up what my clients have actually stopped spending. Three of them, £1,330.05 a year between them, of which £828.65 has already stopped and the rest lapses as each remaining contract reaches its term date. It is on my hire page and my now page, and it recalculates every day.
The interesting part was not the arithmetic. It was working out what I was allowed to count.
The number needed a rule#
The tempting version of this is annualised: add up every monthly bill anyone ever cancelled because of me, multiply by twelve, put a big number on the page. That is also how you end up with a figure you cannot defend when someone asks about it in a meeting.
So the total runs on one rule. A saving is dated from when the old cost actually stopped, not from when the new site went live, and not from when I invoiced.
Those are three different dates and they are often months apart. WAKOOS went live on 22 August. Tiny Tails went live in June. The Squarespace subscription behind Tiny Tails was paid up to 25 October, so as I write this it has saved her exactly nothing. Cancelling an annual plan early refunds nothing, so the only sensible thing to do is let it lapse, which means the saving starts in two months' time.
Two of my four lines are dated in the future for that reason. They show on the page, greyed into a separate total, counting for nothing until the day they lapse. It is a less impressive number than the alternative. It is also one I can stand behind.
The headline and the running total are two different things, and it took me a couple of attempts to make that read clearly. The headline is the annual cost of every contract that has been cancelled, because those decisions are made and the money stops either way. The running total underneath is only what has actually been saved so far, which is a much smaller number and will be for a while.
Not everything drips#
There is one exception to counting by the day. Scott had already paid for the year ahead when he moved across, and moving across got that money back. He is not saving it gradually. He has it now.
So that line is banked in full on the day it landed rather than accruing, and the daily part does not start until July 2027, which is when the year he had paid for would have run out. Without that second date the same twelve months would be counted twice, once as a lump and again as a drip, and the total would quietly inflate to about double what he actually saved.
From July 2027 that line starts accruing like any other, and adds its next £338.65 across the following twelve months. So it sits still for eleven months and then carries on for as long as he is not paying that bill.
It is two extra fields and one more test. It is also the difference between a number I can explain and a number that just looks good.
What I left out#
The exclusions took longer to decide than the inclusions.
- Darras Index. I run that site myself. Any hosting saving on it is mine, not a client's, and it has no business in a total about money saved for other people.
- Popcorn Simulation Gaming. Both new builds with no prior site. Nothing stopped, so nothing saved. The case studies say £0 to run, which is the honest version of the same point.
- Covertime. Employed work, not mine to claim.
- Skin Defence. Not launched yet.
How it works#
The site is a static export, so there is no server to ask what today's date is. The total is worked out in the browser instead, which is the only way to get a figure that is right on the day it is read rather than right on the day I last deployed.
The maths itself is a pure function with the current date passed in, which means it can be tested without mocking the clock:
export function accrued(s: Saving, now: Date): number {
if (new Date(s.from) > now) return 0;
const days =
(now.getTime() - new Date(s.accruesFrom ?? s.from).getTime()) / DAY;
return (s.upfront ?? 0) + (days <= 0 ? 0 : (s.annual / 365.25) * days);
}The days <= 0 is the whole ethical position: a saving that has not started yet accrues nothing. The tests pin that behaviour explicitly, along with the rule that a future-dated line stays out of the annual run rate until it starts. 365.25 rather than 365 so the total does not jump on a leap year, which will matter in 2028 and never be noticed by anyone.
Every figure also traces back to a ledger in the repo that shows the invoice lines and the arithmetic that turned them into an annual number. If a prospective client ever wants to know why I claim £338.65 rather than £438.01, the answer is written down rather than remembered.
The bit that annoyed me#
Reading three sets of old invoices back to back, one pattern turned up every time: the prices go up quietly and they go up fast.
Split Lip's plan rose £57.13 in a single year, from £380.88 to £438.01. That is fifteen per cent for identical service. Two of the four WAKOOS charges had gone up in July alone. Nobody had been notified in a way they registered, because nobody reads a renewal email about a direct debit that has been leaving their account for four years.
None of this is a scandal. It is a business model that works because switching is annoying and £8 a month is beneath the threshold at which a small business owner starts opening spreadsheets. It only becomes obvious when you line up thirteen months of billing history and read it in one sitting, which is not something anyone does for fun.
Roughly speaking, my clients were paying between £230 and £438 a year for a brochure site. Every one of those sites now sits on free static hosting and loads faster than what it replaced.
Where it goes next#
£1,330.05 a year of cancelled contracts, £828.65 of it already stopped, the rest falling away in October and January. The running total sits at £341 and grows by £1.34 a day today, reaching £3.64 a day once every contract has lapsed. It passes £1,000 next June.
If you are paying somebody a monthly fee for a website that does not change very often, the thing worth doing is not hiring me. It is opening your billing history and reading every line back to the beginning. You may well find you are paying for mailboxes nobody uses, or a business listing you have never once looked at.
Then, if you decide you would rather it were on hosting that costs nothing, my inbox is open.
Keep reading

38 things I keep forgetting
No two sites I build get built the same way. Some start in Lovable, some start from a repo I pulled down, some start from nothing. The list is the only part that stays the same.

Built to run without me: my first client handovers
Three client sites, built, handed over, and now running without me: client-owned, editable by them, zero ongoing cost. What I'm learning about the difference between shipping code and delivering a product.

WAKOOS Centre4Children is live
WAKOOS Centre4Children is up: a charity nursery in Billingshurst, off an ageing drag-and-drop site builder and onto Next.js on Cloudflare. £781 a year of hosting became about £20, and the £20 is just the domain names.