Meta tags that matter (and the ones Google ignores)
Which head tags Google Search actually uses (title, description, robots, canonical, viewport, charset), what Open Graph adds, and which tags do nothing.
Published 2026-10-07
A page's <head> collects tags from fifteen years of SEO folklore. Some control whether a page is indexed, some only change how a link preview looks, and some have been dead since 2009. This guide sorts them by what the primary sources say. Google's own documentation is the reference for search behavior: Meta tags that Google supports, Robots meta tag specifications, Title links and Snippets.
The short version
| Tag | Effect on Google Search | Worth including |
|---|---|---|
| <title> | Primary source for the title link, which Google may rewrite | Yes, unique per page |
| <meta name="description"> | Sometimes used as the snippet; not a ranking factor | Yes |
| <meta name="robots"> | Controls indexing and snippets | Only when you need it |
| <link rel="canonical"> | A hint for choosing among duplicate URLs | Yes |
| <meta name="viewport"> | Needed for correct mobile rendering | Yes |
| <meta charset> | Correct text decoding | Yes, first in the head |
| Open Graph, Twitter/X tags | None for Search; drive link previews elsewhere | Yes, if pages get shared |
| <meta name="keywords"> | None | No |
Title: what Google does with it
The title is the strongest on-page signal for the title link in results, but it is not the only input. Google's title-link documentation lists the <title> element along with the main visible heading, <h1> and other heading elements, og:title, prominent styled text, anchor text from other pages, and WebSite structured data. It rewrites titles that are half-empty, outdated compared to the visible page, repeated across many pages, keyword-stuffed or in a different language than the content.
There is no length limit. The documentation says the title link is "truncated in Google Search results as needed, typically to fit the device width." The familiar 60 characters is a pixel-width rule of thumb, not a rule. Keep the important words early, make each title unique, and describe the page rather than the site.
A stuffed title is both unattractive and the kind Google will override. Here is a small audit script that checks a deliberately bad <head>; it is complete and runs as written with Node 18 or later (node audit.mjs):
const html = `<head>
<title>Free Developer Tools: The Best Free Online Utilities for Everyone</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="keywords" content="tools, free tools, dev">
<meta name="description" content="">
<meta name="robots" content="index, noindex">
<meta name="revisit-after" content="7 days">
<meta property="og:title" content="Free Tools">
</head>`;
const supported = new Set(["description", "robots", "googlebot", "viewport",
"notranslate", "rating", "google-site-verification", "nopagereadaloud"]);
for (const m of html.matchAll(/<meta\s+(name|property)="([^"]+)"\s+content="([^"]*)"/g)) {
const [, kind, key, value] = m;
let note = "ok";
if (kind === "name" && !supported.has(key)) note = "ignored by Google Search";
else if (key === "description" && value.trim() === "") note = "empty: Google will write its own snippet";
else if (key === "robots" && /noindex/.test(value) && /\bindex\b/.test(value)) note = "conflict: noindex wins (more restrictive)";
console.log(`${kind}:${key}`.padEnd(26), note);
}
const title = html.match(/<title>([^<]*)<\/title>/)[1];
const counts = {};
for (const w of title.toLowerCase().match(/[a-z]+/g)) counts[w] = (counts[w] || 0) + 1;
const [word, n] = Object.entries(counts).sort((a, b) => b[1] - a[1])[0];
console.log(`title length ${title.length} | repeated word '${word}': ${n}`);
name:viewport ok
name:keywords ignored by Google Search
name:description empty: Google will write its own snippet
name:robots conflict: noindex wins (more restrictive)
name:revisit-after ignored by Google Search
property:og:title ok
title length 65 | repeated word 'free': 2
The supported list in that script is a shortened version of the one on Google's page above (which also lists refresh and the content-type charset declaration); the other names are ignored by Search.
Meta description: a suggestion, not a command
Google's snippet documentation says snippets are "primarily created from the page content itself" and that it "sometimes uses the meta description HTML element if it might give users a more accurate description." So the description is a candidate. Google picks it when it matches the query better than text on the page, and rewrites it otherwise. There is no length limit: the snippet is "truncated in Google Search results as needed." The 155 to 160 character figure is the typical visible length on desktop, and the front of the description is what survives truncation.
Write it as a one-sentence summary that would make sense out of context. A missing description is not an error. An empty or duplicated one is worse than none, because link-preview scrapers (Slack, LinkedIn, and others) read it too.
To control snippets rather than suggest them, use directives: nosnippet removes the text snippet, max-snippet:[n] caps it, and the data-nosnippet attribute hides specific page sections.
Robots meta: the tag that can remove a page
The robots meta tag controls indexing and serving. Per Google's documentation, the supported rules are:
noindexandnofollow, andnoneas shorthand for bothnosnippet,max-snippet:[number],max-image-preview:[none|standard|large],max-video-preview:[seconds]noimageindex,notranslate,indexifembeddedandunavailable_after:[date]
all is the default and has no effect when listed, so <meta name="robots" content="index, follow"> is redundant. noarchive, nocache and nositelinkssearchbox are listed as no longer used. You can target Google only with name="googlebot", and when rules conflict, "the more restrictive rule applies": index, noindex means noindex, as the audit above flags.
The most expensive mistake involves robots.txt. Google states that if a page is disallowed from crawling in robots.txt, "any information about indexing or serving rules will not be found and will therefore be ignored." A page you want out of the index must be crawlable so Googlebot can read its noindex. Blocking it in robots.txt while also adding noindex leaves the page potentially indexed from external links, without a snippet. If you do want to manage crawling, the hub's robots.txt generator builds the file; use it for crawl control and the meta tag (or the X-Robots-Tag header, for non-HTML files) for index control.
Canonical: a hint, not a directive
<link rel="canonical" href="https://example.com/page"> tells search engines which URL among duplicates you prefer. Google's guidance on consolidating duplicate URLs treats it as a signal it weighs along with redirects, internal links and sitemaps, not a command, so it can be overridden when the page contents differ or signals contradict. Practical rules: use absolute URLs, point each page at one canonical, make the canonical page return 200 and be indexable, and make it self-referencing on the preferred version. If you can use a 301 redirect instead, it is a stronger signal.
Viewport and charset
<meta name="viewport" content="width=device-width, initial-scale=1"> makes mobile browsers lay the page out at device width; without it, a phone renders a desktop-width canvas and shrinks it. Google lists viewport among the meta tags it supports. <meta charset="utf-8"> declares the encoding. Put it first in <head> and within the first 1,024 bytes of the document, because the HTML spec lets the browser scan only that much before deciding. A server Content-Type header with a charset takes precedence if both exist. Mismatched charsets are the web version of the mojibake problems in CSV files.
Open Graph and Twitter cards: previews, not rankings
These tags do nothing for Google Search ranking. They control how a URL looks when pasted into Slack, Discord, LinkedIn, Facebook, iMessage and similar apps. The Open Graph protocol defines four required properties: og:title, og:type, og:image and og:url. Useful extras are og:description, og:site_name and og:image:alt.
X (formerly Twitter) uses its own twitter:card tag to pick the layout (summary or summary_large_image) and falls back to the Open Graph title, description and image for the rest. So the minimal pattern is complete Open Graph tags plus one twitter:card line, and twitter:site if you want the handle attached. Use an absolute image URL, and check it is publicly fetchable: preview crawlers do not log in.
Meta keywords: dead since 2009
Google's documentation is unambiguous: "The meta-keyword tag is not used by Google Search, and it has no effect on indexing and ranking at all." Google announced in 2009 that it had stopped using it. It costs bytes and tells competitors which terms you target. The same page lists other dead or never-supported items, including lang attributes as a language signal (Google detects language from content), rel=next/prev for pagination and nositelinkssearchbox. Google says it ignores unsupported tags, so removing them is cleanup, not a ranking fix.
What the hub's meta tag generator produces
DevMill's meta tag generator encodes the table above. With the title "DevMill — Free Developer Tools", a description, a canonical URL, an image and a site name, it emits this (this is the tool's actual output for those inputs):
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>DevMill — Free Developer Tools</title>
<meta name="description" content="Free, fast developer utilities that run in your browser.">
<link rel="canonical" href="https://devmill.dev/">
<meta property="og:title" content="DevMill — Free Developer Tools">
<meta property="og:description" content="Free, fast developer utilities that run in your browser.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://devmill.dev/">
<meta property="og:image" content="https://devmill.dev/og.png">
<meta property="og:site_name" content="DevMill">
<meta name="twitter:card" content="summary_large_image">
Values are HTML-escaped so a quote or ampersand in a title cannot break the attribute. It deliberately omits a keywords tag, writes robots only when you choose noindex or nofollow, and, when Open Graph is turned off, spells out the twitter: title, description and image instead of relying on the fallback. It also warns about titles over 60 characters, descriptions over 160, a missing canonical or og:image, and a noindex that you may not mean to ship. Treat those length warnings as display advice, since neither is a limit Google enforces.
A practical checklist
- One unique
<title>and one honest description per page; neither is repeated across the site. charsetfirst,viewportalways, canonical on every indexable page.noindexonly on pages that must be crawlable to be read; never combine it with a robots.txt block.- Open Graph (title, type, image, url) plus
twitter:cardfor pages that get shared. - Delete
keywordsand any other tag you cannot find in Google's supported list.