A technical SEO case study on removing 45,000 hacked URLs with HTTP 410, rebuilding crawl budget, and restoring topical authority for a London property finance advisory firm.
- Total impressions, last 6 months: 73.7K
- Total clicks, last 6 months: 1.21K
- Impressions growth, last 3 months: +57%
- Clicks growth, last 3 months: +17%
- Hacked URLs cleared from the index: from about 45,000 down to 2,550
- Time to first measurable lift: roughly six weeks from the start of the 410 cleanup
The client is a regulated property finance advisory firm in London. They arrange bridging loans, development finance, commercial mortgages, and second charge lending for UK borrowers and SME landlords. Their team has decades of combined experience inside UK banks and specialist lenders. The deals are real, the credentials are verifiable, the regulatory footprint is intact.
What the firm did not have was visibility on Google. For seven years. Before they came to us, the site sat with an offshore agency running £150-a-month "SEO": spun content, footprinted backlinks, zero technical hygiene. At some point during that stretch the WordPress install was compromised. Attackers used the domain as a doorway farm. At peak, around 45,000 hacked URLs sat in Google's index, almost all of them serving spam from injected templates. By the time the firm reached us, organic performance had dropped to roughly 100 impressions a day. Branded queries for the firm's own name barely surfaced. Service page rankings were nonexistent. The site was, for all practical purposes, deindexed by neglect.
the hack was still hurting the site years later
Cleaning a hacked WordPress install does not remove the damage from Google's index. Google had already crawled, evaluated, and stored 45,000 injected URLs. The malware was gone from the server, but the URLs were not gone from Google.

Most of the hacked URLs now returned a 404. Googlebot kept re-crawling them anyway. Crawl budget was burning on dead pages. A separate layer of 5xx server errors was firing whenever Google touched the broken PHP that the partial cleanup had left behind. The technical layer had to be fixed before any content work would matter.
why 404 is not enough for hacked URLs at scale
HTTP 404 means "I cannot find this resource." It is non-committal. HTTP 410 means "this resource is gone, intentionally and permanently, and is not coming back." It is explicit. For Googlebot, the difference is meaningful. John Mueller of Google Search Relations has stated that 410 is processed slightly faster than 404 for deindexation because 410 is unambiguous. A 404 leaves the door open. A 410 closes it. At scale, with tens of thousands of URLs to clear, "slightly faster" becomes months of saved crawl budget.
We did not handle the 45,000 URLs one at a time. We ran a pattern-based sweep.
- Log analysis: We isolated every URL Googlebot had requested over 90 days.
- Pattern identification: We identified around a dozen URL patterns that covered roughly 95% of the hacked footprint.
- Server level 410 rules: We wrote rewrite rules at the Apache layer that returned a 410 Gone response for any URL matching a hacked pattern.
- Verification: We used the URL Inspection API in Search Console to confirm each pattern was returning 410.
The 5xx errors were a separate problem. We applied the same logic, returning a 410 at the server level so the broken PHP would never execute.
small, segmented, topical
We rebuilt the XML sitemap from scratch, capping each sitemap at 200 URLs and segmenting them by content type. We did this for two reasons:
- Freshness signalling: The proportional signal of changes is stronger in a smaller sitemap.
- Topical clarity: Each sitemap maps onto a topical cluster on the site, making those boundaries legible to the crawler.
The technical foundation was done. Content was next.
- Entity front loading: Every rebuilt service page now opens with a four-block structure: Entity declaration, Primary attributes, Audience, and Differentiator.
- Writing for semantic triplets: We write each factual sentence with one clear claim, avoiding passive voice and ambiguous pronouns so Google can parse the facts.
- E-E-A-T as structure: We built Experience, Expertise, Authoritativeness, and Trust into the structure of every service page through real deal examples, verifiable credentials, and primary source citations .
- Solving real borrower problems: We wrote each service page around an actual problem a borrower would arrive with, covering structures, trade-offs, timelines, and costs.
- Query analysis before writing: We mapped the predicates (verb-and-object structures) of the query domain, not just the keywords.
- Visual semantics: We rebuilt the front end with a restrained type system, a brand-appropriate color palette, real photography, and a predictable navigation structure to communicate trustworthiness through user behavior .
We made a deliberate decision not to use ChatGPT or any LLM to generate keyword lists. Instead, we ran manual SERP-by-SERP analysis to find queries that do not trigger an AI Overview and queries with sparse, low-authority competition .
Six months ago, the site was effectively invisible. Today, the work is still compounding as Google rediscontinues the real site.


| Metric | Value | Window |
|---|---|---|
| Total impressions | 73,700 | Last 6 months |
| Total clicks | 1,210 | Last 6 months |
| Average CTR | 1.6% | Last 6 months |
| Average position | 31 | Last 6 months |
| Impressions growth | +57% | Last 3 months vs previous 3 |
| Clicks growth | +17% | Last 3 months vs previous 3 |
| Not indexed URLS | 2,550 (from 45,000) | Current |
| Indexed URLS | 118 | Current |
- Drain residual URLs: Canonicalize or noindex the remaining low-value pages.
- Expand the topical map: Build supporting content clusters around central entities.
- Run an internal linking audit: Use a predicate-first model.
- Build off-site authority: Begin off-site work next quarter.
- Deploy schema: Add Article, Service, FAQPage, and Organization schema with attention to AI Overview attributes.
- Fix the crawl signal before anything else.
- Use 410, not 404, for pattern-based removal at scale.
- Segment the sitemap.
- Write content around entities and predicates.
- Solve the user's actual problem.
- Treat E-E-A-T as structure, not garnish.
- Treat design as a ranking signal.
- Do not let an LLM choose your keywords.
