
What "meta description updated by JavaScript" means
This check fires when your page ships a perfectly good <meta name="description"> in the raw HTML, and then JavaScript runs and replaces its content with something different. The stakes: crawlers that read source get one description, crawlers that render get another, and you no longer control which version any given consumer indexes or shows.
Draw the line clearly against the sibling check. Here a description is present in source and gets overwritten. In Meta Description Only in Rendered HTML, there's no description in source at all and JS creates one from scratch. This page is about a conflict between two values, not a missing tag.
A real example of the overwrite
The server sends this — a clean, hand-written description:
<!-- Raw HTML from the server -->
<meta name="description"
content="Hand-forged chef knives, balanced for daily use.
Lifetime sharpening included.">Then a router or analytics/personalization script mutates it after load:
<!-- app.js, running client-side -->
document.querySelector('meta[name="description"]')
.setAttribute('content', 'Home | Acme');Now the rendered DOM carries a useless generic string, and the good copy is gone:
<!-- Rendered DOM, after JS -->
<meta name="description" content="Home | Acme">The fix is to stop the client-side mutation and let the server-rendered value stand — or, if the value legitimately must be per-route, generate the correct one server-side per route so source and render agree:
<!-- Corrected: one authoritative value, set server-side, not mutated -->
<meta name="description"
content="Hand-forged chef knives, balanced for daily use.
Lifetime sharpening included.">
<!-- no client-side setAttribute on this tag -->Common overwrite culprits and how to stop them
| Culprit | What it does | How to stop it |
|---|---|---|
| Client-side router (React Helmet, Vue Meta, etc.) | Re-sets head tags on hydration, sometimes to a stale or default value | Render the same head server-side so the hydrated value matches source; fix the default |
| Hydration mismatch | Server prints description A, client component computes description B, client wins | Make the client compute the identical value; sync the data source both sides use |
| Tag manager / personalization script | An A/B or personalization tool rewrites meta on the fly | Exclude meta tags from the tool's DOM edits; personalize body content instead |
| Plugin conflict | Two SEO plugins each write a description; the later-loading one overwrites | Disable one; keep a single source of truth for meta output |
| SPA leftover default | A global <meta> in the app shell overrides per-page values on navigation | Remove the shell default; set description per route only |
How to detect it on your own site
- Diff source against rendered: compare
curl -s https://yourpage/ | grep -i descriptionwith the value shown in devtools → Elements. Two different strings is the smoking gun. - View Rendered Source extension: it flags nodes JavaScript changed (not just added). A mutated description shows as a modified node.
- GSC URL Inspection: View crawled page shows what Google rendered; if that differs from your view-source description, JS is winning at render time.
- Devtools breakpoint: in Sources, set a DOM attribute modified breakpoint on the description meta node, reload, and the debugger stops on the exact script doing the overwrite.
- Screaming Frog, two passes: crawl in text mode and JS-rendered mode; a description that differs between the two runs is being rewritten client-side.
How to fix it
- Identify the script mutating the tag using the DOM attribute-modified breakpoint above.
- Decide the single authoritative description for the route and set it server-side (SSR/SSG), so source is already correct.
- Make the client-side head logic compute the same value, or remove it entirely so nothing overwrites the server value.
- If a tag manager or personalization tool is the culprit, scope it away from the
<head>. - Re-diff source vs. rendered until both show one identical description, then re-crawl to clear the flag.
Why this is worse than it looks: Google may index the rendered value, Bing and AI crawlers may keep the source value, and your social previews may show a third thing. A silent overwrite turns one description into a lottery. Pin it to one value and the ambiguity disappears.
FAQ
Which description does Google actually use?
Google typically indexes what it sees after rendering, so a JS overwrite means the mutated value tends to win with Google — while source-only readers keep the original. That split is exactly the problem.
Is it ever fine for JS to set the description?
It's fine if the client value is identical to the server value — common with SSR frameworks that re-apply the same head on hydration. The check only bites when the two values disagree.
How do I find the exact script doing it?
Set a DOM "attribute modified" breakpoint on the description meta element in Chrome devtools, reload, and the debugger halts on the offending line. That beats grepping through bundles.
How is this different from the rendered-HTML-only check?
Overwrite means source has a description and JS changes it. Rendered-only means source has no description and JS adds it. Same neighborhood, opposite root cause — see Meta Description Only in Rendered HTML.
Could a plugin conflict cause this on WordPress?
Yes. Running two SEO plugins that both emit a description, or a theme that hard-codes one, produces exactly this overwrite. Keep a single plugin authoritative for meta output.
Related reading: Rendering JavaScript for SEO: What Google Indexes, Hydration, and Title Tags and Meta Descriptions: The Complete Guide.
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.







