<title> is the page’s name in three places: the browser tab, the SERP listing, and the link preview anywhere your URL is shared. When it’s missing, Google synthesizes a title from the page’s content — sometimes from the H1, sometimes from a stray button label, sometimes from text inside a navigation menu.
The synthesized version is rarely better than what you would write. CTR on missing-title pages is consistently lower than on pages with explicit, well-written titles.
How to detect it
curl -s https://example.com/some/page \
| grep -oE '<title>[^<]*</title>'
Empty output means missing. A <title></title> with no content is just as bad.
Google Search Console doesn’t report missing titles directly. The signal: pages where the SERP-displayed title doesn’t match anything you wrote. That’s Google synthesizing.
What a good title looks like
Length: 50–60 characters, or up to ~600 pixels wide. Past that, Google truncates with an ellipsis.
Pattern: Primary topic — Brand name for content pages. Primary topic | Brand is equivalent. The separator doesn’t matter much.
Front-load the unique keyword. The first 30 characters are the most-likely to be read in a SERP scroll.
Examples:
- Bad:
Home→ tells the reader nothing. - Bad:
Welcome to Acme — The Best Software Company in the World→ marketing voice, no keyword density. - Good:
Project management for engineering teams — Acme.
The fix
Universal HTML
<head>
<title>Project management for engineering teams — Acme</title>
</head>
Exactly one <title> per page, inside <head>, before any large block of <script> that could delay parsing.
WordPress (Yoast / Rank Math)
Both plugins auto-generate titles using template variables: %%title%% %%sep%% %%sitename%%. Verify the template:
- Yoast → Search Appearance → Content types → set the title template for posts, pages, products.
- Rank Math → Titles & Meta → Posts/Pages → title format.
Override per-page in the post editor’s Yoast/Rank Math meta box.
If the template emits an empty title for any content type, that’s the bug to fix. The most common cause: a “title” custom field someone added but never populated.
Shopify
Shopify ships titles via {{ page_title }} in theme.liquid:
<title>{{ page_title }}{% if current_tags %} – tagged "{{ current_tags | join: ', ' }}"{% endif %}{% if current_page != 1 %} – Page {{ current_page }}{% endif %}{% unless page_title contains shop.name %} – {{ shop.name }}{% endunless %}</title>
If pages have no title, check Online Store → Pages → individual page → SEO section → Page title.
Next.js (App Router)
Use the metadata API:
// app/products/[slug]/page.tsx
export async function generateMetadata({
params,
}: {
params: { slug: string };
}): Promise<Metadata> {
const product = await getProduct(params.slug);
return {
title: `${product.name} — Acme`,
};
}
For a default template, set it in the root layout:
// app/layout.tsx
export const metadata: Metadata = {
title: {
default: "Acme — Project management for engineering teams",
template: "%s — Acme",
},
};
The template uses %s as a placeholder; child pages override title with just the page-specific portion.
Static HTML
For multi-page static sites, generate titles at build time from a per-page front-matter field. Treat empty titles as a build error, not a warning.
Pitfalls
Don’t duplicate <title> across templates. A theme that emits a title and a plugin that also emits a title gives you two titles. Google picks one — usually the wrong one. View source to confirm one tag per page.
Don’t use the same title on every page. Sitewide titles like “Acme — The Project Management Platform” on every URL cluster all pages into one signal. See the duplicate titles guide.
Don’t keyword-stuff. “Project management software project management tool project planning software” is worse than a single clear phrase. Google rewrites obvious stuffing.
Don’t lead with the brand on content pages. “Acme — Project management for engineering teams” wastes the most-read pixels on a word the reader already saw next to your URL. Lead with the topic.
Fix at the edge with Serpwise
When titles are missing from a section of the site you don’t fully control — a third-party blog under /blog/, a hosted help center, a CMS template behind a vendor lock — fixing the template can take weeks.
Serpwise can inject <title> based on URL patterns and page content: “for every /products/* URL, set the title to the first <h1> text + — Acme.” Apply across thousands of URLs in minutes; the proper template fix lands on its own schedule.
See pricing or run a free AI visibility audit.