Skip to content

/ BLOG10 min

Schema markup that Google AI Overviews cites: real composition that works

How to combine Article, FAQPage, HowTo and BreadcrumbList to maximize citations in AI Overviews and ChatGPT. Real examples, not schema.org copy-paste.

  • schema-markup
  • structured-data
  • ai-overviews
  • technical-seo

"Add Schema" is the most repeated and worst-explained SEO advice of recent years. Most sites implement a flat Article or a generic LocalBusiness, then wonder why Google AI Overviews and ChatGPT don't cite them.

This post is what actually works in 2026, with real examples of Schema composition I see cited in AI responses, and the anti-patterns I keep finding in sites that come to audit.

The important change: Schema is no longer just for rich snippets

Until 2023, Schema mainly served to get rich snippets (stars, FAQ dropdowns, visual breadcrumbs) in SERPs. In 2026 there's a second function that's equally or more important:

Generative AIs use Schema to understand what each page is and decide what to cite.

ChatGPT, Perplexity and Google AI Overviews read JSON-LD before the visible content. If your Schema is vague or incorrect, they ignore you. If your Schema is specific and rich, they pick you among 5 alternatives with equivalent content.

Schema composition by page type

Informative blog post

Wrong (what I see in 70% of WP blogs):

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "My post",
  "datePublished": "2026-05-01"
}

Right (rich composition):

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "@id": "https://example.com/blog/my-post/#article",
      "headline": "How to appear in ChatGPT in 2026",
      "description": "Practical guide with real data on Bing indexing, Schema and topical authority.",
      "datePublished": "2026-05-17T10:00:00+02:00",
      "dateModified": "2026-05-17T10:00:00+02:00",
      "wordCount": 2100,
      "inLanguage": "en-GB",
      "image": "https://example.com/blog/my-post/hero.webp",
      "author": { "@id": "https://example.com/#person" },
      "publisher": { "@id": "https://example.com/#person" },
      "mainEntityOfPage": "https://example.com/blog/my-post/",
      "isPartOf": { "@id": "https://example.com/blog/#website" }
    },
    {
      "@type": "Person",
      "@id": "https://example.com/#person",
      "name": "Jesús Porres",
      "url": "https://example.com/about",
      "sameAs": [
        "https://www.linkedin.com/in/jesusporres",
        "https://github.com/jesusporres"
      ],
      "jobTitle": "SEO Consultant",
      "knowsAbout": ["Technical SEO", "AI applied to SEO", "Schema markup"]
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [
        { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" },
        { "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog/" },
        { "@type": "ListItem", "position": 3, "name": "How to appear in ChatGPT" }
      ]
    }
  ]
}

What this composition adds:

  • @graph groups multiple related entities in a single structure.
  • Unique @id lets nodes reference each other (Article points to Person via @id).
  • Person with sameAs triangulates authority: AIs cross-check your LinkedIn, GitHub, etc.
  • BreadcrumbList helps hierarchical understanding of the site.
  • knowsAbout on Person labels you as a topical expert.

Post with FAQs

Add FAQPage when the post explicitly answers questions. Do NOT invent FAQs just to add the Schema — AIs detect over-optimization.

{
  "@type": "FAQPage",
  "@id": "https://example.com/blog/my-post/#faq",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How long does it take for a site to appear in ChatGPT?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Between 2 and 6 weeks after correctly indexing in Bing Webmaster Tools and activating IndexNow. New sites can take up to 8 weeks."
      }
    },
    {
      "@type": "Question",
      "name": "Do you need to pay to appear in ChatGPT?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. ChatGPT has no system for paid mentions. Anyone selling «guaranteed citations» is selling smoke."
      }
    }
  ]
}

Bonus: each Answer.text ideally between 80-200 characters. AIs prefer direct and verbatim-citable answers.

Step-by-step tutorial

HowTo still works even though Google removed the visual rich snippet in 2023. AIs still read it.

{
  "@type": "HowTo",
  "name": "How to register your site in Bing Webmaster Tools",
  "totalTime": "PT15M",
  "estimatedCost": { "@type": "MonetaryAmount", "currency": "EUR", "value": "0" },
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "Create account",
      "text": "Go to webmaster.bing.com and create an account with your email.",
      "url": "https://webmaster.bing.com/"
    },
    {
      "@type": "HowToStep",
      "position": 2,
      "name": "Add your site",
      "text": "Click «Add a site», enter your site URL, verify ownership via meta tag or DNS TXT."
    },
    {
      "@type": "HowToStep",
      "position": 3,
      "name": "Submit sitemap",
      "text": "In Sitemaps, paste your sitemap.xml URL (typically https://yourdomain.com/sitemap.xml)."
    }
  ]
}

