feat(seo): rewrite the C1 snippets to earn the click (W8) #113

Merged
tudor merged 1 commits from feat/seo-metadata-c1 into main 2026-08-20 23:26:12 +00:00
Owner

W8 from the SEO programme, promoted from last to first by the W0 baseline.

Why this is the highest-value change available

Search Console says these pages already rank and simply are not clicked:

Query Impressions Clicks CTR Position
compare school performance 8,168 35 0.43% 6.1
compare schools 3,893 34 0.87% 7.2
school compare 873 80 9.16% 5.6

The last row is the control. Same page, slightly worse neighbourhood of the same results list, twenty times the click-through — which rules out a ranking explanation. When the snippet gives a reason to click, it gets clicked.

These SERPs are owned by the DfE own Compare school performance service. The old title spent its most valuable pixels on a lowercase brand nobody searches for, then followed it with a near-paraphrase of that service name. Beside the government own result, it read as a lookalike.

The approach

Intent in the title, differentiator in the description. The title matches what people type, so relevance is not traded away; the description carries the one fact gov.uk does not publish — how close you had to live to get a place.

Page Title Chars
/ Compare Schools Side by Side | schoolcompare 44
/compare School Comparison Tool — Up to Five at Once | schoolcompare 59
/rankings Primary & Secondary School League Tables | schoolcompare 56
/admissions School Admissions Deadlines & Offer Days | schoolcompare 56

All titles under Google 60-character truncation; all descriptions 139–150, under 155.

Three deliberate calls worth reviewing:

  • /compare takes the tool phrasing, not the homepage phrase. Two pages chasing compare schools is how a site competes with itself.
  • School Rankings became League Tables. The old title matched nothing anyone types; league tables is the phrase parents search, and it spikes each results day.
  • No hard school counts anywhere. The corpus moves with every data refresh, and this repo has already shipped one copy bug of exactly that kind (three schools against MAX_SCHOOLS = 5).

The root layout default title and Open Graph copy were saying something different again — they now agree with the homepage.

Tests

Guard the mechanics, not the wording, so the copy stays free to iterate: SERP length limits, intent keyword present, differentiator present, no brand-first title, no drift-prone counts. Plus two e2e journeys asserting the live pages ship a description and do not open with the brand.

Frontend 231 passed, backend 70 passed, tsc --noEmit clean, next build green.

What this does not cover

C4 — named-school queries — is the larger bucket (38,072 impressions) but its problem is position 20.2, not CTR. That is a ranking problem and belongs to the new workstream the baseline recommends, where it can be measured on its own.

Measuring it

Baseline frozen at 2026-08-20: C1 at position 7.7, 1.43% CTR, 295 clicks. CTR should move within two to four weeks of Google recrawling; position should not move much, and does not need to.

🤖 Generated with Claude Code

https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj

W8 from the SEO programme, promoted from last to first by the [W0 baseline](https://claude.ai/code/artifact/418c0e30-1782-464a-bb48-3feadefe829f). ## Why this is the highest-value change available Search Console says these pages already rank and simply are not clicked: | Query | Impressions | Clicks | CTR | Position | |---|---|---|---|---| | compare school performance | 8,168 | 35 | **0.43%** | 6.1 | | compare schools | 3,893 | 34 | **0.87%** | 7.2 | | school compare | 873 | 80 | **9.16%** | 5.6 | The last row is the control. Same page, slightly *worse* neighbourhood of the same results list, twenty times the click-through — which rules out a ranking explanation. When the snippet gives a reason to click, it gets clicked. These SERPs are owned by the DfE own `Compare school performance` service. The old title spent its most valuable pixels on a lowercase brand nobody searches for, then followed it with a near-paraphrase of that service name. Beside the government own result, it read as a lookalike. ## The approach **Intent in the title, differentiator in the description.** The title matches what people type, so relevance is not traded away; the description carries the one fact gov.uk does not publish — how close you had to live to get a place. | Page | Title | Chars | |---|---|---| | `/` | Compare Schools Side by Side \| schoolcompare | 44 | | `/compare` | School Comparison Tool — Up to Five at Once \| schoolcompare | 59 | | `/rankings` | Primary & Secondary School League Tables \| schoolcompare | 56 | | `/admissions` | School Admissions Deadlines & Offer Days \| schoolcompare | 56 | All titles under Google 60-character truncation; all descriptions 139–150, under 155. Three deliberate calls worth reviewing: - **`/compare` takes the tool phrasing, not the homepage phrase.** Two pages chasing `compare schools` is how a site competes with itself. - **`School Rankings` became `League Tables`.** The old title matched nothing anyone types; league tables is the phrase parents search, and it spikes each results day. - **No hard school counts anywhere.** The corpus moves with every data refresh, and this repo has already shipped one copy bug of exactly that kind (`three schools` against `MAX_SCHOOLS = 5`). The root layout default title and Open Graph copy were saying something different again — they now agree with the homepage. ## Tests Guard the mechanics, not the wording, so the copy stays free to iterate: SERP length limits, intent keyword present, differentiator present, no brand-first title, no drift-prone counts. Plus two e2e journeys asserting the live pages ship a description and do not open with the brand. Frontend 231 passed, backend 70 passed, `tsc --noEmit` clean, `next build` green. ## What this does not cover C4 — named-school queries — is the larger bucket (38,072 impressions) but its problem is **position 20.2**, not CTR. That is a ranking problem and belongs to the new workstream the baseline recommends, where it can be measured on its own. ## Measuring it Baseline frozen at 2026-08-20: C1 at position 7.7, 1.43% CTR, 295 clicks. CTR should move within two to four weeks of Google recrawling; position should not move much, and does not need to. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj
tudor added 1 commit 2026-08-20 23:21:09 +00:00
feat(seo): rewrite the C1 snippets to earn the click (W8)
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m3s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 11s
PR Checks / Build Frontend (no push) (pull_request) Successful in 44s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Failing after 11s
c0547c45e5
The baseline says these pages already rank and are not clicked. 'compare
school performance' sits at position 6.1 with 0.43% CTR; 'compare schools' at
7.2 with 0.87%. The brand query 'school compare' draws 9.16% from the same
neighbourhood of the same results page, which rules out a ranking explanation
— when the snippet gives a reason to click, it gets clicked.

These SERPs are owned by the DfE's own 'Compare school performance' service.
The old title put a lowercase brand nobody searches for in the most valuable
pixels, then a near-paraphrase of that service's name. Beside the government's
own result it read as a lookalike.

Intent in the title, differentiator in the description. Titles now match what
people type, and the descriptions carry the one fact gov.uk does not publish:
how close you had to live to get a place.

/compare deliberately takes the tool phrasing rather than the homepage's, so
the two pages stop competing for one phrase. The root layout's default and
Open Graph copy were saying something different again; they now agree.

No hard school counts in any of it. The corpus moves with every data refresh
and this repo has already shipped one copy bug of that kind.

Tests guard the mechanics — SERP length, intent keyword, the differentiator,
no brand-first title — and leave the wording free to iterate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj
tudor merged commit b187a478c9 into main 2026-08-20 23:26:12 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tudor/school_compare#113