Breadcrumb Structured Data Issues: How to Fix Them
The Breadcrumbs report in Search Console lists problems with the BreadcrumbList markup on your pages: a level with no URL, a missing name, positions out of order, or two trails that disagree. Items with errors are not eligible to show a breadcrumb trail in Google's results, and the markup no longer gives search engines and AI systems a reliable picture of where each page sits in your site. The good news is that breadcrumb markup is almost always printed by one template, so a single change usually fixes every affected page at once. This guide shows you the correct shape, how to read the report, how to fix each common error on popular platforms, and how to keep the markup in step with the visible trail.
What the breadcrumb report is telling you
A breadcrumb trail shows where a page sits in your site, such as Home โบ Garden Tools โบ Pruning Shears. BreadcrumbList markup describes the same trail in a form search engines can read. Google uses it to understand your site structure and, on desktop results, can show the trail in place of the raw URL. Since early 2025 Google shows only the site name and domain on mobile results, so the visible benefit is mainly on desktop, but the structural signal applies everywhere.
When Google finds BreadcrumbList markup, it adds the page to the Breadcrumbs report under Enhancements in Search Console. Each issue is listed as an error, which makes the item invalid, or a warning, which leaves it valid but incomplete. Common messages include:
| Message (typical wording) | What it means |
|---|---|
| Missing field "item" | A level other than the last has no URL |
| Either "name" or "item.name" should be specified | A level has no label |
| Missing field "itemListElement" | The BreadcrumbList is empty or the list has the wrong property name |
| A problem with "position" | A level has no position, or the position is not a whole number |
| An invalid URL in "item" | The URL is relative, malformed or uses a placeholder |
Open each message to see example URLs. Because breadcrumbs come from a template, the examples usually share a page type, which tells you where to look.
The correct shape of BreadcrumbList markup
A BreadcrumbList holds an itemListElement array of ListItem entries. Each entry has a position starting at 1, a name, and an item with the full URL of that level. The last entry is the current page and may leave out item.
<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": "Garden Tools",
"item": "https://example.com/garden-tools/"},
{"@type": "ListItem", "position": 3, "name": "Pruning Shears"}
]
}
</script>
The same trail in microdata, if your theme prints the visible breadcrumb with markup attached:
<ol itemscope itemtype="https://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="https://example.com/"><span itemprop="name">Home</span></a>
<meta itemprop="position" content="1">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="https://example.com/garden-tools/"><span itemprop="name">Garden Tools</span></a>
<meta itemprop="position" content="2">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<span itemprop="name">Pruning Shears</span>
<meta itemprop="position" content="3">
</li>
</ol>
Use one format, not both. JSON-LD is easier to keep correct because it sits apart from the visible HTML.
The common causes
| Cause | Typical result |
|---|---|
| A level with no page of its own, such as a parent category that is only a label | Missing field "item" on a middle level |
| A loop that starts counting at 0, or skips a hidden level | Positions 0, 1, 2 or 1, 2, 4 |
| Template variable empty on some pages | Missing name, or "item": "" |
| Relative paths in the template | Invalid URL warnings, or URLs resolved wrongly |
| Theme and SEO plugin both printing breadcrumbs | Two trails per page, often in different formats and with different levels |
| Old http or redirecting URLs hard-coded | Trail points at addresses that are not the final page |
| Page title used as the last name | Names such as Pruning Shears | My Shop that do not match the trail |
The first cause is by far the most common. It happens when a category exists in your product data but has no category page, or when the theme prints a level as plain text. Either give the level a real page or leave it out of both the visible trail and the markup.
How to diagnose the problem
Take an example URL from the report and run it through the Rich Results Test. It shows each breadcrumb item it found, with the levels listed and any error on the level that causes it. If two Breadcrumbs items appear, you have duplicate markup.
To see exactly what the page prints, paste this into the DevTools console. It lists every trail, in both JSON-LD and microdata, with the positions, names and URLs:
document.querySelectorAll('script[type="application/ld+json"]').forEach(s => {
const walk = o => {
if (!o || typeof o !== 'object') return;
if (o['@type'] === 'BreadcrumbList') console.table(o.itemListElement.map(i =>
({ position: i.position, name: i.name, item: typeof i.item === 'object' ? i.item['@id'] : i.item })));
Object.values(o).forEach(walk);
};
try { walk(JSON.parse(s.textContent)); } catch (e) { console.log('Unparsable block', e.message); }
});
console.log('Microdata trails:', document.querySelectorAll('[itemtype$="BreadcrumbList"]').length);
Check the table for a gap in positions, an empty name or a missing URL on any level except the last. Then check each URL returns 200 directly, not a redirect:
curl -sS -o /dev/null -w "%{http_code} %{url_effective}\n" https://example.com/garden-tools/
If the markup is broken JSON, the console script reports it; fix that first with the structured data syntax errors guide. The schema debugger runs the same checks and flags each failing level.
Platform notes
- WordPress. Yoast SEO and Rank Math each output BreadcrumbList as part of their page graph, and many themes print their own microdata trail too. Choose one: switch off the theme's breadcrumbs or the plugin's, and use the plugin's breadcrumb block or shortcode for the visible trail so both come from the same data. With WooCommerce, check that its own breadcrumb output is not adding a second trail. See debugging schema in WordPress.
- Shopify. Many themes have no breadcrumb at all, and an app or theme snippet adds it. Collection paths are the usual trouble: a product reached from several collections can print different trails. Build the trail from one canonical collection. See debugging schema in Shopify.
- Next.js and headless sites. Generate the JSON-LD from the same route data that renders the visible breadcrumb component, on the server, and build absolute URLs from a single site URL setting rather than the request host.
- Static sites. Use a partial or include that takes the trail as data, so you edit one file rather than every page.
A worked example
A garden shop's Breadcrumbs report shows 1,200 items with Missing field "item". The Rich Results Test on a product page shows four levels: Home, Tools, Garden Tools and Pruning Shears. The error sits on level 2, Tools.
The shop's categories have a parent called Tools with no page of its own; it exists only to group menus. The theme prints it in the visible trail as plain text, and the markup template prints it with an empty URL. The owner has two choices: create a real Tools category page, or drop that level. They drop it from both the visible trail and the markup, which now read Home, Garden Tools, Pruning Shears with positions 1, 2 and 3. A second trail from the theme's microdata is switched off at the same time. After testing a deep product and a product with a long name, the owner validates the fix, and the report's error count falls over the next fortnight.
The fix, step by step
Step 1
Read the report and pick examples
In Search Console, open the Breadcrumbs report under Enhancements and note each error and warning message. Open each one and take two or three example URLs, grouped by page type such as product, category or post. Because breadcrumbs come from templates, each group usually has one cause. Run one example per group through the Rich Results Test and note which level of the trail carries the error.
Step 2
List every trail on the page
Open an example page in Chrome and run a short console script that finds every BreadcrumbList in the JSON-LD and counts microdata trails. Print each level's position, name and URL as a table. Check how many trails the page carries and whether they agree. Two trails that differ, often one from the theme and one from an SEO plugin, are a cause in their own right and need sorting out first.
Step 3
Remove duplicate breadcrumb markup
If the page prints more than one trail by accident, choose one source and switch the other off. In WordPress this is usually a theme option or the SEO plugin's breadcrumb setting. In Shopify, remove the extra snippet or app output. Keep the source that can also print the visible trail, so both come from the same data. Reload and confirm the console script now finds one trail.
Step 4
Add the missing item and name fields
For every level except the last, make sure the markup has an item with that level's URL and a name with its label. Where a level has no page of its own, either create a real page for it or remove that level from both the visible trail and the markup. Fix template variables that come back empty on some pages. Retest and check every middle level now has both fields.
Step 5
Number positions from 1 without gaps
Check the position values run 1, 2, 3 in order with no gaps, repeats or zero. Loops that start counting at 0, or that skip a level hidden in the visible trail, are the usual cause. Calculate the position from the index of each level in the final list, after any levels are removed, rather than from a fixed number. Test a shallow page and a deep page to confirm both number correctly.
Step 6
Use absolute, final URLs
Make every item a full https URL on your canonical host that returns 200 directly. Build URLs from your site address setting, not from relative paths or the request host. Replace any http, old or redirecting addresses with the final URL, and remove tracking and filter parameters. Check a few with curl to confirm each returns 200 with no redirect, and that trailing slashes match your canonical URLs.
Step 7
Match names to the visible trail
Compare the markup with the breadcrumb trail visitors see. Each name should be the same plain label shown in the trail, not the page title with your brand added. Remove levels from the markup that the visible trail does not show, and make sure there is a visible trail on the page. Generating both from the same list of levels keeps them matching after future changes.
Step 8
Test page types and validate
Run the Rich Results Test on one page of each type, including a deep page, a page with a long or unusual name, and a page in a category you recently changed. Each should show one Breadcrumbs item with no errors. Then open each fixed message in the Breadcrumbs report and choose Validate fix. Watch the error count fall over the next two weeks as Google recrawls the pages.
Edge cases worth knowing
- Several genuine paths. A product that really sits in two sections can carry two BreadcrumbList trails, and Google supports that. Two trails are a problem only when they disagree by accident.
- The home page. A trail with only one level, the home page itself, adds nothing. Leave breadcrumb markup off the home page.
- Item as an object.
itemcan be a URL string or an object with an@idURL and its ownname. Both are valid; mixing them within one trail is allowed but harder to maintain. - Trailing slashes and parameters. Use the canonical form of each URL, matching your trailing slash policy, and never include tracking or filter parameters.
- Hidden breadcrumbs. Marking up a trail that visitors cannot see goes against Google's guidelines. Keep a visible trail on every page that carries the markup.
Keeping breadcrumbs correct
Breadcrumb markup drifts when the visible trail and the markup are built from different data. The lasting fix is to generate both from the same source.
- Print the visible trail and the JSON-LD from one function or component, fed by one list of levels.
- Build URLs from a single site address setting so every
itemis absolute and on the canonical host. - Keep one breadcrumb generator; after theme or plugin updates, check one page of each type still shows a single trail.
- When you restructure categories, retest a deep page in the Rich Results Test before and after.
- Check the Breadcrumbs report monthly. A sudden jump in errors usually follows a change you can name.
To see how breadcrumbs appear in search, see breadcrumbs in search results.
1. What does Missing field item mean in breadcrumbs?
Missing field item means one level of your breadcrumb trail, other than the last, has no URL in the markup. Every level except the current page must include an item with the full URL of that level. It usually happens when a parent category has no page of its own, or when a template variable is empty. Either create a real page for that level and link to it, or remove the level from both the visible trail and the markup.
2. Does the last breadcrumb item need a URL?
No, the last item in a breadcrumb trail does not need a URL, because it represents the current page. Google's guidelines allow you to leave out the item property on the final ListItem, keeping only its position and name. Including the current page's URL is also allowed and does no harm. What matters is that every earlier level has a URL, that positions run in order from 1, and that names match the labels shown in the visible trail.
3. Can I have more than one breadcrumb trail on a page?
Yes, a page can carry more than one BreadcrumbList if it genuinely sits in more than one place in your site, and Google supports that. A product listed under two sections might have a trail for each. The problem is accidental duplicates, where a theme and a plugin each print a trail, often with different levels or formats. Keep intentional trails, remove accidental ones, and make sure every trail you keep is complete and matches what visitors can see.
4. Why do my breadcrumbs not show in Google search results?
Breadcrumbs may not show because Google decides per result whether to display them, and since early 2025 Google shows only the site name and domain on mobile results rather than a breadcrumb trail. On desktop, valid breadcrumb markup makes a page eligible, but Google may still show a URL instead. Check the Breadcrumbs report for errors, make sure the page is indexed and the markup matches the visible trail, then allow time for recrawling after any change.
5. Should breadcrumb names include my brand name?
No, breadcrumb names should be the plain labels shown in the visible trail, without your brand added. Using the page title, such as Pruning Shears followed by your shop name, makes the markup disagree with the trail visitors see and adds nothing useful. The site name is already shown separately in search results. Generate the names from the same field that prints the visible breadcrumb labels, so the two always match, and keep each name short and descriptive.
6. Is JSON-LD or microdata better for breadcrumbs?
JSON-LD is usually the better choice for breadcrumbs because it sits apart from the visible HTML and is easier to generate correctly. Microdata attaches the markup to the visible trail itself, which keeps them together but is easier to break when a theme changes its HTML. Google supports both. The important rule is to use one format per trail, not both, and to generate the markup from the same data that prints the visible trail on the page.
7. How long does it take for breadcrumb errors to clear?
Breadcrumb errors clear as Google recrawls the fixed pages, typically over a few days to a few weeks. Choose Validate fix in the Breadcrumbs report to have Google check the affected URLs and track progress. Busy pages clear first, while deep pages that are crawled rarely can take longer. You can confirm individual pages straight away with the Rich Results Test, so there is no need to wait for the report before checking your fix works.
The schema debugger reads every BreadcrumbList on your page, lists each level with its position, name and URL, and flags missing fields and duplicate trails.
Open Schema Debugger Fixes โ