August 13, 2026
Shown 80,000 times. Clicked 29.

In the last twelve months of our old website's life, Google showed it to searchers 80,970 times. It got 29 clicks.
That's not a traffic problem. Eighty thousand impressions is proof the demand exists — homeowners around us were searching for exactly what we do, and Google kept auditioning us for the job. Twenty-nine times in a year, somebody picked us. Our Cypress page alone was shown 18,811 times. Zero clicks.
These notes usually keep company names out of it. This one is about the website itself, so the habit has to go: the pressure washing business you've been reading about is J Calvin Pressure Washing — jcalvintx.com. The screenshots would have given it away anyway.
What the old site was
The site was WordPress, built on a page builder, on managed WordPress hosting. In July I finally sat down and audited all 56 pages of it. The homepage weighed about 5–6 megabytes — 7 to 9 with the hero video — across roughly 81 requests, 44 of them render-blocking stylesheets. The host's page caching was switched off, so every visitor waited on a full server render. Not one image on the site was in a modern format.
The content had the same disease in a different organ. Seventeen city pages, 80 to 86 percent identical to each other — and four of them greeted readers with a different city's name in the heading, live, in production. Forty-two pages emitted two competing meta descriptions. Thirty-four pages had FAQ sections with no FAQ markup, invisible to the rich results they were written for.


The wrong diagnosis
Here's the part I got wrong the longest: none of that came from neglect. Every plugin was current. The theme was maintained. Backups ran. By every checklist a maintenance plan sells, the site was healthy. The audit line that ended the argument: "the problems are architectural, not maintenance."
The instinct, when a site underperforms, is to do more to it — more SEO effort, another plugin, maybe ads. We were auditioning from positions 50 to 70 with a site Google had every reason to rank last. Watering concrete.
The cutover
So we stopped renovating and rebuilt on a foundation that could rank: audit on July 6, new site live on July 14. Eight days.
The speed wasn't recklessness — most of those eight days went into the unglamorous parts that make a cutover safe:
- Everything scraped first. All 56 pages archived — content, images, the lot — before anything changed.
- A redirect map as real code. 102 old URLs — every legacy slug, every misspelled project page, every old plugin's rewrite rule — each 301-redirecting to its real successor, in one typed file with a test suite that fails the build if a destination goes missing. On launch day, 98 of 98 mapped redirects verified on the live domain. Google's crawl surfaced four stragglers the map had missed; they were added within the week.
- A kill switch we never pulled. The old WordPress site stayed running, idle, for thirty days after the DNS flip. Rollback was one DNS change away the whole time. We never touched it.
Two websites actually went into the woodchipper that week — the marketing site and a second WordPress install running our old form tooling, 77 plugins between them, replaced by one codebase.


I didn't type those commits
Same disclosure policy as the ProofShot note. The rebuild is 341 commits, and I didn't hand-type them — I directed an AI coding agent through every one. The audit was mine, every decision in it was mine, and the bar the work had to clear — the redirect tests, the duplicate-content checks that fail the build, the launch checklist — was mine. The agent typed faster than I ever will. That's the honest reason eight days was enough.
What's measurably different
Two days after launch I ran Google's PageSpeed test against the live site and got a mobile score of 69 — while the same test run locally on my machine swore it was a 96. We fixed what real phones actually experience: analytics now wait for the visitor's first interaction, the hero sends zero video bytes to mobile, the one image that matters loads first. Real-world mobile score after: 99. Largest contentful paint went from 5.6 seconds to 2.0. Layout shift: zero.
The lesson rode along free: measure on the tool that sees what customers see. My laptop lied. The deployed URL didn't.
Those are July's numbers, though. The day this note went up I ran the same test again: 95, with the main image landing at 2.9 seconds instead of 2.0. The score breathes run to run — so the screenshot below is publication day's run, not a trophy shot.

What the data says, 30 days in
Now the part most write-ups would skip.
| Window | Days | Clicks | Impressions | Avg. position |
|---|---|---|---|---|
| Before cutover (May 12 – Jul 13) | 63 | 4 | 9,947 | 46.6 |
| After cutover (Jul 14 – Aug 11) | 29 | 5 | 3,974 | 61.1 |
Thirty days in, the search needle has not moved. The average position is temporarily worse — normal after a migration, when new pages start auditioning for queries the old site never entered and land low while Google re-evaluates everything. Clicks are noise in both columns. The one green shoot: the last full week posted the highest impressions of any week since the cutover.

I'm publishing this table on purpose. A rebuild this deep takes months to show up in rankings, and it's easy to write the victory post after the curve turns and let the flat part disappear. This is the flat part. The 90-day numbers land in a follow-up note — whatever they say.
If your site gets shown and never chosen
Look up your own audition record — Search Console is free and it doesn't flatter. If the impressions are there and the clicks aren't, you don't have a marketing problem. You have a systems problem, and no amount of maintenance fixes architecture. The plugins can all be current while the foundation loses every job it's shown for.
Design the foundation, not the paint. And when you do cut over: archive everything first, write the redirect map like it's load-bearing — because it is — and leave the old site running long enough that rollback is boring. The bravest thing about our cutover was how little bravery it needed.
Next step
Let's cut through the noise.
Tell me the pain you're feeling, and in 30 minutes I'll help you see the path forward. No strings.