---
title: "Structured data, JSON-LD and rich results"
description: "What structured data does Structured data is machine-readable information about a page, usually using the schema.org vocabulary. Google uses it to…"
url: https://optimizeall.com/learn/technical-seo-mastery/structured-data-and-rich-results
updated: 2026-10-05
---

Technical SEO Mastery · International SEO and structured data · lesson 12 of 18 · 14 min

# Structured data, JSON-LD and rich results

## What structured data does

Structured data is machine-readable information about a page, usually using the **schema.org** vocabulary. Google uses it to understand content and to make pages **eligible** for rich results (review stars, product price and availability, breadcrumbs, event details, video features and more). Two important truths:

1. Structured data makes you **eligible**, not guaranteed. Google decides whether to show rich results.
2. Structured data is **not a direct ranking boost**. Its value is understanding and presentation.

Google recommends **JSON-LD**, placed in a `script type="application/ld+json"` block, because it is separate from the visible HTML and easy to maintain. Microdata and RDFa are also supported.

## A solid starter set by site type

| Site type | Common types |
|---|---|
| Every site | `Organization` (logo, sameAs, contact), `WebSite`, `BreadcrumbList` |
| E-commerce | `Product` with `Offer`, `AggregateRating`/`Review` (where genuine), merchant return and shipping details |
| Publishers | `Article`/`NewsArticle` with author, dates, images |
| Local businesses | `LocalBusiness` subtypes with address, geo, opening hours |
| Events | `Event` with dates, location, offers |
| Video | `VideoObject` |
| Jobs | `JobPosting` |

## Example: Product with offer

```json
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Handmade Leather Messenger Bag",
  "image": ["https://www.example.com/img/messenger-1x1.jpg"],
  "description": "Full-grain leather messenger bag, hand-stitched in Sialkot.",
  "sku": "MB-204",
  "brand": {"@type": "Brand", "name": "Example Leather"},
  "offers": {
    "@type": "Offer",
    "url": "https://www.example.com/bags/messenger/",
    "priceCurrency": "GBP",
    "price": "149.00",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}
```

## Example: Organization with entity links

```json
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://www.example.com/#organization",
  "name": "Example Agency",
  "url": "https://www.example.com/",
  "logo": "https://www.example.com/logo.png",
  "sameAs": [
    "https://www.linkedin.com/company/example-agency",
    "https://www.youtube.com/@exampleagency"
  ]
}
```

