Structured data is the rare SEO tactic where you literally hand search engines the answer key. Instead of hoping crawlers infer what your page is about, schema markup states it outright: this is an article, written by this person, published by this organization, about this thing. Yet most implementations fail in one of two directions, sites that ship none, or sites that paste every type a plugin offers and mark up nothing correctly.
The stakes are concrete. Schema markup gates rich results, review stars, FAQ dropdowns, product pricing, breadcrumbs, which measurably lift click-through rates. And beyond SERP features, structured data is the cleanest machine-readable layer of your entity model: it's how you tell Google's Knowledge Graph, and every LLM retrieval system built on similar representations, exactly which entities your pages describe.
This guide covers the types that actually matter, correct JSON-LD implementation with working examples, validation workflow, and the mistakes we fix most often in technical SEO engagements.
What schema markup does (and doesn't do)
Schema.org is a shared vocabulary, maintained by Google, Microsoft, Yahoo, and Yandex, for describing things on the web: articles, products, businesses, events, people, and hundreds more. Marking up a page with this vocabulary does two distinct jobs, and it pays to keep them separate in your head:
- Rich result eligibility. Google supports a specific list of result enhancements (product snippets, FAQs, breadcrumbs, review stars, and so on), each requiring specific types and properties. Correct markup makes you eligible; Google still decides per-query whether to show the enhancement.
- Entity disambiguation. Every type, even ones with no visual reward, tells the engine what the page's entities are and how they relate. This feeds Knowledge Graph understanding and site-level topical comprehension.
Equally important is what schema does not do: it is not a direct ranking boost. Google has said repeatedly that adding markup to a page doesn't raise its position by itself. The returns come indirectly, higher CTR from richer snippets, and stronger machine confidence about what you're about, which supports everything from EEAT signals to citations in AI answers.
The six schema types that matter for most sites
Schema.org defines nearly 800 types. For the overwhelming majority of sites, six of them do almost all the work:
| Type | Where it belongs | What it earns |
|---|---|---|
| Organization | Sitewide (referenced from every page) | Knowledge panel data, brand entity disambiguation, logo in results |
| Article / BlogPosting | Every editorial page | Author and date understanding, article result treatment, EEAT proxy signals |
| FAQPage | Pages with visible Q&A sections | FAQ rich results (now limited to authoritative sites), extractable Q&A for AI answers |
| Product + Offer | Product detail pages | Price, availability, and review stars in snippets; Shopping surface eligibility |
| LocalBusiness | Location and contact pages | Local pack data: hours, address, geo, phone, essential for local SEO |
| BreadcrumbList | Every page below the home page | Breadcrumb trail in results; explicit site hierarchy signal |
Match the type to the page's job. Service businesses add Service; publishers with tutorials add HowTo where steps are genuinely visible; multi-location businesses give each location page its own LocalBusiness node, a pattern covered in depth in our local SEO guide. Resist the urge to go further until the core six are correct, connected, and validated.
Think in one graph, not per-page snippets
The step most implementations miss: connecting nodes. Give your Organization and key Person entities stable @id values, then reference those IDs from every Article's publisher and author properties. The result is one coherent graph, every post you publish strengthens the same author and organization nodes instead of creating disconnected duplicates.
JSON-LD implementation done right
Google supports three formats, JSON-LD, Microdata, and RDFa, and explicitly recommends JSON-LD. It lives in a single script type="application/ld+json" block, decoupled from your HTML markup, which makes it dramatically easier to template, test, and maintain. Here's a complete Article implementation showing the connected-graph pattern:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://permanentseo.com/#org",
"name": "Permanent SEO",
"url": "https://permanentseo.com",
"logo": "https://permanentseo.com/logo.png"
},
{
"@type": "BlogPosting",
"@id": "https://permanentseo.com/blog/schema-markup-guide#article",
"headline": "Schema Markup: The Practical Guide to Structured Data",
"datePublished": "2026-01-14",
"dateModified": "2026-01-21",
"author": {
"@type": "Person",
"name": "Mehroz Shafique",
"url": "https://permanentseo.com/about"
},
"publisher": { "@id": "https://permanentseo.com/#org" },
"mainEntityOfPage": "https://permanentseo.com/blog/schema-markup-guide"
}
]
}Note the mechanics: @graph holds multiple nodes in one block, and publisher references the Organization by @id instead of repeating it. On a real site the Organization node is defined once (usually on the home page or in every page's graph via the layout template) and referenced everywhere.
For FAQ content, mark up only questions and answers that visibly appear on the page:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Is schema markup a ranking factor?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Not directly. It gates rich results and improves entity understanding, which lift CTR and machine confidence rather than position."
}
}
]
}- Generate from data, not by hand. Build JSON-LD in your templates from the same fields that render the page (title, dates, author), so markup and content can never drift apart.
- Fill required and recommended properties. Each rich result type has required properties (eligibility) and recommended ones (competitiveness). Google's search gallery documentation lists both per type.
- Keep dates honest.
dateModifiedshould change when content meaningfully changes, not on every deploy.
Validation and monitoring workflow
Two validators, two different questions:
- Google's Rich Results Test answers “is this page eligible for Google's rich results, and which ones?” It only checks types Google supports and flags missing required/recommended properties per feature.
- The Schema.org validator answers “is this structurally valid schema at all?” It catches vocabulary and syntax problems in types the Rich Results Test ignores, important for entity-focused markup like Organization and Person.
- Search Console enhancement reports answer “is it working in production, across every page?” This is where template-level regressions surface: one bad deploy can invalidate markup on thousands of URLs, and these reports are usually how you find out.
Fold structured data checks into your regular crawls too, most crawlers now extract and validate JSON-LD at scale, which is how you spot pages missing markup entirely. We treat it as a standing item in the technical SEO checklist rather than a one-time setup task.
Common schema mistakes (and how to avoid them)
The same handful of failures show up in almost every audit we run:
- Marking up invisible content. FAQs, reviews, or ratings that don't appear on the page. This is the guideline violation most likely to draw a manual action.
- Wrong type for the page. A category page marked as
Product, a service business asArticle. The type must describe the page's main entity. - Disconnected duplicate entities. Every page defining its own fresh Organization and Person nodes with slightly different values, instead of referencing shared
@idnodes, turning your entity graph into noise. - Plugin stacking. Two SEO plugins each emitting their own conflicting JSON-LD for the same page. Pick one source of truth; audit for duplicate blocks.
- Self-assigned ratings. An
aggregateRatingthe site owner wrote about their own business with no visible review system behind it. Google explicitly disallows this pattern. - Set-and-forget. Markup templated once in 2023 and never revalidated while the theme, content, and Google's requirements all changed underneath it.
“Structured data is a contract: the markup promises what the page contains. Every mistake on this list is a broken promise, and search engines respond to broken promises by ignoring, or penalizing, the promiser.”
Get the fundamentals right and structured data becomes quiet, compounding infrastructure: richer snippets today, and a machine-readable identity that pays off across the Knowledge Graph and AI search surfaces tomorrow.
Key takeaways
- Schema markup does two jobs: qualifying pages for rich results, and handing search engines an unambiguous, machine-readable statement of your entities.
- Six types cover most sites' real needs: Organization, Article, FAQPage, Product, LocalBusiness, and BreadcrumbList, implement those well before touching anything exotic.
- JSON-LD is Google's recommended format: keep it in a script block, connect entities with @id references, and only mark up content visible on the page.
- Validate twice, the Rich Results Test for eligibility, the Schema.org validator for structural correctness, then monitor Search Console enhancement reports for regressions.
- The biggest wins come from a connected entity graph across pages, not from isolated snippets pasted into templates.
Frequently asked questions
Does schema markup improve rankings?
Not directly, Google has confirmed markup isn't a ranking boost. It improves outcomes through two indirect paths: rich results that raise click-through rate, and clearer entity understanding that helps engines confidently match your pages to relevant queries.
Should I use JSON-LD or Microdata?
JSON-LD, in almost every case. It's Google's recommended format, lives in one script block instead of being woven through your HTML, and is far easier to generate from templates and validate automatically. Only maintain Microdata where a legacy system already emits it correctly.
How much schema is too much?
Mark up what the page actually is and visibly contains, typically one main type plus supporting nodes like BreadcrumbList, Organization, and Person. Adding types the page doesn't genuinely represent adds no eligibility, dilutes clarity, and increases guideline risk.
Why doesn't Google show my rich results even though validation passes?
Validation confirms eligibility, not entitlement. Google decides per query whether an enhancement improves the result, and some features are restricted, FAQ rich results, for example, are now shown mostly for well-known authoritative government and health sites. Keep the markup: the entity value remains even when the visual treatment doesn't appear.
Can I add structured data with Google Tag Manager?
You can, and Google can process it, but it depends on rendering, the markup only exists after JavaScript executes, which delays and occasionally drops processing. Server-side rendering structured data in the page HTML is the more reliable pattern, especially at scale.
Founder & Semantic SEO Lead · Permanent SEO
Writes about entity SEO, topical authority, and how modern and AI-powered search actually rank content.
View full profile