Structured Data layout for complex pricing structure - schema.org

I'm working with products that have pricing structures based on bulk-buy offers. For example, the pricing for a product may be as follows:
Buy 10-19 and the value of 1 is $3
Buy 20-29 and the value of 1 is $2
Buy 30-39 and the value of 1 is $1
Buy 40 or more and the value of 1 is $0.50
Minimum quantity available to purchase is 10.
How can I mark this up properly in structured data (Microdata format)?
Currently I have:
<span itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<meta itemprop="priceCurrency" content="USD"/>
<meta itemprop="price" content="3" />
<span itemprop="eligibleQuantity" itemscope itemtype="http://schema.org/QuantitativeValue">
<meta itemprop="minValue" content="10" />
<meta itemprop="maxValue" content="19" />
<meta itemprop="value" content="Number" />
</span>
</span>
For each variant. Then I have:
<span itemprop="priceSpecification">
<span itemprop="eligibleQuantity" itemscope itemtype="http://schema.org/QuantitativeValue">
<meta itemprop="minValue" content="10" />
</span>
</span>
On the product block itself, to indicate the minimum quantity of 10.
I'm really not at all confident this is the right structure and tags to use. Could anybody lend some insight?

You are missing the actual PriceSpecification items (as values for the priceSpecification property). UnitPriceSpecification seems to be the appropriate sub-type in your case.
So the structure could look like this:
<div itemscope itemtype="http://schema.org/Offer">
<div itemprop="priceSpecification" itemscope itemtype="http://schema.org/UnitPriceSpecification"></div>
<div itemprop="priceSpecification" itemscope itemtype="http://schema.org/UnitPriceSpecification"></div>
<div itemprop="priceSpecification" itemscope itemtype="http://schema.org/UnitPriceSpecification"></div>
</div>
Personally I would provide a UnitPriceSpecification for the first level (10-19), too, instead of providing its properties directly under Offer:
<div itemprop="priceSpecification" itemscope itemtype="http://schema.org/UnitPriceSpecification">
<p itemprop="eligibleQuantity" itemscope itemtype="http://schema.org/QuantitativeValue">
<span itemprop="minValue">10</span>-<span itemprop="maxValue">19</span>
</p>
<p>$<span itemprop="price">3</span> <meta itemprop="priceCurrency" content="USD"/></p>
</div>
But I don’t know if there aren’t some consumers out there that might expect it directly under Offer.

Related

ItemList with QuantitativeValue for table lists

I am trying to create a schema to use with several tables that use a list of products (e.g. bottles) arranged based on either height, volume, width, etc.
I tried this Microdata:
<div itemscope itemtype="http://schema.org/ItemList" id="id1">
<ul>
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<meta itemprop="position" content="1" />
<span itemprop="item" itemscope itemtype="http://schema.org/Thing">
<span itemprop="name" class="name">Coke Bottle</span>
<span class="measure">
<span itemscope itemtype="http://schema.org/QuantitativeValue">
<span itemprop="value">2359</span>
<span itemprop="unitText">mm</span>
<meta itemprop="unitCode" content="MMT" />
</span> /
<span itemscope itemtype="http://schema.org/QuantitativeValue">
<span itemprop="value">92.52</span>
<span itemprop="unitText">in</span>
<meta itemprop="unitCode" content="INH" />
</span>
</span>
</span>
</li>
</ul>
</div>
The problem is that the measure is not associated directly with the product.
How can I structure this data using Microdata to maintain the measurement values using QuantitativeValue and make the ItemList work for my need?
These are just tables showing a list of product names ordered by these values either ascending or descending, they are not used for navigation, just presenting information based on aggregated data.
In your post I see the following contradictions:
The problem is that the measure is not associated directly with the product.
and
These are just tables showing a list of product names
However, if this is a product, you can use the following the valid markup for your list:
<div itemscope itemtype="https://schema.org/ItemList" id="id1">
<ul>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<meta itemprop="position" content="1" />
<span itemprop="item" itemscope itemtype="https://schema.org/Product">
<a itemprop="url" href=example.com/list.html#cokebottle><span itemprop="name" class="name">Coke Bottle</span></a>
<span class="measure" itemprop="additionalProperty" itemscope itemtype="https://schema.org/PropertyValue">
<span itemprop="value">2359</span>
<span itemprop="unitText">mm</span>
<meta itemprop="unitCode" content="MMT" />
<meta itemprop="propertyID" content="http://www.unece.org/fileadmin/DAM/cefact/recommendations/bkup_htm/add3lm.htm" /> /
<span itemprop="value">92.52</span>
<span itemprop="unitText">in</span>
<meta itemprop="unitCode" content="INH" />
<meta itemprop="propertyID" content="http://www.unece.org/fileadmin/DAM/cefact/recommendations/bkup_htm/add3hk.htm" />
</span>
</span>
</li>
</ul>
</div>
Here we used the guide of Google for Single, all-in-one-page list:
A single, all-in-one-page list hosts all list information, including full text of each item: for example, a gallery of recipes for various kinds of muffins, all contained on one page.
Note that the reference (s) for this markup must have the same URL, but different anchors such as #cokebottle in the above example. So it should be a list of all of which parts (and links to these parts) are installed on one web page.
Here we also use the type PropertyValue as embedded in the property additionalProperty. This property is part of the type Product so all markup is semantic relation and description for the specific product.
Also note that here we used the property propertyID with URL as the identifier of the value of this property.
You can’t associate a QuantitativeValue with a Thing.
The best practice is to use the most specific type available. In your case, this would be Product, or one of its sub-types, if it applies (IndividualProduct, ProductModel or SomeProducts).
This allows you to use the properties depth, height, weight, and width, all of which which can take a QuantitativeValue value.

