The title and the meta description are the two parts of a page written to be read out of context. The title expects to sit in a tab, a bookmark, a search result or a list of sources; the description expects to stand in for the page somewhere the page is not. Check B4 wants a title of 15 to 70 characters, unique across the site, and a description of 50 to 160, on every page crawled, and awards one point for each. The ranges are not arbitrary. They are the band in which the text is long enough to say something and short enough to be shown whole by the things that show it.
This post covers those two points; B4's third, for the Open Graph tags, is a separate post. The evidence blocks referred to below are explained in reading your scan report.
Why an agent reads them at all
An agent working from a fetched page has two summaries available before it reads a word of the body: the title element and the description meta tag. A retrieval crawler stores them alongside the URL; an assistant listing its sources labels each with the title; an agent deciding which of twelve candidate pages to open next chooses on the URL, title and description alone. If the title is Home and the description is absent, the page is chosen or rejected on its URL alone.
The description is also the cheapest summary a machine can get. A page is tens of kilobytes of HTML; a description is one sentence you wrote yourself. An agent that has one can use it; one that does not summarises the page itself, and the summary it produces is not under your control.
Why the bounds are where they are
Title, 15 to 70 characters. The lower bound rules out titles that name a section but not a site. Pricing, About, Blog and Home are under 15 characters and say nothing to anyone who is not already on the site. A title has to survive being the only thing shown, in a tab strip or a source list, so it needs the page and enough of the site to place it. The upper bound is what fits. Browser tabs, search results and link previews all truncate, by pixel width rather than character count, somewhere near the upper bound, and Google's documentation on title links says it may generate a different title when the page's own is too long, stuffed with keywords or boilerplate. Past 70 characters the end is not seen by most of the things that display it, and a title that long is usually two titles joined together.
Description, 50 to 160 characters. Under 50 characters is a tagline, not a summary, and usually repeats the title. Over 160 is a paragraph, cut off wherever it is shown. Between the two sits one or two plain sentences that say what the page contains and who it is for. The 160 figure is the long-standing length of a search snippet shown whole; as of this writing snippets vary by device and query, but the band remains the length at which a description is a description rather than a keyword list.
Neither bound is a target; a 68-character title is not better than a 40-character one. The ranges mark the region in which the text is doing the job it was written for.
How B4 evaluates it
The check runs over every page the crawl fetched successfully, up to six: the homepage plus up to five pages found from its links, preferring pricing, documentation, about, contact and checkout pages. For each page it parses the raw HTML, before any JavaScript runs, and reads:
- the text of the
titleelement, trimmed of surrounding whitespace; - the
contentattribute of<meta name="description">, exactly as written.
A page passes if the trimmed title is 15 to 70 characters and the description content is 50 to 160. Length is measured in JavaScript string units, so most characters count once and a few, emoji among them, count twice, which is one reason not to open a description with one.
The title point requires two things at once: every crawled page's title in range, and all of the titles distinct from one another. The uniqueness test is a set comparison over the titles collected, so two pages sharing a title costs the point even when every title is a perfect length. The description point requires every crawled page to be in range. Both are all-or-nothing across pages, for the same reason B3's points are: one failing page almost always means a template filling in a default that every other page from that template shares.
The evidence block lists pagesCrawled, goodTitles, uniqueTitles, goodDescriptions and completeOpenGraph, and the recommendation names the count outside each range, in the form 2 title(s) outside 15–70 characters, duplicate titles across pages or 3 description(s) outside 50–160 characters.
Duplicates, and where they come from
The duplicate titles finding is nearly always a template. The common cases:
- a layout that sets the title to the site name, and pages that do not override it, so the homepage, the contact page and the about page are all
Acme; - a listing template whose title does not include the page number, so page one and page two of the blog carry the same title;
- a product or article template where the override is wired to a field editors leave empty, and the fallback is the section name.
Only the crawled pages are compared, so a duplicate deep in a catalogue is not caught; but the crawl deliberately reaches for the pages a template is most likely to have handled uniformly, which is the case that matters most.
The site name template eats a third of the budget
The reason a title runs long is rarely the page's own words; it is the suffix. Most frameworks and content management systems append the site name to every title, and the separator and name count with the rest. Ours does. The Next.js metadata template in our root layout is:
title: {
default: "AgentFriendlyRank",
template: `%s — ${site.name}`,
},
The suffix — AgentFriendlyRank is 20 characters, which means every page title on this site has 50 characters of its own before it crosses B4's upper bound, not 70. The post you are reading has a metaTitle field in its frontmatter that is exactly the %s, and a test run over every post before the build enforces the arithmetic:
const SITE_SUFFIX = " — AgentFriendlyRank".length; // 20
const META_TITLE_MAX = 70 - SITE_SUFFIX; // 50
assert.ok(post.metaTitle.length >= 15);
assert.ok(post.metaTitle.length <= META_TITLE_MAX);
assert.ok(post.description.length >= 50);
assert.ok(post.description.length <= 160);
A post with a 51-character metaTitle fails the build. That is why metaTitle exists separately from the h1 title, which may be longer because it is read on the page, in context. The same arithmetic applies to any site: measure the suffix your template adds, subtract it from 70, and that is the budget for the page's own words. A brand with a 30-character name and a | separator has 37 left, and a template that also prepends a section name, in the shape Blog | Post title | Long Brand Name Limited, may have none. Next.js's documentation describes the template mechanism; other frameworks have an equivalent setting, and many themes add a suffix without saying so, so check the rendered HTML rather than the configuration.
Writing them
For the title, lead with the page, not the site; the template supplies the site. Say what the page is in the words a person would use to look for it, and stop. For the description, one or two sentences in the voice of the page, stating what it contains and for whom, with no call to action and nothing that is not on the page. It is a summary a machine may quote, not an advert.
A quick check is one fetch and one line of parsing per page:
curl -s https://example.com/pricing \
| grep -oE '<title>[^<]*</title>|name="description" content="[^"]*"'
Count the characters in the raw output and compare with what your configuration says it should be; the two disagree more often than you would expect.
Check your own site
Run the free scan and read the B4 evidence; it counts the pages outside each range and says whether the titles are distinct. Our own report at /site/agentfriendlyrank.com shows the same evidence for this site, and the full definition is on the methodology page under understanding. Heading structure, the other half of how a machine outlines a page, is in one h1 per page.