{
  "id": 16369723,
  "title": "Building Local Landing Pages That Are Not Doorway Pages (Next.js App Router)",
  "url": "https://urgent.news/2026/10/24/building-local-landing-pages-that-are-not-doorway-pages-next-js-app",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-24T20:56:55.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/kabariyashyam10ui/building-local-landing-pages-that-are-not-doorway-pages-nextjs-app-router-bc3"
  },
  "original_language": "en",
  "account": "Creating localized landing pages for businesses that aren’t just doorways requires careful planning and execution. When building a site for a local service, like an AI receptionist product in Canada, it’s crucial to focus on the unique information relevant to each city rather than simply swapping city names in a generic template. This approach helps avoid the pitfalls of Google’s doorway pages, which are ignored or demoted.\n\nTo distinguish between useful local pages and doorway pages, the data model must include real local details. This means exporting a list of cities, each with its own slug, city name, province, area codes, time zone, an introductory message, common problems, nearby cities, and frequently asked questions. For example, each city entry would specify its own area codes, time zone, specific local challenges, and questions commonly asked by residents.\n\nA single dynamic route can be used to generate these pages statically. By mapping over the list of cities, you can create a route like `app/ai-receptionist/[city]/page.js`. This route generates static parameters for each city, allowing Next.js to create a unique page for every city in the dataset. The function `generateStaticParams` returns an array of objects containing the city slug, while `generateMetadata` uses this data to create SEO metadata for each page, ensuring that each page has a unique title, description, and canonical URL.\n\nStructured data is also essential to match what’s displayed on the page and to accurately represent the business’s location. Each page should output a Service component with the `areaServed` property set to the city slug. The main service page, which acts as the parent topic, should also output a `LocalBusiness` component if the business has a physical presence in that city, including its address, hours, and Google Business Profile link. Cities without a physical location should display truthful and honest wording about their service availability.\n\nTo further establish local credibility, include proof of being local on the main service page. This could be a block displaying the real phone number, operating hours, a link to the Google Business Profile, and a list of nearby towns served. Other cities should have more modest statements, such as “setup is done by phone or video,” to reflect their limited service area.\n\nLinking the pages effectively helps search engines understand the relationships between the pages. The main service page should link to every city page, while each city page should link back to the main page and to other relevant city pages. Additionally, related pages like “local SEO for AI receptionists” or “web design tailored for Edmonton businesses” should link to the specific city page, using descriptive anchor text to guide users and search engines.\n\nKeeping the number of cities to a manageable size—such as six well-detailed pages—often yields better results than creating sixty thin and generic pages. Each page should provide real value and answer specific questions that local users might have, ensuring that a local person finds the content useful. By following these guidelines—modeling local facts, using a single dynamic route, generating pages statically, matching structured data to the page content, and linking the pages appropriately—you can create high-quality, locally relevant landing pages that stand out from doorway pages and improve search engine visibility.",
  "summary": "If you've ever built a site for a local business, you've probably been asked for \"a page for every city.\" The lazy version — one template with the city name swapped — is exactly what Google calls a doorway page, and it tends to get ignored or demoted. I recently built city pages for an AI receptionist product in Canada, and tried to make each one genuinely useful. Here's the approach, with…",
  "key_points": [
    "Local landing pages focus on unique city-specific information, not generic templates.",
    "Data model includes city-specific details like area codes, time zones, and local FAQs.",
    "Single dynamic route generates static pages for each city, improving SEO and relevance."
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}