The on-page schema page covered the strategy. This is the technical implementation: exactly where to put your JSON-LD, how to structure complex schemas with @graph, how to generate schema dynamically, how to validate, and the common mistakes that disqualify you from rich results. If you're going to implement schema on more than a couple pages, you need this.
Schema is machine-readable metadata. Humans don't see it. Search engines and other automated systems read it to understand your page without having to infer from visible text. Done right, it makes your page easier for Google to represent correctly in rich results.
Done wrong, it sits there doing nothing, or worse, disqualifies you for rich results because Google can't validate it.
JSON-LD goes in the <head> in a <script type="application/ld+json"> tag. Can also go in <body>, but head is convention.
You can have multiple JSON-LD blocks on one page OR nest multiple types inside one block via @graph:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com/",
"name": "Example Site"
},
{
"@type": "Article",
"headline": "...",
"isPartOf": { "@id": "https://example.com/#website" }
}
]
}
</script>
@graph is cleaner for complex pages. IDs let entities reference each other.
For CMS-generated content, produce JSON-LD dynamically from content metadata. Most modern CMS plugins (Yoast, RankMath, Schema Pro) handle this. For custom builds:
next/head or metadata APIAvoid client-side schema generation. Googlebot may not always render JS-injected schema.
{
"@type": "Organization",
"name": "Your Company",
"url": "https://yourcompany.com",
"logo": "https://yourcompany.com/logo.png",
"sameAs": [
"https://twitter.com/yourcompany",
"https://linkedin.com/company/yourcompany"
]
}
{
"@type": "Article",
"headline": "...",
"author": { "@type": "Person", "name": "Samuel Ochoa" },
"datePublished": "2026-04-18",
"dateModified": "2026-04-18",
"image": "https://example.com/hero.jpg",
"publisher": { "@type": "Organization", "name": "Example" }
}
{
"@type": "Product",
"name": "Product Name",
"image": "...",
"description": "...",
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "99.00",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "127"
}
}
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is...?",
"acceptedAnswer": {
"@type": "Answer",
"text": "..."
}
}
]
}
Note: Google has restricted FAQ rich results heavily since 2023. Still fine to implement, just don't expect the rich result everywhere.
{
"@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": "Post", "item": "https://example.com/blog/post" }
]
}
Schema in JSON-LD adds HTML weight. Not usually significant, but for very large sites with many entities per page (thousands of products on a category page), be mindful. Consider serving minimal schema on listing pages and full schema on detail pages.
Pick three page types on your site: homepage (Organization), blog posts (Article), and whatever your conversion page is (Product, LocalBusiness, etc.). Implement correct JSON-LD for each. Validate in Rich Results Test. Don't try to do every schema type at once. Get three right before expanding.
Next: log file analysis, the deepest diagnostic available to SEOs that almost nobody uses.