Google isn't showing your meta tags. There are two ways that happens.
Short answer
Two different problems produce this symptom. If your tags are set by JavaScript, crawlers capture the HTML before the tags exist — a rendering problem, fixed by moving metadata to the server. If the tags are in the HTML and Google displays something else, Google is rewriting them — a content problem, fixed by writing better tags.
These two failures look identical in a search result and need opposite fixes. Teams routinely spend weeks on the wrong one — rewriting titles that were never reaching the HTML, or re-architecting rendering to fix a title Google was always going to rewrite. One check tells them apart.
The fork: is the tag in the raw HTML?
In the raw HTML?
Diagnosis
Fix lives in
No — tags appear only after JavaScript
Problem A: rendering. Client-side head management is applying tags after capture.
Your codebase
Yes — tags present, Google shows different text
Problem B: rewriting. Google judged your tag a poor match and substituted its own.
Your copywriting
Yes in raw, but different values after rendering
A metadata mismatch — two versions of your tags disagree. Related but distinct.
The hydration mismatch page
Problem A: the tags never reach the crawler
Client-side head management — react-helmet and its descendants, document.titleassignments, metadata effects in client components — updates the DOM after JavaScript runs. It works perfectly in the browser tab, which is why it survives code review. But the crawler's first-pass capture happened when the server responded, before any of that executed. The tag exists everywhere except the one artifact that gets indexed.
The tell: Google shows a generic title, your homepage's title on inner pages, or the placeholder from your index.html— because that's what the first response actually contained.
Problem B: the tags arrive and Google overrules them
Google rewrites a substantial share of titles and most descriptions — by design, not as an error state. Titles get rewritten when they're too long, keyword-stuffed, boilerplate across many pages, or when they disagree with the page's visible H1. Descriptions get replaced with whatever page snippet better matches the specific query. If your tags are in the raw HTML, no rendering work of any kind will change this — the lever is the tag itself: concise, specific, consistent with the on-page heading.
Social cards: the strict case
Social scrapers execute no JavaScript. Ever.
Google eventually renders JavaScript; the scrapers behind link previews on Facebook, WhatsApp, Slack, LinkedIn and X do not. There's no delayed second pass and no "eventually." Client-set OG tags don't work late — they never work, which is why a site can look fine in Google and still unfurl as a bare URL in every chat app. And because platforms cache scrapes, fixing the tags isn't enough: re-run each platform's card debugger to evict the cached tagless version.
Confirm which problem you have
The check below fetches your page both ways and compares the metadata fields directly — title, description, canonical — in the raw response versus after rendering. That comparison is the fork.
Check which tags are in your raw HTML
https://
Reading the result
On this page, read the metadata fields, not the verdict color:
Metadata pattern
What it tells you
MISSING
Title/description empty or generic in raw, correct after render
Problem A confirmed. Your metadata is client-applied. Steps two through four are your path — and note the social-card consequence applies in full.
SERVED
All tags identical in raw and rendered
Rendering is clean. If Google still shows different text, you have Problem B — rewriting — and the fix is editorial. Compare your title against the page's H1 first; disagreement between them is the most common trigger.
MISMATCH
Tags present in both but with different values
Your server and client disagree about your metadata — a mismatch, and the worst pattern here, because you don't control which version gets used. Fix determinism before anything editorial.
Image slot
Screenshot: the metadata panel with title missing in raw, present in rendered — Problem A's signature.
Problem A in one screenshot: the title exists — just not in the version that gets captured.
How to fix it
Six steps. Step one is the fork; A-path runs through steps two to four, B-path is step five.
01
Check whether the tags exist in the raw HTML
Everything branches on this. Fetch the page without JavaScript and look for your title, description, canonical and OG tags in the response. Present means Google is choosing to display something else. Absent means they're being applied client-side, after the capture.
02
If absent: find what's setting them client-side
The suspects are client-side head libraries, document.title assignments, and metadata effects inside client components. All of them run after the server response is sent — which is after every crawler and every social scraper has already captured the page.
03
Move metadata into the server response
Use your framework's server-side metadata path: the metadata export or generateMetadata in Next.js's App Router, server-fetched props feeding next/head in the Pages Router, useHead in Nuxt, or your SSR layer's equivalent. The test is brutal and simple: the tags must be in view source.
04
Treat social cards as the strict case
Scrapers for Facebook, WhatsApp, Slack, LinkedIn and X execute no JavaScript at all — client-set OG tags don't work late, they never work. Once the tags are server-rendered, run the platforms' card debuggers to purge their caches of the old, tagless version.
05
If present: fix the tag, not the rendering
Google rewrites titles it judges poor matches — too long, stuffed, boilerplate, or disagreeing with the page's visible H1. Rewrites are fixed by writing a concise, accurate title that matches the page's content and heading, not by touching your rendering stack.
06
Verify and request recrawl
Confirm the raw HTML carries the final tags, then use URL Inspection on the affected pages. Displayed titles update on recrawl — give it days, not minutes, and don't chase it with rapid successive edits, which just create more versions to reconcile.
How long updates take
Surface
Update speed
Social card debuggers
Immediate — the debugger re-scrape is the update. Run it per platform; their caches are independent.
Google, inspected URLs
Days. URL Inspection prompts a recrawl; the displayed title changes when the new capture is processed.
Google, site-wide
Weeks, on the normal recrawl cycle. Frequently crawled pages update first; deep pages last.
Rewritten titles (Problem B)
On recrawl after your edit — if the new title is actually better matched. A rewrite persisting after a recrawl means Google still prefers its version; revise again rather than waiting harder.
Common questions
Either your title never reaches the raw HTML because it is set by JavaScript, or it reaches the HTML and Google rewrites it. Google rewrites titles it judges too long, keyword-heavy, boilerplate, or inconsistent with the page's visible heading. Checking whether your title exists in the raw response tells you which case you are in, and they have opposite fixes.