Rule referencecontent/meta-uniqueness

Meta Description Uniqueness — When Snippets Are Templated

content/meta-uniqueness masks the entity tokens in every page's meta description, lower-cases and trims what remains, and fires an error the moment two or more pages collapse to the same string — the templated-snippet pattern Google has treated as scaled content since the March 5, 2024 spam update.

Test your site for meta description uniqueness — when snippets are templated

Loading bot check… if this doesn't resolve in a few seconds, refresh the page.

We'll surface findings tagged with `content/meta-uniqueness`.

What it detects

content/meta-uniqueness checks the one piece of copy most teams forget to vary: the meta description. For every page that has one, the rule masks the entity tokens using your entity patterns, then lower-cases and trims the result. Pages whose masked descriptions are byte-for-byte identical are grouped together.

Any group with two or more members fires an error naming the count of pages that share the template. The masking is the important part. A description like 'Compare {tool} against the competition — pricing, features, and migration paths' looks unique on the surface for every tool, but the moment you mask the tool name, all of them collapse to the same sentence. That collapse is the signal: the description was generated from a template, not written for the page. The rule deliberately uses exact-match-after-masking rather than fuzzy similarity, so it only fires when the underlying snippet really is one template wearing different nouns.

Why it matters

Duplicate meta descriptions waste your single best chance to control how a result looks in the SERP. When Google detects templated or duplicate descriptions it routinely discards them and writes its own snippet from on-page text — so the copy you optimised is replaced by whatever the algorithm grabs. At scale, identical descriptions across a template are also a clean scaled-content tell: a thousand pages with one masked description is a thousand pages a script produced.

Because the meta description is short and structured, it is one of the cheapest signals to get right and one of the most embarrassing to get wrong. A pSEO template that binds real per-entity data into the body but leaves the description as a fixed sentence frame is announcing the template in the one field crawlers read first. Fixing it is low-effort — bind a distinct value into each description — and it clears both this rule and a chunk of the perception that the site is mass-produced.

A page that fails

A jobs board ships 4,000 pages whose descriptions all read 'Find {role} jobs in {city}. Browse openings, salaries, and apply today.' Each looks distinct in the page source, but after masking {role} and {city} every one becomes 'find jobs in. browse openings, salaries, and apply today.' The rule groups all 4,000 and fires error: '4000 pages share the same meta description template after entity masking.'

A page that passes

The same jobs board binds a real per-page figure into each description: 'Compare 312 senior-nurse openings in Austin — median pay $98,000, salaries from $72,000 to $110,000, 41 hiring this week.' After masking the role and city, the descriptions still differ because the counts and salaries differ per page. No two collapse to the same string, the rule stays silent, and the SERP shows the copy the team actually wrote.

How to fix it

  1. 1Bind a distinct value into every description. A per-page count, price, date, or named attribute pulled from your data source breaks the masked-match because the variable part survives masking.
  2. 2Do not rely on the entity alone. Swapping only the city or role is exactly what the rule masks away; the description must vary on something the mask does not remove.
  3. 3Write the description from the page's most specific fact. The best snippets answer 'why this page' in 155 characters — the same discipline that satisfies the rule makes the SERP result more clickable.
  4. 4Audit templates, not pages. One bad description template generates thousands of duplicates; fix the template's data binding once and the entire cluster clears.
  5. 5Check for empty descriptions too — pages with no meta description are skipped here, but they surface in tech/og-completeness and lose snippet control for a different reason.

SpamBrain context

Duplicate metadata predates SpamBrain as a quality concern — Google's old Search Console 'HTML Improvements' report once flagged duplicate descriptions directly — but the March 5, 2024 scaled-content-abuse policy gave it new weight by treating templated mass production as a violation independent of authorship. Identical descriptions across a template are among the most legible evidence that pages came off a generator.

content/meta-uniqueness (in @pseolint/core, MIT-licensed at github.com/ouranos-labs/pseolint) sits in the integrity category alongside content/unique-value, and the two are complementary: one checks that the body says something page-specific, the other that the snippet does. It uses entity-masked exact matching rather than the SimHash similarity that spam/near-duplicate runs on bodies, because meta descriptions are short enough that fuzzy matching would over-fire — a few shared words would look like a template when they are not. Exact-match-after-masking keeps the false-positive rate near zero.

Frequently asked questions

Why mask entities before comparing descriptions?
Because the surface text already differs — every description has a different city or product in it. Masking removes that variable so the rule can see whether anything else changes. If two descriptions are identical once the entity is gone, they came from one template; if they still differ, real per-page copy survives. Masking is how the rule distinguishes 'written per page' from 'generated from a frame'.
Is a duplicate meta description an actual penalty?
Not a manual penalty, but a real cost. Google frequently ignores duplicate or templated descriptions and writes its own snippet from page content, so you lose control of how the result reads. At scale, the duplication is also a scaled-content signal. The rule treats it as an integrity-category error because it is both a wasted opportunity and a fingerprint of mass production.
How is this different from title-uniqueness?
content/title-uniqueness compares raw page titles and flags exact duplicates; content/meta-uniqueness compares descriptions after entity masking. The difference matters: titles are usually meant to contain the entity, so raw comparison is right there, whereas descriptions are prose where a masked template is the real concern. They guard adjacent fields with deliberately different logic.
What if my descriptions legitimately share a sentence?
Sharing a phrase is fine — the rule fires only on exact match after masking, not on partial overlap. If the descriptions differ on any unmasked content (a count, a price, a distinct clause), they will not group. The rule is built to tolerate a common voice while catching descriptions that are wholly templated.
Our wedding-venue listings all describe 'an unforgettable celebration' — is the meta the problem?
That phrasing is the giveaway. Bind each venue's concrete distinguishers into the description instead: the ballroom's seated capacity, the garden-gazebo ceremony option, the in-house catering minimum, the reception square-footage, and the off-season Friday rate. A description reading 'Riverside Barn seats 180, gazebo ceremonies, 7,500-dollar Saturday corkage-free minimum' survives masking because the banquet figures differ per venue, while 'an unforgettable celebration at {venue}' collapses to one templated string the moment the name is masked away. A bridal-suite photo count, a sommelier-curated wine-pairing menu, a string-quartet add-on, and a marquee-tent rain contingency separate one ballroom from the next far better than any superlative adjective. A kiln-fired ceramics studio that names each glaze recipe, the cone firing temperature, and the wheel-thrown dimensions per piece avoids the same templated-snippet collapse.

Related rules

Want to know whether this rule actually fires on your site?

Run pseolint against your sitemap. The audit is free, takes about a minute, and returns a per-URL list of every rule that fired — including this one — with the exact metric values so you can prioritise the fix queue.