City pages work. Doorway pages get ignored
Service-plus-city landing pages are one of the few TikTok local-SEO tactics that survive contact with Google's documentation, with one condition. Google's spam policies define doorway abuse as “sites or pages created to rank for specific, similar search queries” that lead users to the same destination without distinct value (Google spam policies). Twenty templates with the city name swapped is that. One genuinely local page per city you really serve, with original content, is a legitimate page Google's own service-area guidance leaves room for. The tactic is real. The shortcut version of it is the spam.
Why the tactic is sound
A service-area business has a real problem: it works in 12 cities but has 1 address. Google's local results weigh distance, and your homepage cannot be about every city at once. A dedicated page for “water heater repair in Broken Arrow” gives Google a document whose topic actually is that query. This is ordinary relevance, not a trick. The TikTok creators pushing it, to their credit, usually add the honest caveat: the page must be original, because Google recognizes duplicated templates.
The line, drawn precisely
- Doorway: same 400 words, find-and-replace city name, no local detail, all funneling to one form. Created for engines, worthless to a reader who knows the area.
- Legitimate: a page a Broken Arrow homeowner would find useful. Which neighborhoods you covered last quarter, the permit quirks there, drive times, real photos from real jobs in that city, a customer review from that ZIP code.
The practitioner rule of thumb of 600 or more words of original content per page is a decent floor, but the words are evidence, not the goal. The question Google's policy asks is whether the page has distinct value. If you could not have written the page without having worked in that city, you are on the right side of the line.
Build order that does not produce spam
- Start with revenue cities. Where do jobs actually come from? Build those pages first, because you have real material for them.
- One target service per page. A page about everything ranks for nothing. “Roof repair in Tulsa” is a page. “Our services in Tulsa” is a brochure.
- Feed each page real assets. Job photos, project notes, a named review. Refresh when you complete notable work there. A city page is a living record, not a launch artifact.
- Wire the internal links. Each city page links to its parent service page and appears in an areas-we-serve index. Orphan pages help nobody, and we flag them in the audit.
- Match your Business Profile. The cities you build pages for should be the service areas set in your profile. Contradictions between site and profile are exactly the kind of confusion machines punish quietly.
What this costs you when it is done wrong
The lazy version does not usually earn a penalty letter. It earns silence. Templated pages get crawled, recognized as near-duplicates, and left out of results, which means the money spent producing them bought nothing. Worse, AI engines answering “best roofer in Broken Arrow” lift from pages with verifiable local substance. A doorway page gives them nothing to quote. You paid for pages that neither Google nor ChatGPT will ever hand to a customer.
Frequently asked questions
How many city pages is too many?
The count is not the test. Distinctness is. If page 15 reads like page 3 with the nouns changed, you passed your limit 12 pages ago.
Should city pages be under /areas or /locations?
Either works. What matters is a crawlable index page linking them all, and each page linking back to its service. Structure is for readers first.
Can AI write my city pages?
AI can draft structure, but the local substance, real jobs, real streets, real photos, is the part that ranks and cannot be generated. A model that has never been to Broken Arrow writes the same page for every city, which is the exact failure the policy describes.