I Measured It Just in Time to Watch Myself Break It
Altitude: learning from my mistakes
For years the Atlantikwall archive was a set of PHP pages. My dad built them up location by location, hundreds of them, and I always thought of the site as an old thing that existed rather than a thing that worked. If you had asked me how it did in search I would have said I had no idea, and I would have meant it as "probably nothing."
Shortly before I replaced it I finally put Google Search Console on it. Not for any clever reason. It was on the checklist for the new build and it seemed daft to wire it up afterwards.
That decision gave me about a month of data on the old site. Roughly ninety clicks a day, some days over a hundred. Around three thousand impressions a day. For a niche archive of wartime coastal fortifications, that is not nothing. That is an audience.
I cut over to the new site in the last week of July. Nothing happened. The numbers carried on exactly as they had been, and on the 29th the site had its best day of the whole period: a hundred and nineteen clicks.
On the 1st of August it did 26.
The week where it looked fine
That gap matters more to me than the drop does.
For about a week the new site was live and search behaved as though nothing had changed. If I had checked Search Console during that week, and I did, I'd have seen a healthy line and concluded the migration had gone well. It had gone well, by every signal available to me at the time. The site was up, it looked far better than the old one, and the numbers agreed.
What was actually happening was that Google hadn't got round to it yet. The old pages were still in the index, still ranking, still being served to people, because a recrawl and a reassessment of several hundred URLs takes time. The verdict was already decided. It just hadn't been delivered.
So the launch produced a week of evidence that the launch had worked, and that evidence was worthless. There was no moment at which I could have caught it by looking, because looking is exactly what I did.
What I had actually built
The new site is better in every way I knew how to measure before that day. React, a real data model, 885 locations, an admin interface, a map, images, structure. The old one had none of that.
It was also a client-rendered single-page app, which meant every route returned the same raw title, no meta description, and an empty body in the HTML a crawler receives. The per-page titles existed, but JavaScript set them after mount, which is a different thing from existing. robots.txt pointed crawlers at a sitemap that returned a 404. So for a period the site was serving an identical blank page at every URL while directing crawlers to a file that wasn't there.
The old PHP pages stayed up as a deliberate fallback, so years of inbound links wouldn't die. But the fallback wasn't redirecting. A full write-up of one airfield sat at its old .php address while its modern equivalent sat at a new URL, and the old address served the old page. The site I'd replaced was still there, competing with its replacement, and beating it, because it had words on it.
The part I didn't predict
I fixed the visible things. Dynamic sitemap. Server-rendered titles, descriptions and body content for location pages and hub pages. Legacy .php URLs matched and redirected properly. Sitemap submitted.
Then I inspected all 911 sitemap URLs through the Search Console API. 489 indexed. 422 not. Forty-six percent of the site missing. I ran the same sweep on my two other sites the same day for comparison: one came back 95.5% indexed, the other 100%.
Google wasn't failing to crawl. It was crawling constantly, deciding large numbers of location pages were duplicates of one another, and folding them together. One page appeared as Google's chosen canonical in every single one of the ten inspection batches. Dozens of distinct places, quietly collapsed into one.
I checked for the obvious causes and ruled them out. The canonical tags were correct and self-referencing. The server-rendered HTML was genuinely there. The real cause was that the pages were thin. I pulled the rendered prose length: 907 characters on one folded page, 2,039 on another, against 3,793 on the one Google kept. A database of 885 real locations, and a large share of them didn't have enough written about them to earn being a page.
And underneath that, the thing indexing fixes can't touch: Core Web Vitals had gone from around 600 good URLs to zero, on mobile and desktop both. Largest Contentful Paint of 4.2 seconds for real users, 12.8 in a mobile lab test. Page experience is a ranking signal. I had shipped a site that was slower, thinner and less legible to a crawler than the thing it replaced, and I'd done it while believing I was modernising.
What the month of data actually bought me
Not much comfort. It bought certainty.
Without it I'd have told myself the old site was probably declining anyway, that the drop was seasonal, that search had shifted. All of those are available and none of them survive a chart with a cliff on the 1st of August and a flat month of ninety-a-day sitting to the left of it.
I wrote a few weeks ago that you can't master search until search has something to tell you, and that measurement is the skill you can't practise before there's traffic to measure. I still think that's right. What I'd add now is that instrumenting something before you change it is the cheapest thing on the whole list and the only reason I can say anything true about this at all. I did it almost by accident, for tidiness.
The fixes are shipped. Lab metrics are clean. Field data moves on a 28-day rolling window, so late September tells me whether any of it worked. Average position across the three months is 10.3, which is the bottom of page one, which is a polite way of saying nearly.
The archive was doing better when I wasn't looking at it. I only know that because, for once, I looked first.
Written by Steve Drew — most of his career running delivery inside large organisations, currently building ka-do alone.
Try the free triage tool →Get new posts by email
Occasional, no spam. Unsubscribe anytime.