Skip to content

Local SEO

Programmatic local pages without thin content: how we build city × service matrices

How to build hundreds of service-area pages that index and rank without becoming doorway pages: real local data, uniqueness gates and honest page tiers.

By Digital GravityPublished 12 min read

Where Google draws the line

Definition

Doorway page: a page created to rank for a specific, similar search query that leads users to an intermediate page less useful than the final destination. Google lists multiple pages targeted at specific regions or cities that funnel users to one page as an example.

Google's spam policies list two practices that matter here. Doorway abuse covers pages targeted at cities or regions that funnel visitors to one page, and substantially similar pages that sit closer to search results than to a clearly defined, browsable hierarchy. Scaled content abuse is generating many pages primarily to manipulate rankings, typically large amounts of unoriginal content with little value, no matter how it was created.

Neither policy bans location pages, and neither bans generating pages from data. They target a result: pages that exist only to catch a query. The practical question for every page is whether a resident of that city would learn something from it that they could not learn from the page next door.

What a city × service matrix is

Definition

City × service matrix: a set of pages, one for each combination of a service a business offers and a place it serves, generated from structured data and connected to service pages and city hub pages.

For Streamlined Plumbing in Baldwin County, Alabama, the matrix is 22 cities by 14 services: 308 cells, plus 22 city hubs and 14 service pages. Done as a template with the city name swapped, those 308 pages would be 308 doorways. Done properly, each one is the most specific answer on the web to a question like “water heater replacement in Fairhope”.

Give every page facts no competitor has

The durable cure for thin pages is not better rewording. It is information that genuinely differs from one place to the next. Free public datasets provide a lot of it, and every value we use is stored with the URL it came from so it can be re-checked.

Public data sources that make city pages genuinely different
SourceWhat it providesWhere it changes the page
U.S. Census Bureau, American Community SurveyHousing age, home values, owner-occupancyOlder housing stock changes which repairs and upgrades are common
U.S. EPA, Safe Drinking Water Information SystemWhich public water system serves the cityPlumbing and water-treatment pages can name the actual utility
U.S. Geological SurveyGroundwater chemistryHardness and mineral content affect fixtures and water heaters
FEMA, National Flood Hazard LayerFlood zone designationsRelevant to roofing, restoration, HVAC placement and insurance questions
Climate normalsTemperature and humidity patternsCooling load, paint curing, mold risk
Routing from your officeReal drive time to each cityHonest response-time expectations

On the Streamlined Plumbing build, each city carries a snapshot of these values, and each service reads a different subset. A water heater page leans on water chemistry; a drain page leans on housing age. That is what keeps two pages for the same city from saying the same thing.

Write prose that depends on the facts

A fact card bolted to a template doesn't make a page unique; the paragraph around it is still a copy. The writing has to hinge on the data, so that changing the city would force the sentence to change.

Template sentence (fails)

“We proudly provide water heater installation to homeowners in Daphne and the surrounding area.” Swap Daphne for any other town and nothing else needs to change. That is the signature of a doorway.

Data-dependent sentence (passes)

A sentence that names the utility that supplies the town's water, says what the published water chemistry means for tank life, and connects the age of local housing to whether a replacement usually involves updating the venting. Change the city and every clause has to be rewritten. That is the bar.

Two rules keep this honest. First, never assert something the data doesn't support; on the Streamlined Plumbing build an automated claims check fails the build when a page states something its data snapshot doesn't back. Second, where the data for two cities is genuinely similar, say less rather than inventing differences.

Tier honestly: not every cell earns a page

The matrix is a set of candidates, not a quota. For each cell we ask three questions: is there search demand for this service in this place, does the business actually serve it, and is there enough local difference to say something new? The answers sort cells into tiers.

How we tier programmatic local pages
TierWhenWhat gets built
Full pageReal demand, served area, meaningful local dataA complete page with local facts, data-dependent prose, FAQs and photos where they exist
Compact pageServed area, modest demandA shorter page that still carries real local facts, held to the same uniqueness gate
No pageNo measurable demand, or nothing specific to sayMention the city on the service page or city hub, and link there instead

Sometimes the honest answer is no matrix at all. For one media agency client, city-name searches showed no measurable volume, so we built none and put the effort into its Business Profile, reviews and a few genuinely useful resource pages instead.

Measure uniqueness before launch

