Skip to content
Clawson Built Systems

August 13, 2026

Shown 80,000 times. Clicked 29.

The rebuilt J Calvin Pressure Washing homepage on desktop: clear headline over a flag-backdrop hero, phone number and instant-quote button in the header.
the rebuild — jcalvintx.com, thirty days after cutover

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.

A single bar representing 80,970 search impressions over twelve months, with the 29 clicks marked to the same scale — a hairline sliver circled in red pencil.
29 clicks. that's the whole mark.

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 old WordPress homepage on a phone: a dark hero and a long quote form stacked down the page.
The rebuilt homepage on a phone: one clear headline over a flag-backdrop hero, and a quote button above the fold.
same business, same phone — before and after the cutover

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.

The redirect map source file: a typed list of old-URL-to-new-URL entries grouped into documented families, with a comment header explaining each group.
the safety net is code — 102 old addresses, each with a forwarding order, each under test
The new site's instant-quote page: an address field first, with the quote building from real service-area data.
what replaced the form plugins — the instant-quote flow

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.

PageSpeed Insights mobile result for jcalvintx.com: performance 95, accessibility 100, best practices 100, SEO 100 — captured August 13, 2026.
publication day's run against the live site — august 13, 2026

What the data says, 30 days in

Now the part most write-ups would skip.

WindowDaysClicksImpressionsAvg. position
Before cutover (May 12 – Jul 13)6349,94746.6
After cutover (Jul 14 – Aug 11)2953,97461.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.

Daily search impressions from May through August with a red rule marking the July 14 cutover: a dip after the flip, then the strongest week since the cutover at the end, while weekly average position churns.
the churn is the process working
The rebuilt Cypress service-area page: unique local copy, real job photos, and a quote path — the page that was shown 18,811 times under the old site without a click.
the cypress page, rebuilt. under the old site: 18,811 impressions, zero clicks

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.

Wrestling with something like this in your own business? Let's talk it through — book a 30-minute call, no strings.