You read somewhere that duplicate content kills your rankings. So now you’re scared to build pages for the twelve cities you actually serve — or worse, someone built them for you by spinning one template fifty times with the city name swapped, and your traffic is flat. Both reactions miss what’s actually going on. There is no duplicate-content penalty. But there is a doorway-page problem, and a scaled-content problem, and they’re real. This is the operator’s guide to building city and service pages that rank — and exactly where Google draws the line.
First, kill the myth: there’s no duplicate-content penalty
Google has said this plainly, for years. Search Central’s own blog post — literally titled “Demystifying the ‘duplicate content penalty’” — states there is no such penalty. When Google finds near-identical pages, it doesn’t punish you. It deduplicates: it picks one version to show in results and filters the rest out. Internally that’s called canonicalization — Google decides which URL is the “canonical” one and quietly ignores the others.
So why does it feel like a penalty? Because the effect on a templated city-page set looks identical to one. You publish 30 pages, 28 of them get collapsed into one in Google’s eyes, and they never rank. You didn’t get penalized. You got deduplicated — which, for your traffic, is the same funeral with a nicer name.
The thing that actually gets you in trouble is a different policy entirely: doorway abuse.
What Google actually says about doorway pages
Here’s the real wording from Google’s spam policies, verbatim — two sentences, not one stitched-together definition:
“Doorway abuse is when sites or pages are created to rank for specific, similar search queries. They lead users to intermediate pages that are not as useful as the final destination.”
And Google’s actual list of doorway examples includes — again, verbatim — “multiple domain names or pages targeted at specific regions or cities that funnel users to one page,” and “substantially similar pages that are closer to search results than a clearly defined, browseable hierarchy.”
That’s the exact lazy version of city pages: a stack of /plumber-charlotte, /plumber-huntersville, /plumber-matthews pages that are 95% identical and all funnel the visitor to the same generic “call us” pitch. The classic SEO illustration of it — the one you’ve probably heard — is the same page made 200 times with only the city name swapped. That’s community shorthand, not a Google quote, but it captures the spirit exactly: pages built for the search engine, not the customer.
The test that actually matters
Forget word-count thresholds and percentages — there’s no published “70% identical and you’re doomed” rule; Google has never disclosed a word-overlap number. The honest test is simpler and it’s about intent and usefulness:
Could a real customer in that specific city get genuine, non-generic value from this page — value that’s actually different from your other city pages?
If yes, you’re building location pages. If the only thing that changes between pages is the city name in the H1 and a find-and-replace in the body, you’re building doorways. That’s it. That’s the line.
Practically, a city page earns its place when it carries things only true of that place:
- Real jobs you’ve done there — addresses by neighborhood, photos, the specific problem (hard water, slab leaks, aging cast-iron, ice dams).
- Local specifics — permit rules, HOA quirks, the city’s housing stock and its age, common system brands in that market.
- Honest local proof — response times to that area, named neighborhoods you cover, local pricing if it actually differs.
- Reviews from customers there — but write fresh context, don’t paste the same three testimonials onto every page (that just reintroduces the duplicate-content collapse you’re trying to avoid).
If you can’t fill a page with anything real about a city, that’s Google telling you something true: you don’t actually serve it yet. Which brings us to the discipline that makes this whole thing work.
The geo × service matrix: only fill what you can prove
Think of your service area as a grid. Cities down one axis, services across the top. Every cell is a potential page — “drain cleaning in Matthews,” “AC repair in Huntersville.” The instinct is to fill the whole grid, because more pages feels like more coverage.
Don’t. Only fill the intersections you can actually prove. If you do water-heater work in Charlotte every week but have never run a single drain-cleaning job in Belmont, the “drain cleaning in Belmont” cell is a doorway page waiting to happen. Leave it empty until it’s true. A focused set of 15 pages you can each back with real proof will outrank a bloated set of 120 thin clones — and it won’t put your whole domain at risk. This matrix discipline is the spine of how we build city pages that survive updates.
There’s also a site-wide cost to getting greedy. A pile of low-value, near-identical pages drags on your site-wide quality signals — the things rolled up under E-E-A-T. It’s not a precise dial Google “turns down,” but a domain that’s 80% thin doorway pages reads as low-quality overall, and that reputation follows your good pages into the rankings too.
The August 2025 spam update — what it actually did
Google rolled out a spam update in late August 2025, described as broader enforcement of its existing spam policies across all languages. Be careful with how this gets framed: Google did not publish an official statement naming “doorway pages,” “spun content,” or “city × service templates” as specific targets. That framing comes from SEO-community analysis of what sites got hit, not from Google.
What’s fair to say: the update is consistent with enforcement of the long-standing doorway and scaled-content policies, and SEOs widely observed mass-produced, templated, thin-content pages losing visibility. If your city-page strategy is “spin the template and pray,” that’s the profile people watched get hammered. Treat it as a strong signal, not as Google having read your sitemap by name.
The related policy worth knowing is scaled content abuse, which Google defines as “when many pages are generated for the primary purpose of manipulating search rankings and not helping users.” The tool doesn’t matter — AI or human, the test is intent and usefulness (more on AI below).
The on-page fixes most owners miss
Getting the strategy right is most of the battle. But three technical details decide whether good pages actually get indexed and ranked:
Self-referencing canonicals
Each city page should canonicalize to itself — its <link rel="canonical"> should point to its own URL, not back to a hub or your homepage. Owners who half-understand canonicalization sometimes point every city page’s canonical at one “main” page, which is literally telling Google “don’t index these, they’re duplicates of that one.” That’s self-sabotage. Self-referencing canonical on every unique, proof-backed page. Use a canonical to another page only when a page genuinely is a duplicate you want consolidated.
URL structure and a browseable hierarchy
Remember Google’s own doorway language: pages “closer to search results than a clearly defined, browseable hierarchy.” So give it a hierarchy. A clean, consistent structure — /services/[service]/[city]/ or /locations/[city]/[service]/ — with breadcrumbs linking back up to a real services hub and a real locations hub, signals an organized site, not a pile of landing pages dumped at the root. Pick one pattern and hold it; don’t mix /plumber-charlotte at the root with /locations/matthews/ elsewhere.
Schema and indexing controls
Add LocalBusiness (or the relevant Service) structured data to location pages, and use the areaServed property to state the cities you cover. It’s a standard legitimacy signal that helps Google understand the page is a real service-area page, not a keyword target. And for cities you’re building toward but can’t fully prove yet, you have a middle option between “no page” and “thin doorway”: publish it with a noindex tag, keep it for internal navigation and your own funnels, and remove the noindex once you’ve got real jobs and content to stand behind. Staged publishing beats shipping 40 empty pages on day one. Verify it all afterward in Google Search Console — check that your good pages are actually indexed and not getting “Duplicate, Google chose different canonical” in the Pages report.
Can you use AI to draft city pages?
Yes — and this is the question owners actually ask now, so here’s the straight answer. Google’s policy targets intent and quality, not the tool. AI-assisted drafting is fine. What crosses the line is using AI to do exactly what scaled-content abuse describes: mass-produce near-identical pages “for the primary purpose of manipulating search rankings and not helping users.”
The practical rule: use AI to draft pages you can back with real local proof, then add the things AI can’t invent — your actual jobs, your photos, your pricing, your local knowledge. Don’t point it at your geo × service grid and tell it to fill all 200 cells. Same line as everything else in this article; AI just makes it faster to cross.
Where city pages help — and where they don’t
One distinction saves a lot of wasted effort: city pages and your Google Business Profile play different games.
- City pages compete in organic and Local Finder results — the blue links and the expanded local results. A strong page for “water heater repair [suburb]” can win those clicks.
- The map pack (the 3-pack at the top of Maps results) is driven mostly by your Google Business Profile, plus proximity, relevance, and prominence — not by how many city pages you publish.
So a city page for a town you have no real address in won’t lift you in that town’s map pack. As a service-area business, your one profile — verified at your real address, which you then hide, with your true service areas defined — is your map-pack play. (Creating a fake profile per city you don’t have a real address in is a guideline violation that gets profiles suspended, full stop.) City pages extend your organic reach; the GBP drives the map. Build both, but don’t expect one to do the other’s job. The organic side is where our local SEO and broader SEO work lives.
To know whether any of it is working, track them separately: Local Falcon (or similar grid trackers) for map-pack position across your service area, and Search Console for organic impressions and clicks on the city pages themselves. Watching one and assuming the other moved is how owners misdiagnose the whole channel.
The bottom line
There is no duplicate-content penalty — but there is a doorway penalty, a scaled-content policy, and an August 2025 update that, fairly read, rewarded sites with real pages and thinned out the spinners. The whole strategy collapses to one discipline: only build the city × service pages you can prove, make each one genuinely useful to a real customer in that place, give them a clean hierarchy with self-referencing canonicals and areaServed schema, and let your Google Business Profile carry the map pack. Do that and you don’t have to fear duplicate content — because you won’t be producing any.
If you want a growth audit of your current city-page setup — which ones are doorways, which intersections you can actually prove, and what’s getting deduplicated right now — that’s exactly what we’ll map out.