---
title: "Ecommerce schema markup: products, offers, and variants."
description: "Build your store's Product, Offer, ProductGroup, and breadcrumb JSON-LD. Match price and stock to the page, then test rich-result eligibility."
canonical: "https://scalewithsearch.com/articles/ecommerce-schema-markup"
date: "2026-03-20"
modified: "2026-09-25"
---
## Site navigation

- [Scale With Search](https://scalewithsearch.com/)
- Real estate
  - Real estate
    - [Real estate](https://scalewithsearch.com/for/real-estate)
- Work
  - Start here
    - [Send your brief](https://scalewithsearch.com/work#send-your-brief)
    - [Prepare your six-question brief](https://scalewithsearch.com/work#prepare-your-six-question-brief)
  - Build
    - [Site build, content library with SEO, signal desk](https://scalewithsearch.com/work)
- For your business
  - Trades and home services
    - [Auto body and collision shops](https://scalewithsearch.com/for/auto-body-and-collision-shops)
    - [Foundation and home repair contractors](https://scalewithsearch.com/for/foundation-and-home-repair)
    - [Garage door and fencing contractors](https://scalewithsearch.com/for/garage-door-and-fencing-contractors)
    - [HVAC contractors](https://scalewithsearch.com/for/hvac-contractors)
    - [Janitorial and commercial cleaning companies](https://scalewithsearch.com/for/janitorial-and-commercial-cleaning)
    - [Locksmiths](https://scalewithsearch.com/for/locksmiths)
    - [Moving companies](https://scalewithsearch.com/for/moving-companies)
    - [Pest control companies](https://scalewithsearch.com/for/pest-control-companies)
    - [Plumbing and electrical contractors](https://scalewithsearch.com/for/plumbing-and-electrical-contractors)
    - [Restoration and water or fire damage companies](https://scalewithsearch.com/for/restoration-and-water-fire-damage)
    - [Roofing companies](https://scalewithsearch.com/for/roofing-companies)
    - [Towing companies](https://scalewithsearch.com/for/towing-companies)
    - [Tree services and landscaping companies](https://scalewithsearch.com/for/tree-services-and-landscaping)
    - [Solar installers](https://scalewithsearch.com/for/solar-installation)
    - [General contractors](https://scalewithsearch.com/for/general-contractors-and-construction)
    - [Paving, concrete, and flooring contractors](https://scalewithsearch.com/for/paving)
  - Practices and professional services
    - [Bookkeeping and tax practices](https://scalewithsearch.com/for/bookkeeping-and-tax-practices)
    - [Dental practices](https://scalewithsearch.com/for/dental-practices)
    - [Family and criminal defense law firms](https://scalewithsearch.com/for/family-and-criminal-defense-law-firms)
    - [Med spas and aesthetics practices](https://scalewithsearch.com/for/med-spas-and-aesthetics)
    - [Personal injury law firms](https://scalewithsearch.com/for/personal-injury-law-firms)
    - [Veterinary clinics](https://scalewithsearch.com/for/veterinary-clinics)
    - [Gyms and fitness studios](https://scalewithsearch.com/for/fitness)
    - [Therapy and outpatient health practices](https://scalewithsearch.com/for/therapy-and-outpatient-health)
    - [Medical billing companies](https://scalewithsearch.com/for/medical-billing)
    - [Insurance agencies](https://scalewithsearch.com/for/insurance-agencies)
    - [Financial advisors](https://scalewithsearch.com/for/financial-advisors)
    - [Property management companies](https://scalewithsearch.com/for/property-management)
    - [Recruiting and staffing agencies](https://scalewithsearch.com/for/recruiting-and-staffing)
    - [Architects and interior designers](https://scalewithsearch.com/for/architects-and-interior-designers)
    - [Logistics and supply chain companies](https://scalewithsearch.com/for/logistics-and-supply-chain)
  - Agencies, MSPs, and manufacturing
    - [IT and managed service providers](https://scalewithsearch.com/for/it-and-managed-service-providers)
    - [Machine shops and precision manufacturers](https://scalewithsearch.com/for/machine-shops-and-precision-manufacturing)
    - [Marketing agencies and freelancers](https://scalewithsearch.com/for/marketing-agencies-and-freelancers)
    - [SEO agencies and consultants](https://scalewithsearch.com/for/seo-agencies-and-consultants)
    - [Small manufacturers and fabricators](https://scalewithsearch.com/for/small-manufacturers-and-fabricators)
  - Restaurants, shops, studios, and nonprofits
    - [Restaurants and hospitality businesses](https://scalewithsearch.com/for/restaurants-and-hospitality)
    - [Retail stores and ecommerce sellers](https://scalewithsearch.com/for/retail-and-ecommerce)
    - [Photographers, event planners, and travel agents](https://scalewithsearch.com/for/photographers)
    - [Churches and nonprofits](https://scalewithsearch.com/for/churches-and-nonprofits)
  - [All industries](https://scalewithsearch.com/for/)
- Learn
  - For your office
    - [Office job guides](https://scalewithsearch.com/guides/)
    - [Browser calculators](https://scalewithsearch.com/tools/)
  - Start here
    - [How it works](https://scalewithsearch.com/how-it-works)
    - [Free Starter Kit](https://scalewithsearch.com/kit/business-memory-starter-kit.zip)
    - [Synthetic specimen](https://scalewithsearch.com/specimen/working-session-specimen.zip)
  - Guides
    - [The Complete Guide to Business Memory for AI Agents](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [The Complete Small-Business Guide to AI Agent Governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [The Complete Guide to Leaving Vendor AI Memory](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - Articles by cluster
    - [Business memory](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [Agent governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [Migration and ownership](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - For machines
    - [llms.txt](https://scalewithsearch.com/llms.txt)
    - [llms-full.txt](https://scalewithsearch.com/llms-full.txt)
    - [Machine view](https://scalewithsearch.com/?view=machine)
- Company
  - Evidence
    - [Proof](https://scalewithsearch.com/proof)
  - Company
    - [About](https://scalewithsearch.com/about)

# Add Product, Offer, and Breadcrumb markup that makes your store eligible for rich results.

A competitor's listing shows a price, a star rating, and "In stock" under its title. The store's own listing for the same boot shows two lines of text. The difference is often structured data: machine-readable facts about the product that Google can show in its results.

Structured data does not raise rankings on its own. It makes a page eligible for richer result formats, and it gives Google clear facts about price, availability, and variants. For a store, that eligibility applies to product results, merchant listings, and breadcrumb trails. This article shows you which types a store needs, how to write them, and how to check them.

## Know which rich results a store can earn

Google documents two product result types that use `Product` markup:

- **Merchant listing experiences**, for pages where a shopper can buy the product. These can show price, availability, shipping, and returns across Google surfaces.
- **Product snippets**, for product pages where shoppers cannot buy directly, such as review pages. These can show ratings, review counts, and price. A store page with the merchant listing properties can also be eligible for product snippets.

`BreadcrumbList` markup makes a page eligible to show its breadcrumb trail in desktop results (checked September 2026). `Organization` markup describes the store itself. Since June 2024, Google has accepted a store-wide return policy there.

Some formats are not worth building. In 2023, Google limited FAQ rich results to authoritative government and health sites and retired HowTo rich results. Google also does not show review stars for reviews that a business publishes about itself as a `LocalBusiness` or `Organization`. Product reviews on product pages remain eligible. For the full list of types and their status, read the [schema markup types guide](/articles/schema-markup-types-guide).

## Follow Google's general rules first

Four rules apply to every block:

1. Use JSON-LD, the format Google recommends.
2. Mark up only content that the page shows. The price, availability, and rating in the markup must match what the shopper sees.
3. Update the markup when the page changes. A stale price or a wrong stock status is a mismatch.
4. Put the markup on the page it describes, not on a listing page that links to it.

Place each JSON-LD block in the page's HTML inside a script element with the type `application/ld+json`. Generate the markup from the same data that renders the page, so that the two cannot drift apart. The rendering side of JSON-LD is in [structured data with JSON-LD for developers](/articles/structured-data-jsonld-developers).

## Mark up a single product and its offer

A product page where the shopper can buy needs three things in its markup. They are the product name, an image, and an offer with a price and a currency. Add availability, brand, a global identifier such as a GTIN, and the item condition when you have them. Add ratings only when the page shows them.

```json
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Trail Mid Waterproof Hiking Boot",
  "image": ["https://example.com/images/trail-mid-black.jpg"],
  "description": "Mid-cut hiking boot with a waterproof membrane.",
  "sku": "TM-WP-BLK",
  "gtin13": "0000000000000",
  "brand": {"@type": "Brand", "name": "Example Brand"},
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/boots/trail-mid-waterproof",
    "price": "119.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "87"
  }
}
```

The values in the sample are placeholders. Replace each one with the page's own data.

Google also documents shipping details and return policies on the offer, through `shippingDetails` and `hasMerchantReturnPolicy`. Add them when the terms are stable and shown on the page.

When a product goes out of stock, change `availability` to `OutOfStock` or `BackOrder`. Keep the page live if the product will return. The page-level treatment is in [out-of-stock pages and SEO](/articles/out-of-stock-pages-seo).

## Mark up variants with ProductGroup

Many products come in sizes and colors. Since February 2024, Google has documented variant markup. A `ProductGroup` holds the shared data and lists what the variants differ by. It names each variant as a `Product`.

```json
{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Trail Mid Waterproof Hiking Boot",
  "productGroupID": "TM-WP",
  "brand": {"@type": "Brand", "name": "Example Brand"},
  "variesBy": ["https://schema.org/color", "https://schema.org/size"],
  "hasVariant": [
    {
      "@type": "Product",
      "sku": "TM-WP-BLK-9",
      "name": "Trail Mid Waterproof Hiking Boot, black, size 9",
      "color": "Black",
      "size": "9",
      "image": "https://example.com/images/trail-mid-black.jpg",
      "offers": {
        "@type": "Offer",
        "url": "https://example.com/boots/trail-mid-waterproof?color=black&size=9",
        "price": "119.00",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
      }
    },
    {
      "@type": "Product",
      "sku": "TM-WP-BRN-9",
      "name": "Trail Mid Waterproof Hiking Boot, brown, size 9",
      "color": "Brown",
      "size": "9",
      "image": "https://example.com/images/trail-mid-brown.jpg",
      "offers": {
        "@type": "Offer",
        "url": "https://example.com/boots/trail-mid-waterproof?color=brown&size=9",
        "price": "119.00",
        "priceCurrency": "USD",
        "availability": "https://schema.org/OutOfStock"
      }
    }
  ]
}
```

Give each variant a URL that preselects it. Google can then send a shopper to the right size and color. List every variant the page offers, with its own availability. How the page itself handles variant URLs and canonicals is in [ecommerce product page optimization](/articles/ecommerce-seo-product-page-optimization).

## Mark up breadcrumbs and the store

Add `BreadcrumbList` to product and category pages. It must match the visible breadcrumb trail:

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type": "ListItem", "position": 1, "name": "Boots", "item": "https://example.com/boots"},
    {"@type": "ListItem", "position": 2, "name": "Waterproof hiking boots", "item": "https://example.com/boots/waterproof"},
    {"@type": "ListItem", "position": 3, "name": "Trail Mid Waterproof Hiking Boot"}
  ]
}
```

The last item is the current page, so it needs no `item` URL.

Add `Organization` markup to the homepage or the about page: the store's name, logo, URL, and contact details. Add a store-wide return policy there if one policy covers every product.

Category pages list many products. Google documents `ItemList` carousel markup for a limited set of content types and regions. Check its current documentation before you expect a rich result from a category page. Breadcrumbs and a clean product grid do more for a category page. The category template itself is covered in [ecommerce category page SEO](/articles/ecommerce-category-page-seo).

## Test before release and monitor after

Before release, test a sample of pages:

1. Run each page type through Google's Rich Results Test. It shows which rich results the page is eligible for and lists errors and warnings.
2. Run the same pages through the Schema Markup Validator for general schema.org validity.
3. Compare the markup values with the visible page: price, availability, rating, and variant options.
4. Test a product that is out of stock and a product with variants, because those cases break most often.

After release, open the **Merchant listings** and **Product snippets** reports in Search Console. They list valid items, items with warnings, and invalid items, with the error for each. Filter the Performance report by search appearance to see impressions and clicks for these result types. Fix errors in the template, then use **Validate fix** in the report.

If the store also sends a product feed to Google Merchant Center, keep the feed and the markup consistent. A price in the feed that differs from the price on the page causes disapprovals.

## Fix the errors stores hit most often

Most store markup problems come from a short list:

- a price or availability in the markup that differs from the page, often because the markup is cached and the page is not;
- an empty `aggregateRating` block on products with no reviews;
- a missing `priceCurrency`, or a price written with a currency symbol or thousands separator instead of a plain number;
- variants that share one URL, so Google cannot send the shopper to the right option;
- markup that a plugin and the theme both output, which leaves two conflicting Product blocks on one page.

Search the rendered HTML for `application/ld+json` to count the blocks on a page. Keep one source of truth per type.

## Worked example: one product template

The inputs are hypothetical. A store sells hiking boots in 40 sizes and 12 colors. Each model has one page with size and color selectors. The page shows the price, stock by size, and a rating from on-site reviews. It has no structured data.

**Step 1: choose types.** The product template gets `ProductGroup` with variants. Category and product templates get `BreadcrumbList`. The about page gets `Organization` with the store-wide return policy. The owner drops a plan for FAQ markup after a check of the 2023 restriction.

**Step 2: generate from data.** The developer builds the JSON-LD from the same product record that renders the page. Each variant's availability comes from the stock table. An out-of-stock size then shows `OutOfStock` in the markup and on the page at the same time.

**Step 3: test.** The developer runs 5 pages through the Rich Results Test. The set is an in-stock model, a model with one size out of stock, a model with no reviews, and two category pages. The model with no reviews had an empty rating block, which is an error. The developer changes the template to omit `aggregateRating` when there are no reviews.

**Step 4: release and watch.** After release, the owner checks the Merchant listings and Product snippets reports each week for a month. The owner fixes each new error class in the template and records impressions by search appearance for later comparison.

----

```text
                  .|########||.                                       .|########||.                                       .|########||.
               |##||.      .||##|.                                 |##||.      .||##|.                                 |##||.      .||##|.
             |#|.              .|#|.                             |#|.              .|#|.                             |#|.              .|#|.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
        .#.                          .#|                    .#.                          .#|                    .#.                          .#|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
      |#             ......             #|                |#             ......             #|                |#             ......             #|
     .#           ||#########|           #|              .#           ||#########|           #|              .#           ||#########|           #|
    .#.         |######||######|.        .#.            .#.         |######||######|.        .#.            .#.         |######||######|.        .#.
    #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#
   ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||
   #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #
 ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||
 #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#
 #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.
.|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||
||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||
#.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#
#    .||####|###########################|.     #    #    .||####|###########################|.     #    #    .||####|###########################|.     #
#      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #
#      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #
#      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #
#      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #
#   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #
#. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#
|| |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||
|| ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||
.# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.
 #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#
 ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||
  #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.
   ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||
    #.        .######|#|#########|        .#            #.        .######|#|#########|        .#            #.        .######|#|#########|        .#
    .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.
     |#           ||########||           #.              |#           ||########||           #.              |#           ||########||           #.
      |#             ......             #|                |#             ......             #|                |#             ......             #|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
        |#.                          .#.                    |#.                          .#.                    |#.                          .#.
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
            .|#|.              .|#|.                            .|#|.              .|#|.                            .|#|.              .|#|.
               |##||.      .||##|                                  |##||.      .||##|                                  |##||.      .||##|
                 .||########||.                                      .||########||.                                      .||########||.

Scale With Search  2026  [scalewithsearch.com](https://scalewithsearch.com)
```
