# Missing meta description

> No meta description lets Google write its own snippet from page text — usually a worse pitch. Add a 150–160 character summary.

_Category: Search visibility · Detector `seo` · Check `meta-description-missing` · Severity: warning_

The meta description is the paragraph under your title in search results — your one chance to pitch the click. Without it, Google scrapes some text off the page and often picks a boilerplate or nav fragment. AI-built pages skip it because it lives in `<head>`, which the generated components never touch.

## Symptoms

- Search snippets are auto-generated and off-message
- Different queries surface random fragments of your page as the snippet
- No control over the sentence that sells the click

## How VibeCheck detects it

The `seo` detector flags this live in the browser and reports it to the widget's Problems list — and to your coding agent over MCP.

- **Issue string:** `Missing meta description`
- **Threshold:** no <meta name="description">

## Root causes

- The `<head>` is unmanaged, so no description tag is emitted
- Descriptions were considered “optional” and skipped
- A per-route description was never written

## The fix

Write a unique 150–160 character description per page that summarises the content and includes a reason to click. It does not directly affect ranking, but a compelling snippet lifts click-through, which does.

### Steps

1. Write a 150–160 character summary with the page’s value and a keyword
2. Emit it as `<meta name="description">` via your head/metadata mechanism
3. Confirm it appears in view-source and is unique per route

```html
<meta name="description" content="Send branded invoices in under a minute, track payments, and chase overdue clients automatically. Built for freelancers." />
```

## Framework-specific fixes

### React

Render `<meta name="description">` in the component (React 19 hoists it to `<head>`).

```tsx
<meta name="description" content="Simple per-seat pricing with a 14-day free trial." />
```

### Next.js

Set `description` in the route’s metadata object (or `generateMetadata` for dynamic pages).

```tsx
export const metadata: Metadata = {
  title: 'Pricing — Acme',
  description: 'Simple per-seat pricing with a 14-day free trial. No card required to start.',
}
```

[Next.js docs](https://nextjs.org/docs/app/api-reference/functions/generate-metadata)

### Vue

Add it to `useHead`’s meta array.

```ts
useHead({
  meta: [{ name: 'description', content: 'Simple per-seat pricing with a 14-day free trial.' }],
})
```

### Svelte

Place the meta tag inside `<svelte:head>`.

```svelte
<svelte:head>
  <meta name="description" content="Simple per-seat pricing with a 14-day free trial." />
</svelte:head>
```

### Vanilla JS

Add the meta tag to each page’s `<head>`.

```html
<meta name="description" content="Simple per-seat pricing with a 14-day free trial." />
```

## FAQ

### Does a meta description affect ranking?

Not directly. It affects click-through rate by controlling the snippet, and higher CTR is a positive signal. Treat it as ad copy for the search result.

### How long should it be?

About 150–160 characters. Longer gets truncated; much shorter wastes the space. Make each one unique to the page.

### Will Google always use my description?

No — Google may rewrite the snippet to match the query. A good description still wins the majority of the time and is worth writing.

## Related problems

- [Meta description is too long](https://vibecheck.wcgw.fun/fix/meta-description-too-long.md) — Search visibility
- [Missing page title](https://vibecheck.wcgw.fun/fix/missing-page-title.md) — Search visibility
- [Missing og:description](https://vibecheck.wcgw.fun/fix/missing-og-description.md) — Search visibility
- [Missing social preview image (og:image)](https://vibecheck.wcgw.fun/fix/missing-og-image.md) — Search visibility

---

Fix guide from VibeCheck — https://vibecheck.wcgw.fun/fix/missing-meta-description. Full site index for LLMs: https://vibecheck.wcgw.fun/llms.txt
