Technical SEO MasteryInternational SEO and structured data · Lesson 12 of 18

Structured data, JSON-LD and rich results

Article · 14 min · 8 min lecture

Video lecture

Structured data, JSON-LD and rich results

13 chapters · about 8 min · full transcript

Coming soon

Chapter 1 of 13

Structured data and rich results

  • What it really does
  • What still exists in 2026
  • Generate, validate, maintain

The narrated lecture is in production

Every chapter is scripted and ready. Browse the chapters and read the full transcript now — the video will appear here when it’s published.

Chapters

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 typeCommon types
Every siteOrganization (logo, sameAs, contact), WebSite, BreadcrumbList
E-commerceProduct with Offer, AggregateRating/Review (where genuine), merchant return and shipping details
PublishersArticle/NewsArticle with author, dates, images
Local businessesLocalBusiness subtypes with address, geo, opening hours
EventsEvent with dates, location, offers
VideoVideoObject
JobsJobPosting

Example: Product with offer

{
  "@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"
  }
}
{
  "@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).

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)

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.

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.

Check your understanding

Quick questions to lock in the lesson. They don’t count towards your certificate.

  1. A plumbing company adds AggregateRating markup for reviews it collected and displays on its own homepage. Will Google show review stars?
  2. Which tool shows whether a page is eligible for specific Google rich results?
  3. What is the main risk of hidden or misleading structured data?

Put it into practice

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.

Enrol for free to save your progress

Reading is always free. Enrol to keep your place, take the final assessment and earn a verifiable certificate.