All outcomes

Charity effectiveness research · UK

Do Gooder

A question about where donations actually go became a public database that grades UK charities on the accounts they file, not the adverts they run.

Before

Choosing between two charities meant reading two sets of annual accounts. They are public, they are long, and they are written for a regulator rather than for a donor. The figures that reach the public get chosen by whoever is doing the fundraising.

After

A search box over the register, fourteen charities graded on their filed accounts, every pair of them comparable side by side, and a rule set that publishes the threshold behind every flag it raises. Each grade is a page you can send someone.

UK charities graded on their filed accounts
14
head-to-head comparisons, every pair of the fourteen
91
live flag rules, each with its threshold published
6

The problem

The client wanted to answer a donor question and wanted the answer to exist in public rather than in a spreadsheet: how do you tell whether a large UK charity is actually any good at what it does? The Charity Commission already publishes what you would need, in that every registered charity files annual accounts and anyone can download them. Published is not the same as usable. The accounts run to dozens of pages, the figures worth comparing sit in different places in different filings, and the ratings the public actually reaches for are American and cover American charities. There was nowhere obvious to type a UK charity name and get a straight read on what it takes in, what it spends that on, and how it sits against the charity next to it.

What I built

Everything factual on the site comes from the public register through the findthatcharity API, so no financial figure about any charity is typed in by hand. Fourteen major charities got a full research pass and a letter grade on top of that data. The flag engine is eight rules, six of them firing today and two waiting on a data layer, each with its threshold written out on a methodology page, which makes a flag something a reader can check instead of a verdict they have to take on trust. Ninety-one comparison pages, every pair of the fourteen, generate from that one list, with the canonical URL normalised so the two orderings of a pair cannot compete with each other. Every graded charity renders its own scorecard as a real PNG at request time, so a grade shared in a message arrives as the grade. The whole thing, 201 URLs, generates from typed sources with no CMS behind it.

What it looks like

The flag rules page: six rules, each with its trigger threshold stated in a sentence and a caveat paragraph underneath explaining when the rule misfires.
The page the rest of the site rests on. Each flag states the number that fires it, so "expensive fundraising" means above 35% of donated and traded income combined rather than meaning whatever the reader assumes. Every rule also carries a caveat written against itself: the dormancy flag notes that some tiny charities are real, the deficit flag notes that a well-run grant-funded project spends last year's income on purpose. A grading site that only publishes its verdicts is asking for trust. Publishing the thresholds and the failure modes is what makes a flag arguable, which is the only version worth showing a donor.
Oxfam receipt page: grade B+, a one-line verdict, review date and author, share buttons, and an "expensive fundraising" flag chip.
A charity receipt above the fold. The grade is the hook, but the sentence beside it is the actual product: "a B+ charity with an A+ brand", then exactly which parts are strong and which are not. The review carries a date and a name, because a verdict nobody signed is a verdict nobody can be held to. Flags render as chips rather than prose so the reader sees the count before reading a word.
Scorecard grid splitting Oxfam into dimensions: humanitarian response rated strong, long-term development rated mixed, each with a headline and supporting paragraph.
One grade per charity is the thing every competitor does and it is the thing that makes the grade useless. This splits the organisation into the jobs it actually does and rates each separately, so a strong humanitarian operator can be marked down on published evidence of development impact without either judgement swallowing the other. Each supporting paragraph carries footnote markers into a numbered source list at the foot of the page.
The homepage search box with "cancer" typed in, showing a dropdown of six matching registered charities with their charity numbers and latest income.
Search against the live register, 170,000+ registered charities in England and Wales, returning the number and the latest filed income before the reader clicks anything. The box distinguishes "the register is not responding" from "no such charity", so a momentary upstream outage never tells a donor their charity does not exist.
Head-to-head comparison of British Heart Foundation against Macmillan Cancer Support, with both sets of figures aligned row by row.
Every pair of the graded fourteen has a page, which is 91 of them, generated rather than written. This is the format Google actually rewards: the queries landing here are the literal head-to-head ones people type when they have already narrowed to two. Putting both sets of filed figures in the same rows is the whole trick, because the comparison a donor wants to make is impossible on either charity's own website by design.

What happened

The comparison pages are the part that worked. They pull double-digit click-through out of Google on the head-to-head queries they were built for, like "british heart foundation vs macmillan cancer support", the searches people run once they have already narrowed to two charities. The whole site, 201 URLs, generates from public register data with no CMS behind it, and every graded charity renders its own scorecard as a real PNG at request time, so a grade shared in a message arrives as the grade.

Next.js 15Tailwind v4MDXfindthatcharity / Charity Commission dataNext OG image generationVercel

Provenance: Screenshots captured 2026-08-13 from live production at 1440px, DPR 2, unretouched, with no substituted data: every figure on screen is the charity's own filed number. Page counts measured 2026-08-13 against the live sitemap at do-gooder.co/sitemap.xml: 201 URLs, being 12 static, 7 pillar hubs, 77 articles, 14 receipts and 91 comparisons. Graded-charity count read from content/charity-research in LevityLeads/net-positive. Flag rules counted twice over: eight rule definitions in lib/charity/flags.ts, of which six are listed under "what we flag today" on the live methodology page and two under the pending data layer, so the headline metric counts the six that actually fire. Traffic from Google Search Console (sc-domain:do-gooder.co, 15 May to 12 Aug 2026: 12 clicks, 1,928 impressions, average position 34) and GA4 property 535765965 (180 sessions, 22 of them organic search). The search outage was confirmed on 2026-08-13 by direct request against do-gooder.co and against the upstream endpoint, and fixed the same day in commit 03fc8dc.

Want the same thing done to your operation?

Ten working days, a fixed fee, and one automation live before we finish. If there is nothing worth automating, I will say so in the findings.

Book a call