# Schema markup: what it is, which types matter and how to add it

> Schema markup is structured data that tells search engines what a page is about. What it does for SEO, the types worth adding, JSON-LD examples and how to add and check it.

Updated 2026-09-26 · Structured data · HTML version: https://getreport.app/guides/schema-markup

Schema markup is code that labels the content of a page in a vocabulary search engines read directly: "this is a product, it costs 89 EUR and is in stock", "this is an article by this author, published on this date". Google uses it to understand the page and to decide whether it can show a rich result, such as a price, review stars or a breadcrumb trail. This guide is for anyone who owns or builds a website and keeps hearing "add schema": by the end you will know what it does and does not do for SEO, which types your pages should carry, how to add them on your platform, and how to check they work.

## Quick answer

- **Schema markup** is structured data written with the [schema.org](https://schema.org/) vocabulary. Write it as **JSON-LD**, a `<script type="application/ld+json">` block; Google recommends that format.
- **It is not a ranking factor.** It makes pages eligible for rich results, which take more space and often earn more clicks at the same position. Eligible is not guaranteed.
- **Start with the types that match your pages**: Organization and WebSite on the home page, BreadcrumbList site-wide, then Product, Article, LocalBusiness, Event or Recipe where the page really is one of those.
- **Mark up only what visitors can see** on the page. Prices, ratings and dates in the markup must match the visible ones.
- **One source per entity.** A theme and an SEO plugin that both print Organization or Product give Google two versions and often cost the rich result.
- **Check every page type** with the free [schema markup validator](https://getreport.app/tools/schema-validator), and build missing blocks with the [schema markup generator](https://getreport.app/tools/schema-generator).

## What is schema markup?

Schema markup is the combination of two things: a **vocabulary** and a **format**. The vocabulary is schema.org, a shared list of types (Product, Organization, Article, Event) and their properties (`price`, `logo`, `author`, `startDate`), started in 2011 by Google, Microsoft and Yahoo and later joined by Yandex. The format is how you write those labels into the page.

"Structured data" is the general term for information in a fixed format a machine can read without guessing. On websites the two terms mean the same thing in practice, because almost all structured data on the web uses schema.org. You will also hear "schema", "rich snippets markup" and "JSON-LD"; the first two are loose names for the same thing, and JSON-LD is one of the three formats.

| Format | What it looks like | Status |
| --- | --- | --- |
| JSON-LD | A separate `<script type="application/ld+json">` block with a JSON object | Recommended by Google; what most CMSs and SEO plugins output |
| Microdata | `itemscope`, `itemtype` and `itemprop` attributes on your HTML elements | Still supported; harder to maintain because it is woven into the template |
| RDFa | `vocab`, `typeof` and `property` attributes on HTML elements | Still supported; rare outside some CMSs |

A minimal JSON-LD block for a shop's home page looks like this. It goes in the page `<head>` (the `<body>` works too):

```html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example-shop.hr/#organization",
  "name": "Example Shop",
  "url": "https://example-shop.hr/",
  "logo": "https://example-shop.hr/img/logo-512.png",
  "sameAs": [
    "https://www.instagram.com/exampleshop",
    "https://www.linkedin.com/company/example-shop"
  ]
}
</script>
```

`@context` says which vocabulary the names come from, `@type` what the thing is, and `@id` gives it a stable identifier other blocks can point at. The syntax rules, `@graph`, nesting and the errors that silently void a block are in [JSON-LD basics](https://getreport.app/guides/json-ld-basics); the short version is on our fix page [structured data explained](https://getreport.app/learn/structured-data-explained).

## Does schema markup help SEO?

Yes, but not the way it is often sold. Google has said many times that structured data is not a ranking factor in itself: adding Product markup does not move a page from position 8 to position 3. What it does is threefold.

**It makes pages eligible for rich results.** A result with a price and stock line, review stars, a breadcrumb path, event dates or a recipe card is larger and more informative than a plain blue link. Sites that measured it report higher click-through rates on those pages; the case studies Google publishes, and what they do and do not prove, are in our guide on [whether rich snippets help SEO](https://getreport.app/guides/rich-snippets#do-rich-snippets-help-seo). More clicks at the same position is more traffic.

**It removes guesswork.** Without markup, a search engine infers from the text that "89,00 €" is a price and "Ivana Horvat" is the author. With it, those facts are stated. That matters most for things that are easy to misread: which of three prices on a page is the current one, which date is the publication date, which logo is the brand's.

**Other systems read it too.** Bing, social platforms and many AI tools parse JSON-LD. Microsoft's Fabrice Canel said at SMX Munich in March 2025 that schema markup helps Microsoft's language models understand content for Bing and Copilot. Google, by contrast, says in its [guide to generative AI features in Search](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) that structured data is not required to appear in AI Overviews or AI Mode. Treat AI benefits as a possible bonus, not the reason to add it.

What schema markup cannot do: rescue a page that is not indexed, make thin content rank, or force a rich result. Google decides per search whether to show one, and it has retired several types over time, as the next section shows.

## Rich results: what schema can earn in Google

A rich result is a search listing enhanced by structured data: a price and stock line, review stars, a breadcrumb path, event dates or a recipe card. People also call them rich snippets, the older name. Each type has its own page in Google's [Search Gallery](https://developers.google.com/search/docs/appearance/structured-data/search-gallery), with **required** properties (without them the page is not eligible) and **recommended** ones (they add detail).

The types most sites can still use are Product (price, stock and stars), Breadcrumb, Article, Event, Recipe, Video, Local business, Organization and review snippets on supported types. The list has shrunk: HowTo went in 2023, Google stopped showing FAQ rich results for every site on 7 May 2026, and since June 2025 it has phased out Course Info, Claim Review, Estimated Salary, Learning Video, Special Announcement, Vehicle Listing and Practice problem. Reviews a business marks up about itself have not earned stars since 2019. Pages that lost these displays kept their rankings.

Our guide to [rich snippets: which schema types still earn them and how to get them](https://getreport.app/guides/rich-snippets) has a table of every current type with what it shows, the full timeline of retired ones with Google's sources, whether rich snippets help SEO, and what to check when one disappears. The short version is on our fix page on [becoming eligible for rich results](https://getreport.app/learn/rich-results).

## Types of schema markup: which ones your site needs

schema.org lists hundreds of types. You need the few that describe what your pages really are. Start from your page templates, not from the vocabulary: most sites have five to eight templates, and each gets one main type.

### Site-wide: Organization and WebSite

Every business site should state who is behind it and what the site is called. Organization carries your name, logo (at least 112 × 112 px), contact details and `sameAs` links to your official profiles; WebSite carries the site name Google can show above your results. Both go on the home page, once, and other blocks refer to the Organization by its `@id` instead of repeating it. [Organization and WebSite schema](https://getreport.app/guides/organization-and-website-schema) has a complete example and the WordPress and Shopify settings that produce it.

### Navigation: BreadcrumbList

BreadcrumbList describes the path to a page (Home › Bags › Tote bags) and lets Google print that path in place of the URL. It belongs on every page below the home page, matching a visible breadcrumb trail. The exact shape, including the position rules that make it silently ineligible, is in [BreadcrumbList schema](https://getreport.app/guides/breadcrumblist-schema). If you are building the visible trail and the markup together, [breadcrumbs: navigation and structured data together](https://getreport.app/guides/breadcrumbs-navigation-and-structured-data) covers both halves.

### Shops: Product, Offer and reviews

Product markup is where schema pays most directly: price, stock and stars under the listing, and eligibility for merchant listings in Shopping surfaces. It needs an Offer with `price`, `priceCurrency` and `availability`, and a rating only when the page shows real reviews. Variants, sale prices and the common double-Product problem are covered in [Product schema: price, availability and reviews](https://getreport.app/guides/product-schema-price-availability-reviews). WooCommerce outputs Product markup itself; when a field goes missing there, [WooCommerce product schema](https://getreport.app/guides/woocommerce-product-schema-price-availability-reviews) finds which one.

### Local businesses: LocalBusiness

A shop, clinic, restaurant or office that people visit should use the most specific LocalBusiness subtype (Dentist, Restaurant, Store), with the address, phone, opening hours and map position exactly as on the page and in your Google Business Profile. [LocalBusiness schema for shops and clinics](https://getreport.app/guides/localbusiness-schema-for-shops-and-clinics) covers subtypes, `openingHoursSpecification` and sites with several locations.

### Publishers: Article and BlogPosting

Article markup does not earn stars. It helps Google pick the right headline, image and dates, and it ties the article to an author. The properties Google reads, the image size rules and why `dateModified` should change only when the content does are in [Article and BlogPosting schema](https://getreport.app/guides/article-and-blogposting-schema).

### Events and recipes

Event markup puts dates, venues and ticket links into event results, and it has strict rules on cancelled and moved events: [Event schema](https://getreport.app/guides/event-schema) has examples for physical, online and cancelled events. Recipe markup earns the recipe card with image, cooking time and rating; [Recipe schema](https://getreport.app/guides/recipe-schema) lists the fields and the durations in ISO 8601 format that most plugins get wrong.

### FAQ and HowTo

FAQPage is still valid schema.org, and some AI tools and other search engines read it, but Google stopped showing FAQ rich results for every site on 7 May 2026, after limiting them to government and health sites in 2023. [FAQ and HowTo schema after Google's changes](https://getreport.app/guides/faq-and-howto-schema-after-googles-changes) explains what changed, when FAQPage still makes sense and how to keep it honest.

### Sites in several languages

On a multilingual site, each language version describes its own page in its own language while the brand stays one entity with one `@id`. Prices follow the market. [Schema for multilingual sites](https://getreport.app/guides/schema-for-multilingual-sites) shows what to translate and what to keep.

## How to add schema markup to a website

The steps are the same on every platform; only the place you paste or configure differs.

1. **List your templates** (home, category, product, article, contact, event) and write down the one main type for each, from the section above.
2. **See what is already there.** Most CMSs, themes and SEO plugins already output some markup. Run one page per template through the [schema markup validator](https://getreport.app/tools/schema-validator) before adding anything, so you do not create a second copy.
3. **Fill in the source data, not the code.** For a WooCommerce product, the price and stock field; for a Yoast or Rank Math site, the organisation name and logo in the plugin settings. Markup generated from real fields stays correct when the content changes.
4. **Write custom blocks only for what the platform does not cover**, such as a LocalBusiness with opening hours or an Event. Build them with the [schema markup generator](https://getreport.app/tools/schema-generator) or by hand, with `@id` values that match any existing Organization.
5. **Paste them where the platform allows**, usually the page `<head>`; see the platform notes below.
6. **Validate, then publish**, then check the live page again and watch Search Console.

Serve the JSON-LD in the HTML your server sends where you can. Google can read JSON-LD that JavaScript injects, a pattern tag managers use, but it reads it later, after rendering, and many other crawlers, including most AI crawlers, do not run JavaScript at all.

### Platform notes

| Platform | Where schema comes from | Where to add your own |
| --- | --- | --- |
| WordPress | SEO plugin (Yoast SEO, Rank Math, SEOPress) and WooCommerce | The plugin's schema settings per post type; a code-snippet plugin limited to one page for custom blocks |
| Shopify | Most themes output Product and Organization; apps may add more | `theme.liquid` or the product template, in Online Store → Themes → Edit code |
| Webflow | Nothing by default | Page settings → Custom code → Inside `<head>` tag; CMS templates can insert field values |
| Squarespace | Basic markup for some page types | Page settings → Advanced → Page header code injection |
| Wix | Basic markup for some page types | The SEO settings' structured data markup field per page |
| Static sites / frameworks | Nothing unless you add it | Generate the block in the page template from the same data the page renders |

### WordPress: plugins, custom JSON-LD and duplicates

On WordPress, schema markup comes from plugins rather than from the theme files you edit. The SEO plugin (Yoast SEO, Rank Math, All in One SEO or SEOPress) prints a linked graph with Organization or Person, WebSite, WebPage, Article and breadcrumbs as soon as it is active, and WooCommerce adds Product on product pages. The setup work is filling in the plugin's site representation (name, logo, profiles) and choosing the schema type per post type; the guide to [schema markup in WordPress](https://getreport.app/guides/schema-markup-wordpress) walks through Yoast and Rank Math screen by screen, shows how to add a custom JSON-LD node safely, and explains when a dedicated schema plugin is worth it.

WordPress is also where most schema problems come from, because several plugins each want to describe the site. An SEO plugin prints Organization and WebSite, the theme prints its own, a review plugin adds a second Product, and Google often shows no rich result at all. The same guide has a section on duplicate schema: how to find which plugin prints what and switch the extra ones off.

## How to check schema markup

Validation happens in three layers, and a block can pass one and fail the next:

1. **Does it parse?** One stray comma or unescaped quote and the whole block is ignored.
2. **Is it valid schema.org?** Known types, properties on the right types, values of the right kind.
3. **Is it eligible for a rich result?** Every property Google requires for that type is present.

> **Free tool:** [Schema markup validator & structured data test](https://getreport.app/tools/schema-validator): Free schema markup validator: find every JSON-LD block on a page, see which rich results it qualifies for and which required property is missing. No sign-up.

The validator reads every JSON-LD block in the page's HTML, parses it as strict JSON, flattens `@graph` arrays and checks each entity against the properties Google requires for the common rich-result types, naming anything missing. Microdata is detected and counted but its properties are not checked, and RDFa is not read. The same checks run in the structured data module of every getReport report:

> **Check: Structured data found.** Structured data lets Google show rich results such as prices, review stars, breadcrumbs and event dates. Without it, or when every block has a syntax error, Google reads none and your listing is plain text.
>
> 1. Add a JSON-LD script describing the page's main entity (Organization, Product, Article…). If the page already has one that cannot be parsed, fix its syntax first.
> 2. Most CMS SEO plugins generate this for you; check their schema settings.

> **Check: JSON-LD syntax.** A JSON-LD block with a syntax error is ignored completely, so Google reads no structured data from it. One stray comma or missing quote costs the whole block.
>
> 1. Open the technical detail to see the parser message and the block number.
> 2. Paste the block into a JSON validator, fix the character it points at, and run this check again.

> **Check: Required schema properties.** Google shows a rich result (price, stars, breadcrumb, event date) only when the entity carries the properties it requires. Without them the block is valid but earns nothing in search.
>
> 1. Open the technical detail for the full list, one line per entity type and property.
> 2. Add each property to the JSON-LD block. In WooCommerce, Yoast or Rank Math this usually means filling in the price, image or author field on the item itself.

> **Check: Rich result eligibility.** Rich results (price, stars, breadcrumbs or event dates under your listing) make it bigger and earn more clicks than a plain blue link. An entity with missing required properties does not qualify.
>
> 1. Make every JSON-LD block parse first; Google ignores a block with a syntax error completely.
> 2. Then add the required properties Google lists for each type (the report names any that are missing); eligibility follows automatically.
> 3. Test the page with Google's Rich Results Test after the change.
> 4. FAQPage is not counted: Google stopped showing FAQ rich results for every site on 7 May 2026. The markup is still valid, but it earns no rich result.

> **Check: Structured data entities are unique.** Two blocks describing the same Organization, WebSite or Product make Google pick one at random, and their properties may disagree. Usually a theme and an SEO plugin both emit the block.
>
> 1. Keep one block per entity; turn off the schema output of either the theme or the SEO plugin.
> 2. If both are needed, merge them into one @graph with a single entity per @id.

Two free tools from Google and schema.org complete the picture: the **Rich Results Test** shows what Google itself can read on a live URL or a pasted snippet, and the **Schema Markup Validator** at validator.schema.org checks against the whole vocabulary, not just Google's types. After launch, Search Console's rich result reports (under Enhancements or Shopping) show errors across every page of a type. [Schema markup validation](https://getreport.app/guides/schema-markup-validation) walks through each error and warning and how to fix it, including how to run the checks locally and in CI.

To write a block from scratch, pick the type in the generator, fill in the form and copy the JSON-LD; it runs in your browser and nothing is uploaded.

> **Free tool:** [Schema markup generator: JSON-LD for 8 types](https://getreport.app/tools/schema-generator): Free schema markup generator for FAQ, Product, Local business and 5 more types. Fill in a short form and copy valid JSON-LD. Runs in your browser, no sign-up.

## Schema markup examples

Two blocks cover most small business sites. Replace the values with your own and delete properties you cannot fill honestly.

A product page, with the Organization referenced by `@id` rather than repeated:

```html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Tote bag, natural leather",
  "image": "https://example-shop.hr/img/tote-natural-1200.jpg",
  "description": "Hand-stitched tote in vegetable-tanned leather, 38 × 32 × 12 cm.",
  "sku": "TOTE-NAT",
  "brand": { "@id": "https://example-shop.hr/#organization" },
  "offers": {
    "@type": "Offer",
    "url": "https://example-shop.hr/bags/tote-natural/",
    "price": "89.00",
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock"
  }
}
</script>
```

A breadcrumb trail for the same page, matching the trail visitors see:

```html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example-shop.hr/" },
    { "@type": "ListItem", "position": 2, "name": "Bags", "item": "https://example-shop.hr/bags/" },
    { "@type": "ListItem", "position": 3, "name": "Tote bag, natural leather" }
  ]
}
</script>
```

The last breadcrumb has no `item`, because it is the current page; Google allows that. Each cluster guide linked above has a complete, commented example for its type.

## Common mistakes

- **Marking up what is not on the page.** Ratings with no visible reviews, an FAQ that exists only in the code, a price that differs from the one shown. Google's structured data guidelines forbid it, and repeated misuse can lead to a manual action that removes rich results for the whole site.
- **Two sources for one entity.** Theme plus plugin, or JSON-LD plus old microdata for the same product. Keep one, usually the plugin or shop system that owns the data.
- **A syntax error nobody sees.** A trailing comma or a smart quote pasted from a word processor voids the block silently. Validate after every hand edit.
- **Chasing retired features.** FAQ, HowTo and the sitelinks search box are gone from Google's results. Spend the time on Product, BreadcrumbList and Organization.
- **Adding it once and forgetting it.** Prices change, events end, logos are redesigned. Markup generated from your CMS fields stays correct; hand-pasted blocks go stale. Re-check one page per template after every redesign or plugin change.
- **Expecting rankings to move.** Measure clicks and click-through rate on the pages that gained rich results, in Search Console's performance report filtered by search appearance, not positions.

## Questions people ask

### What does schema markup do for a website?

It tells search engines exactly what a page contains, such as a product with a price, an article with an author or a business with opening hours. Google uses it to understand the page and to decide whether it qualifies for rich results like prices, stars and breadcrumbs. It does not change rankings directly, but a richer listing usually earns more clicks. Check what your pages carry with a schema validator.

### Is structured data the same as schema markup?

In practice, yes. Structured data is the general term for information in a fixed, machine-readable format; schema markup is structured data that uses the schema.org vocabulary, which almost every website does. Formats differ: JSON-LD, microdata and RDFa can all carry schema.org types. Google recommends JSON-LD because it sits in its own script block and is easiest to maintain.

### Where does schema markup go in the HTML?

Usually in the page's `<head>`, as a `<script type="application/ld+json">` block; Google also reads it in the `<body>`. It belongs on the page it describes: Product on the product page, Article on the article, Organization once on the home or about page. Output it in the HTML your server sends rather than injecting it later with a tag manager, so every crawler sees it.

### Is schema markup a Google ranking factor?

No. Google has said repeatedly that structured data does not boost rankings on its own. It makes a page eligible for rich results, which take more space and often earn more clicks at the same position, and it helps Google understand the page. Treat it as a way to win more clicks from the rankings you already have, not as a way to climb.

### Do I need a plugin to add schema markup?

Not necessarily. On WordPress an SEO plugin such as Yoast SEO or Rank Math already outputs Organization, WebSite, Article and breadcrumbs, and WooCommerce adds Product, so check what is there before adding another plugin. For anything missing, a JSON-LD block pasted into the page head works on every platform, and a schema generator can write it for you.

### Which schema markup should a small business add first?

Organization or the right LocalBusiness subtype on the home page, with name, logo, address, phone and opening hours, plus WebSite for the site name. Then BreadcrumbList site-wide and the type that matches your main pages: Product for a shop, Article for a blog, Event for a venue. Those cover most of what Google shows for small sites.

### How do I add schema markup to a website without coding?

Use the fields your platform already has. On WordPress, fill in the organisation, logo and post type settings of your SEO plugin, and the product fields in WooCommerce; Shopify themes print Product markup from the product data. For anything missing, a schema generator turns a short form into a JSON-LD block you paste into the page's custom code or header field. Then validate the live page.

### Can wrong schema markup hurt my site?

Broken markup mostly just gets ignored: a block with a syntax error or missing required properties earns nothing, but costs no rankings. Misleading markup is different. Ratings, prices or content that visitors cannot see break Google's structured data guidelines and can lead to a manual action, which removes rich results for the affected pages or the whole site until you fix it.