How to code markup for Product in ItemList?

I have adapted a code taken from example 2 on http://schema.org/ItemList
How do I use it together with Product? On frontpage and some other pages I have a list of products for which I would like to have a better markup.
The following code gives the error
A value for the position field is required.
but Product doesn't have a position, so if there is a value for position it gives different error.
<ul itemscope itemtype="http://schema.org/ItemList">
<meta itemprop="numberOfItems" content="10" />
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Product">
<!-- <meta itemprop="position" content="1" /> -->
<a href="#" itemprop="url">
<img src="asdf.jpg" itemprop="image">
<div class="product-list__title" itemprop="name">
Product name
</div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<div itemprop="price">
$12
</div>
<link itemprop="availability" href="http://schema.org/InStock" />
</div>
</a>
</li>
</ul>
The itemListElement property has three expected values:
ListItem
Text
Thing
ListItem is also a Thing, but it’s listed explicitly because it has a special role here: ListItem provides the position property. If you need to convey the position of the list items, you have to provide ListItem values.
Note that not every ItemList needs this. Your example with using Product values is fine (apart from the meta element which can’t be a child of ul), and unless you try to qualify for Google’s rich result (this is what the error message is about), you could keep it like that.
If you do want to provide the positions, an itemListElement could look like this:
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<meta itemprop="position" content="1" />
<div itemprop="item" itemscope itemtype="http://schema.org/Product">
<!-- your Product -->
</div>
</li>

Using PropertyValue for ImageObject / Schema.org

Example is from http://schema.org/ImageObject
<div itemprop="exifData" itemscope itemtype="http://schema.org/PropertyValue">
<meta itemprop="name" content="Exposure Time">
<meta itemprop="value" content="1/659 sec.">
</div>
<div itemprop="exifData" itemscope itemtype="http://schema.org/PropertyValue">
<meta itemprop="name" content="FNumber">
<meta itemprop="value" content="f/4.0">
</div>
<div itemprop="exifData" itemscope itemtype="http://schema.org/PropertyValue">
<meta itemprop="name" content="MaxApertureValue">
<meta itemprop="value" content="2.00">
</div>
<div itemprop="exifData" itemscope itemtype="http://schema.org/PropertyValue">
<meta itemprop="name" content="Metering Mode">
<meta itemprop="value" content="Pattern">
</div>
<div itemprop="exifData" itemscope itemtype="http://schema.org/PropertyValue">
<meta itemprop="name" content="Flash">
<meta itemprop="value" content="Flash did not fire.">
</div>
These itemprop names and values are completely custom, right? My question is, is there a naming convention? Because MaxApertureValue in example is written as one word and in CamelCase, while Metering Mode is normal. Wouldn't it be better if I just put Aperture?
Yes, it’s up to the author which names (i.e., values for the name property) to use. Of course it makes sense to use standard names, should they exist.
In this example, the author marks up the Exif data exactly like it’s specified in the file:
<!-- We assume the following EXIF meta-data is available, but currently not shown:
Exposure Time: 1/659 sec.
FNumber: f/4.0
MaxApertureValue: 2.00
Metering Mode: Pattern
Flash: Flash did not fire.
-->
I don’t know Exif, but according to its Wikipedia article, the names seem to be written like that (i.e., MaxApertureValue, Metering Mode etc.).
So this is what consumers would likely expect for the exifData property.

schema.org event syntax for all day events and subEvents

