
Breadcrumbs are the trail of links near the top of a page — Home > Category > Subcategory > This Page — showing where the page lives in the site's hierarchy. They matter twice: they are the most consistent internal-linking pattern most sites have, and with the right markup they replace the raw URL in Google's search snippet with a readable path.
That second point is easy to underrate. On mobile results Google shows a breadcrumb-style path above the title on nearly every result. Whether that line reads like your site's actual structure or like a mangled URL slug is decided by your BreadcrumbList markup.
What correct BreadcrumbList JSON-LD looks like
The schema is short but strict about structure — an ordered list of ListItems, positions starting at 1:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Hiking Gear",
"item": "https://example.com/hiking/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Trekking Poles"
}
]
}
</script>Details that trip people up: position is required and must be sequential; every item except the last requires an item URL (the last one — the current page — can omit it); URLs must be absolute and should match the canonical, not a parameterized variant. Google supports multiple BreadcrumbList blocks on one page if a page legitimately belongs to two trails, but one clean trail is the sane default. The full markup walkthrough lives in the breadcrumb schema guide.
Breadcrumb types and what each needs
| Type | What it shows | Markup requirement | Verdict |
|---|---|---|---|
| Hierarchy-based | The page's fixed position in the site tree (Home > Category > Page) | Standard BreadcrumbList mirroring the visible trail | The default. Stable, crawlable, matches how Google models site structure. |
| Attribute-based | Filter path the item was reached through (Home > Shoes > Blue > Nike) | Only mark up levels that are real, indexable landing pages — never raw filter states | Fine on ecommerce if each level resolves to one canonical URL; otherwise you're feeding schema built on faceted noise. |
| History-based | The user's click path ("Back to results") | Do not mark this up — it varies per session and doesn't represent structure | UX-only. Schema derived from session history is inaccurate markup by definition. |
| Path-in-URL only | No visible trail; Google infers from URL segments | None — this is the fallback when markup is absent | What you get by default, and why unmarked sites show ugly slug paths in results. |
Breadcrumbs as internal-linking infrastructure
Every product page linking to its subcategory, and every subcategory linking to its category, produces thousands of consistent, descriptive-anchor internal links pointing up the tree. On large sites the breadcrumb is frequently the only systematic link from deep pages back to mid-tier category pages — which is exactly where most sites are internally weakest. Two rules keep this value intact: every breadcrumb level must be a real link (not dead text), and each level should point at the canonical URL of that section — the same URL a canonical tag on that section page names.
How to check it on your own site
- Run the Rich Results Test on a deep product or article page. It flags missing
position, missingitemURLs, and mismatched types immediately. - Check GSC → Enhancements → Breadcrumbs. This reports validation errors at scale across the whole site, not one URL at a time.
- Crawl with a custom extraction. In Screaming Frog, set a custom extraction for
BreadcrumbList(or use its built-in structured data validation) and compare pages-with-trail against total indexable pages. The gap is your rollout backlog. - Compare markup to the visible trail. View source on a handful of templates: the JSON-LD names and order must match what users see. Divergence is the most common manual finding.
- Verify the links resolve cleanly. Click every level in the trail on a template page: each should land on a 200 canonical URL, not a redirect hop.
Common mistakes
- Markup with no visible breadcrumb (or vice versa). Schema is supposed to describe on-page content. JSON-LD trails on pages with no visible trail risk being ignored; visible trails without markup waste the snippet benefit. Fix: ship both, from the same data source, in the same template.
- Last item as a self-link. The current page rendered as a clickable link to itself. Harmless-looking, but it's a redundant self-referencing link on every page. Fix: current page as plain text, and omit its
itemin JSON-LD. - Breadcrumb URLs pointing at redirects. After a migration, trails keep linking old paths, so every page on the site now emits internal links through 301s. Fix: breadcrumb source data updated in the same ticket as any URL change.
- Skipping levels on deep sites. Home > Product, with the whole category tree missing. That discards the internal-linking value entirely. Fix: render the full ancestor chain from your category data.
- Microdata half-migrated to JSON-LD. Both formats on the page, disagreeing about names or order. Google may pick either. Fix: one format (JSON-LD), delete the legacy microdata from the theme.
FAQ
Do breadcrumbs directly improve rankings?
Not as a labeled ranking factor. They improve crawl paths, distribute internal links up the hierarchy, and change how your result renders in the SERP. Those are real effects; "breadcrumbs = ranking boost" is not the claim.
Should the breadcrumb start with "Home"?
Visible trail: your call — most sites keep it, some drop it on mobile for space. In the markup, including the homepage as position 1 is standard and harmless. Google trims what it displays anyway.
What about products that live in multiple categories?
Pick one primary trail matching the product's canonical URL path and mark that up. Multiple BreadcrumbList blocks are technically allowed, but conflicting trails on canonicalized duplicates cause more confusion than they solve.
Breadcrumbs on mobile — hide them?
Google indexes the mobile version of your page, so if the trail (or its markup) is stripped from mobile templates, it effectively doesn't exist. Keep at least the markup, and preferably a compact visible trail, on mobile.
JSON-LD or microdata for BreadcrumbList?
JSON-LD. Google accepts both, but JSON-LD is decoupled from your HTML structure, survives template refactors, and is what Google's own documentation examples use.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







