Service-Area Pages That Actually Rank (Without Getting Penalized for Doorway Pages)
Programmatic city pages work — when you do them right. We've shipped 12,000+ for clients. Here's the template, the rules, and the patterns Google penalizes.
Service-area pages are the highest-leverage SEO move a multi-city contractor can make — and the single biggest way new sites get sandboxed for thin content. We've shipped over 12,000 of these pages across clients, watched a few get penalized, and tuned the template until it consistently ranks. Here's what works and what gets you killed.
What Google considers a doorway page
Google's exact definition: sites or pages created to rank for similar search queries, with the goal of funneling users to a single destination. The penalty triggers on three signals: duplicate content across cities, no real local information, and no unique value per page. Hit any two of those at scale and your site gets a manual action.
The 5-element template that ranks
- Unique H1 with city + service ('Emergency Plumbing in Cleveland, OH')
- 200+ words of genuinely local content: neighborhoods served, local permit info, common local issues (hard water, basement flooding, etc.)
- Real local proof: customer name + neighborhood, project photo, review text. Not stock content swapped per city.
- Embedded GBP map centered on the city, with directions from the city center
- City-specific schema: LocalBusiness with areaServed populated and Service schema pointing back to the parent service page
The three patterns Google penalizes
- Find-and-replace cities: 'plumbing in [CITY]' content that's identical except for the city name. Trips duplicate-content filters in 60 days.
- Phantom service areas: pages for cities you don't actually serve. Tanks trust and gets you reported.
- Zero internal linking: orphaned city pages with no path from the main nav. Looks like a doorway farm even when it isn't.
How to scale without triggering penalties
Start with your top 10 cities and write each page by hand or with heavy AI-edit-and-verify. Once you have a proven template, expand to 50, then 200, then your full service area. At each expansion, spot-check 10% of pages for content uniqueness using a tool like Siteliner. If duplication runs above 30%, you have a template problem, not a scale problem.
Internal linking architecture
Every service-area page should be reachable in ≤2 clicks from the home page. We use a hub-and-spoke: home → /service → /service/$city. Each city page links back to the parent service hub, to 3–5 neighboring city pages (geographic siloing), and to one piece of relevant blog content. That's the structure Google reads as a real local business, not a doorway farm.
What 'enough unique content' actually means
The threshold isn't word count — it's information gain. Each page should answer at least three questions a competitor's city page doesn't: response time in that specific city, named neighborhoods or zip codes served, local pricing context, common service issues for that geography. We use a structured intake from each client to capture this once, then templatize the unique bits at scale.
Frequently asked questions
How many service-area pages can I safely have?
There's no fixed cap — sites with 5,000+ legitimately unique city pages rank fine. The cap is on duplication, not quantity. If you can answer 'what's genuinely different about this page?' for every URL, you can ship as many as your service footprint justifies.
Should I build a page for every zip code or every city?
City-level for SEO, zip-level only if zip is genuinely how customers search ('plumber 30309'). Most local search is city-named. Zip-coded pages dilute internal link equity unless paired with real volume.
How long until service-area pages start ranking?
Long-tail city + service combinations rank in 4–10 weeks of indexing if the site has any domain authority. Competitive head terms ('plumber in [major city]') take 6–18 months and usually need backlinks to crack the 3-pack.