Pages with custom meta descriptions get 5.8% higher click-through rates than those using auto-generated snippets. Without one, Google decides what to show - and it's rarely optimal.
When your page lacks a meta description, search engines generate one automatically by extracting text from your page content. This sounds helpful until you realize the algorithm doesn't understand context, value propositions, or what makes users click.
Google might pull a random sentence from your footer. Bing might grab your cookie policy notice. The result is a search snippet that fails to communicate why someone should visit your page over the other nine results.
The technical issue is simple: Lighthouse checks for a <meta name="description"> tag in your document head. If it's missing or empty, you fail the audit. But the real problem is strategic - you're giving up control of the single piece of text that represents your page in search results.
Consider what happens when someone searches for "best project management software":
One gets clicked. One gets scrolled past.
Open the Elements panel and search for meta name="description":
Ctrl/Cmd + F in Elements panelmeta name="description"Quick console check:
const meta = document.querySelector('meta[name="description"]')
console.log(meta ? meta.content : 'No meta description found')
If the content is empty or missing entirely, you have the issue.
Run a Lighthouse SEO audit. Look for "Document does not have a meta description" in the results. The audit is binary - you either have a valid meta description or you don't.
Lighthouse specifically checks that:
<meta name="description"> element exists in the documentcontent attribute contains non-empty text (not just whitespace)Place this in your document's <head>:
<head>
<meta name="description" content="Your compelling description here. Aim for 150-160 characters that summarize the page and encourage clicks.">
</head>
Write descriptions that:
Examples by page type:
<!-- Homepage -->
<meta name="description" content="Open-source project management for developers. GitHub integration, Kanban boards, and sprint planning. Free for teams up to 10.">
<!-- Product page -->
<meta name="description" content="Wireless noise-canceling headphones with 40-hour battery life. Premium audio, comfortable fit, and seamless device switching. Ships free.">
<!-- Blog post -->
<meta name="description" content="Step-by-step guide to migrating from REST to GraphQL without breaking your existing clients. Includes code examples and rollback strategies.">
<!-- Documentation -->
<meta name="description" content="Complete API reference for the Authentication module. Covers OAuth 2.0 flows, JWT tokens, refresh handling, and error codes.">
For sites with many similar pages, create templates:
<!-- Product template -->
<meta name="description" content="Buy {product_name} - {key_feature}. {price}. Free shipping on orders over $50.">
<!-- Category template -->
<meta name="description" content="Shop {category_name} - {product_count} items. Filter by {popular_filters}. Fast delivery.">
<!-- Blog template -->
<meta name="description" content="{first_150_chars_of_content}">
Templated descriptions are better than none, but custom descriptions outperform templates when you have the resources.
For SPAs and dynamic content, set descriptions programmatically:
// Vanilla JS
// React Helmet
import { Helmet } from 'react-helmet'
function setMetaDescription(content) {
let meta = document.querySelector('meta[name="description"]')
if (!meta) {
meta = document.createElement('meta')
meta.name = 'description'
document.head.appendChild(meta)
}
meta.content = content
}
function ProductPage({ product }) {
return (
<>
<Helmet>
<meta name="description" content={`${product.name} - ${product.shortDescription}`} />
</Helmet>
{/* page content */}
</>
)
}
export const metadata = {
description: 'Your page description here'
}
// Or generate dynamically
export async function generateMetadata({ params }) {
const product = await getProduct(params.id)
return { description: product.summary }
}
useSeoMeta composable:<script setup>
useSeoMeta({
description: 'Your page description here'
})
// Or with dynamic data
const { data: product } = await useFetch('/api/product')
useSeoMeta({
description: product.value.summary
})
</script>
After adding meta descriptions:
1. View page source
Press Ctrl/Cmd + U and search for meta name="description". Confirm it appears in the <head> with your content.
2. Re-run Lighthouse
The "Document does not have a meta description" audit should pass. If it still fails, check that:
<head>, not <body>content attribute isn't empty3. Test in Google Search Console
Use the URL Inspection tool to see how Google renders your page. Check that the meta description is detected.
4. Preview your snippet
Search for site:yourdomain.com/page-url to see how the description appears in actual search results. Note that Google may choose to show different text if it believes it better matches the query.
<meta name="description" content=""> technically exists but fails the audit. The content must have actual text.Meta description issues often appear alongside:
One template with a missing meta description could affect thousands of pages. A CMS update might have broken your SEO plugin. Unlighthouse scans every URL on your site and flags pages missing meta descriptions, so you can catch issues across your entire domain, not just the pages you remember to check.
Link Text
Learn how to replace generic link text like "click here" with descriptive text that helps search engines understand your content.
Invalid robots.txt
Fix robots.txt validation errors that prevent search engines from properly crawling your site. Learn syntax rules, common errors, and proper configuration.