Schema Markup Guide: Structured Data for SEO with JSON-LD
Structured data is a snippet of code, usually JSON-LD, that describes a page in the Schema.org vocabulary: "this is a product, it costs $39.99 and it is in stock." Google uses it to understand the page and, when the markup follows its guidelines, may show rich results such as prices, star ratings, breadcrumbs or your logo. It is not a direct ranking factor, but it makes your content easier for search engines to read and your listing more informative.
If your site already has markup and you want to know whether it is correct, paste a URL into our free Schema validator. It finds JSON-LD and microdata blocks, flags JSON syntax errors and lists recommended properties you are missing.
What Schema.org is and how structured data works
Schema.org is a shared vocabulary launched by Google, Microsoft, Yahoo and Yandex. It defines types (Organization, Product, Article, Event...) and the properties each type can have (name, price, startDate...). Structured data is simply that vocabulary applied to your HTML.
There are three syntaxes you can use:
| Format | How it works | When to use it |
|---|---|---|
| JSON-LD | A separate <script type="application/ld+json"> block |
Recommended by Google; easiest to maintain |
| Microdata | itemscope, itemtype and itemprop attributes inside HTML tags |
Older themes and some e-commerce platforms |
| RDFa | vocab, typeof and property attributes in HTML |
Rare in SEO; more common in open-data projects |
Google supports all three but recommends JSON-LD. The reason is practical: the block lives apart from your visible markup, it does not break when someone redesigns the template, and it can be generated by a plugin, a theme or your back end.
Which schema types still earn rich results
Many schema guides are out of date, because Google has changed the rules significantly:
- FAQPage: since August 2023, FAQ rich results are shown only for well-known, authoritative government and health websites. On a typical store or blog the markup is still valid, but it no longer produces the expandable Q&A in search.
- HowTo: HowTo rich results were removed in 2023, first on mobile and then on desktop.
- Self-serving reviews: since 2019, review stars that a business publishes about itself on its own site (
LocalBusinessorOrganizationrating itself) are not eligible for review snippets.
Types that remain useful for most sites:
| Type | What it can unlock in search |
|---|---|
Product + Offer / AggregateRating |
Price, availability, review stars, shipping and returns |
BreadcrumbList |
A breadcrumb trail instead of a raw URL |
LocalBusiness |
Helps Google understand address, hours and contact details |
Organization |
Logo and company details Google can use |
Article |
Headline, image and date information for news and blog posts |
Event |
Date, venue and tickets in event experiences |
Recipe |
Photo, cooking time and ratings |
WebSite |
The site name shown in results |
Keep in mind: valid markup makes a page eligible. Google never guarantees that a rich result will appear.
Copy-ready JSON-LD examples
Replace the sample values with your own and place each block in the <head> or <body> of the matching page.
Organization
Goes on the homepage or the About page.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Example Store",
"url": "https://www.example.com",
"logo": "https://www.example.com/logo.png",
"sameAs": [
"https://www.linkedin.com/company/example",
"https://www.instagram.com/example"
]
}
LocalBusiness
For a clinic, restaurant or office with a physical address. Use the most specific subtype available (Dentist, Restaurant, LegalService).
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "Example Bistro",
"url": "https://www.examplebistro.com",
"telephone": "+1-555-010-0000",
"priceRange": "$$",
"servesCuisine": "Mediterranean",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Example Street",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "73301",
"addressCountry": "US"
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
"opens": "12:00",
"closes": "22:00"
}]
}
Product with Offer
The most important type for e-commerce. The price uses a dot as the decimal separator and the currency is an ISO 4217 code.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Stainless Steel Water Bottle 500 ml",
"image": "https://www.example.com/img/bottle-500.jpg",
"description": "Double-wall stainless steel bottle that keeps drinks cold for up to 24 hours.",
"sku": "WB-500",
"brand": { "@type": "Brand", "name": "Example" },
"offers": {
"@type": "Offer",
"url": "https://www.example.com/water-bottle-500",
"price": "39.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}
BreadcrumbList
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.example.com/" },
{ "@type": "ListItem", "position": 2, "name": "Kitchen", "item": "https://www.example.com/kitchen" },
{ "@type": "ListItem", "position": 3, "name": "Stainless Steel Water Bottle 500 ml" }
]
}
The last item can omit item, since it represents the current page.
How to implement structured data step by step
- Map your page templates. Homepage, category, product, blog post, contact page. Each template gets a set of types; you do not hand-code every URL.
- Pick how the markup is generated:
- WordPress: Yoast SEO and Rank Math output
Organization,WebSite,ArticleandBreadcrumbListout of the box. With WooCommerce,ProductandOffercome from the product data. - Shopify: most modern themes already include
ProductJSON-LD. Check thatavailabilityis filled in and that variants with different prices are represented. - Custom sites: generate JSON-LD on the server from the same database that renders the page, so price and stock can never drift from what visitors see.
- Avoid duplicates. An SEO plugin, the theme and a reviews app may each output their own
Product. Conflicting blocks on one page confuse Google. - Validate before publishing, then monitor in Search Console.
Common structured data errors
- Marking up content users cannot see. Reviews, questions or prices that exist only in the JSON-LD violate Google's guidelines and can lead to a manual action.
- Wrong price or availability. The markup says $39.99 and
InStock, the page shows $44.99 and "sold out." Caching and flash sales are the usual cause. Generate the markup dynamically. - Badly formatted values.
"price": "$39.99"is wrong; use"price": "39.99"with"priceCurrency": "USD". Dates should be ISO 8601 (2026-10-15T19:00). - JSON syntax errors. A trailing comma after the last item in an array or object, curly quotes pasted from a word processor, an unclosed bracket. One error invalidates the whole block.
- Missing required properties.
Productwithoutoffers,revieworaggregateRating;EventwithoutstartDateorlocation;LocalBusinesswithoutaddress. - Spammy review markup. Stars on category pages, made-up reviews, or an aggregate rating that does not match the reviews shown on the page.
- Wrong type for the page. Marking a whole listing page as a single
Product, or tagging ordinary blog posts asNewsArticleon a site that is not a news publisher.
How to validate your schema markup
Use three layers of checks:
- Nord SEO Schema validator: shows which JSON-LD and microdata types were found, JSON syntax errors, and missing recommended properties for
Organization,LocalBusiness,Product,Offer,Article,BreadcrumbList,FAQPage,WebSite,EventandRecipe. It is a quick way to review many pages. - Google Rich Results Test: confirms whether Google itself considers the page eligible for rich results, and it renders JavaScript.
- Google Search Console: the enhancement reports (Products, Breadcrumbs, Events and so on) show errors and warnings across the whole site over time. After fixing an issue, click "Validate fix."
Want to see how your listing might look in search? Try your title and description in the SERP snippet preview.
FAQ
Does structured data improve rankings?
Not directly. Google has said that structured data is not a ranking factor on its own. The benefit comes from Google understanding the page better and from the page becoming eligible for rich results, which tend to stand out on the results page.
Is FAQPage markup still worth adding?
It is still valid and does no harm, but since 2023 FAQ rich results appear only for authoritative government and health sites. For most websites, Product, BreadcrumbList, Organization and LocalBusiness deserve priority.
Can I use JSON-LD and microdata on the same page?
You can, but avoid describing the same item twice in different formats. If your theme outputs microdata and your plugin outputs JSON-LD, pick one and disable the other so Google does not receive conflicting data.
How long until rich results show up?
It depends on when Google recrawls the page, which can take anywhere from a few days to a few weeks. You can request indexing in Search Console, but whether a rich result is displayed is still Google's decision.
Want us to look at your site?
Start with a free check — then we can talk about a full audit and a plan.