[Placeholder case study — real deltas publish as post-launch scans complete. Numbers illustrative.]

The situation

A residential cleaning service in St. George, Utah — competent operation, strong local reputation, five-star reviews on Google. But when we ran a visibility check against the twelve most common queries a local homeowner might ask an AI assistant ("best house cleaners in St. George", "eco friendly cleaning southern utah", "same day house cleaning near me", and so on), they were named on zero of them. Not one AI assistant recommended them.

The site was a template WordPress build from 2019. Reviews were pulled in from Google via an embedded widget that AI crawlers couldn't parse. Service area coverage lived in a footer paragraph, not a structured schema. And the site's category — "residential cleaning" — appeared exactly once in the entire HTML.

What the signals said

The correlation engine surfaced the pattern immediately. Three signals pointed to the same root cause:

Signals that pointed to the fix
Source retrieval — competitors' review pages were being retrieved by AI; ours weren't.
Site structure — reviews trapped inside iframe, unreadable by any crawler.
Content gaps — no page explicitly answered "what areas do you serve" in schema-visible text.
Entity graph — no LocalBusiness schema anywhere on the site.

What we shipped

Site rebuild — Moved from WordPress to a crawler-native Astro build. Server-rendered, zero client-side JavaScript for critical content. Every page an AI assistant lands on has the full text available in the initial HTML.

Review restructure — Pulled reviews out of the iframe. Rebuilt them as structured Review + AggregateRating schema in JSON-LD, with the actual review text in prose so assistants could quote it.

Service-area pages — One page per neighborhood in the service area, each answering the specific "cleaner in [neighborhood]" query with real category, service, and pricing data structured for retrieval.

Entity graph — Full LocalBusiness schema with categories, service area, hours, and citations to industry credentials.

GBP cleanup — Corrected category (had been listed under "cleaning products retailer"), added missing service tags, restructured photos with descriptive filenames, and set up a weekly response cadence for reviews.

The result

Named rate by week
baseline through 30 days post-launch
67%
week 4
1007550250W0W1W2W3W4

Thirty days after launch, we re-ran the twelve-query baseline scan. Client was named on eight — a jump from 0% to 67% coverage. The queries where they still weren't named all had the same characteristic: they specified a competitor by name, or asked for a service the client doesn't actually offer. In both cases, correctly excluded.

Meanwhile, phone inquiries increased and the client's Google Business Profile saw a measurable lift in direct calls attributed to "asked ChatGPT / asked AI" as the source — first time that attribution had ever appeared in their intake data.

Signal delta · 30 days
signal
before
after
change
AI recommendations
0/12
8/12
+8 named
Source retrieval
3 pages
18 pages
6× reach
Competitor entities
7 gaps
1 gap
6 closed
Search Console
124/day
340/day
2.7×
Technical SEO
62/100
94/100
+32 pts
Content gaps
18 gaps
4 gaps
14 filled
Site structure
45/100
98/100
+53 pts
Google Business Profile
wrong cat
verified
fixed
Reviews
iframe
schema
readable
The measurement continues. We re-scan monthly and report the delta. What worked stays; what didn't gets rewritten. This is the loop.

What this proves

The point of this case study isn't the number itself. Any agency can produce a case study with a favorable number. The point is that every ship is attributed to a specific signal. When we say "the number moved," we can tell you exactly which piece of work moved it and which piece of data said to do that work.

That's the difference between correlation-driven work and template work: when something works, we know why. When something doesn't work, we know that too, and we adjust the model for the next cycle.