Skip to main content
Technology & EngineeringLlm Optimization343 lines

Schema Markup for LLM Citation & Visibility

Microsoft's Bing Principal Product Manager officially confirmed: **"Schema markup helps Microsoft's LLMs understand your content."** This is the strongest official confirmation that structured data di

Quick Summary14 lines
Microsoft's Bing Principal Product Manager officially confirmed: **"Schema markup helps Microsoft's LLMs understand your content."** This is the strongest official confirmation that structured data directly influences AI visibility.

## Key Points

1. **Google Rich Results Test**: https://search.google.com/test/rich-results
2. **Schema.org Markup Validator**: https://validator.schema.org/
3. **View Page Source**: Verify JSON-LD appears in rendered HTML (SSR verification)
1. **Quality over quantity**: Multiple schema types on one page have diminishing returns. Focus on the Triple Stack for content pages.
2. **Schema must match content**: Schema that does not accurately reflect page content will be penalized, not rewarded.
3. **Test after every change**: Use validation tools after every schema update. Invalid schema is worse than no schema.
4. **Focus on high-traffic pages first**: Prioritize pages that already receive organic traffic.
5. **Always use JSON-LD**: Not microdata, not RDFa. JSON-LD is the standard for AI systems.
skilldb get llm-optimization-skills/Schema Markup for LLM Citation & VisibilityFull skill: 343 lines
Paste into your CLAUDE.md or agent config

Schema Markup for LLM Citation & Visibility

Microsoft's Official Confirmation (March 2025)

Microsoft's Bing Principal Product Manager officially confirmed: "Schema markup helps Microsoft's LLMs understand your content." This is the strongest official confirmation that structured data directly influences AI visibility.

Additionally, sites with no schema markup were found to be "NOT INDEXED at all" by some AI systems. Schema is not optional for AI visibility — it is foundational.

The Triple Stack

Pages with the full Triple Stack — Article + ItemList + FAQPage schema — receive 1.8x more AI citations than pages with Article schema alone.

This is the single most impactful schema configuration for AI citation rates.

Three-Tier Priority System

Tier 1 — High Priority (Implement First)

Schema TypePurposeLLM Impact
OrganizationBrand identity, knowledge graph foundationCritical for entity recognition across all AI systems
ArticleEditorial content with author, dates, publisherSignals credibility; essential for blog/news content
FAQPageQuestion-answer pairsDirectly feeds Q&A to Perplexity, Google AI Overviews; 60% more likely to be featured
ProductFeatures, pricing, reviews, specsEnables AI comparison shopping and product recommendations
SoftwareApplicationApp capabilities and compatibilityCritical for SaaS/tech products

Tier 2 — Secondary Value

Schema TypePurposeLLM Impact
HowToStep-by-step processesPreferentially cited by AI; note: no longer yields Google rich snippets as of 2026
Review / AggregateRatingSocial proof signalsSupports trust evaluation
Author / PersonAttribution and credibilityReinforces E-E-A-T signals
BreadcrumbListContent hierarchyHelps AI understand site structure
SpeakableVoice-optimized contentSignals content suitable for voice AI assistants
ItemListStructured lists and comparisonsCombined with Article schema: 1.8x more citations
VideoObjectVideo content with transcriptsSupports multi-modal AI understanding
ImageObjectImages with captions/descriptionsSupports visual content parsing

Tier 3 — Contextual

Schema TypePurposeLLM Impact
ContactPointAccessibility signalsSupports trust signals
OfferPricing/conversion clarityHelps AI product comparisons
EventTime-sensitive contentEvent-related AI queries
LocalBusinessLocal AI searchChatGPT local queries

JSON-LD Implementation Examples

Always use JSON-LD format — it is Google's recommended format and the most LLM-compatible.

Organization Schema

Apply to all pages (typically in layout). This is your knowledge graph foundation.

// lib/schema/organization.ts
export function organizationSchema(config: {
  name: string;
  url: string;
  logo: string;
  description: string;
  foundingDate?: string;
  sameAs: string[];
}) {
  return {
    '@context': 'https://schema.org',
    '@type': 'Organization',
    name: config.name,
    url: config.url,
    logo: {
      '@type': 'ImageObject',
      url: config.logo,
      width: 512,
      height: 512,
    },
    description: config.description,
    foundingDate: config.foundingDate,
    sameAs: config.sameAs,
    contactPoint: {
      '@type': 'ContactPoint',
      contactType: 'customer service',
      url: `${config.url}/contact`,
    },
  };
}

// Usage:
const orgSchema = organizationSchema({
  name: 'Acme Analytics',
  url: 'https://acme.dev',
  logo: 'https://acme.dev/logo.png',
  description: 'Real-time analytics platform for SaaS companies',
  foundingDate: '2022-01-15',
  sameAs: [
    'https://en.wikipedia.org/wiki/Acme_Analytics',
    'https://www.linkedin.com/company/acme-analytics',
    'https://www.crunchbase.com/organization/acme-analytics',
    'https://github.com/acme-analytics',
    'https://twitter.com/acmeanalytics',
    'https://www.wikidata.org/wiki/Q123456789',
  ],
});

Article Schema

Apply to blog posts and editorial content:

// lib/schema/article.ts
export function articleSchema(config: {
  title: string;
  description: string;
  url: string;
  imageUrl: string;
  datePublished: string;
  dateModified: string;
  authorName: string;
  authorUrl: string;
  publisherName: string;
  publisherLogo: string;
}) {
  return {
    '@context': 'https://schema.org',
    '@type': 'Article',
    headline: config.title,
    description: config.description,
    url: config.url,
    image: { '@type': 'ImageObject', url: config.imageUrl },
    datePublished: config.datePublished,
    dateModified: config.dateModified,
    author: {
      '@type': 'Person',
      name: config.authorName,
      url: config.authorUrl,
    },
    publisher: {
      '@type': 'Organization',
      name: config.publisherName,
      logo: { '@type': 'ImageObject', url: config.publisherLogo },
    },
    mainEntityOfPage: { '@type': 'WebPage', '@id': config.url },
  };
}

