Technical SEO MasteryInternational SEO and structured data · Lesson 12 of 18
Structured data, JSON-LD and rich results
Video lecture
Structured data, JSON-LD and rich results
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
Transcript of the narration, chapter by chapter.
0:00 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.
0:32 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.
1:10 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.
1:52 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.
2:25 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.
2:59 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.
3:32 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.
4:07 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.
4:42 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.
5:12 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.
5:49 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.
7:18 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.
7:50 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.
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:
- Structured data makes you eligible, not guaranteed. Google decides whether to show rich results.
- 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
{
"@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
{
"@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
LocalBusinessorOrganizationpublishes 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
- Rich Results Test — shows which Google rich results the page is eligible for, and errors/warnings, using the rendered page.
- Schema Markup Validator (validator.schema.org) — checks general schema.org validity, including types Google does not use for rich results.
- Search Console enhancement reports — sitewide monitoring of valid items, errors and warnings per type (for example Products, Breadcrumbs, Videos).
- Crawl-based extraction — use your crawler's structured data extraction to check every template at scale.
- 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)
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.
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.