Local SEO & Google Business ProfileCitations, NAP consistency and local landing pages · Lesson 12 of 17

Local landing pages that aren't doorways

Article · 13 min · 8 min lecture

Video lecture

Local landing pages that aren't doorways

13 chapters · about 8 min · full transcript

Coming soon

Chapter 1 of 13

Local pages that aren't doorways

  • The doorway trap
  • Location pages done right
  • Service-area pages done right
  • A similarity check

The narrated lecture is in production

Every chapter is scripted and ready. Browse the chapters and read the full transcript now — the video will appear here when it’s published.

Chapters

Why local pages exist

Your website supports local visibility in two ways: it reinforces relevance for your Business Profile (Google looks at your website as part of relevance and prominence), and it can rank in organic results for local queries. Local landing pages — location pages for each branch, or service-in-area pages — are the main tools.

The doorway page trap

Google's spam policies define doorway abuse as creating sites or pages to rank for specific, similar search queries that lead users to intermediate pages that are not as useful as the final destination. Classic examples:

  • Hundreds of "[service] in [town]" pages with identical text except the town name.
  • Pages for areas the business does not meaningfully serve.
  • Pages that only exist to funnel users to a single contact page.

These pages often fail to rank, and at scale they can harm how Google views the site (and fall under scaled content abuse if mass-produced).

Two legitimate page types

1. Location pages (for real branches)

One page per physical location, linked from the GBP profile for that location. Include:

  • Exact NAP, map embed, directions and parking/transport notes.
  • Opening hours (including special hours).
  • Services offered at that location, team members, photos of that location.
  • Reviews or testimonials from that location's customers (genuine; review markup only where eligible).
  • Local details: nearby landmarks, areas served from this branch, accessibility.
  • Unique content: this is a page about a real place.
  • LocalBusiness schema with the location's details.

2. Service-area pages (for areas genuinely served)

For SABs or businesses serving multiple towns, create pages only where you can provide genuinely area-specific value:

  • Projects completed in that area (case studies, photos, with client permission).
  • Area-specific considerations (e.g. "Older terraced houses in Salford often have...", "In Dubai's older villa communities, AC systems commonly...").
  • Local pricing or response times if they differ.
  • Testimonials from customers in that area.
  • Local team or depot information.

If you cannot write something meaningfully different about an area, you probably should not have a separate page for it; list it on a "Areas we serve" page instead.

A location page template

H1: Al Noor Dental Clinic — Jumeirah, Dubai
Intro: 2–3 sentences about this clinic, its team and specialisms
Key info block: address, phone, hours, directions button, parking notes
Services at this clinic: list linking to service pages
Meet the team: dentists at this location with short bios
Photos: reception, treatment rooms, exterior signage
Patient reviews: selected genuine reviews
Getting here: landmarks, metro/bus, parking
FAQs specific to this location (insurance accepted, languages spoken: Arabic, English, Urdu)
Map embed
Schema: Dentist (LocalBusiness subtype) with address, geo, hours, telephone

Internal linking and store locators

  • A store locator or locations index should link to every location page with crawlable links (not only a JavaScript map that search engines cannot navigate).
  • Link location pages to relevant service pages and vice versa.
  • Include the locations index in the main navigation or footer.

Language and localisation

For bilingual markets, consider separate language versions of location pages (e.g. English and Arabic), implemented with hreflang (see the Technical SEO course). Use local phrasing and landmarks people actually use.

Measuring local pages

Track organic impressions and clicks per location page in Search Console, GBP-linked traffic via UTMs, calls and direction requests, and conversions. Pages that attract no impressions over months may be too thin or unnecessary.

Illustrative example

A home-cleaning company in London had 120 near-identical "cleaners in [borough]" pages. It consolidated them into 12 area hub pages for zones it genuinely serves, each with team information, customer stories and area-specific advice, and redirected the thin pages to the relevant hub. The consolidated pages were easier to maintain and more useful to visitors. (Illustrative scenario; outcomes vary.)

Hands-on: catch city-swap pages with a similarity check

Before publishing (or when auditing) a set of location or service-area pages, measure how similar they are. This Python script compares the visible text of each pair of pages using word shingles and flags pairs that are nearly identical:

import itertools
import re
import requests
from bs4 import BeautifulSoup

URLS = [
    "https://www.example.com/areas/salford/",
    "https://www.example.com/areas/stockport/",
    "https://www.example.com/areas/trafford/",
]

def text(url: str) -> str:
    r = requests.get(url, timeout=15, headers={"User-Agent": "page-similarity/1.0"})
    r.raise_for_status()
    soup = BeautifulSoup(r.text, "html.parser")
    for t in soup(["script", "style", "nav", "header", "footer"]):
        t.decompose()
    return " ".join(soup.get_text(" ").lower().split())

def shingles(s: str, k: int = 5) -> set:
    words = re.findall(r"\w+", s)
    return {" ".join(words[i:i + k]) for i in range(max(len(words) - k + 1, 1))}

pages = {u: shingles(text(u)) for u in URLS}
for a, b in itertools.combinations(URLS, 2):
    inter, union = len(pages[a] & pages[b]), len(pages[a] | pages[b]) or 1
    sim = inter / union
    flag = "  <-- likely city-swap" if sim > 0.6 else ""
    print(f"{sim:.2f}  {a}  vs  {b}{flag}")

A high similarity score is not a Google metric, and there is no official threshold — it is a prompt to ask: what on this page is genuinely about this place? If the honest answer is "only the town name", consolidate.

AI-assisted drafting without doorways

AI tools can help draft location pages from a structured brief, but only from real, location-specific inputs: the branch's team, services actually offered there, photos taken there, directions, local projects with permission, and reviews from that branch's customers. Generating hundreds of area pages from a template and a town list is exactly the pattern Google's scaled content abuse and doorway policies describe. For page systems at scale, see Programmatic SEO and AI Content at Scale (programmatic-seo-and-ai-content-at-scale).

Common mistakes

  • City-swap template pages.
  • Location pages without real local content or photos.
  • Store locators that search engines cannot crawl.
  • Linking all GBP profiles to the home page instead of the location page (for multi-location businesses).

Key takeaways

  • Doorway abuse includes near-identical city-swap pages created only to rank.
  • Build location pages for real branches with unique, useful details and LocalBusiness schema.
  • Create service-area pages only where you can add genuinely area-specific value; otherwise use one 'areas served' page.
  • Make location pages reachable via crawlable store locators and link each GBP profile to its location page.

Check your understanding

Quick questions to lock in the lesson. They don’t count towards your certificate.

  1. Which local page is most likely to be seen as a doorway?
  2. A multi-location business links every Business Profile to its home page. Better approach?

Put it into practice

Draft a location page for a real or fictional branch using the template, making sure at least five elements are unique to that location.

Enrol for free to save your progress

Reading is always free. Enrol to keep your place, take the final assessment and earn a verifiable certificate.