Product Architecture · Information Architecture Diagram

Air Duct Cleaning Directory
Search-First Site IA

Search results are the primary human entry point. The geo hierarchy is the SEO/crawler skeleton. Service×City static pages are pre-rendered saved searches for high-value combos.

Domain airductcleaningservices.co
Stack Astro 5 · Cloudflare Pages
Platform Pure SSG · No build step
Program Directory Builder v0
Locations 23,507 · Cities 9,540
Date June 2026 · Status Design Reference
◆ Layer 2 — SEO/Crawler Skeleton
Home → State → City → Business Hierarchy
The static URL tree that bots index. Every location gets a page. City hubs for ≥3 businesses only (~2,023 of 9,540). Breadcrumbs propagate link equity up the tree.
🤖 Bots primary — humans use breadcrumbs + browse-by-state fallback
◈ Layer 3 — Saved Searches
Service × City Static Pages
A pre-rendered search-results page for high-value combos. Gated: ≥3 businesses + curated service. ~3,000–5,000 pages. Indexable, crawlable, long-tail SEO workhorse.
🔍 Identity: "service × city page = a saved search"
Node Type
Search front door
Standard page
Money page
SEO workhorse / saved search
Service tier
Cross-link pattern
Link Type
Breadcrumb
Hub→Spoke
Lateral
Matrix
Footer
Layer 1 — Search Front Door Primary human entry
★ Humans first
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 Top nav 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.
Breadcrumb ← → 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.
Breadcrumb ← → 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.
Breadcrumb ← 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.
Breadcrumb ← 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 Top-nav Services → all states
Service × State
× ~300–400
/services/{service}/{state}/
Service hub for a state — which city hubs have businesses with this service.
Breadcrumb ← → 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.
Breadcrumb ← 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
✗ Ungated (avoided)
112K+
Thin pages skipped
All service×city combos without ≥3 business gate
Locations
(all 23,507)
23,507
City Hubs
(≥3 biz gate)
~2,023
Svc×City
(gated ~3–5K)
~3–5K
Svc×City
(ungated 112K+)
112,252
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)
Home
1
States
~50
Svc Landing
~6–8
Svc × State
~300–400
City Hubs
9,540 total · 79% skip
~2,023
Svc × City
≥3 biz gate
~3–5K
Locations
ALL get pages
23,507

Total gated+curated indexable: ~30K. Locations + Svc×City form ~87% of index. 9,540 total cities — only 2,023 get hubs.

Internal Link Strategy
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