Illustrative case study

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

Field survey · Sheet 01Station: Ruse, Danube km 495Duration: 6 months

Dunavski Bryag Trust — River conservation NGO · Ruse

Rebuilding a Danube conservation charity's crumbling website from the riverbed up

Crawl errors down 96%

Gauge read 1,948 at survey, 78 at month 6. Watch the water fall →

A decade of plugins left the site slow, half-broken and full of 404s, and grant funders couldn't find their research reports.

5001,0001,5002,000M0

§1The challenge

A decade of sediment on a site that should have been a library.

A decade of plugins left the site slow, half-broken and full of 404s, and grant funders couldn't find their research reports.

The Trust monitors 80 km of the Bulgarian Danube bank around Ruse: water quality, sturgeon spawning, island restoration. Its funding depends on research reports that grant officers in Sofia, Vienna and Brussels need to find, cite and download. Over ten years and three redesigns-by-plugin, those reports sank out of sight.

Every broken URL was a dead end for a crawler and a funder alike. The brief was not a facelift: it was to rebuild from the riverbed up, and to prove the water was falling with a measurement that anyone on the board could read.

Composition of the flood · M0

404 Not Found1,214plugin galleries and old event pages deleted without redirects
Soft 404412an events calendar spawning empty date pages to the year 2099
Redirect chains322three to five hops from three successive domain moves

§2Diagnosis · field notes

Six survey stations, six readings.

A full crawl, 90 days of server logs, Search Console coverage and Chrome UX Report field data, logged like a river survey: station, instrument, reading.

  1. Stn 01 · Crawl

    1,948 errors

    Search Console coverage and a full crawl agreed: almost two thousand URLs that Google tried and failed to fetch, wasting most of a small site's crawl budget.

  2. Stn 02 · Reports

    63 orphaned

    Every grant and field report lived as a bare PDF in /uploads/, which robots.txt blocked. No landing pages, titles or authors: funders searching a report's name found nothing.

  3. Stn 03 · Performance

    LCP 6.3 s

    38 active plugins shipped 2.7 MB of JavaScript to every page. A five-image hero slider painted last; mobile LCP at p75 failed by more than double.

  4. Stn 04 · Structured data

    0 entities

    No NGO or Organization markup, broken Event markup on clean-up days, and no Report or Dataset types for the research the Trust exists to publish.

  5. Stn 05 · Internationalisation

    212 duplicates

    Bulgarian and English versions of the same page competed against each other with no hreflang and inconsistent canonicals.

  6. Stn 06 · Conversion

    41% abandon

    The three-step volunteer form, itself a plugin, failed silently on iOS Safari; sign-ups depended on people who emailed instead.

§3The strategy

Stop the inflow. Dredge. Mark the channel.

Built on our Signal plan (technical seo), with four tactics in sequence.

Tactic 01

Site rebuild

Dredge the riverbed: replace a decade of plugins with a lean, static theme the Trust's two staff can maintain.

  • 38 plugins down to 4
  • Every legacy URL mapped from logs to a new home
  • Reports, projects and volunteering as first-class sections
Tactic 02

Core Web Vitals

Make the site fast on a volunteer's phone on a riverbank, measured in field data, not lab scores.

  • Slider replaced by one AVIF hero with explicit size
  • System fonts, critical CSS inline
  • JavaScript from 2.7 MB to 96 KB
Tactic 03

Crawl errors

Stop the inflow, then drain: fix the causes of broken URLs before fixing the URLs themselves.

  • Calendar pages capped and noindexed
  • 322 chains collapsed to single 301 hops
  • Weekly coverage check with next-day alerts
Tactic 04

Structured data

Label the channel so search engines understand an NGO, its events and its research for what they are.

  • NGO + Organization with founding, area served
  • Event markup for every clean-up day
  • Report + Dataset markup on 63 research pages

§4Timeline · 6 months

The recession, month by month.

Scroll the log, or step through it with the buttons. Each month the water drops and a fresh line is painted on the gauge where it stood.

5001,0001,5002,000M0

Reading M0 · Survey

1,948

crawl errors · flood of record

LCP mob.
6.3 s
Sessions
2,140
  1. Before · Survey — Survey

    High-water mark

    Full crawl, server logs, Search Console coverage and field Core Web Vitals read side by side. 1,948 crawl errors logged; the flood line is painted here.

    Gauge 1,948 · LCP 6.3 s · 62 volunteer sign-ups

  2. Month 1 of 6 — Triage

    Stop the inflow

    Infinite calendar URLs closed off, robots.txt unblocked /reports/, 322 redirect chains collapsed to single 301 hops. The water starts to fall.

    Gauge 1,460 · LCP 6.0 s · 63 volunteer sign-ups

  3. Month 2 of 6 — Rebuild

    New riverbed

    Thirty-eight plugins replaced with a lean static theme. Every legacy URL mapped from logs to its new home before launch day.

    Gauge 905 · LCP 3.8 s · 69 volunteer sign-ups

  4. Month 3 of 6 — Vitals

    Clearing the silt

    Responsive AVIF imagery, system fonts, no sliders. Mobile LCP passes 2.5 s at p75 for the first time in field data.

    Gauge 470 · LCP 2.4 s · 77 volunteer sign-ups

  5. Month 4 of 6 — Reports

    Research above the line

    63 grant and field reports given HTML landing pages with abstracts, authors and Report + Dataset markup. Funders can now search them by name.

    Gauge 220 · LCP 2.1 s · 85 volunteer sign-ups

  6. Month 5 of 6 — Schema

    Marking the channel

    NGO, Event and VolunteerAction-style structured data for every clean-up day; hreflang pairs Bulgarian and English pages.

    Gauge 120 · LCP 2.0 s · 92 volunteer sign-ups

  7. Month 6 of 6 — Gauge

    Measured & clear

    Coverage watched weekly; new 404s alerted within a day. 78 known errors remain, all intentional gone-for-good URLs returning 410.

    Gauge 78 · LCP 1.9 s · 98 volunteer sign-ups

§5Results · after 6 months

Clear water, readable instruments.

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

Broken URLs fixed

1,870

Gauge from 1,948 to 78 errors; the remainder are deliberate 410s.

LCP (mobile)

6.3s → 1.9s

Before
6.3s
After
1.9s

| 2.5 s “good” threshold, p75 field data

Organic sessions

+109%

1,0002,0003,0004,000M0M1M2M3M4M5M6

Volunteer sign-ups

+58%

62 → 98 a month once the form worked on every phone and clean-up days showed as events in search.

Rankings above the waterline

Modelled Google positions, month 0 vs month 6. “—” means not in the top 100.

QueryLandingM0M6Movement
Danube conservation Rusebrand-adjacentHome#14#1
Danube wetland report 2025funder searchReport—#2
доброволци почистване Дунав РусеDanube clean-up volunteers RuseVolunteer#38#3
Danube sturgeon monitoring BulgariaresearchDataset—#4
Русенски Лом биоразнообразиеRusenski Lom biodiversityProject#61#6
river NGO grant Bulgariapartner searchAbout#47#5
Danube island restorationresearchReport#72#8

§6Your survey

Get a plan like this.

We start where this one did: a full survey of crawl errors, Core Web Vitals and structured data, read like a gauge, with a plan to bring the water down.