The City Service Page System: How We Architect a 190-Page WordPress SEO Site
Our agency site runs about 190 pages, and most of them were built in a single quarter. The question I get from other WordPress people isn't about content — it's about architecture: how do you structure 190 pages so Googl
Our agency site runs about 190 pages, and most of them were built in a single quarter. The question I get from other WordPress people isn't about content — it's about architecture: how do you structure 190 pages so Google treats them as a system instead of a pile?
Here's the actual system. Steal it.
The matrix, not the sitemap
Every page is a cell in a two-axis matrix: vertical (pool builders, HVAC, landscapers, outdoor living, med spas) × market (Orange County cities, Long Island towns, Miami-Dade, Tampa Bay, now LA). A page only exists where the cell is real — a vertical we can write about with authority, in a market with actual search demand. Construction SEO in Illinois is one such cell: a vertical page for a real market. No orphan city pages, no standalone service pages floating without geography.
The rule that keeps it clean: city pages always attach to a vertical, never stand alone. A "Tampa SEO" page is a dead end. A deck-and-patio-builders-in-Tampa page has a buyer, a query, and a conversion path.
URL taxonomy
Flat and readable, one level deep:
-
/seo-for-outdoor-living-contractors/— the national category page -
/seo-for-outdoor-living-contractors-los-angeles/— the city cell -
/seo-for-deck-and-patio-builders/— the Tampa cell
No /services/seo/outdoor-living/ nesting. Every page is reachable in one hop from the domain root, which keeps crawl depth at 1 and makes the internal-link graph trivially auditable. When a new LA page goes live, we link it from the national page the same day — new city pages have indexed within the hour on this setup, repeatedly.
The national page is the battery
Each vertical has one national page that earns the category query. Ours for outdoor living sits at #2 nationally for the core "outdoor living contractor SEO" query, and the gap between #2 and #1 is instructive: the content and architecture are already winning, what's being measured now is authority. The national page does two jobs — it ranks for the broad query, and it distributes equity downward to every city cell through a single internal-link block.
We built our national outdoor living contractor SEO page first, then let it pull new market pages up behind it. Maine — a market we'd never touched — ranked on entry because the national page's authority was already there to inherit.
Templates, not snowflakes
Every cell page is built from the same Elementor section architecture: hero with trade-specific proof, the interactive ROI calculator, benchmark tables, process, FAQs, local proof. Same skeleton, different substance. This matters for two reasons:
- Velocity. A new city page is a content exercise, not a design project. Five pages in a day is a content day, not a build week.
- Crawl efficiency. Google learns the template once. When the twentieth page in the same vertical shows the same information architecture with genuinely different local content, it gets processed fast instead of evaluated from scratch.
The trap is making the template so rigid the pages read as duplicates. The fix is the part most people skip: every cell gets real local substance — market-specific benchmarks in the calculator, local project imagery, genuinely different copy. Template the structure, never the content.
Staging discipline
New pages go live behind noindex while content is being written, then flip to index when the page is complete. With 190 pages and a team publishing in parallel, this is the difference between a clean index and a Search Console full of thin-page warnings. We also keep a hard rule: no page ships without its internal links already in place — the national page links down, sibling city pages link across, and the money page links up.
The unglamorous part: the database
One operational note for anyone running Elementor at this scale — we learned this the hard way in October. Every save stores the full page design as serialized JSON in wp_postmeta, and every revision keeps its own copy. Across 190 pages and months of editing, revisions quietly ate 3 GB and tripped our host's per-database cap. Cap WP_POST_REVISIONS in wp-config.php on day one, audit wp_postmeta quarterly, and trust table sizes over hosting-panel summaries for 48–72 hours after any cleanup.
The checklist
- Two-axis matrix: vertical × market. No orphan pages.
- Flat URL taxonomy, crawl depth 1.
- One national page per vertical — the equity battery.
- Same section architecture, genuinely different local content per cell.
- noindex while drafting; internal links wired before the flip.
- Cap revisions before the database becomes the bottleneck.
The system isn't clever. It's just consistent — and consistency at 190 pages is the whole game.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.