The last 10%: what makes the Council Spend Map feel complete, and what makes it 10x

Review of the live app (urban-fresco-778h.here.now) against the exported spend.json of 2026-08-28. Every figure below is from that file or the app code.
Where the app stands numbers from the live export
319
councils in the app, of 339
105.5m
payment rows behind it
62%
of spend carries a service category
2
implausible councils in the national top 6
20
councils show £0 for the last 12 months
0
shareable URLs, OG tags, source links
12
months of history shown, of up to 17 years collected
113
councils with records only since 2024

The pipeline, the map, the coverage floor, and the Treasury toggle are done and done well. The gap is not more rows. The gap is that verified rows do not yet become things a person can trust at a glance, discover without a question in mind, and send to someone else.

1 Trust: fix before anything else first 30 seconds

These are the things a journalist or a sceptical resident hits before they have scrolled once.

1a. The hero states a false fact

Ranked by last-12-months total, the live export puts a 215k-resident borough second in England and a 157k-resident district sixth. These are almost certainly duplicated publications or pass-through flows, not spending.

CouncilTypeResidentsLast 12 m£ / resident
EssexCounty1.56m£2.98bn£1,909
North TynesideMet borough215k£2.84bn£13,207
SurreyCounty1.25m£2.25bn£1,803
LancashireCounty1.29m£1.84bn£1,422
BirminghamMet borough1.18m£1.71bn£1,441
TendringDistrict157k£1.68bn£10,723
Fix: a plausibility gate in the export. Compare per-resident spend with the median for the council type. Above ~3x: hold from rankings and the hero, render grey on the map with an "under review" tooltip, list on a data-quality page. Effort: small. Export plus one app state.
£90.5bn
total spend
299
councils
North Tyneside
top spender
Debt, treasury and investment movements are excluded.
£86.1bn
total spend
297
councils ranked
Essex
top spender
2 councils are held out of rankings while their published totals are under review. See which ›
1b. Twenty councils show £0 for the default period

Leeds, Stoke-on-Trent, Northumberland, Torbay, Wrexham, Rutland and 14 others have no rows inside the Aug 2025 to Jul 2026 window. Their latest published month is earlier. Today they render as a blank card and a grey polygon with no reason.

Leeds
Met borough · est. 822k residents · records since 2010
£0
spend excl. treasury
2,115k
payment records
—
12 months vs prior year
No card-spend retailer data available for this council yet.
Leeds
Met borough · est. 822k residents · records 2010 to Mar 2025
Leeds has not yet published payments for Aug 2025 to Jul 2026. Showing its most recent 12 published months (Apr 2024 to Mar 2025).
£1.62bn
Apr 24 to Mar 25
2,115k
payment records
+4%
vs prior 12 months
Fix: export latest_month per council; app falls back to the last published 12 months with a visible caveat, and drops the council from cross-council rankings for the live window. Never a silent zero. Effort: small.
1c. Nothing is linkable

No hash routing, no pushState, no Open Graph tags. Every discovery dies in the tab it was made in. For a product whose growth loop is "look at this", this is the cheapest 10x on the page.

councilspend.map/#c/E08000025?p=12m&m=percap
councilspend.map/#cat/Adult%20Care?type=met
councilspend.map/#s/Serco
councilspend.map/#cmp/E08000025/E08000035
Council Spend Map
Birmingham · £1.70bn
Birmingham City Council spending, last 12 months
£1,441 per resident · Adult Care 30% · 305k payments · records since 2024
Fix: serialise S to the hash on every update(), restore on load, add a Share button (navigator.share with clipboard fallback). OG images need a tiny pre-render step at export time (one PNG per council, category, and top supplier). Effort: small for URLs, medium for OG images.
1d. Provenance is invisible

The whole repository is built on manifests with source URLs, thresholds, and periods. The app shows none of it. A Sources section turns "trust us" into "check for yourself", and closes the open item in todo.md under coverage.

Sources official transparency data
Payments to suppliers over £500
Monthly CSV · Jan 2024 to Jul 2026 · 31 files · 289k rows
Open ›
Purchase card transactions
Quarterly CSV · Apr 2024 to Jun 2026 · 9 files · 16k rows
Open ›
Known gaps
Nov 2024 supplier file not published by the council. Recorded 2026-06-12.
1 gap
Publication threshold £500. Amounts are as published; no values are changed. Last checked 2026-08-28.
Fix: export a compact sources block per council from the manifests (family, cadence, first/last period, file count, row count, URL, gap list). Add a short "How this works" page. Effort: small to medium. All the data exists.

2 Complete: what a finished product has fills obvious holes

2a. Peer framing, everywhere

"#4 of 299" compares Birmingham with Rutland. "#4 of 36 met boroughs" is fair. The compare view should suggest peers, not ask the user to pick from a list of 319.

Birmingham
Met borough · 1.18m residents
Adult Care per resident
#3 of 36 met boroughs · median £312
£430
Compare with a similar council
LeedsManchesterSheffieldChoose another…
£509m
Adult Care
£398m
£403m
Housing
£201m
£181m
Child Services
£271m
Fix: ranks scoped to type by default; peer set = same type, nearest population (upgrade to CIPFA nearest neighbours later). Effort: small, app only.
2b. History that matches what you collected

Some councils have records since 2009. The app shows 12 bars. "Is it going up?" cannot be answered. Five annual totals per category series is a small export change (about +5 numbers per series) with a large effect.

