Structured Data & JSON-LD: The Complete SEO Guide

How to implement JSON-LD structured data to earn rich results in Google Search, improve click-through rates, and send clear semantic signals to search engines.

Structured data is metadata you add to your HTML that helps search engines understand what your content is, not just what it says. Google uses it to generate rich results — star ratings, FAQs, breadcrumbs, sitelinks, and more — that command dramatically higher click-through rates.

Why JSON-LD Over Microdata?

Google recommends JSON-LD. It lives in a <script> tag rather than being scattered through your HTML, which means:

  • Easier to maintain without touching markup
  • Can be injected or modified by JavaScript
  • Doesn’t interfere with the visual HTML structure
  • Works with dynamic/SPA content via script injection

Essential Schema Types for Blogs

Article / BlogPosting

Every blog post should declare itself as a BlogPosting (a subtype of Article):

{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Your Post Title",
  "description": "150-character description of the post",
  "image": "https://example.com/images/post-cover.jpg",
  "datePublished": "2024-05-20T00:00:00Z",
  "dateModified": "2024-06-01T00:00:00Z",
  "author": {
    "@type": "Person",
    "name": "Author Name",
    "url": "https://example.com/about"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Your Blog Name",
    "logo": {
      "@type": "ImageObject",
      "url": "https://example.com/logo.png"
    }
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://example.com/blog/your-post-slug"
  }
}

Breadcrumbs appear in search results and reduce bounce rate by showing users where they are:

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://example.com"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Blog",
      "item": "https://example.com/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Your Post Title",
      "item": "https://example.com/blog/your-post-slug"
    }
  ]
}

Declare your site entity on the homepage to enable the sitelinks searchbox in branded queries:

{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Your Blog Name",
  "url": "https://example.com",
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "https://example.com/search?q={search_term_string}"
    },
    "query-input": "required name=search_term_string"
  }
}

Validating Your Structured Data

Always validate before deploying:

  1. Google’s Rich Results Testsearch.google.com/test/rich-results
  2. Schema.org Validatorvalidator.schema.org
  3. Search Console — Enhancements tab shows errors on live pages

Common Mistakes That Kill Rich Results

  • Missing required properties — Google will not show rich results if required fields are absent
  • Marking up content that isn’t visible — The schema must match what users see
  • Using the wrong @typeArticle vs BlogPosting vs NewsArticle each have specific eligibility criteria
  • Invalid date formats — Always use ISO 8601: 2024-05-20T00:00:00+00:00
  • Image dimensions — Google requires at least 1200px wide for article images

Structured data is one of the highest-leverage SEO investments: one afternoon of implementation can yield persistent SERP feature eligibility that compound over time.