Free schema markup generator
JSON-LD for products, FAQs and more, written for you.
Built in your browser as you type. Nothing is sent anywhere.
Your JSON-LD
Paste it into the page's HTML
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product"
}
</script>
Or let Shopify fill it in
For every product
This snippet builds the same markup from each product's own title, image, price and stock. Add it as snippets/product-schema.liquid in your theme and render it in the product template. Remove any other Product markup first so there is only one.
{%- assign variant = product.selected_or_first_available_variant -%}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.title | json }},
"description": {{ product.description | strip_html | strip | truncate: 5000 | json }},
"url": {{ request.origin | append: product.url | json }},
{%- if product.featured_image -%}
"image": {{ product.featured_image | image_url: width: 1200 | prepend: 'https:' | json }},
{%- endif -%}
{%- if variant.sku != blank -%}
"sku": {{ variant.sku | json }},
{%- endif -%}
"brand": { "@type": "Brand", "name": {{ product.vendor | json }} },
"offers": {
"@type": "Offer",
"url": {{ request.origin | append: variant.url | json }},
"priceCurrency": {{ cart.currency.iso_code | json }},
"price": {{ variant.price | divided_by: 100.0 | json }},
"availability": "https://schema.org/{% if variant.available %}InStock{% else %}OutOfStock{% endif %}"
}
}
</script>
Check every page, every week
ShopSEO runs these checks across your whole store, not one page, and fixes most of what it finds. The full audit is on the Free plan.
Three steps, no account.
- 1
Pick a type
Product, Organization, FAQ, Breadcrumb, Local business or Blog post.
- 2
Fill in the form
Only what you fill in is used; empty fields are left out of the markup.
- 3
Copy and test
Paste the JSON-LD into your page, then check it with the schema validator.
What it checks
Pick a type, fill in a short form and copy valid JSON-LD for products, your organization, FAQs, breadcrumbs, a local store or a blog post. For Shopify product pages there is also a Liquid snippet that fills the markup in from each product automatically, so it never goes out of date.
ShopSEO checks this across your whole store and fixes it for you. Structured data in the app
- Product, Organization, FAQ, Breadcrumb, Local business, Blog post
- Valid JSON-LD, with empty fields left out
- A Shopify Liquid snippet for every product page
- Runs in your browser; nothing is sent
What each number is telling you.
A report you cannot interpret is just a longer way of saying something is wrong.
JSON-LD
The format Google recommends for structured data: a script tag holding a description of the page that search engines read and shoppers never see.
The Liquid snippet
Instead of fixed values, it reads each product's title, image, price and stock, so one snippet covers the whole catalog and stays accurate.
Required and recommended
Products need a name and an offer with a price to show price and stock in Google. Ratings only belong when the reviews are real and on the page.
The mechanism, not the platitude.
- 01
Price and stock in the result
Product markup is what lets Google show your price, availability and ratings right in search results.
- 02
AI answers read it too
Assistants and AI search use structured data to understand what a page sells, the same way search engines do.
- 03
Themes often get it wrong
Many themes emit partial or duplicate markup. Writing it once, correctly, removes the guesswork.
What this usually turns up, and the fix.
Four problems that account for most of what this tool reports on a Shopify store.
The finding
Two Product blocks on one page
Why it happens
The theme and an app both add markup.
The fix
Keep one: switch off the app's markup or remove the theme's, then add this snippet if needed.
The finding
Ratings that aren't on the page
Why it happens
Review counts copied into markup without visible reviews.
The fix
Only add ratings that shoppers can see on the same page; Google can ignore or penalise them otherwise.
The finding
Price without currency
Why it happens
A hand-written Offer missing priceCurrency.
The fix
Always pair price with a currency code; the Liquid snippet uses your store's.
What this will not tell you.
Every tool has a boundary. Knowing where this one ends is what keeps you from over-reading it.
- It writes markup from what you enter. Make sure every value matches what the page shows.
- Valid markup makes a page eligible for rich results; Google still decides whether to show them.
More free tools.
All toolsRun this continuously instead.
Install ShopSEO free, run your first audit in under a minute, and roll back anything you do not like. No credit card, no theme edits, no lock-in.