Using stable `@id` values lets you connect entities across pages (an `Article` whose `publisher` references the organisation's `@id`), which builds a clean graph.

## Policies that trip people up

- **Mark up only what is visible** and true on the page. Hidden or misleading markup violates Google's structured data guidelines and can lead to a manual action that removes rich result eligibility.
- **Self-serving reviews**: review rich results are not shown for reviews a `LocalBusiness` or `Organization` publishes about itself on its own site.
- **Rich result types change.** Google has retired or restricted several over time: HowTo rich results were removed in 2023; seven little-used types (Book Actions, Course Info, Claim Review, Estimated Salary, Learning Video, Special Announcement and Vehicle Listing) were phased out from June 2025; and **FAQ rich results stopped appearing on 7 May 2026**, with the FAQ report and Rich Results Test support removed afterwards. Always check the current Search Gallery before investing; valid markup for a retired type does no harm but earns no rich result.

## Validation workflow

1. **Rich Results Test** — shows which Google rich results the page is eligible for, and errors/warnings, using the rendered page.
2. **Schema Markup Validator** (validator.schema.org) — checks general schema.org validity, including types Google does not use for rich results.
3. **Search Console enhancement reports** — sitewide monitoring of valid items, errors and warnings per type (for example Products, Breadcrumbs, Videos).
4. **Crawl-based extraction** — use your crawler's structured data extraction to check every template at scale.
5. **Spot-check SERPs** after deployment.

Errors block eligibility; warnings mean optional recommended properties are missing — fix those that are true and available.

## Implementation tips

- Generate JSON-LD from the same data source as the visible page (price, stock, rating) so they never drift apart.
- Keep dates in ISO 8601 with timezone (`2026-03-14T09:00:00+05:00`).
- If you inject JSON-LD with JavaScript or a tag manager, confirm it appears in the rendered HTML in URL Inspection; server-side output is more robust.
- Avoid duplicate conflicting blocks from multiple plugins (a theme and an SEO plugin both outputting `Organization`).

## Structured data and AI search

Google's 2026 guide for its generative AI features says no special schema is needed to appear in AI Overviews or AI Mode. Structured data still matters for the rich results that exist and for machines understanding entities, products and prices consistently — which also reduces wrong facts in AI answers. Product data increasingly flows through **feeds** (Merchant Center) as well as page markup; keep them identical.

## Hands-on: an Article + Breadcrumb graph generated from CMS data (Python)

```python
import json
from datetime import datetime, timezone

def article_jsonld(post, site="https://www.example.com"):
    url = f"{site}{post['path']}"
    graph = [
        {"@type": "Article", "@id": f"{url}#article", "headline": post["title"][:110],
         "datePublished": post["published"].isoformat(), "dateModified": post["updated"].isoformat(),
         "author": {"@type": "Person", "name": post["author"], "url": f"{site}/authors/{post['author_slug']}/"},
         "publisher": {"@id": f"{site}/#org"}, "image": [post["image"]], "mainEntityOfPage": url},
        {"@type": "BreadcrumbList", "itemListElement": [
            {"@type": "ListItem", "position": i + 1, "name": name, "item": f"{site}{path}"}
            for i, (name, path) in enumerate(post["breadcrumbs"])]},
    ]
    return json.dumps({"@context": "https://schema.org", "@graph": graph}, ensure_ascii=False, indent=2)

post = {"path": "/guides/core-web-vitals/", "title": "Core Web Vitals: a practical guide",
        "published": datetime(2026, 3, 2, 9, 0, tzinfo=timezone.utc),
        "updated": datetime(2026, 9, 10, 8, 30, tzinfo=timezone.utc),
        "author": "Ayesha Khan", "author_slug": "ayesha-khan",
        "image": "https://www.example.com/img/cwv-1200.jpg",
        "breadcrumbs": [("Home", "/"), ("Guides", "/guides/"), ("Core Web Vitals", "/guides/core-web-vitals/")]}
print(article_jsonld(post))
```

Render the output server-side inside a `script type="application/ld+json"` element. Because it's generated from the same fields as the visible byline, dates and breadcrumbs, markup and page can't drift apart.

## Worked example 2: a Dubai events company

A Dubai events company (illustrative) marks up every event with `Event`, but the Rich Results Test shows errors: `startDate` without a timezone, `location` missing for online events, and past events still marked `EventScheduled`. Fixes: ISO 8601 dates with `+04:00`, `VirtualLocation` with a URL for online events and `eventAttendanceMode` set correctly, `eventStatus` updated to `EventCancelled`/`EventRescheduled`/`EventPostponed` when relevant, and past events removed from event listings. The Search Console Events report then shows valid items rising.

## Common mistakes

- Marking up reviews that are not on the page, or ratings aggregated from other sites.
- Product markup on category pages listing many products as if each were the page's main item.
- Expecting rankings to improve because markup was added.
- Letting structured data prices go stale after a sale ends.

## Video lecture: Structured data, JSON-LD and rich results

Lecture coming soon · 13 chapters · about 8 minutes. Read the full transcript below.

1. Structured data and rich results
2. What structured data does
3. Rich results in 2026
4. Starter set by site type
5. Policies that trip people up
6. Structured data and AI search
7. Hands-on: generate JSON-LD from CMS data
8. Validation workflow
9. Example 1: duplicate Organization blocks
10. Example 2: Dubai events (illustrative)
11. Watch me do it: structured data audit
12. Tips and mistakes
13. Recap and try this now

## Lecture transcript

### Structured data and rich results

Structured data is one of the most over-sold and under-maintained parts of SEO. Over-sold, because people promise ranking boosts it doesn't give. Under-maintained, because markup goes stale, prices drift, and rich result types get retired while proposals still promise them. In this lecture you'll learn what structured data really does, which rich results still exist in twenty twenty-six, how to build clean JSON-LD from your CMS data, and how to validate it at scale.

### What structured data does

Structured data is machine-readable information about a page, usually using the schema dot org vocabulary. Google uses it to understand content and to make pages eligible for rich results, like review stars, product price and availability, breadcrumbs, event details and video features. Two truths to remember. It makes you eligible, not guaranteed; Google decides whether to show rich results. And it's not a direct ranking boost. Its value is understanding and presentation. Google recommends JSON-LD because it sits separately from your visible HTML and is easy to maintain.

### Rich results in 2026

Which rich results still exist? Google has been pruning. HowTo rich results were removed in twenty twenty-three. From June twenty twenty-five, seven little-used types were phased out: book actions, course info, claim review, estimated salary, learning video, special announcement and vehicle listing. And FAQ rich results stopped appearing on the seventh of May, twenty twenty-six, with the FAQ report and Rich Results Test support removed afterwards. Still alive: product and merchant listings, review snippets within policy, articles, recipes, video, events, breadcrumbs, organisation details, local business and job postings, among others. Always check the Search Gallery first.

### Starter set by site type

A solid starter set by site type. Every site: Organization with logo, same-as and contact details, WebSite, and BreadcrumbList. E-commerce: Product with Offer, genuine ratings and reviews, and merchant return and shipping details. Publishers: Article or NewsArticle with author, dates and images. Local businesses: a LocalBusiness subtype with address, geo coordinates and opening hours. Events: Event with dates, location and offers. Plus VideoObject and JobPosting where relevant. Use stable at-id values so entities connect across pages.

### Policies that trip people up

Policies that trip people up. Mark up only what's visible and true on the page; hidden or misleading markup violates Google's guidelines and can lead to a manual action removing rich result eligibility. Self-serving reviews: review rich results aren't shown for reviews a LocalBusiness or Organization publishes about itself on its own site. And don't put Product markup for many products on a category page as if each were the main item. Markup describes the page's main content, honestly.

### Structured data and AI search

What about AI search? Google's twenty twenty-six guide says no special schema is needed for AI Overviews or AI Mode. But structured data still matters for rich results and for consistent understanding of entities, products and prices, which reduces wrong facts in AI answers. And product data increasingly flows through feeds like Merchant Center as well as page markup, so keep feed and markup identical. The honest pitch is accuracy and eligibility, never guaranteed AI citations.

### Hands-on: generate JSON-LD from CMS data

Hands-on. The lesson text has a Python function that builds an Article and BreadcrumbList graph from CMS fields: headline, published and modified dates with timezones, author with a profile URL, publisher by at-id, image, and breadcrumb items with positions. You render the output server-side in a script tag of type application ld plus json. The key idea is that the markup is generated from the same fields as the visible byline, dates and breadcrumbs, so they can never drift apart.

### Validation workflow

Validation workflow. The Rich Results Test shows which Google rich results a rendered page is eligible for, with errors and warnings. The Schema Markup Validator checks general schema dot org validity, including types Google doesn't use. Search Console's enhancement reports monitor valid items, errors and warnings per type sitewide. Your crawler's structured data extraction checks every template at scale. And spot-check results after deployment. Errors block eligibility; warnings mean optional properties are missing, so fix those that are true and available.

### Example 1: duplicate Organization blocks

Worked example one, simple. A Karachi bakery's theme and SEO plugin both output Organization markup, with different phone numbers and logos. Both validate, but machines now see conflicting facts. The fix is disabling one source, keeping a single Organization entity with a stable at-id, and matching the phone number to the Business Profile. Duplicate conflicting blocks from multiple plugins are one of the most common findings on real audits.

### Example 2: Dubai events (illustrative)

Worked example two, with illustrative details. A Dubai events company marks up every event, but the Rich Results Test shows errors. Start dates have no timezone. Online events have no location. And past events are still marked as scheduled. The fixes: ISO dates with plus four hours, VirtualLocation with a URL for online events and the right attendance mode, event status updated when events are cancelled, rescheduled or postponed, and past events removed from listings. The Search Console Events report then shows valid items rising.

### Watch me do it: structured data audit

Watch me do it. I'll audit structured data for a recipe publisher in twenty minutes. Step one: I pick one URL per template: recipe, article, category and home. Step two: I run each through the Rich Results Test. The recipe page is eligible for recipe rich results with two warnings, missing video and nutrition. The article page is valid. The category page has an error: a Product block copied from an old theme. Step three: I run the same URLs through the Schema Markup Validator. It also shows FAQPage markup on every recipe. That's valid schema, but FAQ rich results ended in May twenty twenty-six, so I note it as harmless, not a priority. Step four: I use the crawler's structured data extraction across all recipes and find two hundred with cook time in the wrong format, PT30 without the M. Step five: in Search Console, the Recipes enhancement report shows the same invalid items. Step six: I write tickets. Fix the ISO 8601 durations at the source. Remove the stray Product block from the category template. Add nutrition where the data exists. And I leave the FAQ markup alone, and explain why to the editor, so nobody expects a feature that no longer exists.

### Tips and mistakes

Implementation tips and common mistakes. Keep dates in ISO eight-six-oh-one with a timezone. If you inject JSON-LD with JavaScript or a tag manager, confirm it appears in the rendered HTML in URL Inspection; server-side output is more robust. Avoid duplicate blocks from multiple plugins. Common mistakes: marking up reviews that aren't on the page, product markup on category pages, expecting rankings to rise, and letting structured data prices go stale after a sale ends.

### Recap and try this now

Recap. Structured data gives understanding and eligibility, not rankings. Check the Search Gallery before promising any rich result, especially after the twenty twenty-five and twenty twenty-six retirements. Generate markup from the same data as the page, validate with the Rich Results Test and Search Console, and keep it in sync with feeds. Try this now. Run one URL from each of your templates through the Rich Results Test, and list every error and every rich result type you're marking up that no longer exists.

## Key takeaways

- Structured data provides eligibility for rich results and aids understanding; it is not a direct ranking boost.
- Use JSON-LD generated from the same data as the visible page; mark up only visible, truthful content.
- Rich result types are added and retired over time; check Google's current Search Gallery.
- Validate with the Rich Results Test, Schema Markup Validator and Search Console enhancement reports.

## Try it

Write valid JSON-LD for your organisation (with @id and sameAs) and one key page type, then validate both in the Rich Results Test and Schema Markup Validator.

- [Previous: hreflang and international SEO](https://optimizeall.com/learn/technical-seo-mastery/hreflang-and-international-seo)
- [Next: Core Web Vitals: diagnosis and fixes](https://optimizeall.com/learn/technical-seo-mastery/core-web-vitals-diagnosis-and-fixes)
- [All lessons of Technical SEO Mastery](https://optimizeall.com/learn/technical-seo-mastery)
