AEO Saigon
How-to

BreadcrumbList Schema: Helping AI and Google Understand Your Website Structure

Table of contents

When AI reads your website, one of the things it is looking for is hierarchical structure. Which page is the overview? Which is the detail? Which page belongs to which topic? BreadcrumbList schema is how you answer these questions clearly and in a structured way.

How BreadcrumbList Works

BreadcrumbList is a list of "waypoints" leading from the homepage to the current page. It does two things:

1. On Google SERP:

Instead of a raw URL, users see a clean hierarchical path: example.vn › blog › guides › breadcrumb-schema → CTR improves.

2. With AI search:

AI understands: this article belongs to the "Guides" topic, which is a child of "Blog" — when answering questions about structured data, this is a relevant source to cite.

Complete BreadcrumbList JSON-LD

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://example.vn/en"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Blog",
      "item": "https://example.vn/en/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Guides",
      "item": "https://example.vn/en/blog/guides"
    },
    {
      "@type": "ListItem",
      "position": 4,
      "name": "BreadcrumbList Schema: Helping AI and Google Understand Website Structure"
    }
  ]
}

Note that the last item does not have an item field (URL) — this is the current page, no link is needed.

Implementation in Next.js App Router

// lib/schema/breadcrumb.ts
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL!;

interface BreadcrumbItem {
  name: string;
  href?: string;
}

export function generateBreadcrumbSchema(
  items: BreadcrumbItem[],
  locale: string
): object {
  return {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    itemListElement: items.map((item, index) => ({
      "@type": "ListItem",
      position: index + 1,
      name: item.name,
      ...(item.href && {
        item: `${siteUrl}/${locale}${item.href}`,
      }),
    })),
  };
}

Service page

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.vn/en" },
    { "@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.vn/en/services" },
    { "@type": "ListItem", "position": 3, "name": "AEO for E-commerce" }
  ]
}

Product page (E-commerce)

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://shop.vn" },
    { "@type": "ListItem", "position": 2, "name": "Fashion", "item": "https://shop.vn/fashion" },
    { "@type": "ListItem", "position": 3, "name": "Men's Shirts", "item": "https://shop.vn/fashion/mens-shirts" },
    { "@type": "ListItem", "position": 4, "name": "Cotton Polo Shirt" }
  ]
}

SitelinksSearchBox Schema

SitelinksSearchBox allows Google to display an inline search box when users search for your brand:

{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "https://example.vn/#website",
  "url": "https://example.vn",
  "name": "AEO Saigon",
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "https://example.vn/search?q={search_term_string}"
    },
    "query-input": "required name=search_term_string"
  }
}

Conditions for Google to activate Sitelinks Search:

  • Website has a functioning search with relevant results
  • Search URL works correctly with query parameters
  • Google has indexed enough pages (typically requires reasonable domain authority)

Common BreadcrumbList Errors

ErrorDescriptionFix
URL doesn't match structureBreadcrumb declares a path different from the actual URLSync breadcrumb items with URL slugs
Using relative URLs/blog instead of https://example.vn/blogAlways use absolute URLs in item
Last item has a URLCurrent page does not need a URLRemove the item field for the last position
Non-sequential positions1, 2, 4 (skipping 3)Ensure positions increment sequentially from 1
Missing first itemBreadcrumb starts from category, skipping HomeAlways include Home as the first item
i18n ignores localeURLs in schema missing /en/Prepend locale to each URL item

BreadcrumbList schema affects AEO in ways few people consider:

  • Topical clustering: AI recognizes /blog/guides/* as a cluster of "technical guides", distinct from /blog/knowledge/* as a "theoretical knowledge" cluster. When answering practical questions, AI prioritizes /guides/.
  • Authority flow: AI understands that the category page (/blog/guides) is the "parent authority" for its child articles. If a category page has good schema and many child articles, the category page receives higher authority from AI.
  • Citation precision: Instead of citing "website ABC", AI can cite "in the Guides section of ABC" — more specific, more trustworthy.

BreadcrumbList is one of the easiest schemas to implement yet is often overlooked. Implement it correctly in one session, and benefit long-term from both SEO (rich results) and AEO (AI context).

Frequently asked questions

Does BreadcrumbList schema have an impact on AEO?

Yes — in two ways. First, BreadcrumbList helps AI understand content hierarchy: the page /blog/guides/what-is-aeo is a child of /blog/guides, which is a child of /blog. AI uses this signal to identify the parent topic and context when citing. Second, Google displays breadcrumbs in search results instead of ugly URLs — users see a clear path, CTR improves. Pages with high CTR give AI stronger relevance signals.

Where should BreadcrumbList be declared — in the page or layout?

Declare it in each page, not in the layout. Each page has its own breadcrumb trail (for example: a blog post has 3–4 levels; the homepage has only 1 level). If declared in the layout, you cannot customize per-page. In Next.js App Router: create a generateBreadcrumbSchema() function in each page.tsx, pass it to generateMetadata or render directly in a JSON-LD script tag.

How many breadcrumb levels are enough?

3–4 levels is ideal. For example: Home → Services → AEO for E-commerce → Case Study. Too few (1–2 levels) does not provide enough hierarchical context. Too many (5+ levels) makes URL and structure unnecessarily complex. If the site structure is flat (only 2 levels) — still declare it, Google will display the domain and category.

What is SitelinksSearchBox and should it be used?

SitelinksSearchBox is a schema that allows Google to display a search box directly in branded search results. Users can search site content right from the Google SERP. Use it if the site has a well-functioning search with relevant results. Not required — Google may add sitelinks search automatically without schema.

Do BreadcrumbList schema and URL structure need to match?

Yes — they must match completely. If the URL is /blog/guides/what-is-aeo then BreadcrumbList must reflect the exact structure: item 1 = /, item 2 = /blog, item 3 = /blog/guides, item 4 = /blog/guides/what-is-aeo. The declared breadcrumb must not differ from the actual URL. Google checks this consistency and will ignore it if there is a conflict.

AEO Saigon

An Answer Engine Optimization agency in Ho Chi Minh City — helping business websites get cited by AI. About AEO Saigon →

Want your website to be cited by AI like this?

Free Audit