Why You Are Here
Breadcrumb markup has the best effort-to-benefit ratio of any structured data type. It takes minutes to implement, applies to nearly every page on a site, and almost never causes validation problems.
Without markup, Google shows a version of your raw URL beneath the page title in search results. With it, that line becomes a readable path such as Home > SEO Tools > Breadcrumb Schema Generator.
That difference matters most on deep pages. A URL with several folder levels, a numeric ID, or an unhelpful slug looks cluttered and tells a searcher very little. A named path tells them exactly where the page sits and what kind of thing it is before they click.
The first situation is a site whose search results show raw URLs, where the fix is quick and applies across every template at once.
The second is a site with visible breadcrumbs on the page but no corresponding markup, so search engines have to infer a hierarchy that is already stated plainly in the HTML.
The third is fixing mismatches, where the markup and the visible breadcrumbs have drifted apart and Search Console is flagging it.
What This Tool Does
The Breadcrumb Schema Generator builds valid BreadcrumbList JSON-LD from your navigation path.
Enter each level of the trail with its name and URL, in order from your homepage down to the current page, and the tool assembles correctly numbered ListItem objects inside a BreadcrumbList wrapper, with the script tag included. Copy it and paste it into your page.
Requirements
The whole specification fits in one table.
| Requirement | Detail |
|
itemListElement |
Array of ListItem objects |
|
ListItem.position |
Sequential integer, starting at 1 |
|
ListItem.name |
The label for that level |
|
ListItem.item |
URL for that level, optional on the last |
|
Minimum entries |
TWO ListItem objects |
Two items is the minimum
A single-item breadcrumb showing only Home is technically valid but produces nothing useful, which is why breadcrumb markup is worth adding from the second level of your site downwards rather than on the homepage itself.
Positions must be sequential integers starting at 1
Skipping a number, starting at 0, or reordering the array without renumbering breaks parsing. If a breadcrumb trail stops appearing after a template change, the position sequence is the first thing to check.
The final item may omit its URL
The last entry is the page the visitor is already on, so Google displays it as plain text rather than a link. Including the URL anyway is also accepted, and both approaches work.
Represent the User Path, Not the URL Structure
This is Google's guidance and it is the point most implementations miss, because the obvious approach is to mirror the folder structure.
Google's framing
Breadcrumbs should represent a typical user path to the page, rather than mirroring the URL.
Those two are often the same thing, and where they are, no decision is needed. Where they differ, the user path is the better choice.
| URL | Mirroring the URL | Typical user path |
|
/blog/2026/03/sourdough-guide |
Home > Blog > 2026 > 03 > Sourdough Guide |
Home > Blog > Baking > Sourdough Guide |
|
/p/48291 |
Home > P > 48291 |
Home > Jumpers > Merino Crew Neck |
|
/docs/v2/api/auth |
Home > Docs > V2 > Api > Auth |
Home > Documentation > API > Authentication |
A practical constraint
Your markup should match the breadcrumbs visible on the page, so if you want a user-path trail in search results, build that trail on the page as well.
Example Output
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "SEO Tools",
"item": "https://example.com/seo-tools"
},
{
"@type": "ListItem",
"position": 3,
"name": "Breadcrumb Schema Generator"
}
]
}
// The third item has no item property because it is
// the current page.
Multiple Trails for One Page
If a page is genuinely reachable through more than one route, you can supply more than one BreadcrumbList. A jumper might sit under both a category path and a seasonal collection:
[
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home",
"item": "https://example.com/" },
{ "@type": "ListItem", "position": 2, "name": "Jumpers",
"item": "https://example.com/jumpers" },
{ "@type": "ListItem", "position": 3,
"name": "Merino Crew Neck" }
]
},
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home",
"item": "https://example.com/" },
{ "@type": "ListItem", "position": 2,
"name": "Autumn Collection",
"item": "https://example.com/autumn" },
{ "@type": "ListItem", "position": 3,
"name": "Merino Crew Neck" }
]
}
]
Where the Markup Goes
<script type="application/ld+json">
{
... your BreadcrumbList JSON-LD here ...
}
</script>
Google processes JSON-LD wherever it appears, though the head is conventional.
The trail is derived from where a page sits, so generating it from your existing navigation logic means it is correct everywhere and stays correct as the site changes. Hand-writing it page by page is how mismatches begin.
What Breadcrumb Markup Does and Does Not Do
| Does | Does not |
|
Replaces the raw URL with a readable path in search results |
Directly improve rankings |
|
Gives search engines an explicit site hierarchy |
Replace internal linking |
|
Helps AI systems understand page relationships |
Work without matching visible breadcrumbs |
|
Applies to nearly every page on a site |
Create navigation for users on its own |
On rankings
Breadcrumb markup is not a confirmed ranking signal. Its value is presentational and structural. A clearer, more informative search result can improve click-through rate, and engagement is its own kind of signal, but the honest description is that this improves how your result looks rather than where it ranks.
On availability
Google's documentation describes the breadcrumb feature as available on desktop in all regions and languages where Google Search is available. Worth knowing when comparing what you see on a phone against what you see on a laptop.
Common Mistakes to Avoid
Structured data must reflect what a visitor can see. If your page shows Home > Shop > Knitwear but your markup says Home > Products > Jumpers, Search Console will flag the mismatch and Google may disregard the markup entirely. This usually happens when the trail is hand-written per page rather than generated from the same navigation logic that renders the visible breadcrumbs.
Positions must be sequential integers starting at 1. Starting at 0, skipping a number, or reordering the array in a template without renumbering all break parsing, and the trail simply stops appearing. Because the markup still validates as JSON, nothing obvious signals the problem, which makes it worth checking first when a working breadcrumb disappears.
BreadcrumbList describes a hierarchical path from your site root to the current page. It is not for pagination sequences, related-article links, or a list of recently viewed pages. Those are different relationships and misusing the type gives search engines an incorrect picture of your site structure.
Quick Reference
| item | Detail |
|
Type |
BreadcrumbList |
|
Rich result |
Breadcrumb trail, fully supported |
|
Required |
itemListElement with position and name |
|
Minimum |
Two ListItem entries |
|
Positions |
Sequential integers from 1 |
|
Last item |
item URL optional |
|
Trail should reflect |
The user path, not the URL |
|
Visibility |
Must match the visible breadcrumbs |
|
Multiple trails |
Allowed if routes genuinely exist |
|
Not for |
Pagination or related links |
|
Implementation |
In the template, not per page |
|
Rankings |
Not a confirmed ranking signal |
