
What "meta description only in rendered HTML" means
This check fires when the page has no <meta name="description"> in the raw HTML that the server sends, and the tag only shows up after JavaScript executes in the browser or renderer. The stakes: any crawler that reads your source and doesn't wait for — or can't run — JavaScript sees a page with zero description, which is most non-Google bots, including several AI crawlers.
The key distinction from its sibling check: here the description is absent from source and injected by JS. In the Meta Description Updated by JavaScript case, a description is in the source but JavaScript overwrites it with a different one. This page is about a tag that simply isn't there until scripts run.
Raw source vs. rendered DOM: a real example
Here is what the server actually returns — note there is no description tag anywhere in the <head>:
<!-- Raw HTML from the server (view-source) -->
<head>
<title>Wireless Noise-Cancelling Headphones | Acme</title>
<link rel="canonical" href="https://acme.example/headphones/">
<script src="/app.bundle.js" defer></script>
</head>Then app.bundle.js runs and injects the description client-side, so the rendered DOM finally contains it:
<!-- Rendered DOM, after JS -->
<head>
<title>Wireless Noise-Cancelling Headphones | Acme</title>
<link rel="canonical" href="https://acme.example/headphones/">
<meta name="description" content="40-hour battery, adaptive ANC,
and multipoint pairing. Free returns.">
</head>The fix is to make sure that tag is in the server response, not conjured later:
<!-- Corrected: description present in the initial HTML -->
<head>
<title>Wireless Noise-Cancelling Headphones | Acme</title>
<meta name="description" content="40-hour battery, adaptive ANC,
and multipoint pairing. Free returns.">
<link rel="canonical" href="https://acme.example/headphones/">
</head>Which crawlers see what
| Consumer of your page | Runs JavaScript? | Sees your JS-injected description? |
|---|---|---|
| Googlebot (rendering pass) | Yes, on a deferred second wave | Usually yes — but delayed and never guaranteed |
| Bingbot | Limited | Often no |
| Most AI crawlers (GPTBot, common scrapers) | No | No — they read raw HTML only |
| Social share unfurlers (Slack, LinkedIn, iMessage) | No | No — your share preview goes blank or wrong |
| Screaming Frog (default, no JS rendering) | No | No — which is why the audit flagged it |
How to detect it on your own site
- View source vs. inspect: open
view-source:https://yourpage/and search forname="description". If it's missing there but present in devtools → Elements, it's being injected by JS. - curl the raw response:
curl -s https://yourpage/ | grep -i 'name="description"'. No output means the server isn't sending it. - GSC URL Inspection: run the URL, open View crawled page, and check the HTML Google stored. Compare it against the rendered screenshot to see the gap.
- Screaming Frog, two crawls: crawl once in default (text) mode and once with JavaScript rendering enabled. If the description only appears in the JS crawl, that's your confirmation.
- View Rendered Source extension: it shows raw and rendered side by side and highlights exactly which nodes JavaScript added — the description will show up as a rendered-only diff.
How to fix it
- Move description generation server-side. In a React/Vue/Next/Nuxt app, set it via server-side rendering or static generation (e.g. Next.js Metadata API, Nuxt
useHeadrendered on the server) so it lands in the initial HTML. - If you're stuck on a client-rendered SPA, put a real prerendering layer in front of it so bots receive fully-formed HTML — see prerendering as a stopgap.
- Confirm the tag is not merely being moved or duplicated by hydration, which would create a different problem.
- Re-run
curland view-source to verify the description is in the raw bytes, then re-crawl in text mode.
Why bother when Googlebot renders JS anyway? Because rendering is a second, delayed pass that Google is under no obligation to complete promptly, and everyone else — Bing, AI crawlers, social unfurlers — reads the raw HTML on the first look. Serving the description in source removes all that risk for zero downside.
FAQ
Google renders JavaScript, so does this even matter?
Yes. Google's render queue can lag, and it's still a best-effort second pass. Meanwhile AI crawlers and social unfurlers never run your JS at all, so a source-only-missing description costs you snippets and share previews everywhere outside Google.
How is this different from "updated by JavaScript"?
Here the description is absent from source and JS adds it. In the updated-by-JavaScript case a description exists in source and JS replaces it with something else. Absent vs. overwritten — different root cause, different fix.
What causes a description to end up JS-only?
Almost always a client-rendered framework where meta tags are set in component code that runs in the browser, without server-side rendering or prerendering configured for the head.
Do social platforms run my JavaScript?
No. Slack, LinkedIn, Facebook, and iMessage unfurlers read the raw HTML only. A JS-injected description won't reach them, which is why your link previews look empty or generic.
Is server-side rendering the only fix?
SSR or static generation is the clean fix. Prerendering is a legitimate stopgap when refactoring isn't feasible yet. Both put real HTML in the server response — see Server-Side vs Client-Side Rendering for SEO.
Related: The Forgotten HTML: What AI Crawlers Really See and the sibling checks Canonical Only in the Rendered DOM and Page Title Only in Rendered HTML.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







