Untangling 40,000 auto-generated pages so a telehealth service could actually rank
+221%
organic consultations
SCOPE · wattlebird.example
M00/10
URLs ON SCOPE
40,000
PRUNED
0
VALUABLE INDEXED
2,900
INP p75
410ms
FIXES ON APPROACH
WTB-01 · ONLINE GP HUB
“online gp melbourne” · 4,400/mo
ACQUIRING · lock expected M02
Each square is a crawlable URL that added nothing; each green dot a page with real demand. Amber diamonds are target clusters. Run the sweep to replay the 10-month engagement.
01Contact report
Forty thousand blips. Almost none of them real.
Programmatic 'condition × suburb' pages created a crawl trap of near-duplicates and Google was ignoring most of the site.
Wattlebird Telehealth had generated a page for every condition in every Melbourne suburb: roughly 180 conditions × 220 suburbs. Each one was technically unique and practically identical. Googlebot spent its visits wading through permutations, the index kept a fraction, and the pages patients actually booked from were crawled so rarely that updates took weeks to surface.
URL INVENTORY · MONTH 00
40,000
- Near-duplicate condition × suburb pages31,400
- Thin but salvageable, merged into hubs5,700
- Pages with real search demand2,900
02Diagnosis · NOTAMs
Seven notices to everyone flying this site.
- IDX-01CRITIndex
27,900 URLs in “Crawled — currently not indexed”. Google had seen the pages and decided most were not worth keeping.
- CRW-02CRITCrawl
Log files: 78% of Googlebot requests hit condition × suburb permutations; the 140 pages that convert were crawled every 19 days on average.
- DUP-03HIGHContent
Shingle analysis put 92% of programmatic pages above 85% similarity — the suburb name was the only thing that changed.
- CAN-04HIGHCanonicals
Every permutation self-canonicalised, and ?sort / ?avail parameters spawned an unbounded URL space on top.
- MAP-05MEDSitemaps
One 40,000-URL sitemap, every <lastmod> stamped with the build date, so it carried no freshness signal at all.
- INP-06HIGHCore Web Vitals
INP p75 410 ms on mobile: the booking widget hydrated 1.1 MB of JS on load and a third-party chat blocked the main thread.
- SDA-07MEDStructured data
No MedicalWebPage, reviewer or organisation markup; clinical review existed but was invisible to crawlers.
03Flight plan
Four vectors, flown in sequence.
Built on our Signal plan: fixes shipped as pull requests to the site’s repo, measured against log files and field data rather than a monthly PDF.
VECTOR 01 · HDG 045°
Programmatic SEO
Rebuild the template, not the pages
40,000 permutations collapse into ~180 condition hubs plus state-level service pages. A page only generates if it clears a uniqueness gate: clinician-reviewed copy, real eligibility rules, live consult hours and Medicare notes specific to that condition.
VECTOR 02 · HDG 135°
Index management
Clear the scope, deliberately
31,400 URLs return 410; the 5,700 with links or traffic 301 into their hub. Parameters are blocked at robots level, sitemaps split by page type with honest <lastmod>, and log files watched weekly until crawl share moves.
VECTOR 03 · HDG 225°
Core Web Vitals
Fix interaction before ranking
The booking widget is split and loaded on intent, long tasks are broken up with yielding, chat waits for idle, and the DOM on hub pages shrinks by 60%. INP p75 is tracked from field data, not lab runs.
VECTOR 04 · HDG 315°
Structured data
Make clinical trust machine-readable
MedicalWebPage with reviewedBy and lastReviewed, Physician entities for reviewing GPs, MedicalOrganization and BreadcrumbList — validated in CI on every template change so the markup cannot quietly break.
04Flight log
10 months, one sweep at a time.
- M01
Log-file and crawl baseline; URL inventory classified into prune / merge / keep.
pruned 2,200INP 405ms - M02
Uniqueness gate defined; first 2,200 zero-impression URLs return 410.
pruned 9,800INP 380ms - M03
Parameter spaces blocked; sitemaps split by type; 7,600 more URLs pruned.
pruned 18,600INP 330ms - M04
Condition-hub template v2 live for 40 conditions with clinician review dates.
pruned 25,100INP 270ms - M05
Booking widget split and deferred — INP p75 falls below 300 ms.
pruned 28,900INP 220ms - M06
301 merge of 5,700 salvageable pages into hubs completes; MedicalWebPage schema ships.
pruned 30,600INP 190ms - M07
INP p75 crosses the 200 ms ‘good’ line; crawl share on money pages passes 60%.
pruned 31,100INP 170ms - M08
Remaining hubs published; Physician reviewer entities linked site-wide.
pruned 31,400INP 155ms - M09
Final prune batch: 31,400 removed. Indexed valuable pages pass 7,500.
pruned 31,400INP 145ms - M10
Steady state: weekly log checks, CI schema tests, consultations +221% on baseline.
pruned 31,400INP 140ms
05Landing report
Clean scope. +221% organic consultations.
Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.
Low-value URLs pruned
31,400
Indexed valuable pages
+184%
INP (p75)
410ms → 140ms
Organic sessions
+167%
ORGANIC SESSIONS & CONSULTATIONS · M00–M10
— sessions— consults
CRAWL SHARE · GOOGLEBOT REQUESTS
Modelled from server logs: share of Googlebot requests landing on pages that can convert (green) versus permutations (coral).
| Callsign | Query | Vol/mo | Before | After |
|---|---|---|---|---|
| WTB-01 | online gp melbourne | 4,400 | 38 | 3 |
| WTB-02 | telehealth medical certificate | 6,600 | 46 | 2 |
| WTB-03 | online prescription renewal | 3,600 | 71 | 5 |
| WTB-04 | uti telehealth consult | 1,900 | 89 | 6 |
| WTB-05 | after hours gp online victoria | 1,300 | — | 8 |
| WTB-06 | bulk billed telehealth | 2,900 | — | 7 |
| WTB-07 | mental health care plan online | 2,400 | 64 | 4 |
| WTB-08 | telehealth doctor melbourne | 2,900 | 54 | 4 |
| WTB-09 | online dermatology referral | 880 | — | 11 |
| WTB-10 | telehealth gp near me | 5,400 | 62 | 9 |
Cleared to land_
Get a plan like this
If your site has more pages than Google wants, Signal finds the noise, clears it, and lets the pages that matter lock on.