Breadcrumb schema: four properties, and the one you should leave out
Breadcrumb schema in one JSON-LD block: a BreadcrumbList with at least two ListItem entries, each carrying position, name and item — plus the one property Google tells you to omit on the last step.

A breadcrumb schema block tells Google where a page sits in your site's hierarchy, and Google can print that trail in place of the URL in the search result. It is one JSON-LD script, it needs a BreadcrumbList with at least two ListItem entries, and each entry needs three properties: position, name and item. The last entry may drop item.
Before you start
This only pays off if your site has a real hierarchy — categories, sections, a path a reader could walk back up. A blog where every post sits one level under the homepage has nothing to describe, and marking that up gives Google a two-item trail that says what the URL already said. Decide the hierarchy first; internal linking strategy covers that half.
What a breadcrumb schema block does and does not do
It changes how the result is presented, not whether it appears. Google's Breadcrumb (BreadcrumbList) structured data page, retrieved 2026-08-28, states the availability plainly: "This feature is available on desktop in all regions and languages where Google Search is available." Desktop is the word to notice — the page names no mobile equivalent.
Two more constraints come straight from the same page. The markup has to describe an actual trail, not a navigation menu: a breadcrumb is the path by which "a user can navigate all the way up in the site hierarchy, one level at a time". And the old data-vocabulary.org markup is dead — the page says it "is no longer eligible for Google rich result features", so an untouched 2018 theme may be shipping something Google stopped reading.
A breadcrumb describes the way back up. If your page has no parent, it has no breadcrumb.
The four properties, and the one exception
Google supports three formats — JSON-LD, microdata and RDFa — and states a preference: "In general, Google recommends using JSON-LD for structured data if your site's setup allows it, as it's the easiest solution for website owners to implement and maintain at scale". Use JSON-LD unless your CMS forces otherwise.
| Property | Where | What it must contain |
|---|---|---|
itemListElement | BreadcrumbList | An array of ListItem, at least two |
position | ListItem | Integer; 1 is the start of the trail |
name | ListItem | The title shown to the user |
item | ListItem | The URL of that step |
The exception is the last step. Google's page: "If the breadcrumb is the last item in the breadcrumb trail, item is not required. If item isn't included for the last item, Google uses the URL of the containing page." Leaving it off is the safer habit, because it removes one place where a hand-edited URL can drift away from the page it sits on.
Two entries is the documented floor, and it is worth reading as a design constraint rather than a technical one. A trail of exactly two — Home, then this page — describes a site with one level, and it will render as a path that repeats what the domain already says. If most of your templates can only produce two steps, the useful work is in the site structure, not in the markup.
Do it: five steps
Budget twenty minutes for the first template and about two minutes per page type after that.
- Write down the trail as a reader would walk it, ending at the current page. Three steps is typical: section, subsection, this page.
- Render the same trail as visible text near the top of the page. Structured data is meant to describe what the page shows; a trail that exists only in a script is a claim with nothing behind it.
- Emit the JSON-LD in the
<head>, oneListItemper step, positions counting from 1, and noitemon the last step. - Validate with the Rich Results Test, then deploy a few pages and check them with the URL Inspection tool — Google's own sequence. Confirm the page is not blocked by robots.txt,
noindex, or a login. - Roll it out per template, not per page. Category pages, article pages and product pages each need their own generator; a single hard-coded trail copied across a site is the fastest way to produce trails that point at the wrong parent.
Deliverable: two blocks you can paste
A three-step trail, with the last step's item deliberately omitted:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Handbook",
"item": "https://example.com/handbook"},
{"@type": "ListItem", "position": 2, "name": "Crawling and indexing",
"item": "https://example.com/handbook/crawling"},
{"@type": "ListItem", "position": 3, "name": "Breadcrumb schema"}
]
}
</script>
When a page genuinely sits in two places — a product in a brand tree and in a category tree — Google's page allows both trails as an array in one script:
<script type="application/ld+json">
[
{"@context": "https://schema.org", "@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Books",
"item": "https://example.com/books"},
{"@type": "ListItem", "position": 2, "name": "Science Fiction",
"item": "https://example.com/books/sciencefiction"},
{"@type": "ListItem", "position": 3, "name": "Award Winners"}]},
{"@context": "https://schema.org", "@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Literature",
"item": "https://example.com/literature"},
{"@type": "ListItem", "position": 2, "name": "Award Winners"}]}
]
</script>
Do not invent the second trail to fill space. Two trails are for pages that really are reachable two ways; anything else is markup describing a structure your site does not have.
| Check before shipping | Pass condition |
|---|---|
| Length | At least two ListItem entries |
| Positions | 1, 2, 3 — no gaps, no zero |
| Visible match | Same labels on the page itself |
| Last step | No item, or the canonical URL |
| Vocabulary | schema.org, not data-vocabulary.org |
| Access | Page not blocked or noindexed |
Three ways this goes wrong
None of these throws an error in the Rich Results Test, which is why they survive so long.
- The trail describes the menu instead of the path. A top navigation bar lists siblings; a breadcrumb lists ancestors. Marking up the nav produces a trail that leads nowhere near the page.
- The last step carries a URL that no longer matches the page, usually after a slug change. Omitting
itemon the last step removes the failure mode entirely, since Google then uses the containing page's URL. - The visible breadcrumb and the markup drift apart, because one lives in a template and the other in a plugin. Generate both from the same data or you will eventually ship two different hierarchies for the same page.
Where this stops
Breadcrumb markup will not create a hierarchy you do not have, and it does not make a page rank. Google's documentation describes an appearance feature, available on desktop, and it does not promise the trail will be shown — rich result eligibility is not a guarantee of display. If nothing about your pages is appearing in results at all, this is the wrong layer to work on; start with whether crawlers reach and quote them, which is what QueryWin works on. For which other structured data types are still live, see schema markup for AI search.
One more thing worth knowing before you build the generator: the trail is per template, and the labels in it are the same phrases you use as anchor text elsewhere. Keeping them identical costs nothing at build time and saves you from a site that calls the same section three names in three places.
Common questions
Does breadcrumb schema help with ranking?
Google documents it as a search appearance feature, not a ranking signal. The honest reason to add it is that the result then shows a readable path instead of a URL, and that the same hierarchy is legible to anything else parsing your page.
Do I need a visible breadcrumb on the page?
Structured data is meant to describe the page's content, so the safe answer is yes: show the trail, then mark it up. Building the markup first and the visible trail never is how sites end up describing a structure no reader can see.
How many levels should a trail have?
At least two entries, since that is the documented minimum for a BreadcrumbList. Beyond that it should match the real depth of your site rather than a target number.
Can one page have two breadcrumb trails?
Yes. Google's page shows two BreadcrumbList objects in a single array for a page reachable by two paths. Use it only when both paths exist.
What about the old data-vocabulary markup?
It is no longer eligible for rich result features, in Google's own words. If an old theme still emits it, replacing it with schema.org JSON-LD is the whole fix.
Part of the QueryWin handbook · Level 2