Tried to Google out but came empty handed. I'm looking for a snippet containing example markup.
How should I mark all-day events?
How should I mark concerts having multiple performances with varying locations (for same data multiple start and end dates) aka. subEvents? This is what I tried:
<section itemscope itemtype="http://data-vocabulary.org/Event"><!-- section per event -->
<a href="/test#event_17" id="event_17" itemprop="url">
<h3><!-- visual title when and where -->
<div itemprop="summary"><!-- summary what the event is for -->
Summary text
</div>
</h3>
</a>
<span itemprop="location" class="location">
Location name
</span>
<span itemprop="subEvent" itemscope itemtype="http://data-vocabulary.org/Event">
<a href="/test#event_17_1" id="event_17_1" itemprop="url">
<time itemprop="startDate" datetime="2014-09-15T15:00:00+03:00">00:00</time>
—
<time itemprop="endDate" datetime="2014-09-15T17:00:00+03:00">00:00</time>
</a>
</span>
<span itemprop="subEvent" itemscope itemtype="http://data-vocabulary.org/Event">
<a href="/test#event_17_2" id="event_17_2" itemprop="url">
<time itemprop="startDate" datetime="2014-10-10T20:00:00+03:00">00:00</time>
—
<time itemprop="endDate" datetime="2014-10-10T22:00:00+03:00">00:00</time>
</a>
</span>
<div itemprop="description"><!-- details of the event -->
Description
</div>
</section>
Based solely on http://www.google.com/webmasters/tools/richsnippets
How should I mark all-day events?
For all day events it seems that the appropriate way is to give only datetime value. End date is not required.
2015/02/17
How should I mark concerts having multiple performances with varying locations (for same data multiple start and end dates) aka. subEvents?
Notice itemref to concert name.
<h1 itemscope=""><span id="concertName" itemprop="name">Foo</h1>
<p>
<span itemscope="" itemtype="http://schema.org/MusicEvent" itemref="concertName">
<strong>Wed 3.12.2014</strong> 10:05
<span itemprop="location" itemscope="" itemtype="http://schema.org/Place">
<span itemprop="name">Concert Hall</span>
</span>
<meta itemprop="startDate" content="2014-12-03T10:05:00+02:00" />
<meta itemprop="url" content="http://www.example.com/concert/8" />
</span>
<span itemscope="" itemtype="http://schema.org/MusicEvent" itemref="concertName">
<strong>Fri 26.12.2014</strong> 10:05
<span itemprop="location" itemscope="" itemtype="http://schema.org/Place">
<span itemprop="name">Concert Hall</span>
</span>
<meta itemprop="startDate" content="2014-12-26T10:05:00+02:00" />
<meta itemprop="url" content="http://www.example.com/concert/8" />
</span>
</p>

Add geodata for both locations

For a restaurant with two physical locations I am trying to add geo data to the rich snippets for both locations. When I add geodata for itemtype restaurant, the code validates, but then I can only add one location. Adding geo data in other parts results in errors like: Error: Page contains property "geo" which is not part of the schema.
I am trying to add this code:
<div itemprop="geo" itemscope itemtype="http://schema.org/GeoCoordinates">
<meta itemprop="latitude" content="37.7793" />
<meta itemprop="longitude" content="-122.4192" />
</div>
The code below is the complete rest of code which validates correctly. Any suggestions/comments are also very welcome.
<div itemscope itemtype="http://schema.org/Restaurant">
<span itemprop="name">Our Restaurant</span><br><br>
<meta itemprop="description" content="The best" />
<meta itemprop="servesCuisine" content="West European" />
<meta itemprop="menu" content="url/menu" />
<meta itemprop="paymentAccepted" content="Pin, Vpay" />
<meta itemprop="logo" content="link to logo" />
<meta itemprop="url" content="url" />
<meta itemprop="acceptsReservations" content="0123 12345678910">
<meta itemprop="email" content="info#myrestaurant.nl" />
</div>
<div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
<span itemprop="streetAddress">Address</span>,
<span itemprop="postalCode">12345</span>
<span itemprop="addressLocality">City</span><br><br>
<meta itemprop="telephone" content="01234 12345678910" />
</div>
<div itemprop="location" itemscope itemtype="http://schema.org/PostalAddress">
<span itemprop="streetAddress">Address1</span>,
<span itemprop="postalCode">54321</span>
<span itemprop="addressLocality">City1</span><br><br>
<meta itemprop="telephone" content="+10 12345678910" />
</div>
het, as your markup currently sits, you have three separate and independent schema types, and search engines will not be able to understand the relationship between them. First, you need to nest the PostalAddress type within the Restaurant schema type, like this:
<div itemscope itemtype="http://schema.org/Restaurant">
<span itemprop="name">Our Restaurant</span><br><br>
<meta itemprop="description" content="The best" />
<meta itemprop="servesCuisine" content="West European" />
<meta itemprop="menu" content="url/menu" />
<meta itemprop="paymentAccepted" content="Pin, Vpay" />
<meta itemprop="logo" content="link to logo" />
<meta itemprop="url" content="url" />
<meta itemprop="acceptsReservations" content="0123 12345678910">
<meta itemprop="email" content="info#myrestaurant.nl" />
<div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
<span itemprop="streetAddress">Address</span>,
<span itemprop="postalCode">12345</span>
<span itemprop="addressLocality">City</span><br><br>
<meta itemprop="telephone" content="01234 12345678910" />
</div>
</div>
You also need to use two separate Restaurant types, one for each location. You can show the relationship between the two by using either the "branchOf" property or the "subOrganizaiton" property. But each location must use its own Restaurant schema type and then the PostalAddress type must be nested within each.