Skip to content

Duplicate meta descriptions

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.

Write a distinct meta description for every page that summarises that specific page. Keep each between 120 and 155 characters.

Set a unique description in each page’s metadata export rather than relying on a single value in the root layout.

app/about/page.tsx
export const metadata = {
title: 'About',
description: 'Meet the team behind Acme and the accessibility-first process we use on every build.',
}
// app/services/page.tsx
export 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:

app/blog/[slug]/page.tsx
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params
const post = await getPost(slug)
return { description: post.excerpt }
}

Set a <meta name="description"> in <Head> on every page, with a value specific to that page.

pages/about.tsx
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>
</>
)
}
src/routes/about/+page.svelte
<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.

pages/about.vue
<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.

src/pages/about.astro
---
import Layout from '../layouts/Layout.astro'
---
<Layout description="Meet the team behind Acme and how we work.">
<main>Content</main>
</Layout>
about.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." />

Compare the descriptions across your pages:

Terminal window
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:

Terminal window
npx orino-cli audit --url https://example.com --pages 10