Illustrative case study

A fictional business. The figures are a modelled scenario, not a client result.

Get Ranked On Top · Examinations

Paper 1 · Technical SEO · Time allowed: 7 months

A*46/50
Candidate
Quillbury Tutors
Centre
Private tutoring agency · Oxford
Candidate no.
04517

Marking the site's homework: fixing 30,000 duplicate tutor-search pages

Indexed junk URLs down 89%

30,800 → 3,390 indexed filter URLs

Instructions to candidates

  • • Answer all 5 questions in Section A.
  • • Show your working: every fix is logged and re-crawled.
  • • Marks are awarded for pages that deserve to rank — not for volume.

First sitting

U

10/50

Resit, month 7

A*

46/50

Preamble

The question set

Faceted subject-and-level filters generated tens of thousands of near-identical URLs that wasted crawl budget and diluted rankings.

Quillbury Tutors matches students across Oxford with vetted tutors for 11+, GCSE, A-level and Oxbridge admissions. Families search by subject and level; the site let them filter by area, lesson mode, availability and sort order too, and every one of those choices minted a new, crawlable URL.

The result was a search index full of near-identical pages competing with each other, while the pages that should rank — “A-level chemistry tutor in Oxford” — sat five clicks deep and were crawled once a month at best.

Examiner’s summary

  • 30,800 junk URLs indexed
  • 640 pages that deserve to rank
  • 74% of crawl on parameters
  • Avg. position 11.4 on core terms

48 duplicates for every real page.

Section A

The audit, marked

[50 marks]

Crawl logs, Search Console exports and a full render of 30,000+ URLs, set out as questions. Switch to the resit to see the same paper after the fixes.

Show marks for

Total 10 / 50

  1. Q1.

    Faceted navigation

    Explain how six search filters can turn 640 useful pages into 30,800 indexed URLs.

    Subject (28) × level (9) × area (14) × mode (3) × availability (4) × sort (4) were all plain <a href> links, so Googlebot followed every combination it could reach.

    • 30,800 filter URLs in the index against 640 real landing pages
    • 74% of Googlebot hits spent on parameter URLs
    • 4,900 indexed pages reading “0 tutors found”
  2. Q2.

    Canonicalisation

    Which URL is the canonical for GCSE maths tutors in Oxford? Justify your answer.

    Every filter page declared itself canonical, and ?level=gcse&subject=maths and ?subject=maths&level=gcse were treated as two different pages.

    • 1,912 duplicate clusters with no agreed canonical
    • Google ignored the declared canonical on 38% of sampled URLs
    • Parameter order, case and trailing slashes all produced new variants
  3. Q3.

    Core Web Vitals

    Assess the tutor-search results page on a mid-range phone over 4G.

    Results rendered client-side after three API calls; tutor photos loaded without dimensions and pushed the list down.

    • LCP 4.1 s (p75, mobile)
    • INP 380 ms on filter taps
    • CLS 0.24 from late avatars
  4. Q4.

    Internal linking

    Trace the path from the homepage to the A-level chemistry page.

    There was none: subject hubs were only reachable through filters, so 61% of internal links pointed at parameter URLs instead.

    • 212 hub pages more than 5 clicks deep
    • 61% of internal links to parameter URLs
    • No links between related subjects or levels
  5. Q5.

    Thin content

    What should a search engine do with a page that lists no tutors?

    Index it, apparently. Empty combinations returned 200 OK with boilerplate copy.

    • 4,900 empty-result pages returning 200
    • Average 41 words of unique copy per filter page
Section B

Model answers

The work ran on our Signal plan (technical seo): four tactics, applied in the order the crawl data said would recover the most budget first.

B1

Faceted navigation

  1. (a)Facet rules decided by demand: only subject and subject + level combinations with search volume get a clean, crawlable path such as /tutors/maths/gcse/.
  2. (b)Area, mode, availability and sort became buttons that update results in place: no href, so nothing new to crawl.
  3. (c)Empty combinations return a helpful 404 with nearby subjects, never a 200.

B2

Canonicalisation

  1. (a)One URL shape: lower-case, fixed parameter order, trailing slash, enforced with 301s at the edge.
  2. (b)Remaining parameter URLs canonicalise to their clean parent and carry noindex, follow until they drop out.
  3. (c)XML sitemaps rebuilt to list only the 1,180 canonical pages, split by subject.

B3

Core Web Vitals

  1. (a)Search results server-rendered and cached per clean URL; filters hydrate afterwards.
  2. (b)Tutor photos given fixed dimensions, AVIF sources and a lazy boundary below the first six cards.
  3. (c)Filter handler debounced and moved off the main thread to bring INP under 200 ms.

B4

Internal linking

  1. (a)A subject × level matrix on every hub, so each landing page is at most three clicks from home.
  2. (b)“Students also searched” links between related subjects (chemistry ↔ biology, 11+ ↔ KS2 maths).
  3. (c)Breadcrumbs with structured data that follow the clean URL tree.

Practical · try the facet rules

Before · indexed as its own page

/find-a-tutor?subject=maths&level=gcse

One of 30,800. Duplicate of its neighbours.

After · Subject + level landing page

/tutors/maths/gcse/

Crawlable link, self-canonical, in the XML sitemap and linked from the subject matrix.

✓ Indexable — earns its place.

Section C

Revision timetable

[7 months]
  1. M01Mock examCrawl-log and index audit; 30,800 filter URLs mapped to 640 real pages.30,100 junk URLs
  2. M02Facet rulesDemand-led facet rules shipped; area, mode and sort links turned into buttons.24,600 junk URLs
  3. M03CanonicalsURL normalisation, 301s and parent canonicals; sitemaps rebuilt to 1,180 URLs.16,900 junk URLs
  4. M04SpeedServer-rendered results and fixed image boxes: LCP 4.1 s to 2.3 s.10,200 junk URLs
  5. M05LinkingSubject × level matrices and breadcrumbs; hubs moved to within three clicks.6,400 junk URLs
  6. M06Thin pages4,900 empty-result pages to 404; filter-page copy rewritten for top 120 hubs.4,300 junk URLs
  7. M07Final paperRe-crawl confirmed; monitoring alerts on new parameter URLs.3,390 junk URLs
Results slip

Grades awarded

Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.

Organic sessions

+82%

Tutor-match enquiries

+61%

Avg. position (core terms)

11.4 → 4.2

0k10k20k30kM0M1M2M3M4M5M6M7Indexed junk URLs down 89%
Indexed filter (parameter) URLs, Google Search Console, modelled.
Organic sessions per month: 9,400 → 17,100.
page 1 ends

Avg. position, core terms: 11.4 → 4.2. Enquiries 212 → 341 a month.

LCP (p75 mobile)

4.1 s → 2.1 s ✓ pass

INP

380 ms → 160 ms ✓ pass

CLS

0.24 → 0.04 ✓ pass

Mark sheet: core Oxford keywords
KeywordMonth 0Month 7Position 20 → 1
maths tutor oxford143
a level chemistry tutor oxford122
gcse english tutor oxford94
11 plus tutor oxford166
physics tutor oxford113
oxbridge interview preparation137
private tutor oxford82
home tutor oxford87

END OF QUESTION PAPER

Next paper

Get a plan like this

Faceted filters, duplicate URLs and slow search pages are fixable. Signal starts with the same crawl-log audit and marks every page on whether it deserves to rank.