“It reads differently to me” is not a test. We measure it, on the rendered HTML that search engines actually receive rather than the source templates.

  1. Extract the visible prose from each built page, excluding navigation, header, footer and scripts.
  2. Mask city names and bare numbers, so two pages that differ only in which city and which figure they name are recognized as twins.
  3. Split the masked text into overlapping six-word sequences (shingles).
  4. Score every pair of pages by the overlap of their shingle sets, and score every page by how many of its shingles appear on no other page.
The uniqueness gate thresholds we use
CheckFails whenWhat it catches
Worst pairwise similarityAny pair of pages overlaps by more than 50%Two pages that are near-copies of each other
Unique shingles per pageFewer than 250 six-word sequences appear only on that pageA page that is mostly shared boilerplate, even if no single pair looks close
Regression against baselineAn existing page gets less unique than its recorded scoreSlow drift back toward a template as pages are edited

Why not a percentage-unique target?

Pages about the same service share vocabulary by necessity. A rule like “every page must be 80% unique” is unreachable for a same-topic set without padding, and easy to game with filler. An absolute count of unique content plus a pairwise ceiling measures what matters.

Build a hierarchy, not a funnel

The doorway policy contrasts near-duplicate pages with “a clearly defined, browsable hierarchy”. The structure itself is part of the answer.

  • Service pages explain the service in depth and link to each city where it is offered.
  • City hubs describe the business in that place and link to each service offered there.
  • Matrix cells link up to both parents, sideways to the same service in nearby cities, and to proof such as projects completed in that area.
  • Breadcrumbs on every page, visible and in BreadcrumbList markup, mirror that structure.

Every page in the set should be reachable through normal links within a few clicks of the homepage. A page that is only reachable from the XML sitemap is a page nobody, including Google, has much reason to value.

Getting hundreds of pages indexed

A large, genuinely useful page set still has to be discovered and indexed. We submit an XML sitemap with truthful last-modified dates, notify Bing and other IndexNow engines the day pages ship, and track indexing per URL from Google's inspection data.

On a brand-new domain, Streamlined Plumbing had 406 of its 413 pages indexed within about three weeks. ACExperts, also launched on a new domain, had 215 pages indexed by week seven. When a page stays stuck in “discovered, currently not indexed”, resubmitting it rarely helps; improving the page or the internal links pointing at it does.

Pre-launch checklist

  1. Every cell has a reason to exist: demand, a served area and something specific to say.
  2. Every local fact is stored with its source URL and can be re-checked.
  3. The prose depends on the facts; swapping the city would force rewrites.
  4. No page asserts anything its data doesn't support.
  5. The uniqueness gate passes on the built HTML.
  6. Service pages, city hubs and cells link to each other, with breadcrumbs throughout.
  7. Every page is self-canonical, in the sitemap, and submitted for indexing at launch.

This is how we build location pages for clients under our local SEO service, on websites we build with our web design and development team. The structured data side of the same work is covered in our guide to entity SEO and schema.

Frequently asked questions

Are location pages bad for SEO?

No. Location pages are a normal, useful part of a service business website when each one serves people in that place with specific information. They become a problem when they are near-copies with the city name swapped, which Google's spam policies describe as doorway abuse.

How many service area pages should a business have?

As many as there are places you genuinely serve and can say something specific about. Start from the cities and services with real search demand and real local differences, and link the rest to a broader service page instead of creating thin pages.

What is the difference between programmatic SEO and doorway pages?

Programmatic SEO is a production method: generating many pages from structured data. Doorway pages are an outcome: pages built to rank for near-identical queries that offer little beyond funneling visitors elsewhere. Programmatic pages avoid that outcome when each one carries unique, useful content for its query.

How do you measure whether pages are too similar?

We shingle the visible text of each built page into six-word sequences, mask city names and numbers so template twins can't hide behind substitutions, then measure the overlap between every pair of pages and the count of sequences unique to each page.

Sources

  1. Google Search Central: Spam policies for Google web search: doorway abuse and scaled content abuse
  2. Google Search Central: Creating helpful, reliable, people-first content
  3. U.S. Census Bureau: American Community Survey
  4. FEMA: National Flood Hazard Layer
  5. U.S. EPA: Safe Drinking Water Information System (SDWIS)

Where to go from here

ServiceLocal SEOLocation pages, schema, Google Business Profile, content and same-day indexing, with a monthly report of verified leads.

Want this done on your site?

Book twenty minutes. We'll look at your site and tell you plainly what we'd change first.