FAQPage Schema

Apply to pages with question-answer content. This is 60% more likely to be featured in AI Overviews.

// lib/schema/faq.ts
export function faqSchema(faqs: Array<{ question: string; answer: string }>) {
  return {
    '@context': 'https://schema.org',
    '@type': 'FAQPage',
    mainEntity: faqs.map(faq => ({
      '@type': 'Question',
      name: faq.question,
      acceptedAnswer: {
        '@type': 'Answer',
        text: faq.answer,
      },
    })),
  };
}

// Usage:
const faq = faqSchema([
  {
    question: 'What is the pricing for Acme Analytics?',
    answer: 'Acme Analytics offers a free tier for up to 10M events/month. Growth is $99/month. Enterprise pricing is custom.',
  },
  {
    question: 'Does Acme Analytics support self-hosting?',
    answer: 'Yes. Cloud deployment (US, EU, APAC) and self-hosted via Docker or Kubernetes on Enterprise plan.',
  },
]);

SoftwareApplication Schema

Critical for SaaS and tech products:

// lib/schema/software.ts
export function softwareSchema(config: {
  name: string;
  description: string;
  url: string;
  imageUrl: string;
  category: string;
  operatingSystem: string;
  pricing: { price: string; currency: string; billingPeriod: string };
  rating?: { value: number; count: number };
}) {
  return {
    '@context': 'https://schema.org',
    '@type': 'SoftwareApplication',
    name: config.name,
    description: config.description,
    url: config.url,
    image: config.imageUrl,
    applicationCategory: config.category,
    operatingSystem: config.operatingSystem,
    offers: {
      '@type': 'Offer',
      price: config.pricing.price,
      priceCurrency: config.pricing.currency,
      billingIncrement: config.pricing.billingPeriod,
    },
    ...(config.rating && {
      aggregateRating: {
        '@type': 'AggregateRating',
        ratingValue: config.rating.value,
        ratingCount: config.rating.count,
      },
    }),
  };
}

ItemList Schema

For listicles, comparison pages, and ranked content:

// lib/schema/itemlist.ts
export function itemListSchema(config: {
  name: string;
  description: string;
  items: Array<{ name: string; url: string; position: number }>;
}) {
  return {
    '@context': 'https://schema.org',
    '@type': 'ItemList',
    name: config.name,
    description: config.description,
    numberOfItems: config.items.length,
    itemListElement: config.items.map(item => ({
      '@type': 'ListItem',
      position: item.position,
      name: item.name,
      url: item.url,
    })),
  };
}

Next.js Integration — Centralized Schema Factory

// lib/schema/index.ts
export function buildPageSchema(
  type: 'article' | 'product' | 'faq' | 'home',
  pageData: Record<string, any>
) {
  const schemas: object[] = [];

  // Always include Organization
  schemas.push(organizationSchema({ ...SITE_CONFIG, sameAs: [...] }));

  if (type === 'article' && pageData.article) {
    schemas.push(articleSchema(pageData.article));
  }
  if (pageData.faqs?.length > 0) {
    schemas.push(faqSchema(pageData.faqs));
  }
  if (pageData.listItems?.length > 0) {
    schemas.push(itemListSchema(pageData.listItems));
  }

  return schemas;
}

// React component for injecting schema
export function SchemaScript({ schemas }: { schemas: object[] }) {
  return (
    <>
      {schemas.map((schema, i) => (
        <script
          key={i}
          type="application/ld+json"
          dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
        />
      ))}
    </>
  );
}

Usage in a page (Triple Stack example):

// app/blog/[slug]/page.tsx
import { buildPageSchema, SchemaScript } from '@/lib/schema';

export default function BlogPost({ post }: { post: Post }) {
  const schemas = buildPageSchema('article', {
    article: { title: post.title, /* ... */ },
    faqs: post.faqs,         // Triple Stack: Article + FAQ
    listItems: post.listItems, // Triple Stack: + ItemList
  });

  return (
    <>
      <SchemaScript schemas={schemas} />
      <article>{/* page content */}</article>
    </>
  );
}

Validation Tools

  1. Google Rich Results Test: https://search.google.com/test/rich-results
  2. Schema.org Markup Validator: https://validator.schema.org/
  3. View Page Source: Verify JSON-LD appears in rendered HTML (SSR verification)

Rollout Timeline

WeekAction
Week 1-2Organization schema on all pages + Product/SoftwareApplication on product pages
Week 3Article + FAQPage + ItemList (Triple Stack) on content pages
Week 4Validation with Google Rich Results Test, fix any errors
OngoingAdd schema to new content, validate monthly, update as schema.org evolves

Key Rules

  1. Quality over quantity: Multiple schema types on one page have diminishing returns. Focus on the Triple Stack for content pages.
  2. Schema must match content: Schema that does not accurately reflect page content will be penalized, not rewarded.
  3. Test after every change: Use validation tools after every schema update. Invalid schema is worse than no schema.
  4. Focus on high-traffic pages first: Prioritize pages that already receive organic traffic.
  5. Always use JSON-LD: Not microdata, not RDFa. JSON-LD is the standard for AI systems.

Install this skill directly: skilldb add llm-optimization-skills

Get CLI access →