Skip to the tool
OnPageKit

Breadcrumb Schema Generator

Build a BreadcrumbList trail that validates.

the page this block goes on
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList"
}
</script>

The trail here should match the path a visitor can actually click on the page. Valid markup is not the same as eligibility, so check the published URL with Google’s Rich Results Test.

Everything runs in your browser. Nothing you type is sent to a server.

Found a bug in this tool? Report it.

Share this tool

Name the steps, get the list

This breadcrumb schema generator builds the BreadcrumbList JSON-LD for a page one step at a time: type the name and URL of each level, and it numbers the positions, omits the URL of the final step if you want it to, and flags the mistakes that stop the trail being used. It runs entirely in the browser.

What Google does with it

Of all the structured data types, this one has the most visible payoff. On a desktop result, a page with valid breadcrumb markup shows example.com › guides › breadcrumbs where the raw URL would otherwise sit. That reads as a real place in a real site rather than a string, and it is the difference between a listing that looks navigable and one that looks like a file path.

The trail Google displays is not always the one you declared. It reconciles your markup with the URL structure and the site's internal linking, and it may shorten or relabel a step. Declaring the trail is how you get a vote, not a veto.

position, and why it starts at 1

Each step is a ListItem with a position, and the numbering starts at 1 rather than 0. It has to be sequential with no gaps, which sounds trivial until a template loops over an array index and produces a list starting at zero — a mistake that invalidates the whole block rather than one item. The generator numbers the steps for you and skips any step you left unnamed, so removing a level never leaves a hole in the sequence.

The name is what appears in the result, so write the label a visitor would recognise: Guides, not guides-category-2. The item is the absolute URL of that level. Relative paths are the single most common reason a breadcrumb block silently fails — the markup validates as JSON, and the URL resolves to nothing a crawler can use.

One trail per page, and it should match the navigation

A page can be reached by many routes. A pair of walking boots might sit under Footwear, under Sale, and under Brands › Meindl, and the temptation is to declare all three so that every path is represented. Declare one.

The right one is the path that matches what a visitor sees on the page. If the header shows Home › Footwear › Walking boots, that is the trail, and the markup exists to make that visible structure machine-readable. When the two disagree, the mismatch is not merely untidy: markup that describes navigation the page does not offer is describing content that is not there.

That coherence is also why the last step is best left without a URL. A link back to the page you are already on is noise for a visitor and redundant for a crawler, and Google explicitly allows the final ListItem to carry a name alone. The generator ticks that option by default and warns when the last step links to the current page anyway.

Validity is not eligibility

The block produced here is valid JSON-LD and conformant with schema.org — that is what a generator can guarantee. Whether Google shows the trail on your listing is its decision, made against the live page, so publish the block and then run the URL through the Rich Results Test. It reports which features the page is eligible for and which properties it parsed, which is the only answer that counts.

Breadcrumbs rarely travel alone. On an article template, pair this block with the article schema generator; where the page is genuinely a list of questions, the faq schema generator covers the other half.

Frequently asked questions

Does the last breadcrumb need a URL?

No, and leaving it out is the cleaner option. Google accepts a final ListItem with a name and no item property, which is exactly what a trail means — the last step is where you already are. If you do include the URL, make it the canonical address of the current page rather than a variant with parameters.

Can one page have more than one breadcrumb trail?

Technically yes: a product reachable through two categories may declare two BreadcrumbList blocks, and Google will pick one. In practice it rarely helps. Pick the path that reflects how the site is organised, declare that one, and spend the effort on making the visible navigation match it.

Where should the JSON-LD block go?

Anywhere in the head or the body of the page. Placement makes no difference to how it is parsed, so put it wherever your template keeps its other structured data. One block per page, not one per breadcrumb.

Do breadcrumbs still appear in search results?

Yes. Unlike several structured data features narrowed since 2023, the breadcrumb trail is still shown in place of the URL on desktop results, and it is one of the few pieces of markup that visibly changes how your listing looks. On mobile, Google usually shows the site name and a shortened path.

What if my site has no visible breadcrumbs?

Add them to the page first. The markup is supposed to describe a navigation path a visitor can see and click; declaring a trail that exists only in JSON-LD is markup describing content that is not there, and it wastes the main benefit — a visitor who lands on a deep page and needs to know where they are.

Related tools

Updated