Skip to content
Free Tool Arena

How-To & Life · Guide · Developer Utilities

How to add schema markup

Schema.org types (Article, FAQ, HowTo, Product, Breadcrumb), JSON-LD vs microdata, validating with Rich Results test, and what actually wins rich snippets.

Updated April 2026 · 6 min read

Schema markup is structured data that describes the entities on your page — articles, products, events, reviews, people — in a vocabulary search engines understand. Done right, it unlocks rich results: star ratings in the SERP, FAQ accordions, recipe cards, breadcrumb trails, and Knowledge Graph entries. Done wrong, it earns manual actions and silent filtering. The vocabulary comes from schema.org, but there are three ways to embed it, and Google has had a strong preference for one format since 2015. This guide covers JSON-LD vs microdata vs RDFa, the types that unlock rich results in 2026 (Article, Product, FAQPage, BreadcrumbList, Organization, Review), how to test with the Rich Results Test and Schema Validator, and the validation errors that quietly disable your rich snippets.

Advertisement

JSON-LD vs microdata vs RDFa

Schema.org data can be embedded in three syntaxes. All three produce the same semantic graph; they differ in how they wrap the markup.

JSON-LD: a JSON object inside a <script type="application/ld+json">tag, typically placed in <head>. Not entangled with visible HTML. Google explicitly recommends this format and most documentation examples use it.

Microdata: attributes (itemscope, itemtype, itemprop) sprinkled on visible HTML. The markup and the content stay together, which is tempting, but template changes can silently break the graph.

RDFa: similar to microdata using different attributes (vocab, typeof, property). Rarely used on the modern web outside government and academic sites.

Pick JSON-LD unless you have a specific constraint otherwise. It is the only format that lets you keep structured data decoupled from the DOM your CMS produces.

The JSON-LD skeleton

Every JSON-LD block needs a context and a type. The rest are properties of that type as defined on schema.org.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "How to add schema markup",
  "datePublished": "2026-04-23",
  "author": {
    "@type": "Person",
    "name": "Jay Rivera"
  }
}
</script>

Use https://schema.org (not http) for the context. Validators accept either but the canonical value is https.

Article — news, blog, long-form

Use Article, NewsArticle, or BlogPosting. Required for Google’s Top Stories: headline, image, datePublished, and a Publisher with a logo no taller than 60 px. The headline must be 110 characters or fewer to appear in Top Stories; longer headlines are truncated in some surfaces.

Product — the big rich-result earner

Product with offers and aggregateRating earns price, availability, and star-rating snippets. Minimal example:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Mechanical Keyboard K7",
  "image": "https://example.com/k7.jpg",
  "brand": {"@type": "Brand", "name": "Clackco"},
  "offers": {
    "@type": "Offer",
    "price": "129.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "382"
  }
}

Google requires reviews to be written by humans and visible on the page. Auto-generated ratings or ratings invisible to users trigger a manual action for spammy structured data.

FAQPage — powerful but restricted

As of August 2023, Google shows FAQ rich results only for authoritative government and health sites. Everyone else still benefits from the clearer semantic signal, and the snippets may return for other verticals later.

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [{
    "@type": "Question",
    "name": "Is JSON-LD case sensitive?",
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "Yes. Property names must match schema.org casing exactly."
    }
  }]
}

Every question in the markup must appear verbatim on the visible page. Asking in the markup what the page never actually answers is a policy violation.

BreadcrumbList

Replaces the URL shown in the SERP with a breadcrumb trail. The position property must be an integer starting at 1 and incrementing. The final item’s item can be omitted — Google treats the current page as implicit.

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type": "ListItem", "position": 1, "name": "Home",
     "item": "https://example.com/"},
    {"@type": "ListItem", "position": 2, "name": "Guides",
     "item": "https://example.com/guides/"},
    {"@type": "ListItem", "position": 3, "name": "Schema"}
  ]
}

Organization and Person

One Organization block per site, usually on the homepage, populates the Knowledge Graph panel for your brand. Include name, url, logo, and sameAs (an array of your social and authority profiles). For authors, add a Person block linked from each article’s author field to build author authority.

Testing tools

Run every change through two validators before shipping.

Google Rich Results Test at search.google.com/test/rich-results tells you which rich results your page qualifies for and which properties are missing.

Schema.org Validator at validator.schema.org checks the markup against the full vocabulary, catching typos and unknown properties that the Google tool sometimes silently ignores.

After deploying, monitor Search Console’s Enhancements reports. They surface warnings and errors across your whole site, with per-page error lists.

Multiple types on one page

A product page can legitimately have Product, BreadcrumbList, and Organization markup at once. Use separate <script> tags or a single JSON-LD @graph array:

{
  "@context": "https://schema.org",
  "@graph": [
    {"@type": "Product", "name": "..."},
    {"@type": "BreadcrumbList", "itemListElement": [...]}
  ]
}

Common mistakes

Marking up content that is not on the page.Every value in structured data must correspond to something users can see. Invisible FAQs and fake review snippets trigger manual actions.

Using the wrong type. A category page is not a Product; a how-to article is an Article, not a HowTo unless it has numbered steps with tools and materials. Mis-typing earns ineligibility for any rich result.

Missing required properties. Each rich-result type has a required-property list. Miss one — priceCurrency, datePublished, image — and the whole snippet becomes ineligible. The Rich Results Test flags these.

Case-sensitive typos. It is datePublished, not DatePublished or date_published. Schema.org property names are camelCase and validators reject variants silently.

Inventing properties. Unknown properties do not fail validation but they do nothing either. Before adding a field, check it exists on the schema.org type page.

Stale dates. Templates that auto-update dateModified to “now” on every page render make Google discount the signal. Only bump it when content actually changes.

Run the numbers

Generate valid JSON-LD for the common types in seconds with the schema markup generator. Pair with the FAQ schema generator when the page has a question-and-answer block, and the JSON formatter to pretty-print and syntax-check your JSON-LD before pasting it into the head.

Advertisement

Found this useful?Email