Service page

For a service page (commercial landing):

{
  "@context": "https://schema.org",
  "@type": "Service",
  "@id": "https://example.com/services/local-seo/#service",
  "name": "Local SEO for small businesses",
  "description": "Local SEO service for small businesses in Spain with initial setup + monthly retainer.",
  "provider": {
    "@type": "LegalService",
    "@id": "https://example.com/#legalservice",
    "name": "Jesús Porres SEO Consulting",
    "url": "https://example.com/",
    "telephone": "+34 ...",
    "address": { ... },
    "priceRange": "€€"
  },
  "areaServed": {
    "@type": "Country",
    "name": "Spain"
  },
  "serviceType": "Local SEO",
  "offers": {
    "@type": "AggregateOffer",
    "priceCurrency": "EUR",
    "priceSpecification": {
      "@type": "PriceSpecification",
      "priceCurrency": "EUR",
      "minPrice": "800"
    }
  },
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Included services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Initial GBP audit" }},
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "LocalBusiness Schema" }},
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Monthly GBP posts" }},
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Monthly report" }}
    ]
  }
}

hasOfferCatalog moves the needle most. Almost no one implements it well.

The 5 anti-patterns I keep seeing

1. Schema only on home

I see this on 60% of sites. Home with complete Schema, rest of pages empty. Each page must have its specific Schema for its type.

2. JSON-LD with syntax errors

Trailing commas, mismatched quotes, keys without quotes. Any syntax error makes the browser parse JSON-LD as invalid and Google ignores it all. Validate with Google's Schema Validator (the official one), not Rich Results Test.

3. @type that doesn't exist in schema.org

Inventing types like "@type": "ConsultingService" (doesn't exist). The correct one is "@type": "ProfessionalService" with serviceType: "Consulting". If in doubt, schema.org has a search box.

4. Contradictory data between Schema and visible page

If Schema says priceRange: "€€" and the page shows services at 3,000€/month, there's contradiction. AIs penalize contradiction.

5. Multiple Schemas of the same type on one page

Marking the same thing twice (e.g. two different Organization on home). Google keeps one arbitrarily. Better one @graph with all unique entities.

How to actually validate

  1. Official Schema Validator (https://validator.schema.org/). The only one that validates against the full spec.
  2. Rich Results Test only validates types with visual rich snippet (limited).
  3. Google Search Console → Enhancements → Structured data shows errors in real coverage.
  4. For mass audits, Screaming Frog has a structured data validation module in licensed plan.

Recommended workflow when launching a new page

  1. Decide the main @type based on the page type (Article, Service, Product, etc.).
  2. Build the JSON-LD locally.
  3. Validate with Schema Validator before deploy.
  4. After deploy, verify the JSON-LD renders correctly with View Source.
  5. Submit the URL in Google Search Console → URL Inspection to force re-crawl.
  6. Wait 7-14 days and check in GSC → Enhancements if the type is recognized.

Why it matters more in 2026

Three cumulative reasons:

  • AI Overviews in global rollout, including Spain progressively. Rich Schema = higher chance of citation.
  • ChatGPT with search enabled by default. Citations in responses are the new SERP impression.
  • Perplexity and other LLMs value structured extraction over pure prose.

Schema markup done right is the best-ROI technical investment I know of in 2026. Cost: 3-5 hours per main page of the site. Benefit: months of AI citations + rich snippets + better understanding by Google.


Want to review your site's current Schema with external criteria? It's a standard part of the technical SEO audit. For implementation + monthly monitoring, see technical SEO.

[[ ¿TE RESULTA ÚTIL? ]]

Hablemos de tu proyecto.

Diagnóstico inicial de 30 min sin compromiso. Te digo qué veo y si tiene sentido que trabajemos juntos. Sin packs cerrados.

Contactar →

[ SEGUIR LEYENDO ]

Schema markup that Google AI Overviews cites: real composition that works — Jesús Porres · Jesús Porres