Monthly Spend last 12 months
Aug 25Nov 25Feb 26May 26
By yearBy month
Adult Care financial years
2020/2121/2222/2323/2424/2525/26
Grey years predate this council's category coverage. Up 72% over five years, against a met-borough median of +41%.
Fix: add fy arrays (last 5 financial years) to cats series; skip for sup to protect file size, or include for the top 15 per council only. Effort: small export, small app.
2c. The third axis: "How it's spent"

Agency staff, consultants, energy, hotels, food. The most emotionally charged resident questions live here, and the taxonomy already has the dimension (spend_category, 24 categories). It stays gated on ~60% coverage of the seven salient categories, but it belongs as the third tab, not a footnote.

What forWho got itHow it's spent
AS
Agency staff
£118m
C
Consultants & professional services
£76m
E
Energy & utilities
£45m
Covers 61% of this council's spend. Not shown for councils under the coverage floor.
Status: data-gated (13.7% coverage in the last profile). The value-map and supplier-implied tiers are the lever. Effort: medium data, small app.
2d. Honest empty and edge states

Small things that stop the product feeling finished:

TodayProposed
"No card-spend retailer data available" on every empty supplier list (legacy copy)"No published payments to companies in this period"
"records since 202" and "since 1899" on some cards (bad source dates)Clamp display to the first plausible year; keep the raw fact in Sources
Grey polygon, no reason on hoverTooltip states one of: not yet collected, under review, not published for period, category coverage too low
Supplier page with no "what they do"One line from types.csv: "Outsourcing and facilities company"
No methodology anywhere"How this works" page: sources, thresholds, what is excluded, versions
Effort: small, mostly copy and one export field.

3 10x: from lookup tool to discovery tool why people come back

The app answers "how much". People come for "what is notable". Three additions change what the product is.

3a. Findings per council highest leverage

Six auto-generated, neutral, factual sentences at the top of every council card. Each links to the view that proves it. No adjectives. The user judges. This gives every user type a reason to scroll.

Birmingham
Met borough · 1.18m residents · records since 2024
What stands out
Spends £430 per resident on Adult Care, 1.4x the met-borough median.
›
Housing is 24% of spend. Median for its type is 11%.
›
Largest company paid is Serco, £41m, 2.4% of all spend.
›
Agency staff spend is up 38% on the prior 12 months.
›
78% of payments carry a service label. National median is 46%.
›
Paid 1,204 suppliers in the period; the top 10 received 31%.
›
How: a fixed library of ~15 finding templates ranked by deviation from the type median; pick the top 6 that pass a minimum-evidence rule. Computed at export time so the app stays static. Effort: medium. The comparison data is already in the file.
3b. Actual payments most concrete

Everything in the app is an aggregate. The thing residents and journalists actually want is a row. The top 25 payments per council and per published supplier is a few hundred KB, and each row links to the raw source file, which is the strongest trust signal you have.

Largest payments last 12 months
S
Serco Ltd
14 Mar 2026 · Adult Social Care · "ICT managed service"
£4.2m
BC
Birmingham Children's Trust
1 Apr 2026 · Children & Families · "Contract payment Q1"
£3.9m
B
Balfour Beatty
22 Nov 2025 · Highways · "PFI unitary charge"
£3.1m
H
Hays Specialist Recruitment
30 Jun 2026 · Corporate · "Agency staff June"
£1.8m
Values as published. Open source file › · Download all payments (CSV)
How: export top_payments (date, recipient, department, purpose, amount, source file id) for each council and each published supplier. Reuse the manifests for the file link. Effort: small to medium export, small app. Values shown are illustrative.
3c. Supplier profiles that say what the money bought

Today a supplier page shows totals and rivals. A profile should answer: what do councils buy from them, how many councils, the trend, and who they are (Companies House, charity register). This is Phase 4 of the naming review, and it is where the map becomes a reference.

Serco
Outsourcing and facilities company · Companies House 02048608 · #3 of 84 in Construction & contracting
£612m
from 71 councils, 12 months
+9%
vs prior 12 months
Peterborough
biggest customer
What councils buy
W
Waste collection
£241m
L
Leisure centre operation
£140m
IT
IT and back office
£87m
Illustrative values. Registry match by reviewed rule, never by name alone.
How: registry joins on the 272 audited identities first; spend_category split per supplier from the classifier; 5-year series for the top 400. Effort: medium data, small app.
3d. Open the data

Journalists build stories on CSVs, and each story links back. The API already runs on the Mini (query/api_server.py); the export can also write one CSV per council to static hosting today.

Download Birmingham payments
CSV · 305k rows · 41 MB · Jan 2024 to Jul 2026 · as published
Download
Download this view
Adult Care, all met boroughs, last 12 months · 36 rows
CSV
API
GET /v1/councils/E08000025/payments?from=2025-08&supplier=serco
Docs ›
How: static per-council CSVs first (no server), API public when all 339 are complete. Effort: small for static CSVs; medium for public API hosting.

4 Impact against effort

Judgement, not measurement bar = expected effect on trust and return visits; right column = effort
Plausibility gate + zero-window handling
small
Shareable URLs + OG cards
small / med
Findings per council
medium
Actual top payments + source links
small / med
Sources section + methodology page
small
Annual history (5 financial years)
small
Peer ranks + suggested comparisons
small
Supplier profiles + registries
medium
"How it's spent" axis
medium, gated
CSV download + public API
small → medium

5 Suggested order

Batch 1 · Trust

The hero must never say a false thing. Every view must be linkable and checkable.

Batch 2 · Discovery

Give people something to find without a question in mind.

Batch 3 · Depth

Data-gated. Ship each when its coverage or registry evidence is ready.
One sentence

The data work has earned this. The gap now is not more rows; it is turning verified rows into things a person can see, trust, and send to someone else.