THA: location page and service page architecture

The full matrix, built the way the reference client should have been. Plus what it costs and which cells to skip.

1The pattern, using Fort Worth

This is the structure you described. Every city page lists its services; every service is a link to a city-specific service page.

Texan Heating & Air
texanhvac.com
Service Areas
/service-areas/
Hub. Lists all 15 cities.
HVAC Services in Fort Worth
/service-areas/fort-worth/
Median build 1998 · 35.4% gas · cluster 4,180/mo
Links down to all 8 service pages below
8 city-specific service pages
AC Repair in Fort Worth
/service-areas/fort-worth/ac-repair/
ac repair fort worth · 1,300/mo · KD 11 · $71 CPC
AC Installation & Replacement in Fort Worth
/service-areas/fort-worth/ac-installation-replacement/
ac installation fort worth · 140/mo · KD 9
Heating & Furnace Repair in Fort Worth
/service-areas/fort-worth/heating-furnace-repair/
furnace repair fort worth · 390/mo · peaks 1,900 in Feb
Heat Pump Services in Fort Worth
/service-areas/fort-worth/heat-pump-services/
61.9% of Fort Worth homes are electric
HVAC System Replacement in Fort Worth
/service-areas/fort-worth/hvac-system-replacement/
hvac replacement fort worth · 10/mo
Maintenance & Tune-Up in Fort Worth
/service-areas/fort-worth/hvac-maintenance-tune-up/
ac maintenance fort worth · 70/mo · KD 12
Indoor Air Quality in Fort Worth
/service-areas/fort-worth/indoor-air-quality/
No volume data; supports the hub
Emergency HVAC Repair in Fort Worth
/service-areas/fort-worth/emergency-hvac-repair/
emergency ac repair fort worth · 20/mo · KD 0
Why this URL shape and not /services/ac-repair/fort-worth/

Both work. Nesting under the city keeps each city page as the parent of its own children, which is the relationship we want Google to read, and it makes the city page the natural canonical hub. The reference client nested under the service instead, and their city pages ended up orphaned from their own service pages entirely.

2Your footer question: yes, but nearest-five, not all-fifteen

You asked whether a "Not your area? More areas covered" block at the bottom is too much. It is not too much. But all-fifteen is the wrong version of it, for a specific and measurable reason.

OptionWordsShare of shared budgetTotal site linksEffect on uniqueness
All 15 areas on every page~5319%1,800Hurts. Identical block on all 120 pages counts as shared text.
5 nearest areas~238%600Helps. Different on every page, so it counts as unique.
3 nearest areas~176%360Helps, but thin for users
The elegant part

A nearest-five block is different on every single page, because Weatherford's five nearest neighbours are not Edgecliff Village's. That means it counts toward the unique 60% rather than against it. The all-fifteen version is identical everywhere, so it eats 19% of the shared budget and buys nothing.

It is also just better for a human. Someone reading the Benbrook page wants to know you also cover White Settlement and Westworth Village, not that you cover Annetta South forty minutes west.

The thing the reference client actually got wrong, for contrast

It was not that they had too many links. It was that /locations/{city}/ linked to all nine service hubs and to zero of that city's own service pages. The two axes never connected. Your instinct to keep the web interconnected is the correct instinct; the fix is to connect it in the right direction, parent to child, before worrying about lateral links.

3Not all 128 cells earn a page

Sixteen cities by eight services is 128 combinations. Scored against the per-town data we now have: build era, heating fuel, lot size, permits.

AC RepairAC Install & ReplaceHeating & FurnaceHeat PumpSystem ReplacementMaintenanceIndoor Air QualityEmergency
Fort Worth1998 · 35.4% gasSSSSSSSS
Aledo2010 · 40.0% gas, newestSSSWVSVV
Weatherford1998 · 22.4% gas, oldest+rentersSVSVSVWS
Willow Park2003 · 94.8% electricSSWSSSWV
Saginaw2000 · 25.2% gasSVVVVVWV
Benbrook1983 · 24.3% gasSVVVSVWV
White Settlement1973 · 23.6% gasSVVVSVWV
River Oaks1953 · 43.0% gas, oldest stockSVSWSVVV
Hudson Oaks1999 · 91.5% electricSVWSVVWW
Annetta1999 · 0% gas, 90% electricSVSSVVWV
Westover Hills1975 · 47.2% gas, highest valueVSSWSVVW
Westworth Village1976 · 61.1% gas, highestVVSWVVWW
Edgecliff Village1976 · 42.4% gasVWVWVWWW
Lakeside1970 · 43.4% gas + 7.8% LPVWSWVWWW
Annetta South1992 · 24.6% propane, peakVWSVVWWW
Annetta North1994 · 18.8% propane, 141 homesVWSVWWWW
SStrong: a data-backed differentiator exists VViable: writable uniquely with effort WWeak: no real differentiator, do not build
41
Strong cells
51
Viable cells
36
Weak, skip these
118
Total pages if built as scored
How the scoring works, so you can argue with it

