JSON-LD is a block of code, placed in a <script type="application/ld+json"> tag, that tells search engines exactly what a page represents: a product with a price, an organization with a logo, a breadcrumb trail. For SEO, its job is to make your pages eligible for rich results such as product prices, ratings and breadcrumbs, and to remove guesswork about your content. It does not raise rankings by itself.
This guide is for e-commerce and Shopify teams who want structured data that is correct, current and worth the effort. You will get what Google supports in 2026, which JSON-LD types a store actually needs, copyable examples, how Shopify handles it, a testing routine and a fix list for the errors we see most often in audits.
What is JSON-LD in SEO?
JSON-LD stands for JavaScript Object Notation for Linked Data. It is a W3C standard for writing linked data as JSON, and on the web it is almost always used with the schema.org vocabulary, a shared set of types (Product, Organization, BreadcrumbList) and properties (name, price, logo) maintained by the major search engines.
Three keys do most of the work:
@contextsays which vocabulary you are using, normallyhttps://schema.org.@typesays what the thing is, for exampleProduct.@idgives the thing a stable identifier so other blocks can point to it, for example linking a WebSite to the Organization that publishes it.
Everything else is a property of that type. Because the block sits in its own script tag, shoppers never see it, and you can add, change or remove it without touching your layout. That separation is the main reason developers and search engines prefer it to older inline formats.
If you want the broader picture first, including how schema relates to ChatGPT and AI search, read our guide to schema markup. This post focuses on the format and the implementation.
Why Google recommends JSON-LD over Microdata
Google Search supports three structured data formats: JSON-LD, Microdata and RDFa. Its introduction to structured data labels JSON-LD as recommended and says Google generally recommends it "if your site's setup allows it." The same page notes that all three formats are equally fine for Google when the markup is valid, so you do not need to rip out working Microdata in a panic. You should, however, write anything new in JSON-LD.
| Format | Where it lives | Strength | Weakness |
|---|---|---|---|
| JSON-LD | A separate script block | Easy to generate from data, edit and debug; Google can read it when injected with JavaScript | Easy to let drift out of sync with visible content |
| Microdata | Attributes on visible HTML elements | Stays tied to the content it describes | Tangled with templates, easy to break during redesigns |
| RDFa | Attributes on HTML elements | Widely used for Open Graph style metadata | Verbose and rarely used for Google rich results |
The open web is moving the same way. The HTTP Archive Web Almanac 2024 found JSON-LD on 41% of pages, up from 34% in 2022. RDFa scores higher only because Open Graph meta tags, the ones that control link previews on social platforms, are counted as RDFa.
View the data
| Value | |
|---|---|
| RDFa | 66% |
| Open Graph | 64% |
| JSON-LD | 41% |
| Microdata | 26% |
Source: HTTP Archive, Web Almanac 2024, Structured Data chapter
What JSON-LD does and does not do for SEO
Most disappointment with structured data comes from expecting the wrong thing. Here is what Google's own documentation supports.
What it does
- Makes pages eligible for rich results. Product prices, availability, ratings, breadcrumbs, videos and more depend on structured data. Google's search gallery lists 25 features as of its October 2026 update.
- Removes ambiguity. A price in a script block is unambiguous in a way that a price in a styled
spanis not. Google uses schema.org markup and theog:imagetag when choosing preview images, according to a March 2026 documentation update. - Feeds Search Console reports. Valid markup unlocks rich result reports, such as Merchant listings and Breadcrumbs, that show errors across the whole site.
What it does not do
- It does not guarantee display. Google's general structured data guidelines say plainly that Google does not guarantee structured data will show up, even when the Rich Results Test passes.
- It is not a ranking factor in the usual sense. None of Google's structured data pages promise a ranking boost. The value is a richer listing and a clearer page, which can lift clicks.
- It is not an AI search shortcut. Google's guidance on AI features and your website says no special schema is needed to appear in AI Overviews or AI Mode. In May 2026, Ahrefs tracked 1,885 pages that added JSON-LD against matched control pages for 30 days before and after. Citations in AI Mode and ChatGPT moved by amounts statistically indistinguishable from zero, and AI Overview citations fell slightly.
What changed in 2025 and 2026
Google has been pruning features. On June 12, 2025, it marked seven types as deprecated: book actions, course info, estimated salary, ClaimReview, learning video, special announcement and vehicle listing. In a changelog entry dated May 8, 2026, Google deprecated the FAQ rich result, which stopped appearing in Google Search on May 7, 2026; the FAQ documentation was removed on June 15, 2026. HowTo rich results were removed back in September 2023. Breadcrumbs now appear only in desktop results (January 2025). Meanwhile, merchant features grew: return policies, loyalty programs, merchant-level shipping policies (November 2025) and sale-price date properties (July 2026).
The practical lesson: markup that was best practice three years ago may now do nothing in Google. FAQPage markup is still valid schema.org and harmless, but if you added it only to win FAQ snippets, that reason is gone. Our post on FAQ schema not showing in Google covers what to do with it.
We benchmark your store against your top three competitors on Google and AI answers, flag the structured data and technical fixes that matter, and show the revenue math.
JSON-LD types every e-commerce site needs
You do not need dozens of types. A store needs a small set, implemented completely and kept accurate. This table maps each type to the page it belongs on and what Google requires.
| Type | Page | Google feature | Required by Google |
|---|---|---|---|
| Product with Offer | Product pages you sell from | Merchant listings (price, availability, shipping, returns) | Product: name, image, offers. Offer: price above zero and priceCurrency |
| Product (snippet) | Review or comparison pages that do not sell | Product snippets (ratings, price range) | name, plus one of review, aggregateRating or offers |
| ProductGroup | Products with variants | Variant-aware merchant listings | Variants linked with isVariantOf and inProductGroupWithID |
| BreadcrumbList | Products, collections, articles | Breadcrumb trail (desktop) | itemListElement with ListItem position and name |
| Organization | Homepage or About page | Logo and brand details, store-wide shipping and return policies | No single required property; name, url and logo recommended |
| Article or BlogPosting | Blog posts | Article enhancements | No required properties; headline, image, datePublished, author recommended |
Two points from Google's merchant listing documentation trip up many stores. First, Google recommends defining shipping and return policies once in Organization markup, and using offer-level shippingDetails and hasMerchantReturnPolicy only as overrides for specific products. Second, product rich results are for pages about one product or its variants, not for collection pages listing many products. Do not put Product markup for every item on a collection page.
Here is what the rest of the web actually uses. The Web Almanac's most common JSON-LD types skew toward site-level markup; Product appears on under 1% of mobile pages, which is one reason well-marked-up stores still stand out.
View the data
| Value | |
|---|---|
| WebSite | 12.7% |
| Organization | 7.2% |
| BreadcrumbList | 5.7% |
| LocalBusiness | 4% |
| ItemList | 2.4% |
| WebPage | 1.5% |
| BlogPosting | 1.4% |
| Product | 0.8% |
Source: HTTP Archive, Web Almanac 2024, Structured Data chapter
For deeper dives by type, see our guides to Product schema on Shopify and Organization schema markup.
JSON-LD examples you can copy
These examples use placeholder values. Replace every value with real data from the page, and never mark up a rating, price or review the shopper cannot see.
Product with Offer and rating
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Merino Wool Runner",
"image": ["https://www.example.com/images/merino-runner.jpg"],
"description": "Lightweight merino wool running shoe.",
"sku": "MWR-001",
"gtin13": "0123456789012",
"brand": { "@type": "Brand", "name": "Example Co" },
"offers": {
"@type": "Offer",
"url": "https://www.example.com/products/merino-runner",
"price": "98.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "212"
}
}
</script>
Notes: availability and itemCondition take schema.org URLs, not free text. Use the most specific GTIN you have, in numeric form; Google does not accept GTINs written as URLs. Only include aggregateRating if the rating and count are shown on the page and come from real customers.
Organization and WebSite linked with @id
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://www.example.com/#organization",
"name": "Example Co",
"url": "https://www.example.com/",
"logo": "https://www.example.com/logo.png",
"sameAs": ["https://www.instagram.com/exampleco"]
},
{
"@type": "WebSite",
"@id": "https://www.example.com/#website",
"url": "https://www.example.com/",
"name": "Example Co",
"publisher": { "@id": "https://www.example.com/#organization" }
}
]
}
</script>
The @graph array holds several connected items in one block, and @id lets the WebSite point to its publisher without repeating the Organization. Google's guidelines suggest @id for exactly this kind of linking. Put this block on the homepage.
BreadcrumbList
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Shoes", "item": "https://www.example.com/collections/shoes" },
{ "@type": "ListItem", "position": 2, "name": "Running", "item": "https://www.example.com/collections/running-shoes" }
]
}
Wrap it in the same script tag as above. The trail should match the breadcrumb a shopper sees on the page, in the same order.
How to add JSON-LD on Shopify
On Shopify, most structured data comes from your theme, and the rest often comes from apps. That is convenient and also the source of most problems, because two sources frequently output overlapping markup.
The structured_data filter
Shopify's Liquid language includes a structured_data filter that converts a product or article into schema.org markup. A product without variants becomes a Product; a product with variants becomes a ProductGroup; an article becomes an Article. Shopify's documented usage is:
<script type="application/ld+json">
{{ product | structured_data }}
</script>
The filter is the easiest way to keep markup in sync with your catalog, since prices and availability come straight from product data. It does not cover everything, so you may still want Organization, WebSite and BreadcrumbList blocks in your theme layout and collection templates.
A safe workflow for Shopify stores
- Inventory what you already output. Open a product page, view the source and search for
application/ld+json. Note every block and where it comes from (theme section, snippet or app). - Pick one source per type. If your theme and a reviews or SEO app both output Product, disable one. Two Product blocks with different prices or ratings send conflicting signals.
- Add what is missing. Typically Organization and WebSite on the homepage, BreadcrumbList on products and collections, and shipping and return policies in Organization.
- Edit a duplicate theme first. Make changes in a copy, preview it and run the tests in the next section before publishing.
- Pair markup with your Merchant Center feed. Merchant listings can use both, and Shopify's Google and YouTube channel manages the feed. Keep prices and availability consistent across the two.
Schema alone will not get you cited. Our free roadmap, built from 7,960 live pages and 197 A/B tests, covers getting cited by ChatGPT, Google AI Overviews and Perplexity.
How to test and monitor JSON-LD
Valid markup on launch day can break the next time a developer edits a template. Build testing into your routine.
| Tool | What it checks | When to use it |
|---|---|---|
| Rich Results Test | Whether a page or code snippet is eligible for Google rich results, with errors and warnings | Before publishing any template change |
| Schema Markup Validator | Valid schema.org syntax for any type, including ones Google does not use | For types outside Google's gallery |
| URL Inspection in Search Console | Whether Google found structured data on the indexed version of a page | After deploy, on a few key URLs |
| Rich result reports in Search Console | Valid and invalid items across the whole site, such as Merchant listings and Breadcrumbs | Weekly or monthly |
| Performance report in Search Console | Clicks and impressions, filterable by search appearance | To compare results before and after a change |
Google's introduction recommends this sequence: validate during development with the Rich Results Test, confirm with URL Inspection after deploy, then watch the rich result reports for breakage caused by templating or serving issues.
Common JSON-LD mistakes and how to fix them
These are the problems that most often stop structured data from working. Each one is covered by Google's guidelines.
| Symptom | Likely cause | Fix |
|---|---|---|
| Rich Results Test shows two Product items | Theme and an app both output Product | Keep one source and disable the other |
| Price in search differs from the page | Hard-coded or cached markup after a price change | Generate offers from live product data, for example with the structured_data filter |
| Ratings never show | Self-serving reviews on Organization or LocalBusiness, or reviews not visible on the page | Mark up only real, visible customer reviews on product pages |
| Invalid item: missing field | Required property absent, such as image or priceCurrency | Add the required property; items missing one are ineligible |
| Markup is valid but nothing shows | Feature retired (FAQ, HowTo) or Google chose a plain result | Check the current search gallery and stop chasing retired features |
| Manual action for structured data | Markup describes hidden, misleading or irrelevant content | Remove the offending markup and request review in Search Console |
A manual action for structured data removes rich result eligibility, but Google says it does not change how the page ranks in web search. Also remember that pages blocked by robots.txt or noindex cannot earn rich results at all, and image URLs in your markup must be crawlable.
Where to start this week
If you only have an afternoon, do this in order: run your homepage, one collection and your best-selling product through the Schema Markup Validator, remove duplicate Product blocks, make sure every product page has a Product with an Offer that matches the visible price, then add Organization and BreadcrumbList where they are missing. Check the Merchant listings report in Search Console two weeks later.
Structured data is one part of a sound technical foundation, alongside crawlability, indexing and page speed. Our technical SEO audit checklist covers the rest, and our technical SEO team can audit it for you. If you want a second pair of eyes on your markup and how your store compares with competitors, get in touch.
Bring your store. We will compare it with your top three competitors, show which pages are ready to move and prioritize the fixes, including structured data.