Store AEO
Pricing
Blog

Structured data for Shopify product pages

June 1, 2026

Flat illustration of code brackets and a tag icon

Structured data is how you tell a crawler what a product is, without making it infer anything from marketing copy. On a product page that means Product markup in JSON-LD: a block of machine-readable facts that sits alongside the page a shopper sees.

This post covers what to include, what Shopify gives you already, and how to check what you've got.

Why assistants lean on it

A language model can read your prose, but prose is ambiguous. “Runs small” could be a fit note or a review quote. Structured data has no such problem: a field means one thing, and every site uses the same field name for it. When an assistant has to compare six products quickly, the one with clean markup is the one it can compare.

The markup, with the fields that matter

Google's required properties are name, image, offers, offers.price, and offers.priceCurrency. Everything else below is recommended, and the recommended fields are what make a product comparable.

Product JSON-LD, with the recommended fields filled in
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Summit Trail Runner",
  "image": ["https://example.com/summit-trail-runner.jpg"],
  "description": "Trail running shoe for wet, soft ground. 5mm lugs, water-resistant upper, true to size.",
  "sku": "STR-42-GRN",
  "gtin13": "0123456789012",
  "brand": { "@type": "Brand", "name": "Example Co" },
  "material": "Recycled polyester upper, rubber outsole",
  "color": "Moss green",
  "size": "42 EU",
  "audience": { "@type": "PeopleAudience", "suggestedGender": "unisex" },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "128"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/summit-trail-runner",
    "price": "129.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}

Two details people get wrong:

  • The price in the markup must match the price on the page. A mismatch gets the markup ignored.
  • Only mark up what's visible. Ratings that appear nowhere on the page are a guidelines violation, not a shortcut.

Variants

A product in five sizes is one product, not five. Group them with ProductGroup and hasVariant, or point each variant at its parent with inProductGroupWithID. Google's variant documentation has the full shape. Ungrouped variants compete with each other and split whatever signal they have.

What Shopify already does

Most modern themes output basic Product JSON-LD: name, image, price, currency, availability. That covers the required set. What themes can't know is the rest: material, sizing, audience, identifiers, and the use-case wording that makes the listing answer a real question. Those come from your catalog data, and usually have to be added.

Check before assuming either way: themes differ, and apps sometimes add a second, conflicting block.

How to check your work

  1. Run a product URL through the Rich Results Test. Read the warnings, not only the errors: warnings are the recommended fields you're missing.
  2. In Search Console, open the Merchant listings report to see the issues across the catalog rather than one page at a time.
  3. View source and search for ld+json to confirm there's exactly one Product block, not two disagreeing ones.

Where this stops

Structured data is the floor. It makes your facts unambiguous; it doesn't invent facts you never wrote down. If your listing doesn't say what the product is for, no markup will fix that. See Google's product structured data guide for the full specification.

See what AI assistants say about your store today

Schedule an audit and we'll show you which products AI assistants recommend instead of yours, and what it takes to fix that.

Schedule an AI visibility audit
Structured data for Shopify product pages | Store AEO