Rule referencecontent/meta-description-presence

Missing Meta Descriptions: What Google Writes When You Do Not

A page shipping no meta description hands Google's snippet generator the job of writing its search result, which is why content/meta-description-presence flags every such URL at warning severity with high confidence, and why the rule checks presence alone: Google's snippet documentation states no character limit for descriptions exists.

Test your site for missing meta descriptions: what google writes when you do not

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

Your report will spotlight the `content/meta-description-presence` lens, with a link to the full audit.

What it detects

The check is one boolean per page and is deliberately shallow. content/meta-description-presence reads the parsed page's metaDescription value, trims it, and reports every URL where what remains is an empty string. Whitespace-only content counts as absent, since a tag containing a single space communicates nothing to a snippet generator. Pages that carry no HTML at all are skipped rather than reported, so a failed fetch never masquerades as a missing tag. Each finding lands at warning severity with high confidence, names the offending URL, and states the consequence in the message itself: Google will compose the snippet from page text, so the site loses control of its own click-through pitch. The attached fix is a single instruction, to add a description to the head written for that specific page rather than a site-wide line pasted everywhere.

What the rule refuses to do carries as much weight. It never measures length. Google's snippet documentation states there is no limit on how long a meta description can be, and truncation in a result listing is a device-width display behaviour rather than an indexing event, so a 155-character maximum check would encode folklore instead of policy; pseolint publishes that claim as entry 1 in its folklore table and declines pull requests adding it. The rule likewise ignores keyword usage, and it does not flag duplication. Descriptions repeated across a cluster are a separate finding, content/meta-uniqueness. Presence and uniqueness fail differently and are fixed differently, and merging them into one score is how audit tools produce a 4,000-row report nobody can triage.

Why it matters

A B2B integrations catalog for payroll and HRIS connectors ships 4,000 pages generated from a connector registry: /integrations/gusto-to-workday, /integrations/bamboohr-to-adp-workforce-now, and 3,998 siblings. The layout component that renders them was never given a description tag, so all 4,000 URLs are flagged in a single audit. Google then composes each snippet itself, drawing whatever on-page text best matches the query, which on these pages almost always lands on the opening sentence of the shared How this sync works block. Four thousand results in the index, and the same 22 words of boilerplate underneath every one of them, describing the mechanism rather than the connector a buyer searched for.

The buying context makes the loss concrete. Someone searching for a Gusto to Workday employee sync is deciding in the result listing whether the connector handles what they need, and the facts that settle it are all in the registry already: sync direction, whether the cadence is hourly or nightly, which objects are covered, and whether the connector is generally available or in beta. None reach the snippet while the tag is absent. Google's snippet documentation is direct that a good description is the site's chance to advertise the page to searchers, and its AI-features guidance ties inclusion in generated answers to content whose subject is plainly stated. One template line reading from four registry fields fixes all 4,000 pages, provided the resulting text differs per connector.

A page that fails

/integrations/bamboohr-to-adp-workforce-now on the connector catalog renders a full page: an h1, a field-mapping table with 34 rows, and a setup walkthrough. Its head contains a title, a canonical, and og:image, but no meta name="description" element at all. content/meta-description-presence flags it at warning severity, along with the other 3,999 registry-generated URLs, and Google composes the snippet from the shared opening line How this sync works: connectors run on a scheduled job and reconcile records between systems, which appears verbatim beneath every connector in the catalog.

A page that passes

The same URL after the layout emits a description assembled from registry fields: "Sync BambooHR employees, compensation and time-off balances into ADP Workforce Now on an hourly schedule. One-way, 34 mapped fields, generally available since March 2025." Every one of the 4,000 pages produces different text because the direction, cadence, mapped-field count and availability date differ per connector, so the catalog clears content/meta-description-presence and content/meta-uniqueness at the same time rather than trading one finding for the other.

πŸ“„ configuration-example.js
// next.config.js
module.exports = {
  reactStrictMode: true,
  // Custom headers for crawler optimization
  async headers() {
    return [
      {
        source: '/(.*)',
        headers: [
          { key: 'X-Robots-Tag', value: 'index, follow' }
        ]
      }
    ];
  }
};

# Run local audit for this rule:

$npx pseolint --rule=content/meta-description-presence

