Meta description length, duplicates and when Google ignores yours

Short answer

The meta description, <meta name="description" content="…">, is a short summary of the page that Google sometimes shows under the title in search results. Give every important page its own, written for people deciding whether to click: one or two sentences, roughly 120 to 155 characters, so it isn't cut off on desktop. Google sets no limit, but shortens snippets to fit the screen. Google often writes its own snippet from the page instead, especially when yours is missing, duplicated or doesn't match the search.

What a meta description does

It's the sales pitch under your link. When Google uses it, it's the main thing a searcher reads before deciding whether to click:

Google builds snippets mainly from the page's own content and uses the meta description as a second source, when it describes the page better than the visible text. So a good description raises the chance it's shown, but doesn't guarantee it.

Meta description length

Google says there's no limit on how long a meta description can be. Snippets are simply cut to fit the device. In practice:

LengthRough guideWhy
Too shortUnder about 70 charactersToo little room to say what the page offers (70 is SEOSnip's threshold, not Google's)
About rightAbout 120 to 155 charactersUsually shows in full on desktop
Too longOver about 160 characters, or about 985 pixels in 14px ArialThe end gets replaced with "…"

Like titles, it's the width that gets cut, not the character count: capitals and wide letters run out of room sooner. See title tag length for why pixels matter.

Why Google shows other text

Google often shows other text from the page instead. It's most likely when:

  • There's no description, so it has to pick text from the page.
  • It's the same on many pages, such as one site-wide description in the template. Google recommends a different one for each page.
  • It's a list of keywords, which Google says is less likely to be shown.
  • It doesn't match the search. Google may show the part of the page that answers the query instead.
  • It only repeats the title, which tells the searcher nothing new.

More than one <meta name="description"> on a page, often one from the theme and one from a plugin, makes it unclear which you meant. Keep one.

How to write one

  1. Summarise the page, not the site. What will someone get if they click?
  2. Lead with the useful part, so it still makes sense if the end is cut.
  3. Include the facts people compare on: price, sizes, delivery, date, author, as fits the page.
  4. Make each one unique. On large sites, generating them from page data (product name, category, key details) is fine, as long as they read naturally and differ from page to page.
  5. Prioritise. If you can't write them all, start with the homepage and the pages that get the most search traffic.

How to check by hand

1Check the description, and look for copies 1 minute

Open DevTools (F12), go to the Console and paste:

// Checks this page's meta description, then compares it with up to 20 pages it links to
const clean = s => (s || '').replace(/\s+/g, ' ').trim();
const all = [...document.querySelectorAll('meta[name="description" i]')].map(m => clean(m.getAttribute('content')));
const desc = all[0] || '';
const ctx = document.createElement('canvas').getContext('2d');
ctx.font = '14px Arial';
const px = Math.round(ctx.measureText(desc).width);
const problems = [
  !desc && 'MISSING',
  all.length > 1 && 'MORE THAN ONE',
  desc && desc.toLowerCase() === clean(document.title).toLowerCase() && 'SAME AS THE TITLE',
  desc && desc.length < 70 && 'SHORT',
  (desc.length > 160 || px > 985) && 'LIKELY CUT OFF',
].filter(Boolean);
console.table({
  'Meta descriptions': all.length,
  Characters: desc.length,
  'Pixels (14px Arial, estimate)': px,
  Result: problems.join(', ') || 'ok',
});
// Duplicates: same description on other pages of the site. Skips sign-out, cart and delete links, and files.
if (desc) {
  const skip = /log[-_]?(out|off)|sign[-_]?(out|off)|delete|remove|unsubscribe|cart|basket|checkout|\.(pdf|zip|docx?|xlsx?|mp4|jpe?g|png|gif|webp)(\?|$)/i;
  const here = location.href.split('#')[0];
  const links = [...new Set([...document.links].map(a => a.href.split('#')[0])
    .filter(h => h.startsWith(location.origin + '/') && h !== here && !skip.test(h)))].slice(0, 20);
  const same = [], failed = [];
  for (const url of links) {
    try {
      const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
      if (!res.ok || res.redirected || !/html/i.test(res.headers.get('content-type') || '')) {
        res.body?.cancel();
        failed.push(url);
        continue;
      }
      const doc = new DOMParser().parseFromString(await res.text(), 'text/html');
      if (clean(doc.querySelector('meta[name="description" i]')?.getAttribute('content')) === desc) same.push(url);
    } catch (e) { failed.push(url); }
  }
  console.log(same.length ? 'Same description on: ' + same.join(', ')
    : 'None of the ' + (links.length - failed.length) + ' linked pages checked share this description');
  if (failed.length) console.log('Skipped (error, redirect, timeout or not HTML): ' + failed.join(', '));
}

It reports how many descriptions the page has, the length in characters, an estimate of its width in Google's desktop results (14px Arial), and every problem it finds: missing, short, likely cut off or the same as the title. Then it fetches up to 20 same-site pages this one links to and lists any with exactly the same description.

It reads the page as rendered, so it includes a description added by JavaScript. The duplicate check reads each linked page's server HTML, so it misses descriptions added there by JavaScript. It skips sign-out, cart and delete links, files, and pages that fail or redirect, but every other link gets a normal request, so run it while signed out.

2See what Google actually shows 1 minute

Search Google for site: followed by the page's URL. Compare the snippet with your description. The snippet changes with the search, so also try a phrase people would use to find the page. If it's different text from the page, Google preferred that, so look at what it chose and why.

3Look at the source 30 seconds

Press Ctrl+U (⌘+⌥+U on a Mac) and search for name="description". There should be one match, in the head. A description added by JavaScript won't show here; the Console check above sees it.

On Shopify, WordPress and Next.js

  • Shopify: Use the Description field under Edit website SEO on the page. The homepage description is under Online Store > Preferences.
  • WordPress: Descriptions usually come from an SEO plugin. If you see two, the theme or a second plugin is probably adding another.
  • Next.js: Set description in the metadata object or return it from generateMetadata.

How crawlers report this

If a crawl sent you here, these are the labels to look for. Our guide to Screaming Frog and Sitebulb issues covers other common ones.

Screaming FrogSitebulbWhat it means
Meta Description: MissingMeta description is missingSearch engines will write the snippet themselves.
Meta Description: MultipleMultiple meta descriptionsMore than one description tag on the page.
Meta Description: Over 155 CharactersMeta description length too longThe description may be cut off in results.
Meta Description: Below 70 CharactersMeta description length too shortThe description may be too thin to be used.
No direct matchTitle and meta description are the sameThe description repeats the title and adds nothing.

Doing this on every page?

SEOSnip checks meta descriptions for you

Open the extension on any page and it measures the description in characters and Google's desktop pixels. You get:

  • A missing description, or more than one, in the server HTML or the rendered page
  • One under 70 or over 160 characters, or within 160 characters but too wide, with the part that would be cut struck through
  • A description that repeats the page title
  • A ticket with that evidence, and a "Check if fixed" button that re-runs the check