Layer 1 — Search Front Door
Primary human entry
★ Humans first
Search Results
Dynamic — DB query
/search?service=air-duct-cleaning&location=Chicago+IL · /search?near=me · /search?zip=60601
Ranked list + interactive map + filter bar (rating, distance, price, services). The primary human front door — Yelp-style. Long tail lives here, not in nav.
Dynamic DB query
Near Me / Zip-radius
Map + ranked list
Long tail → search, not nav
Layer 2 — Geo Hierarchy
Core URL tree · Depth 1–4
◆ SEO/Crawler skeleton
Home
× 1
/
National entry. Search bar front and center. Browse by state or let geo-detection surface local results.
Geo-Aware Homepage — Key Feature
CF edge geo (CF-IPCity headers) or browser
navigator.geolocation → personalized on first paint.
✦ Near You (primary)
"Cities Near You" + top-rated businesses within ~50 mi. Edge-rendered, no JS required for initial paint.
◇ Browse by State (fallback)
Full A–Z state grid always visible. Fallback if geo fails or user outside service area.
LocalBusiness schema
Edge geo detect
FAQ block
State
× ~50
/{state}/
State hub — grids city hubs with ≥3 businesses (not all 9,540 cities — only the ~2,023 hubs). Links top providers in state.
→ city hubs only
State Page schema
City Hub
~2,023 of 9,540 cities
/{state}/{city}/
City hub — lists all businesses, top services. Gated: ≥3 businesses.
79% of cities (≤2 businesses) skip this tier — they live in search only.
→ businesses
↔ nearby cities
City schema
Location (Business)
× 23,507 — ALL get a page
/{state}/{city}/{business}/
Per-business profile. GBP data, services, reviews, photos, hours, NAP, SAB "also serving" cities, schema markup. Converts visitors → calls.
Reviews embed
LocalBusiness + Review schema
Service FAQ
→ SAB cities
Location × Service
× on-demand
/{state}/{city}/{business}/{service}/
A business's detail page for one confirmed service. Deepest crawlable node.
Service schema
Service-Area "Also Serving"
cross-link
not a separate URL tier
On each Location page, a "Cities We Serve" block links laterally to sibling city pages. Spreads equity without adding URL depth.
↔ lateral links
→ nearby city hubs
Layer 3 — Service × City Static Pages
Saved searches · Gated ≥3 businesses
◈ Saved search identity
26 raw GBP services
→
~6–8 clean services
AC/HVAC-heavy, redundant GBP tags curated to clean airduct service taxonomy before generating pages.
Service Landing
× ~6–8
/services/{service}/
Top-of-funnel anchor for each clean service. National overview, links all State × Service combos.
Service schema
→ all states
Service × State
× ~300–400
/services/{service}/{state}/
Service hub for a state — which city hubs have businesses with this service.
→ service × cities
Service × City
~3K–5K gated (≥3 biz)
/services/{service}/{state}/{city}/
= A saved search-results page. Targets "air duct cleaning [city]" queries. Pre-rendered with ranked list + map embed + filters. Interlinks location pages. Gated ≥3 businesses — avoids thin pages.
Raw ≥3 = 15,958 combos · ungated total = 112,252 — gating eliminates 107K+ thin pages.
Raw ≥3 = 15,958 combos · ungated total = 112,252 — gating eliminates 107K+ thin pages.
LocalBusiness + ItemList schema
↔ sibling services
→ location pages
Local FAQ
Crawl Budget: Gated vs. Ungated
✓ Gated + Curated (build)
~30K
Indexable pages
23,507 locations + ~2,023 city hubs + ~3K–5K svc×city
23,507 locations + ~2,023 city hubs + ~3K–5K svc×city
✗ Ungated (avoided)
112K+
Thin pages skipped
All service×city combos without ≥3 business gate
All service×city combos without ≥3 business gate
Key insight: 79% of cities have ≤2 businesses — they live in search only, not in nav. Gating city hubs + service×city pages eliminates 107K+ thin pages from the index.
Page Scale Overview (Measured)
Total gated+curated indexable: ~30K. Locations + Svc×City form ~87% of index. 9,540 total cities — only 2,023 get hubs.
Internal Link Strategy
Breadcrumbs
Every page carries a full trail upward through the hierarchy.
Location → City → State → Home
Hub → Spoke
State pages link to city hubs. Service landing links to Svc×State. City hubs link to businesses.
State → Cities → Businesses
Lateral
City pages → nearby cities. Location pages → SAB cities. Svc×City → sibling services in same city.
City ↔ Nearby · Biz → SAB cities
Matrix Web
Svc×City ↔ Location creates dense interlinking: each saved search lists businesses; each business links back to relevant saved-search pages.
Svc×City → Locations → Svc×City
Footer Matrix
Site-wide footer: Top States (A–Z), All ~6–8 Services, Top 20 Metro Cities. Global equity pass.
Every page → top states/services/cities
Saved-Search Matrix Sample (Service × Geo)
Dryer Vent
HVAC Clean
Furnace
Texas
Svc×State
Svc×State
Svc×State
Austin TX
Saved Search
Saved Search
Saved Search
Round Rock
Saved Search
pending ≥3
Saved Search
Pflugerville
pending ≥3
search only
pending ≥3
Each cell = one "saved search" page (Service × City). ~6–8 clean services × ~2,023 gated city hubs = ~3K–5K pages. Muted = city lives in search only (≤2 businesses). Raw combos at ≥3 threshold = 15,958 — curated services bring this to ~3K–5K.
Schema.org Markup by Page Type
| Page Type | Schema Types |
|---|---|
| Home | WebSite, Organization, FAQPage |
| State / City | WebPage, BreadcrumbList |
| Location | LocalBusiness (HomeAndConstructionBusiness), Review, AggregateRating, GeoCoordinates |
| Svc × City | ItemList, LocalBusiness (repeated), FAQPage, BreadcrumbList |
| Service Landing | Service, WebPage |