A multi-city HVAC franchise operating across 22 metro areas
Won local AI search citations across 22 metros with programmatic city pages
The challenge
The client operates HVAC service franchises across 22 metro areas in the southern and southwestern United States. Local lead flow had been steady through Google Local Service Ads and traditional local SEO, but starting in late 2025 the marketing director noticed a slow erosion in lead volume that did not match any change in ad spend or local rankings. The pattern eventually clarified: prospects were asking ChatGPT, Google AI Mode, and Perplexity for HVAC recommendations in their city, and the LLM responses were citing aggregator review sites and a handful of larger regional competitors. The client almost never came up by name. The existing city-level pages on the franchise site were thin, templated, and read like SEO content from 2018. The team had tried a manual rewrite project on five cities and given up after two months because the workload was untenable. They needed a programmatic approach that produced pages good enough to be cited by LLMs across all 22 metros, without becoming the kind of templated content that would get correctly classified as spam.
What we shipped
The work was a programmatic build with real content underneath. We did not generate the pages from a template. We built a structured data layer per city, then generated content that drew from that layer with enough variation and local specificity to be genuinely useful.
Per city, we built a data record covering: local climate patterns and how they affect HVAC needs, common system types in the region, average system age in the housing stock, local utility rebate programs, local permit requirements, average service costs benchmarked against the client's actual invoice data, and named local landmarks and neighborhoods for natural geographic anchoring. We then layered in the client's actual local data: technician count, service hours, average response time pulled from dispatch records, and real customer reviews quoted with permission.
The city page template generated about 1,800 to 2,400 words per city, with the structured data driving genuine variation. We added LocalBusiness, Service, and FAQPage schema, with proper geo coordinates and serviceArea markup. We built a local reviews schema implementation that pulled real reviews from the dispatch system, with proper Review markup.
Off-domain, we ran a structured local press effort, getting the franchise included in 14 local "best of" lists across the metros, mostly through reaching out to local lifestyle publications with usable data on HVAC pricing and seasonal patterns. We did not buy any of these placements. We submitted to the local business databases that Google AI Mode is known to lean on.
We shipped llms-full.txt at 1.1MB covering the 22 city profiles, the service catalog, the pricing structure, and the technician credentialing.
The numbers
| Metric | Baseline | After 90 days | After 6 months |
|---|---|---|---|
| Local AI search citation rate (avg across 22 metros) | 3% | around 21% | around 38% |
| Google AI Mode local citation rate | 5% | around 24% | around 41% |
| Inbound calls from organic, monthly | 1,400 | 1,720 | 2,300 |
| Cost per booked job (organic) | $47 | $38 | $29 |
| Local press placements | 0 | 9 | 14 |
| Branded search, monthly (blended across metros) | 18k | 23k | 34k |
The cost-per-booked-job change was the metric that won the engagement an extension. Lead quality from organic improved meaningfully over the course of the engagement, with a noticeable rise in the share of calls that converted to scheduled service on the first call. The dispatch team's read was that customers arriving through LLM citations were arriving with clearer expectations about pricing and service area, which reduced the back-and-forth that often killed bookings at the dispatch stage. Average ticket size on organic-acquired jobs lifted modestly because the city pages were doing real education on system replacement versus repair, and customers were arriving more often having already decided on a fuller scope of work. Branded search lifted across all 22 metros, with the strongest lift in the metros where the client had also won local press placements.
What we'd do differently
We tried to build all 22 cities in parallel in phase one. That was a mistake. The first six cities we shipped were noticeably better than the next sixteen because we were still figuring out which structured data elements drove citation and which were dead weight. We should have built five cities, measured for three weeks, refined, and then scaled. Instead we shipped all 22 in the first two months and had to do a quality rebuild on cities seven through twenty-two in month four. We also underestimated how important the local press component was. The metros that won press placements lifted citation rate twice as fast as the metros that did not, and we should have weighted press effort more heavily from the start rather than treating it as a supporting tactic.
What's next
The engagement renewed for a year with two expansion areas. First, the client is opening franchises in seven new metros over the next twelve months, and we are building the city playbook to ship each new metro with full citation coverage from day one. Second, we are extending the programmatic approach to neighborhood-level pages in the four largest metros, where local AI responses are starting to differentiate by neighborhood. The hypothesis is that "HVAC repair in [specific neighborhood]" prompts will compound the metro-level work rather than cannibalize it. We are also helping the client think through how to apply the same model to a sister franchise system in plumbing, which the parent company owns separately.
Want this outcome for your domain?
Start with a $597 Strategy Sprint or get a free GEO audit.
Book a Strategy Sprint Free GEO Grader