Heating and Furnace is Strong where gas or propane share is high: Westworth Village 61.1% gas, River Oaks 43.0%, Annetta South 24.6% propane. It is Weak where almost nobody heats with fuel: Willow Park 2.9% gas, Hudson Oaks 4.3%.

Heat Pump is Strong in the all-electric towns (Willow Park 94.8%, Hudson Oaks 91.5%, Annetta 90.1%) and Weak in the gas towns, because you cannot write a distinctive heat pump page for a town that heats with gas.

Indoor Air Quality is Weak nearly everywhere, because we have no per-town data that makes it different. It stays as a single service hub rather than 16 city versions. That is the honest call, and it removes 14 pages by itself.

4What this costs, which is the real constraint

ScopePagesUnique words requiredComment
Full 15 x 8 matrix, unscored14560,900Every cell built regardless of whether it has anything to say
Scored matrix, weak cells skipped118~49,600Recommended
City pages and hubs only2610,900The earlier plan
Say this number out loud before committing

The scored matrix needs roughly 49,600 genuinely unique words, verified by the checker, before any of it is worth publishing. That is a book. At a realistic pace for researched local copy it is a months-long content programme, not a build.

This is the actual risk to the plan, and it is not an SEO risk. It is a capacity risk. The failure mode is not that the matrix is a bad idea; it is that page 60 gets written at 2am on a deadline, the uniqueness gate gets skipped "just this once," and we have rebuilt the reference client one page at a time.

The mitigation, and it is the same one already in the plan

Stage it. Fort Worth plus the four Tier 2 cities is 40 pages and about 17,000 unique words, which is achievable. Publish, run the checker, measure for 90 days, then decide whether Tier 3 and 4 earn the next 78 pages.

Google's own guidance warns against publishing a large batch of near-identical pages at once, so staging is both the safe content decision and the safe SEO decision.

5What makes a city-service page genuinely different

This is what the reference client could never have done, because they had no per-town data. We do.

PageWhat it actually says that no other page says
Heating & Furnace in Annetta SouthOne home in four runs a propane furnace. No gas utility serves the town at all, so a propane furnace cannot be converted. Different orifices, different burner setup, and the tank is yours, not a utility's.
Heating & Furnace in Westworth Village61.1% on utility gas, the highest of any town we serve. Housing built around Carswell AFB from 1941; median 1976. Gas furnace and original ductwork territory.
AC Repair in River OaksMedian home built 1953, the oldest stock in the service area. Post-war construction, undersized returns, ductwork that predates the equipment by decades.
Heat Pump in Willow Park94.8% of homes are all-electric and 40.5% were built 2000 to 2009, so a large cohort is 17 to 26 years old and on original equipment. Tri-County members can claim up to $200 on a 16 SEER+ heat pump.
AC Install in AledoMedian build 2010, newest in the area, 27.7% of the housing stock permitted in the last six years. Warranty-era equipment, and unlike its neighbours Aledo is on the gas main at 40.0%.
System Replacement in Westover HillsHighest home values in the set, median build 1975, 47.2% gas heat. Premium equipment is sellable here in a way it is not two miles away.
The rule that keeps this honest

If a city-service page cannot say something in that column, it does not get built. That is what the 36 weak cells are. The scoring is not a nicety; it is the mechanism that prevents the matrix from decaying into the reference client.

Gate every page on tha-uniqueness-check.py at 60% before it goes live. It masks city names before comparing, so a template with the town swapped in scores zero, exactly as the reference client's pages do.

Prepared by Shepard (Tech Director), 19 August 2026. Heating fuel and build era from US Census ACS 2024 5-year, tables B25040 and B25035, pulled directly. Search volume and seasonality from DataForSEO. Reference client per-page figures from Google Search Console, 16-month window (2025-04-18 to 2026-08-15). Companion documents: tha-location-seo-sitemap.pdf, tha-visual-sitemap.pdf, tha-city-page-content-spec.md, tha-uniqueness-check.py.