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.