Schema Markup: A Practical Guide
Structured data is machine-readable context about your page, written in JSON-LD. It is not a ranking boost — it is a rich-result and machine-comprehension layer, and mismatched markup is worse than none at all.
What is schema markup and what does it actually do?
Schema markup is code embedded in a page that describes its content in a structured, machine-readable form — what the page is about, who publishes it, what it costs, how it is rated. Search engines read it to build rich results: enhanced listings with price and rating, FAQ accordions, breadcrumbs, knowledge panels.
It is worth being precise about what it is not. Structured data is not a ranking factor. Google has said so, and adding it does not make a page rank higher on its own. What it does is make your page eligible for enhanced presentation in results, which increases click-through, and it improves how machines including language models understand the page.
Should I use JSON-LD, microdata or RDFa?
JSON-LD, and it is not a close call. It is a single block placed in the page head or body, separated from the HTML, so it does not interfere with markup or rendering and is trivially easy to deploy and update.
| Format | Status | Recommendation |
|---|---|---|
| JSON-LD | Google's recommended format | Use this |
| Microdata | Still supported | Avoid — harder to maintain, breaks on template changes |
| RDFa | Legacy | Avoid |
Put one JSON-LD block per entity in a script tag with type application/ld+json. Multiple entities can go in one block using @graph, which is how this site is structured.
Which schema types matter most?
There are hundreds of types. These are the ones that change how a page is presented or understood, and they are the ones to prioritize.
| Type | What it does | Rich result? | Priority |
|---|---|---|---|
| Organization | Identifies the business, with logo and social profiles | Knowledge panel eligibility | Essential, site-wide |
| WebSite | Identifies the site and its search action | Sitelinks search box (largely deprecated) | Low value but harmless |
| Article | Identifies content as an article with author and dates | Article presentation in some surfaces | High for publishers |
| FAQPage | Marks up question-and-answer pairs | FAQ accordion, though Google restricted these to authoritative health and government sites in 2023 | Medium — still useful for machine comprehension |
| Product | Price, availability, rating, condition | Price and rating in results, Shopping surfaces | Essential for ecommerce |
| LocalBusiness | Address, hours, geo, contact | Local pack and knowledge panel | Essential for local businesses |
| Service | What a business offers | No direct rich result, but improves machine comprehension | High for service businesses |
| BreadcrumbList | The page hierarchy | Breadcrumb display in results | Easy win, worth adding |
| HowTo | Step-by-step instructions | Restricted similarly to FAQ | Low |
| Person | Author or expert identity | Author attribution in AI features | High where authorship matters |
Correct JSON-LD examples
Three examples covering the types most sites need. Note that each describes content that is actually visible on the page — that is a requirement, not a formality.
Organization — site-wide, in the head or footer
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Ltd",
"url": "https://example.com/",
"logo": "https://example.com/assets/logo.png",
"email": "hello@example.com",
"sameAs": [
"https://www.linkedin.com/company/example",
"https://x.com/example"
]
}The `sameAs` array is the part most sites omit and the part that matters most for entity clarity. It tells search engines and language models which other profiles belong to the same organization. Only list profiles you actually own.
Article — on a content page
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to Appear in Google AI Overviews",
"description": "What AI Overviews are and what actually raises citation rate.",
"url": "https://example.com/ai-overviews-guide/",
"datePublished": "2026-01-20",
"dateModified": "2026-09-30",
"author": { "@type": "Person", "name": "Jane Smith" },
"publisher": { "@id": "https://example.com/#organization" },
"inLanguage": "en"
}FAQPage — matching visible content exactly
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do I need an llms.txt file?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Not for Google's AI Overviews. Google's official guidance states you do not need special machine-readable files."
}
}
]
}Every question and answer in the markup must appear verbatim in the visible page content. Marking up FAQs that are not on the page violates Google's guidelines and can trigger a manual action.
How do I validate structured data?
| Tool | What it checks | When to use |
|---|---|---|
| Google Rich Results Test | Eligibility for specific rich results | Before and after deploying; shows missing or invalid fields |
| Schema.org validator | Vocabulary correctness against schema.org | When using an unfamiliar type or property |
| Search Console → Enhancements | Live monitoring of your deployed pages | Ongoing — shows errors as they occur in production |
| Search Console URL Inspection | Per-URL validation and live test | Checking a single page |
Validation tools check syntax and vocabulary, not truth. They will happily pass markup that describes content not actually on the page, so the semantic accuracy is your responsibility.
What are the common mistakes?
- Markup for content that is not on the page. The most serious error and the one most likely to trigger enforcement. Reviews, prices, FAQs — all must be visible.
- Stale prices and availability. Product markup showing a price from six months ago generates errors and suppresses the rich result entirely.
- Two conflicting types on one page. Marking a service page as both Product and Service confuses the parser. Pick the accurate one.
- Invented aggregate ratings. Marking up a rating that does not appear on the page, or that you generated, is a policy violation.
- Missing required properties. A Product without offers, or an Article without author and date, is invalid and ignored.
- SameAs pointing at profiles you do not own. This is an entity-claiming error and should never be done.
- Leaving it to degrade. A template change that drops the block silently removes structured data site-wide. Re-check after every redesign.
Frequently asked questions
Does schema markup improve my rankings?
Is JSON-LD better than microdata?
Will FAQ markup still get me the accordion?
Is it safe to add Organization sameAs for social profiles I do not own?
How often should I validate structured data?
Do I need structured data on every page?
Can I mark up reviews if I collect them elsewhere?
My structured data was working and now it is not. What happened?
Keep reading
Want this applied to your business?
Stop guessing what to prioritize. Get a straight answer on where your marketing is leaking money, and what to fix first.
Book a free 30-minute audit