I'm back with another Schema.org / Google inconsistency.

Our store sells many products that have different variants each with their own price. For example a heater may be sold in any of 8 BTU levels with a higher BTU heater costing more. We present all variants on the same product page and display a price range until the user selects their specific variant.

The question is how can I tell Google that the product has a price range? Or if I can enumerate the variants as individual sub-products with their own prices that may suffice.

What we've tried:

We started by using Offer's priceSpecification property. We tried this with both an itemtype of PriceSpecification and of UnitPriceSpecification. These left us with the Error: Incomplete microdata with schema.org. in Google's Structured Data Testing Tool and even more importantly with error Missing: price in our Webmaster Tool's Structured Data tab (which nuked our rich snippet). This is supposedly because Google erroneously expects the Offerprice property to always be set even if priceSpecification is in use (see: This SO post on priceSpecification ). Example:

<div itemtype="http://schema.org/Offer" itemscope itemprop="offers">
    <div itemtype="http://schema.org/UnitPriceSpecification" itemscope itemprop="priceSpecification" class="price-box">
        <span id="product-price-6048" class="price">$571.20 - $894.75</span>
        <meta content="571.2" itemprop="minPrice">
        <meta content="894.75" itemprop="maxPrice">
        <meta content="USD" itemprop="priceCurrency">

We also tried just passing the human-readable string "$571.20 - $897.75" as the Offerprice property. That obviously didn't work as Google didn't know how to parse it.

According to point 8 of this SEOMoz article you can use AggregateOffer as a workaround to list a price range for a product/product-set. However Schema.org clearly states AggregateOffer is for

When a single product is associated with multiple offers (for example, the same pair of shoes is offered by different merchants)

While it will likely work for now, using AggregateOffer in our case seems like a kludge that's liable to break.

So again, how can I inform Google that a product price is in a range depending on user selections? Has anyone had any success using the PriceSpecification for a product, especially to list a product price range? Or is there another way to accomplish the same result?

  • I see that your using itemscope="" is this because you copied from source using a browser? only reason I ask it should itemscope without the brackets. Commented Jul 2, 2014 at 21:49
  • I do not want to be critical of the schema.org specification especially since I am so grateful and supportive of the effort. But it is clearly frustrating and incomplete. It requires a lot of work and experimentation. I suspect that a re-work of the specification will become required at some point. You have my empathy. If I can help, I will chime in.
    – closetnoc
    Commented Jul 3, 2014 at 0:28
  • @bybe That's correct. Fixed now.
    – tbernard
    Commented Jul 3, 2014 at 3:28
  • In my case I'm showing products that are available from multiple vendors, with different prices but for the same product. Just putting in multiple itemprop="offers" each with its own price results in Google displaying a range of prices on the result, saying e.g. "$27.00 - $35.00". The collection of offers is wrapped in a single div with itemscope itemtype="http://schema.org/Product".
    – nhinkle
    Commented Aug 7, 2014 at 17:47

2 Answers 2


I had the same problem in a different context. My solution was to set the price of the offer to the lowest price and then specify an instance of PriceSpecification where I state the minimum price that is of EQUAL value to the value in the price tag and then a maximum price. This effectively means that there is a product with price X AND that X price corresponds to the minimum price.

It's not perfect, but at least all the data is there. I've done this in JSON-LD as it is the recommendation from Google, see the example above to specify more that one offer to the same product and then for each offer specify a price and a minimum price. You could also specify the maximum price. That way it is clear that the offer is a range:

  "@context": "http://schema.org",
  "@type": "Product",
  "description": "This Fancy Product is all you will ever need.",
  "name": "My Fancy Product",
  "model" :"https://www.freebase.com/m/02116f",
  "offers": [
    "@type": "Offer",
    "category": "base",
    "availability": "http://schema.org/InStock",
        "minPrice": "10.00",
        "priceCurrency": "EUR"
      "price": "10.00"
    "@type": "Offer",
    "category": "high-end",
    "availability": "http://schema.org/InStock",
        "minPrice": "50.00",
        "priceCurrency": "EUR"
      "price": "50.00"

After a month of testing different permutations of the SEOMoz AggregateOffer solution I've come to the conclusion it doesn't work. Until Google supports the PriceSpecification property of the offer and stops requiring a single fixed price for offer there isn't a way to list a group of products/variants under one price-range umbrella.

If anyone finds a better solution post it here.

  • Did you ever find a solution to this? I'm having a similar issue at MammothWorkwear.com on products offered on a Bulk Buy mammothworkwear.com/honeywell-multisafe-parka-jacket-p2689.htm Commented Jan 8, 2015 at 9:55
  • @JohnDoherty - No I haven't, sorry. But admittedly I haven't looked at it since I posted this. It's possible Google now supports the PriceSpec or some other markup.
    – tbernard
    Commented Jan 8, 2015 at 19:29
  • I find that Google can sometimes be an unrelenting jerk about some things. They get so rigid and can demand whatever they want because they are so huge. I had product related problems with my father's website in sending e-commerce data to Google because there was a lot of custom items that didn't have brand info or other specifications that they want. This was years ago and I had to give up on it.
    – Patrick
    Commented Apr 7, 2016 at 20:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.