Great content isn’t enough, search engines need context. Schema markup tells Google what your page means, not just what it says.
From this article you’ll learn:
Check Also: what SEO actually is · structured data guide
From this article you’ll learn:
- what schema is,
- how it works,
- which types to use,
- how to add,
- how to test it fast.
Check Also: what SEO actually is · structured data guide
What is schema markup?
Schema markup is a small block of code (usually JSON-LD) you add to a page to describe its content in a way machines instantly understand. Think of it as labels that say, “This is a product with a price,” “This is a business with opening hours,” or “This is an article written by a real person.”
When search engines get this extra context, your pages can qualify for rich results (stars, prices, FAQs, sitelinks) and clearer brand signals.
When search engines get this extra context, your pages can qualify for rich results (stars, prices, FAQs, sitelinks) and clearer brand signals.
Why is schema markup important for SEO?
Search is changing. AI systems (like Google’s AI Mode and AI Overviews) read your page, extract facts, and build answers on the fly. If your content isn’t clearly labeled, it’s easy to be skipped.
Schema markup gives machines the structure they need, so your pages become eligible for rich results, get cleaner brand info, and show up more often for “near me” and long-tail queries.
Here’s what you gain, fast:
Schema markup gives machines the structure they need, so your pages become eligible for rich results, get cleaner brand info, and show up more often for “near me” and long-tail queries.
Here’s what you gain, fast:
- More visual results: ratings, prices, availability, breadcrumbs, FAQs.
- Better clarity for AI: entities (brand, product, person, location) are unambiguous.
- Higher CTR: richer listings attract more qualified clicks—even if rankings stay the same.
- Fewer mistakes: hours, addresses, and authorship stay consistent across your site.
💡 Growth Tip:
Add Organization + Website schema to your homepage first. It’s a quick win that strengthens brand signals and can unlock a sitelinks search box.
Add Organization + Website schema to your homepage first. It’s a quick win that strengthens brand signals and can unlock a sitelinks search box.
Schema vs. structured data vs. rich snippets vs. metadata
Term
What it is
How you use it
Schema markup
A shared vocabulary of types & properties
Choose the right type and properties for your page
Structured data
A machine-readable format
Add JSON-LD script (preferred)
Rich results
Enhanced SERP presentation
Earned when your structured data is valid & relevant
Metadata
Descriptive page info (not schema)
Set title/description/OG tags
How schema markup works?
Here’s the simple flow:
- Crawl - Google discovers your page and fetches the HTML.
- Parse JSON-LD - it reads your scheama code and pulls out the facts.
- Identify entities - it maps your brand, products, locations, people, and topics to known entities.
- Match to intent - if your data is valid (and the page content backs it up), your result can become eligible for rich results.
Which schema types to use (by site type)
If you run a local business
Use:
Organization, LocalBusiness (right subtype), PostalAddress, Geo, OpeningHoursSpecification, AggregateRating/Review, FAQPage.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://example.com/locations/downtown#local",
"name": "Example Dental – Downtown",
"url": "https://example.com/locations/downtown",
"image": "https://example.com/img/office.jpg",
"telephone": "+1-555-0100",
"address": {
"@type": "PostalAddress",
"streetAddress": "101 Main St",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:00",
"closes": "13:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.8,
"reviewCount": 214
}
}
Organization, LocalBusiness (right subtype), PostalAddress, Geo, OpeningHoursSpecification, AggregateRating/Review, FAQPage.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://example.com/locations/downtown#local",
"name": "Example Dental – Downtown",
"url": "https://example.com/locations/downtown",
"image": "https://example.com/img/office.jpg",
"telephone": "+1-555-0100",
"address": {
"@type": "PostalAddress",
"streetAddress": "101 Main St",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:00",
"closes": "13:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.8,
"reviewCount": 214
}
}
If you manage an online store
Use:
Product, Offer, AggregateRating, Review, BreadcrumbList, ItemList.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@type": "Product",
"@id": "https://example.com/p/wireless-headphones#product",
"name": "Apex Wireless Headphones",
"image": ["https://example.com/img/apex1.jpg"],
"description": "High-quality wireless headphones with noise cancellation and 20 hours of battery life.",
"sku": "APX-1000",
"mpn": "1000-APX",
"brand": {
"@type": "Brand",
"name": "Apex"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"reviewCount": 138
},
"offers": {
"@type": "Offer",
"price": 129.99,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"priceValidUntil": "2025-12-31",
"url": "https://example.com/p/wireless-headphones"
}
}
Product, Offer, AggregateRating, Review, BreadcrumbList, ItemList.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@type": "Product",
"@id": "https://example.com/p/wireless-headphones#product",
"name": "Apex Wireless Headphones",
"image": ["https://example.com/img/apex1.jpg"],
"description": "High-quality wireless headphones with noise cancellation and 20 hours of battery life.",
"sku": "APX-1000",
"mpn": "1000-APX",
"brand": {
"@type": "Brand",
"name": "Apex"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"reviewCount": 138
},
"offers": {
"@type": "Offer",
"price": 129.99,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"priceValidUntil": "2025-12-31",
"url": "https://example.com/p/wireless-headphones"
}
}
If you publish a lot of articles
Use:
Article/BlogPosting with author (Person), datePublished, dateModified, image, mainEntityOfPage. Add FAQPage only when it’s real Q&A.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://example.com/blog/seo-checklist#article",
"headline": "The Simple SEO Checklist",
"description": "A simple step-by-step SEO checklist to improve rankings and visibility.",
"image": ["https://example.com/img/seo-checklist.jpg"],
"datePublished": "2025-02-10",
"dateModified": "2025-09-01",
"author": {
"@type": "Person",
"name": "Alex Rivera",
"url": "https://example.com/authors/alex"
},
"publisher": {
"@type": "Organization",
"name": "Example Media",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/img/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/seo-checklist"
},
"wordCount": 1200,
"articleSection": "SEO"
}
Article/BlogPosting with author (Person), datePublished, dateModified, image, mainEntityOfPage. Add FAQPage only when it’s real Q&A.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://example.com/blog/seo-checklist#article",
"headline": "The Simple SEO Checklist",
"description": "A simple step-by-step SEO checklist to improve rankings and visibility.",
"image": ["https://example.com/img/seo-checklist.jpg"],
"datePublished": "2025-02-10",
"dateModified": "2025-09-01",
"author": {
"@type": "Person",
"name": "Alex Rivera",
"url": "https://example.com/authors/alex"
},
"publisher": {
"@type": "Organization",
"name": "Example Media",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/img/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/seo-checklist"
},
"wordCount": 1200,
"articleSection": "SEO"
}
If you operate many locations
Use:
one global Organization + one LocalBusiness per location page; include special/holiday hours; link each store’s sameAs to its GBP URL.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Example Fitness",
"url": "https://example.com"
},
{
"@type": "HealthClub",
"@id": "https://example.com/locations/east#local",
"name": "Example Fitness – East",
"url": "https://example.com/locations/east",
"parentOrganization": {
"@id": "https://example.com/#org"
},
"image": "https://example.com/img/east-location.jpg",
"telephone": "+1-555-0200",
"sameAs": ["https://maps.google.com/?cid=1234567890"],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Sunday",
"opens": "08:00",
"closes": "14:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "06:00",
"closes": "21:00"
}
],
"specialOpeningHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"validFrom": "2025-12-25",
"validThrough": "2025-12-25",
"closed": true
}
],
"address": {
"@type": "PostalAddress",
"streetAddress": "200 East Rd",
"addressLocality": "Nashville",
"addressRegion": "TN",
"postalCode": "37201",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 36.1627,
"longitude": -86.7816
}
}
]
}
one global Organization + one LocalBusiness per location page; include special/holiday hours; link each store’s sameAs to its GBP URL.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Example Fitness",
"url": "https://example.com"
},
{
"@type": "HealthClub",
"@id": "https://example.com/locations/east#local",
"name": "Example Fitness – East",
"url": "https://example.com/locations/east",
"parentOrganization": {
"@id": "https://example.com/#org"
},
"image": "https://example.com/img/east-location.jpg",
"telephone": "+1-555-0200",
"sameAs": ["https://maps.google.com/?cid=1234567890"],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Sunday",
"opens": "08:00",
"closes": "14:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "06:00",
"closes": "21:00"
}
],
"specialOpeningHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"validFrom": "2025-12-25",
"validThrough": "2025-12-25",
"closed": true
}
],
"address": {
"@type": "PostalAddress",
"streetAddress": "200 East Rd",
"addressLocality": "Nashville",
"addressRegion": "TN",
"postalCode": "37201",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 36.1627,
"longitude": -86.7816
}
}
]
}
If you’re a small team/early-stage site
Use:
Organization, WebSite + SearchAction, BreadcrumbList, one FAQPage.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Starter Co",
"url": "https://example.com",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/img/logo.png"
},
"sameAs": [
"https://www.facebook.com/starterco",
"https://www.linkedin.com/company/starterco"
]
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com",
"name": "Starter Co",
"publisher": {
"@id": "https://example.com/#org"
},
"inLanguage": "en",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={query}",
"query-input": "required name=query"
}
}
]
}
Organization, WebSite + SearchAction, BreadcrumbList, one FAQPage.
Example of JSON-LD:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Starter Co",
"url": "https://example.com",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/img/logo.png"
},
"sameAs": [
"https://www.facebook.com/starterco",
"https://www.linkedin.com/company/starterco"
]
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com",
"name": "Starter Co",
"publisher": {
"@id": "https://example.com/#org"
},
"inLanguage": "en",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={query}",
"query-input": "required name=query"
}
}
]
}
How to add schema markup to a website?
- Pick the page types - home, product, article, location. Start where schema will have the biggest impact.
- Choose the schema from the lists above or visit https://schema.org/ - match types to real on-page content. Don’t mark up what users can’t see.
- Generate JSON-LD - use a saved template, a reputable generator, or craft it once and reuse. Keep @id stable.
- Place it on your website - use theme/template (best), CMS script/SEO field (fast) or Google Tag Manager (okay short-term; avoid for critical product data).
- Validate - run the Schema Markup Validator for correctness, then Google’s Rich Results Test for eligibility.
- Publish - roll out to all relevant pages, then request indexing to speed up discovery.
- Monitor in Google Search Console - check Enhancements report (errors/warnings) and Performance (CTR, impressions).
💡 Growth Tip:
Use JSON-LD (recommended). It’s a small script tag you can drop into your page - fast to add, easy to maintain. Where to place it: head is ideal, but body works too.
Use JSON-LD (recommended). It’s a small script tag you can drop into your page - fast to add, easy to maintain. Where to place it: head is ideal, but body works too.
Pro tips:
Errors vs. Warnings:
Quick troubleshooting:
- Use one graph per page when possible; avoid scattering multiple blocks that repeat the same entity.
- Keep IDs consistent across the site (/ #website, / #organization, per-page /#webpage).
- For e-commerce, populate price, priceCurrency, availability, and sku directly from your product database to avoid stale data.
- After adding, validate (I’ll cover this next) and request indexing for key URLs.
Errors vs. Warnings:
- Errors = fix now (missing required fields like price, availability, openingHoursSpecification).
- Warnings = recommended fields (nice to have; often unlocks fuller results).
Quick troubleshooting:
- See two Product nodes? Kill duplicates from theme/apps; keep one canonical @id.
- Marked up info not visible on the page? Align content and schema.
- Wrong subtype (LocalBusiness vs Dentist)? Use the most specific type that matches reality.
- Missing basics: sku, priceCurrency, image, author, datePublished/Modified.
- Inconsistent NAP (name/address/phone) across site vs. schema vs. GBP? Normalize all three.
Common mistakes (and quick fixes)
Duplicate Product nodes (theme + app).
Marking up hidden or misleading content.
Missing required fields.
Wrong or too-generic types.
Mixing multiple locations in one node.
Inconsistent NAP across site, schema, and GBP.
Stale availability/pricing.
No @graph (scattered blocks).
Forgetting Search Console.
- Fix: Remove one. Keep a single canonical node with a stable @id.
Marking up hidden or misleading content.
- Fix: Only mark up what users can see (ratings, hours, prices). Align schema with on-page text.
Missing required fields.
- Fix: Product: price, priceCurrency, availability, sku, image.
- Fix: Local: address, openingHoursSpecification.
- Fix: Article: headline, image, datePublished, author.
Wrong or too-generic types.
- Fix: Pick the most specific subtype that truly fits (e.g., Dentist instead of generic LocalBusiness).
Mixing multiple locations in one node.
- Fix: One LocalBusiness per location page. Link each to its GBP with sameAs.
Inconsistent NAP across site, schema, and GBP.
- Fix: Standardize name, address, phone everywhere, then reflect it in schema.
Stale availability/pricing.
- Fix: Pipe values from your database. If using GTM, set a process to refresh frequently—or move to server-rendered.
No @graph (scattered blocks).
- Fix: Consolidate into one JSON-LD block when possible; keep IDs consistent.
Forgetting Search Console.
- Fix: After deployment, check Enhancements for errors/warnings and Performance for CTR lifts. Iterate.
Schema markup for better SERPs
Schema markup doesn’t magically boost rankings, but it does make your content crystal clear to search engines and AI systems.
Ready to unlock richer results and cleaner brand signals? Book a free SEO Audit
Ready to unlock richer results and cleaner brand signals? Book a free SEO Audit
F.A.Q
What is schema markup used for?
To describe what’s on a page in machine-readable terms (product, price, hours, reviews, author). That clarity makes pages eligible for rich results and helps disambiguate entities.
Is schema.org still used?
Yes, it's the current standard and actively updated.
Is schema markup important for SEO?
Yes for visibility and CTR. It’s not a direct ranking factor, but it improves how your results appear and how well algorithms understand your content.
What’s the difference between schema.org and rich snippets?
Schema.org = the vocabulary you use in your code. Rich snippets/results = the enhanced listings you may earn (stars, price, FAQs) if your page is eligible.
How does schema markup work?
Google crawls your page, parses the JSON-LD, maps entities (brand, product, person, place), and—if valid and policy-compliant—may show an enhanced result.
Where to put schema markup in HTML?
head is ideal; body is fine. For Product data (price/availability), favor server-rendered markup for reliability.

Talk to an SEO Expert Now
Let us help you rank better and drive more qualified traffic!
Optimize today!