Structured data and rich results
Schema.org vocabulary, JSON-LD in practice, the types that produce visible results, validation, and the eligibility rules people ignore.
JSON-LD in practice
Structured data is a machine-readable statement about the page. Add JSON-LD inside a script element with type application/ld+json in the head, describing only what a user can actually see on the page.
// inside a script element with type application/ld+json
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "DNS TTL and caching explained",
"description": "What TTL controls at each cache layer and how to plan a cutover.",
"author": { "@type": "Person", "name": "Alex Doe", "url": "https://example.com/authors/alex" },
"publisher": { "@type": "Organization", "name": "Example", "logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" } },
"datePublished": "2026-04-02",
"dateModified": "2026-09-18",
"mainEntityOfPage": { "@type": "WebPage", "@id": "https://example.com/guides/dns/ttl" }
}dateModifiedmust change when the content genuinely changes. Updating it without editing the page is a pattern that gets ignored at best and penalised at worst.- Relative URLs are not allowed. Every
@id,urland image path must be absolute. - One page can carry several blocks. Use
@graphto describe related entities once instead of repeating them. - Microdata and RDFa still work but are verbose and easy to break in a template. JSON-LD is the practical choice.
Types that produce visible results
| Type | Rich result | Required to be eligible |
|---|---|---|
Article / BlogPosting | Headline, date, thumbnail in news and discover | Headline, image, datePublished, author |
BreadcrumbList | Breadcrumb trail in the result | At least two items with position and name |
Product | Price, availability, rating | Offers with price and priceCurrency, or review/aggregateRating |
FAQPage | Expandable questions | Question and acceptedAnswer; content must be visible on the page |
HowTo | Step list | Every step with a name and text |
Organization | Knowledge panel and logo | Name, url, logo |
Event | Date and location in listings | Start date plus location or online attendance |
// Product price: keep priceValidUntil and currency explicit
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Replacement filter pack",
"sku": "FIL-204",
"brand": { "@type": "Brand", "name": "Acme" },
"offers": {
"@type": "Offer",
"url": "https://example.com/products/filter-pack",
"priceCurrency": "USD",
"price": "24.00",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31"
}
}Rich results are a presentation feature, not a ranking feature. Marking up content does not raise its position - it can only change how the result looks once it is already eligible to appear.
Validating and debugging
- Validate the markup with the official rich results test and the schema validator; they catch different problems, so run both.
- Check that every value in the markup is visible on the page. Invisible structured data is the most common cause of a manual action.
- Watch the enhancement reports in Search Console. A sudden drop in valid items is usually a template regression, not a content change.
- Test after a deploy, not during development - the rendered HTML is what matters, and client-side injection can be missed.
- Keep the markup in the template, driven by the same data that renders the page, so the two cannot drift.
⚠️
Never mark up a rating or a review you do not have, and never mark up a price that differs from the visible price. Self-serving review markup about your own organisation is explicitly disallowed and the consequence is losing all rich results on the site, not just that page.
FAQ
Does structured data improve rankings?
Not directly. It can improve click-through by changing the appearance of a result, and that indirect effect is real - but a page that does not rank will not rank because of markup.
Do I need markup on every page?
No. Add it where a rich result is possible: articles, products, breadcrumbs, FAQs, events, organisation details on the homepage. Markup on a page with no eligible result is maintenance cost with no upside.
Related
On-page essentials Local SEO and Google Business Profile
Last refreshed 2026-09-18.