BreadcrumbList Schema Markup: Show Navigation Trails in Google Results

·7 min read

The line of text directly under your title in a Google search snippet is the URL. By default it looks like example.com › blog › 2025 › 03 › some-slug-here — ugly, often truncated, and usually identical to the URL above the title. With BreadcrumbList schema, you can replace that with a clean navigation trail like Example › Guides › Local SEO › LocalBusiness Schema.

It's one of the easiest rich-result wins in SEO. Validation is forgiving, the JSON-LD is short, and there's no editorial review process — Google picks it up as soon as it's crawled. Yet most sites either skip it entirely or break it with the same three mistakes.

What BreadcrumbList Actually Changes

A correctly-implemented BreadcrumbList does three things:

  1. Replaces the URL display path in the SERP with the breadcrumb trail you defined
  2. Makes each crumb a clickable link in search results on some queries
  3. Feeds Google's site-structure understanding — the crumbs are one signal among many that tell Google how your pages relate hierarchically

What it doesn't do: rank you higher directly. The benefit is purely click-through rate. A snippet that says "Acme › Resources › Plumbing › How to Fix a Leaky Faucet" earns more clicks than acme.com/resources/plumbing/leaky-faucet-fix because it reads like a path, not a slug. Across millions of impressions, that CTR delta becomes meaningful — but no engineer is going to win an internal argument by promising "rankings."

The Minimum Viable BreadcrumbList

Drop this in the <head> of any page. Three items, each with a name and a position, and that's it:

<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": "Guides",
      "item": "https://example.com/guides/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "How to Fix a Leaky Faucet",
      "item": "https://example.com/guides/leaky-faucet-fix/"
    }
  ]
}
</script>

The last item is the current page. Some implementations omit the item URL on the final crumb because Google specifically says you can — both forms validate. Including the URL is safer because some third-party SEO tools flag the omission as a warning.

The Three Things That Break It

1. Position Numbers Skipping or Repeating

position must start at 1, increment by 1, and have no gaps. I've seen breadcrumb generators produce position arrays like [1, 2, 4] when a middle category got filtered out by a CMS rule. Google rejects the entire trail when this happens — not just the bad crumb, the whole BreadcrumbList silently fails validation and your snippet shows the default URL path.

Always renumber after any filtering step. Cheap fix: in your template, ignore whatever the CMS gives you and assign positions sequentially from a loop counter.

2. URLs That 404 or Redirect

Every item URL must return a 200 OK. If a category page in the middle of the trail 301-redirects to a renamed category, Google may either fall back to the default URL or display the trail incorrectly. If any URL 404s, the whole markup is rejected.

This breaks most often after a site reorganization. Run your category and tag pages through a Redirect Chain Checker after any URL change and update any breadcrumb generators that hardcode old paths.

3. Breadcrumb Trail Doesn't Match Visible Breadcrumbs

Google's documentation says the schema "should match the visible breadcrumb trail on the page." In practice they tolerate small differences — capitalization, "Home" vs your site name in the first position, trailing slashes. What they don't tolerate is invisible breadcrumbs.

If your page has no visible breadcrumb navigation but your JSON-LD declares a trail, you're technically violating their structured data policy ("Do not mark up content that is not visible to users"). The penalty is rarely a manual action; it's that Google's algorithms ignore the markup and fall back to the URL display.

Add visible breadcrumbs to the page first, then mirror the same labels and links in the JSON-LD. The <nav aria-label="Breadcrumb"> element is the standard pattern.

Multiple Breadcrumb Trails on One Page

Some pages legitimately sit under more than one category — a product that's in both "Power Tools" and "Sale" categories, or a blog post tagged with multiple topics. Schema.org allows multiple BreadcrumbList objects on the same page, and Google picks one to display.

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [...trail A...]
  },
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [...trail B...]
  }
]
</script>

In practice, Google almost always picks the first trail in the array. If you have a primary category and a secondary one, list the primary first. Don't expect both trails to show in different searches based on query context — that's not how Google chooses.

How It Combines with Other Schema Types

BreadcrumbList plays nicely with every other schema type. You don't pick one or the other — a typical product page has Product, BreadcrumbList, and sometimes Review markup all at once. Each lives in its own <script> block:

  • Product + BreadcrumbList — product pages, the most common pairing
  • Article + BreadcrumbList — blog posts and news articles, where the trail signals editorial structure (see our Article schema guide)
  • LocalBusiness + BreadcrumbList — multi-location sites where each location page sits under a region trail (covered in our LocalBusiness schema guide)
  • FAQPage + BreadcrumbList — support and help center pages

The only schema type you shouldn't combine BreadcrumbList with is Organization markup on the homepage — your homepage doesn't have a breadcrumb trail because it is the root.

Where Most Sites Skip It (And Shouldn't)

The pages that benefit most from BreadcrumbList markup are the ones most often missing it:

  • Deep category and tag archive pages. These are usually 3-4 levels into your URL structure and need the visual hierarchy boost.
  • Knowledge base and help center articles. Users searching support queries have urgent intent — a breadcrumb showing Help › Billing › Subscription Changes instantly says "this is the right page."
  • E-commerce sub-sub-categories. A product filter URL like /shoes/running/trail/waterproof/ looks awful as a URL but ideal as a breadcrumb trail.
  • Multi-author or multi-podcast blogs where the trail can encode the author or show name.

Skip it on: the homepage, single-level sites without real hierarchy, and any page where adding a breadcrumb trail would be misleading (one-off landing pages, for instance).

Validate Before You Ship

Two checks before deploying:

  1. Run the JSON-LD through the Structured Data Validator to catch syntax errors, position gaps, and missing required fields.
  2. Generate the markup with the Schema Markup Generator if you don't want to hand-write it — pick BreadcrumbList from the type dropdown and fill in each crumb.

After deploying, give Google a week or two to recrawl, then check Google Search Console under Enhancements › Breadcrumbs. It'll show which pages have valid breadcrumb markup and which ones have errors. Errors there mean Google saw the markup but couldn't use it — usually one of the three breakage modes above.

The Short Version

  • BreadcrumbList replaces your ugly URL line in Google snippets with a clean navigation trail
  • Three required fields per crumb: position (sequential from 1), name, item URL
  • Last item's URL is optional; include it anyway for tool compatibility
  • Mirror the visible breadcrumbs on the page — invisible markup gets ignored
  • Combine freely with Product, Article, LocalBusiness, FAQPage — they live in separate <script> blocks
  • Most-needed on deep category pages, knowledge bases, and e-commerce sub-categories

It's one of the cheapest rich-result wins in SEO. The JSON-LD is under 30 lines, validation is unforgiving but fast to fix, and the CTR lift compounds across every page on the site that gets indexed.

Ready to try it?

Create JSON-LD structured data for your website. Support for Article, LocalBusiness, Product, FAQ, and more schema types.

📋 Schema Markup Generator — Free Online Tool

Get notified about new SEO tools

More free tools coming soon — keyword research, sitemap generator, and more.