The article this pairs with, local SEO for service area businesses, covers where your ranking leverage sits when you have no storefront, how to set up service areas and categories, and why the website has to work harder when the address does less. It also states the principle behind this guide in a paragraph: a city page earns its ranking when it carries something only that page can.
This is how you actually produce one. The worked example is a gutter and eavestrough company based in Mississauga that also serves Oakville and Milton. It's illustrative rather than a real client, and the figures in it are invented to be realistic, but the situation is the most common one in this job: three cities, one service, and a strong temptation to write the page once and swap the name twice.
The two policies, and why the difference matters
Almost every article on this subject warns about doorway pages and stops there. That's half the picture, and the less relevant half. Google's spam policies contain two separate things a location page can breach, and they fail different tests.
| Policy | What Google describes | The test it applies |
|---|---|---|
| Doorway abuse | Pages created to rank for specific, similar queries that lead users to intermediate pages less useful than the final destination. Named examples include pages targeted at specific regions or cities that funnel users to one page | Is this page the destination? A city page that answers the question and takes the booking isn't an intermediate page |
| Scaled content abuse | Many pages generated primarily to manipulate rankings rather than help users, typically large amounts of unoriginal content with little or no value, no matter how it's created | Is this page original and useful? Sameness across the set is the problem, and the phrase no matter how it's created means the tooling isn't a defence |
Most location pages that get filtered aren't doorways in the strict sense. They're real destinations where you can book the job. They fail the second test: twelve pages of the same paragraph with the place name moved around, which is unoriginal content produced at scale, whoever or whatever typed it.
Hold onto that distinction, because it tells you what to fix. Adding a phone number and a booking form to a thin city page answers the doorway concern and does nothing about the real problem. Only different content fixes sameness.
Qualify the page before you write a word
This step exists mostly to give you permission not to build the page, which is the most valuable thing in the guide and the hardest to accept when someone has told you more pages means more traffic.
Three questions. All three need a yes:
- Do you actually serve this city? Not would you like to. Would you drive there on a Tuesday for a normal job at a normal price. If the honest answer is that you'd go for a big enough job, that's a no.
- Have you worked there? At least one real job, or a genuine plan to get one. A page for a city you've never worked in has nothing true to say and you'll feel it by paragraph two.
- Can you say something specific? Before writing, can you name one thing about working there that differs from your home city. If nothing comes, that's information, not a temporary block.
Two yes answers and a maybe means the honest move is a regional page covering the wider area, naming the city inside it where that's true. One good regional page beats four thin municipal ones, and it's far easier to keep accurate.
How to know it worked You can answer all three out loud without hedging, and you have written the third answer down as a sentence. If you have just talked yourself out of a page, the step worked exactly as intended.
Common trap Qualifying a city because a competitor has a page for it. You don't know whether theirs is working, and copying the shape of somebody else's mistake is how most thin page sets start.
Go and get five facts that don't travel
The bar is five things that are true of this city and false of the next one on your list. Five is deliberate. One or two can be padded around; five forces you to actually know the place.
Facts that travel are useless here. Fast response times, free quotes and fully insured are true everywhere, which is why they appear on every page and differentiate none of them. Look in four places:
- The housing stock. Age, style, roofline, lot size, how tight the driveways are. This is the richest source for most trades, because it changes the job itself rather than the marketing.
- The conditions. Tree cover, exposure, drainage, what the winter does to that specific area. Anything that changes what you carry in the van.
- The competitive picture. Search your main phrase plus the city in a private window and look at who's there. National directories mean an opening; three strong local firms mean you need a sharper angle.
- The practical friction. Permit rules, parking, access, the drive itself. Naming a real constraint reads as experience because it is.
Write them as sentences, not keywords. A note reading mature trees isn't usable; older streets are full of forty-year maples, so gutters there fill twice a season instead of once is a sentence that can go straight in the page.
How to know it worked Five written sentences, and for each one you can name the neighbouring city where it's false. If a fact is true of both, it isn't a local fact, it's a general one. Cross it out and go back.
Common trap Padding with population figures and founding dates from an encyclopedia. Every thin city page has that paragraph, nobody reads it, and it tells a customer nothing about the job. If it could be looked up in ten seconds, it isn't local knowledge.
Find one piece of local proof
Facts describe the place. Proof shows you were in it. A page can have all five facts and still read like research rather than experience, and proof is what closes that gap.
One genuine item is enough. In rough order of strength:
- A job you did there, described specifically: the street or neighbourhood, the problem, what you did about it.
- A photo of your own work in that city. Not a stock image, and not the same photo as the sibling page.
- A review from a customer in that area, quoted with the neighbourhood named.
- A named area you regularly work in, if you can't share job detail. Weakest of the four, but still specific.
Say the true thing in the true way. One job in the city means writing about that one job, not implying a decade. A single honest example outweighs a page hinting at volume it can't show, and it survives a customer asking about it.
How to know it worked The page contains at least one item a competitor couldn't copy without lying. Read your proof paragraph and ask whether any firm in your trade could paste it onto their own site unchanged. If they could, it isn't proof.
Common trap Reusing one testimonial across every location page. It's the same content on multiple pages, so it works against you twice, and a customer comparing two of your pages sees it immediately.
The free audit flags thin and duplicate pages across your site, which is the fastest way to find out how many of your existing location pages would fail step 8.
RUN THE FREE AUDITWrite headings that don't survive a find and replace
Open your nearest existing location page beside the new one and work on the headings alone. They're the skeleton, they're what a skim-reader and a crawler both take first, and they're where templating is most obvious.
The rule: if swapping the city name makes your headings identical to the sibling's, they aren't headings, they're a template.
Generic headings look like Our Services in Oakville, Why Choose Us, Areas We Serve. Every one works for any city and any company. Specific headings come out of your step 2 facts and are unmistakably about somewhere.
The H1 is worth its own minute. Name the service and the place plainly, because that's what the page is, and let the H2s underneath carry the differentiation. Don't make the H1 clever. Make it accurate.
| Template headings | Headings that resist the swap |
|---|---|
| Eavestrough Cleaning in Oakville | Eavestrough Cleaning in Oakville1 |
| Our Services in Oakville | Why Oakville gutters fill twice a season2 |
| Why Choose Us | Working safely on steep century rooflines |
| Areas We Serve | When guards are worth it on older streets |
| Contact Us Today | Book a two-visit seasonal schedule |
How to know it worked Put the two heading sets side by side, swap the city names, and read them. At least half your H2s should now read as wrong for the other city. If all of them still work, you have written a template and filled it in twice.
Common trap Differentiating with synonyms. Changing Our Services to What We Offer isn't differentiation, it's the same heading wearing a hat. The words have to change because the content underneath changed.
Build the body around one local angle
Five facts don't make a page. A page needs a spine, and the spine is one angle: the single reason this page exists that the sibling pages can't claim.
Pick the fact from step 2 that most changes the job, and build around it. Everything else supports it. This is the difference between a page with local details sprinkled through it and a page that's genuinely about a place.
In the worked example, Oakville's angle is the tree canopy on older streets, so the page is about seasonal load, guard choice and a twice-a-year schedule. Milton is new-build subdivisions with young trees, so its page is about builder-grade installs, downspout placement and capacity. Same company, same service, two pages with almost nothing in common, because the work genuinely differs.
Keep the standard material, but keep it short. Pricing, service list, contact and coverage all still belong on the page. They aren't what it's about, and they shouldn't be the first three sections.
How to know it worked You can state the angle in one sentence, and it's a sentence that would be false about the sibling city. Then read the page as somebody who lives there and ask whether it sounds like it was written about them or near them.
Common trap Writing the shared material first and adding local colour afterwards. It always reads as bolted on, because it was, and the local content ends up as one paragraph in the middle that could be deleted with no loss. Start with the angle.
Write a genuinely different FAQ set
The FAQ block is where templating survives longest, because it feels like boilerplate by nature. It's also the part most likely to be read, and increasingly the part quoted back by an assistant, so sameness here's expensive.
Don't take the same five questions and insert the city. Ask what somebody in this city actually wants to know, which usually comes straight out of your step 2 facts: how often the job is needed there, what the local housing stock changes about it, what the access or permit situation is, whether you charge differently for the drive.
Then mirror them exactly in FAQPage JSON-LD. The visible text and the schema text must match word for word, because a mismatch is a structured data problem rather than a clever one. The schema guide covers the markup mechanics if that part is new.
One honest note on rich results: FAQ rich results were cut back to government and health sites, so on a local business page the markup is for parsing rather than for a visible result in Google. Add it because assistants and other consumers read it, not because it will draw a rich snippet, and don't let anyone tell you otherwise.
How to know it worked No question on this page appears on any sibling page, and every visible question matches the schema exactly. Paste the page into the Rich Results Test and confirm the FAQ block parses without warnings.
Common trap Marking up questions that aren't visible on the page. The schema must reflect what a visitor can actually see and read. Invisible FAQ markup is a structured data violation, not a shortcut.
Add the technical layer
Short step, and the least likely to go wrong, but skipping it wastes the two hours you just spent.
- URL. Put the service and the location in the path, like
/eavestrough-cleaning/oakville. A bare/oakvilledoesn't say what the page is and stops scaling the moment you add a second service. Keep the pattern identical across the set. - Canonical. Self-referencing, pointing at this page. Sibling pages canonicalising to each other is a real and self-inflicted way to make a good page invisible.
- Schema.
ServicewithareaServednaming the city, plus yourFAQPagefrom step 6. The artifact below is the shape. - Internal links, both directions. Link down from the parent service page, and sideways between siblings. A location page nobody links to is exactly the orphan structure the doorway policy describes.
- Title and meta description. Written for this page, not generated from a pattern. If your descriptions differ only by city, that's the same problem in miniature.
How to know it worked The page validates in the Rich Results Test with no errors, the canonical points at itself, and you can reach the page from the homepage in two clicks by following real links rather than typing the URL.
Common trap
Copying the sibling page's schema block and forgetting areaServed, the URL, or the FAQ text inside it. Copied schema that still names the previous city is common, invisible on the page, and tells Google the two pages are about the same place.
Run the swap test before you publish
The last gate, it takes five minutes, and it's the one step that would have prevented most of the thin location pages on the web.
- Copy the finished page into a plain text document.
- Find every instance of the city name and replace it with the sibling city.
- Read it as though it were the real page for that city.
Every sentence that's still true isn't local content. That's the whole test. It doesn't mean the sentence is bad, since pricing and contact details are supposed to travel, but those sentences aren't why the page deserves to exist.
Then count. If the majority of the body survives the swap intact, you have written a template. If the page now reads as obviously wrong, with claims about tree cover that don't apply and a job description that doesn't match the housing, the page is genuinely about somewhere and you can publish it.
Do this before publishing, not after. Fixing a thin page that's already indexed means editing it, waiting for a recrawl, and wondering for weeks whether it recovered. Five minutes now avoids all of that.
How to know it worked You can state in one sentence what this page offers that its nearest sibling doesn't, and the swapped version reads as visibly wrong for the other city. If you can't make that statement, don't publish. Merge the two pages into one regional page instead.
Common trap Running the test, seeing that most of it survives, and adding the city name a few more times to compensate. Repetition isn't differentiation, and it makes the page worse to read while changing nothing about the underlying sameness.
The whole thing, worked
The gutter company, across two of its three cities. Illustrative, but the shape is the one that keeps turning up.
| Sentence on the page | Still true after the swap? |
|---|---|
| Fast, reliable eavestrough cleaning in Oakville | Yes, and so it counts for nothing1 |
| Free quotes, fully insured, family run since 2011 | Yes |
| Older streets here are lined with mature maples, so most homes need two cleans a season rather than one | No2 |
| Century rooflines are steep and often need a stabiliser rather than a standard ladder | No |
| We recommend guards here far more often than in the newer subdivisions | No |
| Call today for a free estimate | Yes |
Step 1 killed a page. The company serves Mississauga, Oakville and Milton properly, and had been about to add Burlington because a competitor had one. They had never worked there. That's a no on question two, and the page wasn't built.
Step 2 produced the split. Oakville's older residential streets have a mature tree canopy, so gutters fill roughly twice a season and guards are worth recommending. Milton has grown fast, so much of the housing is recent subdivision stock with young trees, builder-grade aluminium, and problems of capacity and downspout placement rather than leaves. Same service, materially different job.
Steps 4 and 5 followed from that. Oakville's H2s cover seasonal load, guard choice on established properties, and working safely on steep older rooflines. Milton's cover builder-grade installs, downspout placement, and what to check on a house whose gutters have never been cleaned. Neither set of headings works on the other page.
Step 8 confirmed it. Swapping Oakville for Milton produced a page claiming a tree canopy that isn't there and recommending guards for a problem the houses don't have. Visibly wrong, which is exactly the result you want.
The pattern generalises past gutters. Two cities twenty minutes apart usually differ in ways that change the work, and if you can't find those ways, that's a real answer telling you to build one regional page rather than two thin ones.
Copy and paste
Four artifacts. The first one is the one that saves the most time, because it stops pages being built.
CITY: ______________ DATE: __________
1. Do I actually serve this city?
Would I drive there Tuesday, normal job,
normal price? YES / NO
("only for a big job" = NO)
2. Have I worked there?
At least one real job, or a genuine
plan to get one. YES / NO
3. Can I say something specific?
Name ONE thing about working there that
differs from my home city:
______________________________ YES / NO
THREE YES ...... build the page, go to step 2
TWO + A MAYBE .. build a REGIONAL page instead,
name the city inside it
ANY NO ......... do not build the page
Not building a page is a valid outcome and the
most common correct one. Four thin city pages
are worse than one honest regional page.
Need 5 sentences TRUE here and FALSE next door.
HOUSING STOCK richest source for trades
age / era of build ..................
roofline, storeys, access ...........
lot size, driveway width ............
CONDITIONS
tree cover, exposure ................
drainage, water, soil ...............
what winter does here ...............
COMPETITIVE PICTURE private window, search
"[service] [city]"
who ranks: locals / directories / nobody
gap I can take ......................
PRACTICAL FRICTION
permits, parking, access ............
the drive itself ....................
TEST EACH ONE
name the neighbouring city where this
is FALSE. Can't? It is not a local fact.
BANNED (true everywhere, differentiates nothing)
fast response - free quotes - fully insured
family owned - years of experience
population and founding date paragraphs
1. Paste the finished page into plain text.
2. Replace every "[THIS CITY]" with "[SIBLING CITY]".
3. Read it as if it were the real sibling page.
SENTENCE | SURVIVES?
__________________________________|__________
| yes / no
| yes / no
| yes / no
SURVIVES = not local content.
(fine for price and contact lines,
fatal for the body)
SCORING
most of body survives ...... TEMPLATE.
do not publish
page now reads WRONG ....... genuinely local.
publish
THE ONE SENTENCE
This page offers ____________________
which the sibling does not.
Cannot finish that sentence?
-> merge both into one regional page.
Run BEFORE publishing. Fixing an indexed
thin page means editing, waiting for a
recrawl, and guessing for weeks.
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Eavestrough Cleaning Oakville",
"serviceType": "Eavestrough cleaning",
"url": "https://example.com/eavestrough-cleaning/oakville",
"provider": {
"@type": "LocalBusiness",
"name": "YOUR BUSINESS NAME",
"telephone": "+1-905-555-0100",
"url": "https://example.com"
},
"areaServed": {
"@type": "City",
"name": "Oakville"
},
"description": "ONE SENTENCE describing this
service in THIS city. Rewrite per page. If it
differs only by city name, so does the page."
}
CHECKLIST, per page
[ ] name, url, areaServed all say THIS city
[ ] description rewritten, not swapped
[ ] FAQPage block matches the VISIBLE text
[ ] canonical points at ITSELF
[ ] validates in the Rich Results Test
One page, start to finish
Where this stops
An owner will write a better location page than most agencies, and that isn't flattery. The whole thing turns on knowing that the older streets fill twice a season and the new subdivision has a capacity problem, and you know that because you've been on the roofs.
The cap is volume, and it's arithmetic rather than skill. Two hours a page means twelve cities is twenty-four hours of writing before maintenance, which is the point at which it stops happening. Sets of thin pages are usually the residue of an ambitious plan that ran out of Tuesdays, not of anyone deciding to cut corners.
The other limit is judgment about the set rather than the page. Deciding that six cities are really three pages plus one regional page, and which existing URLs to merge, redirect or keep, is a structural call. Guide 12 feeds it, since the mapping step tells you whether two cities are one query or two.
If you want that structure decided for you, it's part of the Search Roadmap. If you want to know how many of your current location pages would fail step 8, the free audit flags thin and near-duplicate pages across the site, which is a faster answer than reading them all.
Questions people ask
How many location pages can I have?
There's no number. Google's policies describe what pages are, not how many of them you have, so the honest limit is however many cities you can clear step 1 for. A business with three genuine service areas and three strong pages beats the same business with twenty, and the twenty version is actively worse because the thin seventeen drag on the good three. The useful reframe is that each page has a cost of about two hours of real work plus ongoing maintenance, so ask how many you're prepared to keep accurate rather than how many you're allowed. If the answer is three, build three.
Can I use AI to write my location pages?
For drafting and structure, yes. For generating the pages, no, and Google's wording closes the loophole directly: scaled content abuse covers creating large amounts of unoriginal content that provides little or no value, no matter how it's created. The method of creation is explicitly not the test. What matters is whether the page is original and useful. The practical line is that a model can't know that the older streets in your area are full of mature trees while the new subdivision twenty minutes away has none, because that came from you standing on a roof. Use the model to tighten prose you supplied the substance for. The moment it is inventing the local specifics, it's inventing them for every city equally, which is the exact pattern the policy targets.
What should I do with the thin location pages I already published?
Sort them into three piles rather than reacting to all of them at once. Pages for cities you genuinely serve and can improve get the eight steps applied, oldest and highest-impression first. Pages for cities you don't really serve should be removed and redirected to the parent service page, which is a decision people resist and rarely regret. Pages for cities you serve but can't say anything specific about get merged into one honest regional page covering the area, which is almost always stronger than four thin pages. Don't simply delete a batch of URLs with no redirects. Redirect each one to the closest genuinely useful page so the links and any history point somewhere sensible.
What if two of my cities genuinely have nothing different about them?
Then they're one page, and that's a real answer rather than a failure. Two adjacent suburbs with the same housing stock, the same conditions and the same competitors don't give you two pages worth of material, and forcing it produces exactly the near-identical pair the policies describe. Build one page covering both honestly, name both places in the body where it's true, and let it rank for both. This happens most often with neighbouring municipalities that function as one market. It's also worth checking whether the differentiator is your work rather than the place: if you do a different kind of job in each, that's a service page split rather than a location page split, and it may be the better structure.
Should the city name go in the URL, the title, or both?
Both, and in the H1 too, provided the page genuinely earns it. None of that's a trick, it's describing the page accurately, and a URL like /eavestrough-cleaning/oakville reads clearly to a person and a crawler alike. Put the service and the location in the path rather than the location alone, because a bare /oakville tells nobody what the page is for and doesn't scale once you add a second service. What matters more than the placement is consistency across the set, so that the pattern is legible and the sibling pages sit in an obvious hierarchy. Where people go wrong is treating the URL as the differentiator. The URL is labelling, and the body is what decides whether the page survives.