You can check meta tags by viewing the page source (Ctrl+U) and searching for title, description, canonical, and OGP. But View Source shows the original HTML from the server, DevTools shows the page after JavaScript ran, and Search Console's URL Inspection shows what Google received — so the three can disagree. Judge canonical and robots by whether they're in the <head> of the original HTML, and confirm canonical reached Google with the user-declared canonical in URL Inspection.
Three Places to Check, Each Showing Something Different
| Where | Shows | Good for | Misses |
|---|---|---|---|
| View Source (same as curl) | The original HTML from the server | Whether canonical, robots, and OGP are there from the start | Tags added later by JavaScript don't appear |
| DevTools (Elements, Console) | The page after JavaScript ran | What the browser ended up with | Shows tags missing from the source HTML, so it's easy to think they're 'there' |
| Search Console URL Inspection | What Google received, and Google's decision | Whether your canonical reached Google (user-declared canonical) | No screen lists tags. Details only show for indexed URLs or live tests that pass |
One rule decides it. For canonical, Google only accepts it in the <head>, and asks you to put it in the source HTML and not change it with JavaScript. So "I can see it in DevTools" doesn't count as a pass. The pass is the right value in the <head> of the original HTML.
What to Check, in Order: 5 Steps
1. View Source to see whether the tags are in the original HTML
Open the source with Ctrl+U (Windows) or Command+Option+U (Mac), then search for <title, name="description", name="robots", rel="canonical", and og:. If canonical or robots aren't here, treat them as missing.
2. List the rendered tags from the DevTools console
Paste the code below into the console. It lists the title, meta, and canonical tags on the rendered page and whether each sits in <head> or <body>. Tags that differ from step 1 were added or changed by JavaScript.
3. Compare with the HTML a social crawler gets
Social crawlers read OGP. Fetch the page in a terminal with Facebook's crawler User-Agent (facebookexternalhit) to see the HTML that social networks receive. Some frameworks serve it differently from browsers.
4. Use URL Inspection to see whether canonical reached Google
In Search Console's URL Inspection, check the user-declared canonical. If you set one but this is empty, Google didn't receive it. If the Google-selected canonical is a different URL, Google chose another page as canonical.
5. Run a checker for missing tags and lengths in one pass
Finish with a checker. It reads the original HTML from the server, so it sees what step 1 sees; tags that exist only after rendering show as missing. Compare with step 2 to decide whether that's a real issue.
Step 2: code to paste in the console
[...document.querySelectorAll('title, meta[name], meta[property], link[rel="canonical"]')]
.map((el) => ({
where: document.head.contains(el) ? 'head' : 'body',
tag: el.getAttribute('name') || el.getAttribute('property') || el.getAttribute('rel') || 'title',
value: el.getAttribute('content') || el.getAttribute('href') || el.textContent,
}))Step 3: fetch as a social crawler
curl -s -A "facebookexternalhit/1.1" https://example.com/ | grep -oE '<(title|meta|link)[^>]*(og:|description|canonical|robots)[^>]*>|<title>[^<]*'For reading curl output (and the trap of matching text inside scripts), see can AI crawlers read your SPA. For URL Inspection states, see Discovered – currently not indexed.
What Passes, and What Needs Fixing, Tag by Tag
| Tag | Passes | Fix |
|---|---|---|
| title | Unique per page, main term near the front | Missing, duplicated across pages, or confused with an SVG title |
| meta description | Summarizes the page's answer | Missing or identical everywhere. Not a ranking penalty — Google builds one from the text |
| meta robots | No noindex on pages you want indexed | A leftover noindex on a live page (often copied from staging) |
| link rel="canonical" | In <head>, points to itself or the right representative URL | In <body>, changed by JavaScript, or pointing to another page |
| og:title / og:description / og:image / og:url | og:image is an absolute https:// URL | Relative og:image or a 404 image — social crawlers won't show it |
| meta viewport | Has width=device-width | Missing — the page renders zoomed out on phones |
| meta keywords | No need to check | Not used by Google Search |
Fix in order of what decides whether the page appears in search at all: robots (noindex) and canonical first, then title and description, then OGP and viewport. Even a clean title may not show as written — Google also uses headings, og:title, and other text to build the title link.
How to write each tag is covered in title tags, meta descriptions, canonical tags, and OGP tags. This article sticks to checking that they're present and actually delivered.
Pitfall 1: Meta Tags Landing in <body> (Measured on This Site)
Since Next.js 15.2, dynamically rendered pages start sending HTML without waiting for metadata, then stream the tags into the end of <body>. Only crawlers that can't run JavaScript get them in <head> as before. On October 23, 2026 we checked the five dynamically rendered pages on this site; only the shared audit result page had its tags in <body>. Here's what that page returned when fetched different ways.
| User-Agent | Where title, description, canonical, og:title were |
|---|---|
| Browser (Chrome) | End of <body> |
| Googlebot | End of <body> |
| GPTBot (OpenAI) | End of <body> |
| facebookexternalhit, Twitterbot, Slackbot | <head> |
We also opened the page in a browser and checked the finished page in DevTools: all four tags were still in <body>, not moved to <head>. The Next.js docs say they verified that bots which run JavaScript and inspect the full DOM, such as Googlebot, interpret this correctly. Google, on the other hand, states that canonical is only accepted in the <head>.
The call: there's no reason to leave canonical — which affects whether a page shows up at all — where two official sources disagree. The same day, we changed the Next.js config (htmlLimitedBots) so every request gets metadata in <head>. It only affects dynamic pages; our statically built articles and tool pages already had their tags in <head>.
If your site runs on Next.js, fetch the source with a browser User-Agent and with facebookexternalhit and compare. If <title> moves, streaming is happening.
Pitfall 2: Checkers Picking Up an SVG Icon's Title
SVG logos and icons often include a <title> element for screen readers. Browsers use the first <title> outside any SVG as the page title. Tools that search by tag name alone pick up the SVG's title too and mistake it for the page title.
Direbase's checker had this bug. It kept overwriting with the last <title> it found, so an SVG title in the body won. On October 23, 2026, we fed these three HTML patterns to the same Cloudflare Workers runtime as production, before and after the fix.
| Page HTML | Before | After |
|---|---|---|
| Title in <head>, plus a title inside an SVG logo | The SVG title | The <head> title |
| No title in <head>; an SVG title, then the real title, in <body> | The SVG title | The real title |
| A title only inside an SVG | The SVG title | No title (same as browsers) |
If a checker shows an unfamiliar short title — often a site or logo name — check the source for a <title> inside an SVG first. The original HTML from step 1 outranks any tool.
Pitfall 3: "It's in DevTools, So It's Fine"
On sites that add canonical or description with a tag manager or JavaScript, DevTools shows the right values — but the source HTML has none, or different ones. Social crawlers don't run JavaScript, so OGP added later never reaches the share preview.
Google says that if you can't set canonical in the source HTML, leave it out of the source and set it only with JavaScript. The worst case is the source and JavaScript saying different things. Make "steps 1 and 2 agree" your pass/fail line.
Related Tools
Sources (checked October 23, 2026)
- Google Search Central — Meta tags Google supports (meta keywords unused)
- Google Search Central — Specify a canonical URL (accepted only in <head>)
- Google Search Central — Title links (sources Google uses)
- Search Console Help — URL Inspection tool (user-declared canonical)
- Next.js — generateMetadata (streaming metadata, since v15.2.0)
FAQ
What's the quickest way to check meta tags?▾
Can I check meta tags in Search Console?▾
Why do title or canonical differ between View Source and DevTools?▾
Is it a problem if meta tags appear in <body> instead of <head>?▾
Do I need to check meta keywords?▾
Why does a checker show a different title than the real one?▾
See What's in the Original HTML, All at Once
Enter a URL to list title, description, canonical, and OGP with their lengths. Any tag that disagrees with DevTools is the place to fix.
Check your meta tags
Written by
今井政和SEO Director / Frontend Developer
SEO Director with 20+ years of web industry experience. Creator of Direbase and the official WordPress plugin "ORECTIC SEO CHECK." Author of a book on web strategy inspired by Edo-era merchant principles.
@imai_directorRelated Articles
How to Set Up OGP Tags | Optimize Social Media Sharing
Learn OGP tag setup, recommended og:image sizes, and Twitter Card differences. Check your social sharing display for free.
How to Write Meta Descriptions | Free Checker Tool
Learn the optimal length, writing tips, and common mistakes for meta descriptions. Check your settings instantly with our free tool.
How to Write Title Tags | SEO Best Practices & Checker
Learn the optimal title tag length, writing tips, and how to prevent Google rewrites. Check your title settings instantly with our free tool.
What Is a Good SEO Score? Why Tools Disagree and What to Fix First
There is no universal passing SEO score. Using Lighthouse's scoring, a breakdown of 100 points, per-plan maximums, and real audits, learn how to read the score and what to fix first.