# Every page has a unique title tag

- **Pattern:** `ab-002515` (`seo-fundamentals.meta-tags.title-present`)
- **Severity:** critical
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-002515
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-002515)

## Why it matters

Search engines use the title tag as the primary signal for what a page is about and display it as the clickable headline in results. Pages without a title tag, or pages that all share one identical title, collapse into a single entry in Google's index and compete with each other for ranking. The result is lost organic traffic, cannibalized rankings across your own pages, and poor click-through rates on the few results that do surface.

## Severity rationale

Critical because missing or duplicate titles directly prevent indexing and kill organic discovery across the entire site.

## Remediation

Export a unique `metadata` object from every `page.tsx` in the App Router, or use `generateMetadata` for dynamic routes. Each title should describe that specific page's content — do not reuse the site name alone.

```ts
// app/about/page.tsx
export const metadata = {
  title: 'About Us | YourSite',
}
```

For a root template, set `title: { template: '%s | YourSite', default: 'YourSite' }` in `app/layout.tsx` so child pages only supply the segment.

## Detection

- **ID:** `title-present`
- **Severity:** `critical`
- **What to look for:** Examine how page titles are set across the project. For Next.js App Router, look for `metadata` exports or `generateMetadata` functions in `layout.tsx` and `page.tsx` files. For Pages Router, look for `<Head>` components with `<title>` tags. For other frameworks, check the equivalent meta tag mechanism.
- **Pass criteria:** Count all page routes in the project. Every page route has a title tag set, either directly or via a layout that provides a default. Titles are unique per page (not all identical) — at least 2 distinct title strings must exist across all routes. A shared layout title that gets overridden by child pages counts as passing. If the root layout provides a template-style title (e.g., `title: { template: '%s | My App', default: 'My App' }`) and individual pages supply their own segment title, this passes — the per-page title is unique even though the layout contributes the suffix. Report even on pass: `"X of Y page routes have explicit title tags."` Do NOT pass when a single hardcoded title string is reused identically on every page without per-page variation.
- **Fail criteria:** Any page route has no title mechanism, or all pages share an identical static title with no per-page variation (e.g., every page just says "My App"). If every page renders the exact same static title string with no per-page customization, this fails even if a layout title exists.
- **Skip (N/A) when:** Never — every web project should have page titles. This check always applies.
- **Detail on fail:** Name the specific page routes that lack titles, or note that all pages share the same static title. Example: `"Pages /about, /pricing, /blog have no title tag. Only the root layout sets a title."`
- **Remediation:** Your pages need unique, descriptive titles for search engines to properly index them. In Next.js App Router, export a `metadata` object from each `page.tsx`:

  ```ts
  // app/about/page.tsx
  export const metadata = {
    title: 'About Us | YourSite',
  }
  ```

  Or use `generateMetadata` for dynamic titles. In Pages Router, use `next/head`:

  ```tsx
  import Head from 'next/head'
  export default function About() {
    return (<><Head><title>About Us | YourSite</title></Head>...</>)
  }
  ```

  Each page's title should be unique and describe the page's content.

Taxons: findability

HTML version: https://auditbuffet.com/patterns/ab-002515
