Duplicate meta descriptions
What this means
Section titled “What this means”Two or more of your pages have the same meta description. The description is the snippet Google shows under the title in search results. When several pages share one description, none of them describes its own content accurately, so Google is more likely to ignore the tag and generate its own snippet from the page body — usually a worse result than a description written for that page.
Duplicate descriptions almost always come from a single template applied site-wide without per-page overrides.
How to fix it
Section titled “How to fix it”Write a distinct meta description for every page that summarises that specific page. Keep each between 120 and 155 characters.
Next.js App Router
Section titled “Next.js App Router”Set a unique description in each page’s metadata export rather than relying on a single value in the root layout.
export const metadata = { title: 'About', description: 'Meet the team behind Acme and the accessibility-first process we use on every build.',}
// app/services/page.tsxexport const metadata = { title: 'Services', description: 'Web app development, accessibility audits, and performance work for UK financial services teams.',}For dynamic routes, generate the description from the page’s own data:
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) { const { slug } = await params const post = await getPost(slug) return { description: post.excerpt }}Next.js Pages Router
Section titled “Next.js Pages Router”Set a <meta name="description"> in <Head> on every page, with a value specific to that page.
import Head from 'next/head'
export default function About() { return ( <> <Head> <meta name="description" content="Meet the team behind Acme and how we work." /> </Head> <main>Content</main> </> )}SvelteKit
Section titled “SvelteKit”<svelte:head> <meta name="description" content="Meet the team behind Acme and how we work." /></svelte:head>Derive it from load data for dynamic routes so each page gets its own value.
<script setup>useSeoMeta({ description: 'Meet the team behind Acme and how we work.',})</script>Pass a distinct description prop to your layout on each page.
---import Layout from '../layouts/Layout.astro'---<Layout description="Meet the team behind Acme and how we work."> <main>Content</main></Layout>Plain HTML
Section titled “Plain HTML”<meta name="description" content="Meet the team behind Acme and how we work." />
<!-- services.html --><meta name="description" content="Web app development and accessibility audits for UK teams." />Verify the fix
Section titled “Verify the fix”Compare the descriptions across your pages:
curl -s https://example.com | grep -i 'name="description"'curl -s https://example.com/about | grep -i 'name="description"'Each should return a different value. Re-run the audit with multiple pages to confirm:
npx orino-cli audit --url https://example.com --pages 10