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" }
}
  • dateModified must 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, url and image path must be absolute.
  • One page can carry several blocks. Use @graph to 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

TypeRich resultRequired to be eligible
Article / BlogPostingHeadline, date, thumbnail in news and discoverHeadline, image, datePublished, author
BreadcrumbListBreadcrumb trail in the resultAt least two items with position and name
ProductPrice, availability, ratingOffers with price and priceCurrency, or review/aggregateRating
FAQPageExpandable questionsQuestion and acceptedAnswer; content must be visible on the page
HowToStep listEvery step with a name and text
OrganizationKnowledge panel and logoName, url, logo
EventDate and location in listingsStart 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

  1. Validate the markup with the official rich results test and the schema validator; they catch different problems, so run both.
  2. Check that every value in the markup is visible on the page. Invisible structured data is the most common cause of a manual action.
  3. Watch the enhancement reports in Search Console. A sudden drop in valid items is usually a template regression, not a content change.
  4. Test after a deploy, not during development - the rendered HTML is what matters, and client-side injection can be missed.
  5. 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.

On-page essentials Local SEO and Google Business Profile

Last refreshed 2026-09-18.