STRUCTURED DATA

Schema Markup: The Complete Guide to Structured Data for SEO

A complete guide to schema markup and structured data for SEO — covering JSON-LD implementation, the most impactful schema types (Product, Article, FAQPage, BreadcrumbList, LocalBusiness, HowTo), Rich Results eligibility, and how to audit and validate structured data.

Schema markup is code you add to a page to help search engines understand the content's meaning — not just its words. A page about a product can mark up the price, availability, and customer rating in a way that Google can reliably extract and display in search results. A recipe page can mark up cooking time and ingredients. A local business can mark up its address and opening hours. This structured data doesn't change what users see, but it gives search engines the semantic layer they need to produce Rich Results, AI Overview citations, and other enhanced search features.

What is schema markup?

Schema markup refers to code using vocabulary from Schema.org — a collaborative project between Google, Microsoft, Yahoo, and Yandex that defines a shared vocabulary for describing entities (things, events, places, people, products, and more) in a machine-readable way. When you add schema markup to a page, you're telling search engines what the content is, not just what the content says.

The three formats for adding schema markup:

  • JSON-LD (JavaScript Object Notation for Linked Data) — a <script type="application/ld+json"> block in the <head> or <body> containing a JSON object that describes the page content. This is Google's preferred format and the easiest to implement and maintain.
  • Microdata — HTML attributes added directly to content elements in the page body (itemscope, itemtype, itemprop). Historically used in templates but harder to maintain than JSON-LD.
  • RDFa — similar to Microdata, attributes embedded in HTML elements. Less common.

JSON-LD is the format to use for all new implementations. It keeps the structured data separate from the HTML content, making it easy to update without touching content code.

The most impactful schema types for SEO

Product schema

Who needs it: e-commerce sites, product pages, marketplace listings.

What it unlocks: Google Shopping rich results (product panels with price and availability in organic search), star ratings in organic results (requires aggregateRating), and product eligibility for AI Overview product citations.

Minimum required properties for Google Rich Results eligibility: name, description, image, and offers (containing price, priceCurrency, availability, and url). For Review stars: add aggregateRating with ratingValue and reviewCount.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Product Name",
  "description": "Product description here.",
  "image": "https://example.com/product-image.jpg",
  "sku": "SKU-123",
  "offers": {
    "@type": "Offer",
    "price": "49.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "url": "https://example.com/products/product-name"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "234"
  }
}

Common mistakes: using InStock instead of https://schema.org/InStock for the availability enum (the full URI is required); price as a number instead of a string; aggregateRating.reviewCount of zero or less than one (invalid).

Article schema

Who needs it: blog posts, news articles, editorial content.

What it unlocks: Eligibility for Google's Top Stories carousel (news publishers), enhanced article display in Google Discover, better authorship signals for E-E-A-T. Required for Google News publishers.

Key properties: headline, datePublished, dateModified, author (Person type with name and url/sameAs), publisher (Organization type with name and logo).

The author field is particularly important for E-E-A-T: use a Person entity with sameAs linking to authoritative author profiles (LinkedIn, Wikipedia, institutional pages). This connects your article author to Google's Knowledge Graph representation of that person.

FAQPage schema

Who needs it: any page with a question-and-answer section — help pages, product pages, service pages, blog posts with FAQ sections.

What it unlocks: FAQ dropdowns in search results (historically shown in SERPs), eligibility for featured snippet selection from individual FAQ items, and strong AI Overview citation probability (FAQPage schema signals that content is structured in a format AI systems can extract and cite).

Structure: array of Question entities, each with name (the question text) and acceptedAnswer containing text (the answer text).

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How does schema markup help SEO?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Schema markup helps search engines understand page content semantically, enabling Rich Results (star ratings, FAQ dropdowns, product panels) and improving AI visibility for featured snippets and AI Overview citations."
      }
    }
  ]
}

The FAQ answer text should be concise (40–300 words), directly answer the question without excessive preamble, and stand alone as a readable answer without requiring context from surrounding content.

BreadcrumbList schema

Who needs it: any multi-level site with category hierarchies — e-commerce, blogs with categories, documentation sites.

What it unlocks: Breadcrumb display in search results (replacing the URL with a hierarchical path: Home › Category › Sub-category › Page), which provides users with navigation context in the SERP and can improve CTR.

The item URLs in BreadcrumbList must match the canonical URL of each level — not the display URL or a redirect destination. A common error: using the navigational URL of a breadcrumb link (which may redirect) instead of the canonical URL of the target page.

LocalBusiness schema

Who needs it: businesses with physical locations — restaurants, retailers, service businesses, medical practices, law firms.

What it unlocks: Eligibility for enhanced local search results, Google Maps integration, Knowledge Panel information, and Local Pack display. For multi-location businesses, each location's page should have its own LocalBusiness entity with the specific location's address, phone, and hours.

Key properties: name, address (PostalAddress type with streetAddress, addressLocality, addressRegion, postalCode, addressCountry), telephone, openingHoursSpecification, geo (GeoCoordinates), and url.

HowTo schema

Who needs it: tutorial content, step-by-step guides, instructional articles.

What it unlocks: HowTo rich results (step list display in SERPs), strong AI Overview citation probability for procedural queries ("how to…"), and featured snippet eligibility.