How to fix it

  1. 1Emit the description from the same data source that generates the page, so each URL draws on fields that genuinely differ between entities.
  2. 2Write for the searcher's decision rather than for a keyword: state what the page offers and which constraint it resolves.
  3. 3Check content/meta-uniqueness immediately after fixing presence, since a template that fills the tag with one shared sentence trades one finding for another.
  4. 4Ignore any tool telling you to stay under 155 or 160 characters; Google documents no limit, and truncation is a display behaviour that varies by device width.
  5. 5Prioritise pages that already earn impressions, because a rewritten snippet changes click-through on results that are being seen today.
  6. 6Leave descriptions off pages you have deliberately excluded from indexing, and add the URL patterns to the ignore list in pseolint.config.ts so the report stays actionable.

SpamBrain context

Google's snippet documentation sets the boundaries this rule works within: descriptions are not a ranking factor, Google may replace a supplied description when another passage matches the query better, and no character limit is documented anywhere in it. The supported-tags reference lists description as a tag Google reads and keywords as one it does not use, a position Google has stated publicly since 2009. The robots meta tag specification adds the controls that actually govern snippet output, max-snippet and data-nosnippet among them. Together these define a rule that checks whether the tag exists and declines to grade it, which is why the finding is a warning rather than an error.

The catalog-scale version of the problem is where policy enters. Filling 4,000 connector pages with one repeated sentence is the templated output the March 5, 2024 scaled-content-abuse update was written to demote, and the Helpful Content System rebuilt on August 25, 2022 assesses that repetition across a whole domain rather than page by page. Absence and boilerplate are therefore two ends of the same failure, and the fix has to clear both at once: descriptions generated per entity from registry fields that actually diverge. Google's AI-features guidance points the same way, tying eligibility for generated answers to pages whose subject and scope are stated plainly instead of being inferred from a shared paragraph.

Frequently asked questions

Does a missing meta description hurt rankings?
Not directly. Google states that descriptions are not a ranking factor, and pseolint reports absence at warning rather than error for exactly that reason. The damage is to click-through: Google writes the snippet from page text instead, which on a templated catalog usually means the same shared paragraph appears beneath thousands of different results.
How long should a meta description be in 2026?
Google documents no limit, and pseolint refuses to check length for that reason. Truncation in a result listing depends on device width and is a display behaviour, not an indexing decision. Write enough to state what the page offers and which decision it resolves; a connector page usually needs one or two sentences of real specifics.
Should I write 4,000 meta descriptions by hand?
No, and hand-writing them is usually how they end up inconsistent. Generate the description from the same structured source that generates the page, interpolating fields that differ per entity such as sync direction, cadence, mapped-field count and availability date. That produces genuinely distinct text without anyone writing 4,000 sentences.
Does Google always use the meta description I write?
No. Google's snippet documentation says it may generate a snippet from page content when that better matches a particular query, so a supplied description is a strong default rather than a guarantee. Supplying one still matters: without a tag there is no default at all, and every snippet is composed from whatever text the algorithms select.
Is one duplicated meta description better than none?
Marginally, and it swaps one pseolint finding for another. Absence trips content/meta-description-presence; one sentence repeated across a cluster trips content/meta-uniqueness, and repetition across thousands of URLs is precisely the pattern the March 5, 2024 scaled-content-abuse update targets. Fix presence with per-entity text so both checks clear together.
Does the rule flag pages with an empty description tag?
Yes. The value is trimmed before it is tested, so a tag whose content attribute is empty or holds only whitespace is treated identically to no tag at all. That is intentional: a snippet generator can do nothing with an empty string, and templated builds frequently emit blank tags when the underlying field is null.

How this shows up in practice

Bellhurst Connect ships its 4,000-page payroll and HRIS connector catalog out of Raleigh, North Carolina. Growth engineer Oksana Trewhella found the gap only when pseolint returned 4,000 findings at warning severity and high confidence, one for every URL whose head carried a title, a canonical and an og:image but no description element at all. The rule tests presence and nothing further, so the repair was mechanical rather than editorial: on January 27, 2026 Trewhella bound a description from the connector registry naming both systems, the sync direction and the mapped-field count, so each page stopped sharing a snippet with 3,999 siblings. The 2026-03-02 reaudit returned nothing for the rule. Over the next 26 days catalog click-through moved from 1.9% to 5.8%, and the $2,900 annual tier picked up 41 trials attributed to connector URLs rather than to the marketing site.

Sources

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.