Files
magnus919_agent-skills/seo/references/schema-markup.md
T
Magnus HedemarkandGitHub 531ff67537 feat(seo): consolidate answer and generative search optimization
Merging with required validation green. Droid Auto Review was retried twice and failed before producing a review because DeepSeek V4 Flash rejected the action's ApplyPatch tool; the check is non-required per branch protection. The diff was independently inspected and local/repository validation passed.
2026-08-26 19:42:25 -04:00

6.3 KiB

Schema Markup / Structured Data Reference

Structured data helps search engines understand the content of a page and enables rich results in SERPs (FAQ snippets, HowTo steps, breadcrumbs, article previews).

JSON-LD Format

Google's preferred format. Structured data is typically JSON-LD injected through the CMS, application templates, or a supported code-injection mechanism.

Basic Structure

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Title of the Article",
  "description": "150-160 char meta description",
  "author": {
    "@type": "Person",
    "name": "Example Author"
  },
  "datePublished": "2026-05-01",
  "dateModified": "2026-05-15",
  "image": "https://example.com/image.jpg",
  "publisher": {
    "@type": "Organization",
    "name": "Groktopus",
    "logo": {
      "@type": "ImageObject",
      "url": "https://www.example.com/favicon.png"
    }
  }
}

Schema Types for Platform-specific implementation notes

TechArticle (example.com)

Use for technical/analytical content about AI, enterprise technology, and engineering.

{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Article Title",
  "description": "Description",
  "author": {
    "@type": "Person",
    "name": "Example Author"
  },
  "datePublished": "2026-05-01",
  "dateModified": "2026-05-15",
  "proficiencyLevel": "Advanced",
  "about": {
    "@type": "Thing",
    "name": "Topic area"
  }
}

Article / BlogPosting (example.com)

Use for personal blog and analytical long-form content.

{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Title",
  "description": "Description",
  "author": {
    "@type": "Person",
    "name": "Example Author"
  },
  "datePublished": "2026-05-01",
  "dateModified": "2026-05-15"
}

For articles authored by Jasper:

{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Title",
  "description": "Description",
  "author": {
    "@type": "Person",
    "name": "Jasper"
  },
  "datePublished": "2026-05-01",
  "dateModified": "2026-05-15"
}

FAQPage (All Sites)

Use when the article answers multiple distinct questions. Enables FAQ rich results in SERPs.

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Question 1?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Answer text here."
      }
    },
    {
      "@type": "Question",
      "name": "Question 2?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Answer text here."
      }
    }
  ]
}

Requirements for Google rich result eligibility:

  • Minimum 2 questions
  • Questions must be visible text on the page (not hidden)
  • Each Question must match visible content
  • Answers must be clearly visible to the user (not just in schema)
  • Google may show up to 4 FAQ entries in the SERP

HowTo (Tutorials, Technical Guides)

Use for step-by-step guides and tutorials on any site.

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to Title",
  "description": "Description of the tutorial",
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "Step 1",
      "text": "Description of step 1."
    },
    {
      "@type": "HowToStep",
      "position": 2,
      "name": "Step 2",
      "text": "Description of step 2."
    }
  ]
}

BreadcrumbList (Site Navigation)

Use on all sites to enable breadcrumb rich results in SERPs.

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://www.example.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Category",
      "item": "https://www.example.com/category/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Article Title",
      "item": "https://www.example.com/article-slug/"
    }
  ]
}

Organization (Site-level)

Use on all sites for site-level schema (injected globally, not per-page).

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Site Name",
  "url": "https://www.example.com/",
  "logo": "https://www.example.com/favicon.png",
  "sameAs": [
    "https://twitter.com/username",
    "https://github.com/username"
  ]
}

Platform-Specific Implementation

Ghost CMS (example.com, example.org, example.net)

Per-page schema:

  • Ghost injects basic JSON-LD automatically (Article type with headline, dates, author)
  • Custom schema (FAQPage, HowTo, TechArticle) goes in:
    • Post-level: Settings → Code Injection → Post Header (<script type="application/ld+json">...</script>)
    • Site-level: Settings → Code Injection → Site Header (BreadcrumbList, Organization)

Verification:

Ghost auto-generated schema limitations:

  • Ghost only generates Article/BlogPosting schema by default
  • FAQPage, HowTo, TechArticle, BreadcrumbList, Product all require custom injection
  • Author info in Ghost's default schema may need enrichment (add author URL, sameAs)

Hugo (example.com)

Per-page schema:

  • Add JSON-LD via Hugo template in layouts/partials/head.html or layouts/_default/single.html
  • Use Hugo's .Params to inject article-specific values
  • Conditional schema: {{ if .Params.faq }} for FAQPage, {{ if .Params.howto }} for HowTo

Site-level schema:

  • Organization and BreadcrumbList in the base template (baseof.html)

Validation Checklist

  • JSON is valid (no trailing commas, properly closed braces)
  • Required fields present for each @type
  • URLs are absolute (including https://)
  • Dates are in ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ)
  • Author names match the byline
  • @context is set to "https://schema.org"
  • No conflicting or duplicate schema on the page
  • FAQPage content matches visible page content (no hidden answers)
  • Google Rich Results Test passes without errors
  • Schema content is visible to users where required (FAQPage, HowTo)