Structure: HowTo type with name, description, totalTime (ISO 8601 duration, e.g., PT30M for 30 minutes), and step array of HowToStep items each with name and text.

Implementing schema markup in JSON-LD

Add JSON-LD schema to the <head> of the page or immediately before </body>. For server-rendered sites (Next.js, Nuxt, WordPress), embed the JSON-LD in the server-side rendered HTML — not in a JavaScript file that executes client-side. Googlebot's first-wave crawl only reads the raw server HTTP response; client-side-injected schema may not be visible in the first crawl.

Next.js: Add JSON-LD in the page component using a <script> tag in the JSX, or via a generateMetadata() return — but note that generateMetadata() doesn't support arbitrary JSON-LD injection. The most reliable pattern:

export default function ProductPage({ product }) {
  const jsonLd = {
    '@context': 'https://schema.org',
    '@type': 'Product',
    name: product.name,
    // ...other properties
  };
  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
      />
      {/* page content */}
    </>
  );
}

WordPress: Use a plugin (Rank Math, Yoast, AIOSEO) that generates schema from post/page metadata, or add custom JSON-LD via the wp_head hook.

Shopify: Add JSON-LD directly to Liquid theme templates (product.liquid, article.liquid) using Shopify's template variables.

Validating and auditing schema markup

After implementing schema, verify it works using:

  1. Google's Rich Results Test — paste a URL and see which Rich Result types the page is eligible for, along with any schema errors and warnings.
  2. Google Search Console → Rich Results — after Googlebot crawls the page, GSC reports which pages have valid structured data and which have errors or warnings. This is the authoritative source for whether schema is eligible for Rich Results display.
  3. Schema Markup Validator (validator.schema.org) — validates schema syntax against the Schema.org specification (broader than Google's Rich Results requirements — catches errors that the Rich Results Test doesn't report).
  4. DeepSEOAnalysis audit — validates structured data across all crawled pages in a single report: checks schema types present, required property completeness per Google's specifications, renders the server HTTP response (not the post-JS DOM) to detect client-side-only schema injection gaps, and flags schema-to-visible-content mismatches (e.g., Product price in schema different from price displayed on the page).

Common schema errors that fail Rich Results eligibility: missing required properties, availability values without the https://schema.org/ prefix, aggregateRating.reviewCount of 0, datePublished in a non-ISO 8601 format, and image URLs that return 404.

Run the DeepSEOAnalysis free audit on your site to check structured data completeness across all pages — which page types have schema, which required properties are missing, and whether schema is in the server-rendered HTML or injected client-side — with framework-specific fix guidance.


Frequently asked questions

Does schema markup directly improve rankings?

Schema markup is not a direct ranking factor — adding JSON-LD to a page doesn't immediately improve its ranking position. The SEO value of schema is indirect: it enables Rich Results (star ratings, FAQ dropdowns, product panels) that improve click-through rate from existing positions; it provides semantic signals that help Google understand content meaning, which can influence relevance for related queries; and it strongly correlates with AI Overview citation probability — FAQPage and HowTo schema in server-rendered HTML are among the strongest signals for AI search visibility. The primary ROI of schema is in CTR improvement from Rich Results, not direct ranking uplift.

Which schema type is most important to implement first?

It depends on your site type. E-commerce: Product schema with aggregateRating — this is the highest-impact implementation because it enables star rating display in both organic search and Google Shopping. Local business: LocalBusiness schema — essential for map pack and Knowledge Panel accuracy. Content/SaaS: FAQPage schema on all key product and feature pages — this is the most efficient implementation for AI visibility and featured snippet eligibility. Blog/editorial: Article schema with author Person entity — important for E-E-A-T signalling and Google Discover eligibility. If you have one hour to implement schema on a new site: Product (e-commerce) or FAQPage (all other types) are the highest priority.

What's the difference between schema markup and Open Graph tags?

Schema markup (JSON-LD / Schema.org vocabulary) is primarily for search engines — it tells Google and other search engines what your content is and enables Rich Results. Open Graph (OG) tags are primarily for social platforms — when a URL is shared on Facebook, LinkedIn, Twitter/X, or iMessage, these platforms read OG tags to construct the link preview (title, description, image). Both are structured metadata in the HTML <head>, but they serve different consumers and different purposes. You need both: schema markup for search engine and AI search visibility, Open Graph tags for correct social link preview display. There is no overlap in terms of data — implementing one doesn't cover the other.

Can I have multiple schema types on one page?

Yes. A page can contain multiple JSON-LD blocks or a single block with an @graph array containing multiple entities. A product page can simultaneously carry Product schema (for Rich Results) + BreadcrumbList schema (for breadcrumb display in SERPs) + FAQPage schema (for FAQ dropdowns). A blog post can carry Article + BreadcrumbList + FAQPage. The only constraint: don't use conflicting schema types for the same content (e.g., marking up the same entity as both Product and Event), and ensure each schema block accurately represents the actual visible content of the page — mismatches between schema and visible content are a Rich Results eligibility disqualifier.

Run DeepSEOAnalysis on your own site.

Free, no signup. Technical SEO, Core Web Vitals, structured data, and AI visibility in one report.

Run a free audit →