Page Summary
-
Structured data on hotel webpages, using schema.org's
HotelandHotelRoomin JSON-LD format, helps Google validate pricing information for Google Hotels. -
Structured data values must match the visible information on your website to improve price accuracy validations and aid debugging.
-
Required properties for
Hotelincludename,address, andmakesOffer, with nested details for offers and pricing. -
Required properties for
HotelRoomincludeoffers, with nested pricing and optional details likebedandoccupancy. -
Various optional properties like
hasMerchantReturnPolicy,eligibleCustomerType,includesObject,availability, andamenityFeaturecan provide additional information for hotels and rooms.
This page provides the technical specification and vocabulary reference for Schema.org hotel structured data markups.
Overview
Hotel price structured data provides a standardized, machine-readable format to explain, validate, and display hotel prices listed on your website, regardless of your visual layout. This includes base prices, rates, room specifications, itemized fees and taxes, and booking policies.
Google recommends that you annotate your webpages with standardized structured data provided by Schema.org to accurately extract prices from your webpages.
Standard structured data allows for scaling price accuracy validations through improving the reliability of crawlers, increasing the number of price accuracy validations, enabling direct debugging of price accuracy issues, and maintaining a consistent price accuracy score.
If you're new to structured data, learn more about structured data vocabulary and format.
Google Hotels recommends Microdata format by default to annotate your
webpages for hotel price accuracy checks. The JSON-LD format is deprecated
for price accuracy validation. Note that this recommendation applies strictly
to hotel price accuracy validation and doesn't affect other usages of
structured data across Google (such as Google Search rich results). To learn
more about formats supported for general Search features, see
supported formats.
This documentation provides detailed reference content specific to structured
data implementation in Hotels.
Hotel structured data is used to annotate hotel-specific fields in your
web page. Hotel structured data has the following properties:
nameandaddresspropertiesmakesOfferpropertyHotel priceSpecificationpropertyhasMerchantReturnPolicypropertyeligibleCustomerTypeproperty
HotelRoom structured data is used to annotate room-specific fields in
your web page.
HotelRoom structured data has the following properties:
offerspropertybedandoccupancypropertiesHotelRoom priceSpecificationpropertyincludesObjectpropertyavailabilitypropertyamenityFeatureproperty
Navigation attributes are used to explain interactive elements and page states to crawlers. For more information, see navigation tagging.
Hotel structured data
The following properties apply to the Hotel entity.
name and address properties
name and address properties are used to annotate the hotel's name and
location. The following are the name and address properties:
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "XX",
"addressLocality": "City Name",
"addressRegion": "State Name",
"postalCode": "01234",
"streetAddress": "1234 Main St."
},
Syntax
The name and address properties uses the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">hotel-name</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<span itemprop="streetAddress">1234 Main St.</span>,
<span itemprop="addressLocality">City Name</span>,
<span itemprop="addressRegion">State Name</span>
<span itemprop="postalCode">01234</span>
<span itemprop="addressCountry">XX</span>
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "XX",
"addressLocality": "City Name",
"addressRegion": "State Name",
"postalCode": "01234",
"streetAddress": "1234 Main St."
},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"]
...
}
}
Properties
The following are the name and address properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| Hotel.name | Required | string | The name of the hotel |
| Hotel.identifier | Required | string | The partners' hotel ID. Identifier must be a unique string per hotel, and should exactly match with the string used in the price feed. |
| Hotel.address | Optional | PostalAddress | The address or location of the hotel. |
Name and address example
The following is a basic example of adding name and address annotations:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<h1 itemprop="name">Mountain Hotel</h1>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<span itemprop="streetAddress">Technikerstrasse 21</span>,
<span itemprop="addressLocality">Innsbruck</span>,
<span itemprop="addressRegion">Tyrol</span>
<span itemprop="postalCode">6020</span>
<span itemprop="addressCountry">AT</span>
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "Mountain Hotel",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "AT",
"addressLocality": "Innsbruck",
"addressRegion": "Tyrol",
"postalCode": "6020",
"streetAddress": "Technikerstrasse 21"
},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
makesOffer property
makesOffer annotations are used to markup
your hotel itineraries.
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/InStock",
...
}
Syntax
The makesOffer property uses the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">hotel-name</span>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
Check-out: <time itemprop="checkoutTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
<meta itemprop="availability" content="https://schema.org/InStock"/>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
...
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"address": { ... },
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/InStock",
"priceSpecification": { ... }
}
}
Properties
The following are the makesOffer properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| makesOffer | Required | Offer and LodgingReservation | The hotel offer(s) for the given itinerary.
The |
| LodgingReservation.checkinTime | Required | DateTime | The check-in time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered. |
| LodgingReservation.checkoutTime | Required | DateTime | The check-out time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered. |
makesOffer example
The following is a basic example to annotate your hotel offers. You can specify multiple offers for an itinerary but you should specify the Google-displayed rate first followed by other rates. The price amount specified includes all applicable taxes.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">Mountain Hotel</span>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1200.74</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "Mountain Hotel",
"identifier": "hotel-id-1234",
"address": { ... },
"makesOffer": [
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
},
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1200.74,
"priceCurrency": "USD"
}
}
]
}
Hotel priceSpecification property
This property is used to annotate pricing information for your hotel or hotel
rooms. There are two additional properties that are required to annotate your
prices and taxes. You should use CompoundPriceSpecification
to specify the total pricing information such as base rate, taxes and discounts.
Use UnitPriceSpecification
to specify additional taxes or special types of charges
such as ResortFee, GenericTax and ServiceFee. priceSpecification
property is bundled with the Offer property.
{
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency"
},
...
]
}
}
Syntax
The Hotel priceSpecification property uses the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">hotel-name</span>
...
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name"></span>
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
<meta itemprop="priceComponentType" content="GenericTax"/>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Discount</span>
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
<meta itemprop="priceComponentType" content="Discount"/>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "",
"price": "float",
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "GenericTax",
"potentialAction": {
"@type": "https://schema.org/PayAction",
"recipient": {
"@type": "OnlineBusiness",
"name": "name-of-the-business"
}
}
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "Discount"
}
]
}
}
}
Properties
The following are the hotel priceSpecification properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| Hotel.Offer.priceSpecification.price | Required | float | The total price including taxes and fees for the hotel. Google rate should always be annotated on your landing page along with your complete rate details. Annotating rate details lets you complete price accuracy checks. Google accepts both hotel-level and room-level prices. |
| Hotel.Offer.priceSpecification.priceCurrency | Required | currency | A three-letter currency code for the specified price. Eg: "USD"
. |
| Hotel.Offer.priceSpecification.priceComponent | Optional | UnitPriceSpecification[] | The total price breakdown including taxes and fees for the hotel. There are two types of price structured data:
You must set the values in the |
| Hotel.Offer.priceSpecification.priceComponent. potentialAction | Optional | PayAction | The hotel point of payment.The hotel payment flows include prices that are charged during check-out time on the booking site and at the hotel during check-in. You should use the Google supports the following two settings for
|
Examples
The following are examples of hotel price specifications.
Price
The following is a basic example of adding price structured data to your
web page. Multiple hotel-level offers can be included in the
makesOffer property.
PostalAddress types such as addressCountry, postalCode,
streetAddress and other fields are mandatory if you choose to specify the
address property. The Google-displayed rate should be listed first in the
makesOffer property. The price amount specified includes all applicable
taxes.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">ACME Hotel</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<span itemprop="streetAddress">Technikerstrasse 21</span>,
<span itemprop="addressLocality">Innsbruck</span>,
<span itemprop="addressRegion">Tyrol</span>
<span itemprop="postalCode">6020</span>
<span itemprop="addressCountry">AT</span>
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1200.74</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "AT",
"addressLocality": "Innsbruck",
"addressRegion": "Tyrol",
"postalCode": "6020",
"streetAddress": "Technikerstrasse 21"
},
"makesOffer": [
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
},
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1200.74,
"priceCurrency": "USD"
}
}
]
}
Price breakdown
The following is an example of the priceSpecification property with the
price breakdown. The base rate, taxes such as generic tax and discount are
defined using the UnitPriceSpecification component. Remember to set the
priceComponentType field with the values corresponding to the
UnitPriceSpecification component.
The total price for the length of stay should be specified in the
CompoundPriceSpecification property. The price breakdown should be
specified in the priceComponent property.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<h1 itemprop="name">ACME Hotel</h1>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<span itemprop="streetAddress">123 Main street</span>,
<span itemprop="addressLocality">Mountain View</span>,
<span itemprop="addressRegion">Santa Clara</span>
<span itemprop="postalCode">94040</span>
<span itemprop="addressCountry">US</span>
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
Total Price: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
<!-- Price Components -->
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Base Rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1150</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">172.74</span>
<meta itemprop="priceComponentType" content="GenericTax" />
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Discount</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">-100</span>
<meta itemprop="priceComponentType" content="Discount" />
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {...},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "",
"price": 1150,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "USD",
"priceComponentType": "GenericTax"
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": -100,
"priceCurrency": "USD",
"priceComponentType": "Discount"
}
]
}
}
}
Point of payment
The following is an example of potentialAction specification in using
PayAction's recipient type.
The total price of the package is $1170 and the online website charges part
of the total price which is $1150 at the time of booking specified using the
"@type": "OnlineBusiness" and the user has to pay the remaining $20 at
the time of check-in at the hotel which is specified using the
@type": "Hotel".
You must specify the potentialAction component in order to break down
payment at the time of booking and at the hotel. If it isn't specified, then
payAction interprets the payment at the time of booking as the default
payment method.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">ACME Hotel</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
Price Due: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1170</span>
<!-- Paid Online -->
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1150</span>
<div itemprop="potentialAction" itemscope itemtype="https://schema.org/PayAction">
<div itemprop="recipient" itemscope itemtype="https://schema.org/OnlineBusiness">
<span itemprop="name">myonlinebusiness</span>
</div>
</div>
</div>
<!-- Paid at Hotel -->
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">20</span>
<div itemprop="potentialAction" itemscope itemtype="https://schema.org/PayAction">
<div itemprop="recipient" itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">The Langham, Boston</span>
</div>
</div>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00]",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1170,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"price": 1150,
"priceCurrency": "USD",
"potentialAction": {
"@type": "https://schema.org/PayAction",
"recipient": {
"@type": "OnlineBusiness",
"name": "myonlinebusiness"
}
}
},
{
"@type": "UnitPriceSpecification",
"price": 20,
"priceCurrency": "USD",
"potentialAction": {
"@type": "https://schema.org/PayAction",
"recipient": {
"@type": "Hotel",
"name": "The Langham, Boston",
"address": { ... }
}
}
}
]
}
}
}
hasMerchantReturnPolicy property
This property is used to annotate the merchant refund policy in the itineraries.
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"refundType": "https://schema.org/FullRefund",
"merchantReturnDays": "YYYY-MM-DD[THH:mm:ss]",
"restockingFee": 0
}
Syntax
The hasMerchantReturnPolicy has the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
...
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
<div itemprop="hasMerchantReturnPolicy" itemscope itemtype="https://schema.org/MerchantReturnPolicy">
<link itemprop="returnPolicyCategory" href="https://schema.org/MerchantReturnFiniteReturnWindow"/>
<link itemprop="refundType" href="https://schema.org/FullRefund"/>
<meta itemprop="merchantReturnDays" content="YYYY-MM-DDTHH:mm:ss"/>
<meta itemprop="restockingFee" content="0"/>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": { ... },
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"refundType": "https://schema.org/FullRefund",
"merchantReturnDays": "YYYY-MM-DD[THH:mm:ss]",
"restockingFee": 0
}
}
}
Property
The following is the hasMerchantReturnPolicy property:
| Attribute | Required? | Type | Description |
|---|---|---|---|
| Offer.hasMerchantReturnPolicy | Optional | MerchantReturnPolicy | The merchant refund policy. Partners should use
If |
Return policy example
The following is a basic example of structured data for a hotel with room
details and total price with taxes and fees. This example denotes a stay
that can be canceled without any charges until 11 PM (UTC) on
December 18, 2023. Partners should use
"MerchantReturnPolicy.restockingFee" to indicate cancellation policies
that don't refund the full amount of the stay. The restockingFee defaults
to $0.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">ACME Hotel</span>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
<div itemprop="hasMerchantReturnPolicy" itemscope itemtype="https://schema.org/MerchantReturnPolicy">
<link itemprop="returnPolicyCategory" href="https://schema.org/MerchantReturnFiniteReturnWindow"/>
<link itemprop="refundType" href="https://schema.org/FullRefund"/>
Cancellation Deadline: <time itemprop="merchantReturnDays" content="2023-12-18T23:00:00">2023-12-18 23:00:00</time>
Fee: $<span itemprop="restockingFee">0</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"description": "Beautiful resort in the outskirts of the city",
"address": {...},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"priceSpecification": {...},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"refundType": "https://schema.org/FullRefund",
"merchantReturnDays": "2023-12-18 23:00:00",
"restockingFee": 0
}
}
}
eligibleCustomerType property
This property can be used to annotate the rewards programs provided for hotel membership customers.
"eligibleCustomerType": "RewardsMember",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency"
}
Syntax
The eligibleCustomerType property has the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
...
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="eligibleCustomerType" content="RewardsMember"/>
...
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"eligibleCustomerType": "RewardsMember",
"priceSpecification": { ... }
}
}
Property
The following is the eligibleCustomerType property:
| Attribute | Required? | Type | Description |
|---|---|---|---|
| Offer.eligibleCustomerType | Optional | BusinessEntityType | The loyalty programs or the member rewards offered for the customers. Many hotel pages display member rates together with public rates, to encourage users to sign up for their loyalty programs. Rates restricted to particular audiences, such as member rates, can be specified by setting theOffer.eligibleCustomerType property. |
Examples
The following are examples of rewards member rates.
Member rates
The following is a basic example of member pricing or fenced rate specification for loyalty programs. The customer is a "rewards member" of the hotel.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">ACME Hotel</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<!-- Address details -->
</div>
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<span itemprop="name">RewardsMember</span>
<meta itemprop="eligibleCustomerType" content="RewardsMember"/>
Check-in: <time itemprop="checkinTime" content="2023-12-15T16:00:00">Dec 15, 2023 4:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-12-20T11:00:00">Dec 20, 2023 11:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1342.74</span>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1069.98</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">172.74</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">ResortFee</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">100</span>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {...},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"name": "RewardsMember",
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"eligibleCustomerType": "RewardsMember",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1342.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1069.98,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "ResortFee",
"price": 100,
"priceCurrency": "USD"
}
]
}
}
}
Member and regular rates
This is an example of both regular and member rate prices annotations. The member pricing is listed first followed by regular rates.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">ACME Hotel</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<!-- Address details -->
</div>
<!-- Member Rate -->
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<span itemprop="name">RewardsMember</span>
<meta itemprop="eligibleCustomerType" content="RewardsMember"/>
Check-in: <time itemprop="checkinTime" content="2023-12-15T16:00:00">Dec 15, 2023 4:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-12-20T11:00:00">Dec 20, 2023 11:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1342.74</span>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1069.98</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="currency">$</span><span itemprop="price">172.74</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">ResortFee</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">100</span>
</div>
</div>
</div>
<!-- Regular Rate -->
<div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<span itemprop="name">regularRate</span>
Check-in: <time itemprop="checkinTime" content="2023-12-15T16:00:00">Dec 15, 2023 4:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-12-20T11:00:00">Dec 20, 2023 11:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1572.24</span>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1369.98</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="currency">$</span><span itemprop="price">202.26</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">ResortFee</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">100</span>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {...},
"makesOffer": [
{
"@type": ["Offer", "LodgingReservation"],
"name": "RewardsMember",
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"eligibleCustomerType": "RewardsMember",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1342.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1069.98,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "ResortFee",
"price": 100,
"priceCurrency": "USD"
}
]
}
},
{
"@type": ["Offer", "LodgingReservation"],
"name": "regularRate",
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"priceSpecification": {
"price": 1572.24,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1369.98,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 202.26,
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "ResortFee",
"price": 100,
"priceCurrency": "USD"
}
]
}
}
]
}
HotelRoom structured data
The following properties apply to the HotelRoom entity.
offers property
offers annotations are used to markup your room
itineraries. You should use the offers property for HotelRoom specification.
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "hotel-room-id-1234",
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": {...}
}
Syntax
The offers property has the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom">
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
Check-out: <time itemprop="checkoutTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
...
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "HotelRoom",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
...
}
}
}
Properties
The following are the offers properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| offers | Required | Offer and LodgingReservation | The room price specification for the given itinerary. The |
| LodgingReservation.checkinTime | Required | DateTime | The check-in time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered. |
| LodgingReservation.checkoutTime | Required | DateTime | The check-out time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered. |
offers example
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom">
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "HotelRoom",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
bed and occupancy property
The bed property is used to annotate the bed type and the number of beds
available in the room. The occupancy property is used to annotate the number
of guests in the room. bed and occupancy properties can be specified using
the HotelRoom property.
"@type": "Hotel",
"identifier": "hotel-id-1234",
"containsPlace": {
"@type": ["HotelRoom", "Product"],
"identifier": "hotel-room-id",
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
}
}
Syntax
The bed and occupancy properties has the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">hotel-name</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<span itemprop="name">room-name</span>
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<!-- Bed Details -->
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">integer</span>
<span itemprop="typeOfBed">KING</span>
</div>
<!-- Occupancy -->
<div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
Occupancy: <span itemprop="value">integer</span>
</div>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"containsPlace": {
"@type": ["HotelRoom", "Product"],
"name": "room-name",
"identifier": "hotel-room-id-1234",
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": {
"@type": "UnitPriceSpecification",
"name": "",
"price": "float",
"priceCurrency": "currency"
},
...
}
}
}
}
bed and occupancy properties can only be set by using the HotelRoom
property. Room-specific information, including room-level rates, can be included
to the Hotel property through the containsPlace property. Refer to the
Hotel and HotelRoom specification example.
Properties
The following are the bed and occupancy properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| HotelRoom.bed | Optional (Recommended) | bed | The type of bed(s) included in the accommodation and the number of occupants in the room. The supported values are:
|
| HotelRoom.occupancy | Optional (Recommended) | QuantitativeValue | The number of guests in the hotel room. The type for occupancy is a
Occupancy is an explicit property of
|
| containsPlace | Optional (Recommended) | LocationFeatureSpecification | It is used to annotate the room-level rates associated with specific rooms. It can also be used to specify the amenities in the room. Learn more on how to use |
Examples
The following are examples of bed and occupancy specifications.
HotelRoom example
The following is a basic example of beds and occupancies for a room specification.
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<span itemprop="name">Deluxe Room, 1 King Bed</span>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">KING</span>
</div>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">SINGLE</span>
</div>
<div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
Occupancy: <span itemprop="value">2</span>
</div>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id-1234",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
Hotel and HotelRoom example
The following is an example of annotating the Hotel and HotelRoom
properties along with bed, occupancy and priceSpecification.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">hotel-name</span>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<span itemprop="name">Deluxe Room, 1 King Bed</span>
<meta itemprop="identifier" content="hotel-room-id"/>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">KING</span>
</div>
<div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
Occupancy: <span itemprop="value">2</span>
</div>
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">Minibar</span>
<meta itemprop="value" content="true"/>
</div>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"containsPlace": {
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id",
"bed": {
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"amenityFeature": {
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": true
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
}
HotelRoom priceSpecification property
Hotel room price specification is similar to hotel price specification.The
difference is that room prices are specified using the Product.offers property
instead of the Hotel.makesOffer property.
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": {
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency"
}
...
}
Syntax
The priceSpecification property for hotel rooms has the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
...
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name"></span>
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
<meta itemprop="priceComponentType" content="GenericTax"/>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Discount</span>
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
<meta itemprop="priceComponentType" content="Discount"/>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
...
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "",
"price": "float",
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "GenericTax"
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "Discount"
}
]
}
}
}
Properties
The following are the HotelRoom priceSpecification properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| Hotel.Offer.priceSpecification.price | Required | float | The price per room including the taxes and fees for the
Google rate should always be annotated on your landing page along with your complete rate details. Annotating rate details lets you complete price accuracy checks. Google accepts both hotel-level and room-level prices. |
| Hotel.Offer.priceSpecification.priceCurrency | Required | currency | A three-letter currency code for the specified price. Eg: "USD"
. |
| Hotel.Offer.priceSpecification.priceComponent | Optional | UnitPriceSpecification[] | The total price breakdown including taxes and fees for the hotel
room and the occupancy with offers linked to
|
Examples
The following are examples of HotelRoom price specifications.
Total room price example
The following is a basic example of defining the total price for the length of stay and price per occupancy.
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<span itemprop="name">Deluxe Room King, 1 Single Bed</span>
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">KING</span>
</div>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">SINGLE</span>
</div>
<div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
Occupancy: <span itemprop="value">2</span>
</div>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1232.74</span>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room King, 1 Single Bed",
"identifier": "hotel-room-id-1234",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1232.74,
"priceCurrency": "USD"
}
}
}
Room price breakdown example
The following is an example of price per room or plan. The price breakdown
is defined for room type such as Deluxe room and the bed and occupancy
type such as KING and SINGLE beds and an occupancy of 2 guests.
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<span itemprop="name">Deluxe Room King, 1 Single Bed</span>
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">KING</span>
</div>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">SINGLE</span>
</div>
<div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
Occupancy: <span itemprop="value">2</span>
</div>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1150</span>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">172.74</span>
<meta itemprop="priceComponentType" content="GenericTax"/>
</div>
<div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
<span itemprop="name">Discount</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">-100</span>
<meta itemprop="priceComponentType" content="Discount"/>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room King, 1 Single Bed",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1150,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "USD",
"priceComponentType": "GenericTax"
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": -100,
"priceCurrency": "USD",
"priceComponentType": "Discount"
}
]
}
}
}
includesObject property
This property is used to annotate rate-specific services provided in the hotel
or room such as meal options and valet service. You can annotate
includesObject in either Hotel or HotelRoom property.
{
"includesObject": [
{
"@type": "TypeAndQuantityNode",
"typeOfGood": {
"@type": "Service",
"name": "Valet"
}
},
{
"@type": "TypeAndQuantityNode",
"amountOfThisGood": "float",
"unitText": "currency",
"typeOfGood": {
"@type": "FoodService",
"name": "MealCredit"
}
}
]
}
Syntax
The includesObject has the following syntax for rate-specific services
available in the room:
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
...
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
<div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
<div itemprop="typeOfGood" itemscope itemtype="https://schema.org/Service">
<span itemprop="name">Valet</span>
</div>
</div>
<div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
<meta itemprop="amountOfThisGood" content="float"/>
<meta itemprop="unitText" content="currency"/>
<div itemprop="typeOfGood" itemscope itemtype="https://schema.org/FoodService">
<span itemprop="name">MealCredit</span>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
...
"@type": ["HotelRoom", "Product"],
...
"offers": {
"@type": ["Offer", "LodgingReservation"],
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency"
},
"includesObject": [
{
"@type": "TypeAndQuantityNode",
"typeOfGood": {
"@type": "Service",
"name": "Valet"
}
},
{
"@type": "TypeAndQuantityNode",
"amountOfThisGood": "float",
"unitText": "currency",
"typeOfGood": {
"@type": "FoodService",
"name": "MealCredit"
}
}
]
}
}
Property
The includesObject has the following property:
| Attribute | Required? | Type | Description |
|---|---|---|---|
| Offer.includesObject | Optional | TypeAndQuantityNode | The services provided in the hotel or room. Rate-specific features are included with the
Rate-specific features may also be included within base level offers, or may be specified as add-ons for an additional price. The
|
includesObject example
The following is a basic example of rate-specific features for valet parking
and food services. Rate-specific features should be specified with the
Offer.includesObject property. The name field on
TypeAndQuantityNode.typeOfGood should be used to indicate the type of
service.
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<span itemprop="name">Deluxe Room, 1 King Bed</span>
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
<!-- Included Services -->
<div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
<div itemprop="typeOfGood" itemscope itemtype="https://schema.org/Service">
<span itemprop="name">Valet</span>
</div>
</div>
<div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
<meta itemprop="amountOfThisGood" content="50"/>
<meta itemprop="unitText" content="USD"/>
<div itemprop="typeOfGood" itemscope itemtype="https://schema.org/FoodService">
<span itemprop="name">MealCredit</span>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
},
"includesObject": [
{
"@type": "TypeAndQuantityNode",
"typeOfGood": {
"@type": "Service",
"name": "Valet"
}
},
{
"@type": "TypeAndQuantityNode",
"amountOfThisGood": 50,
"unitText": "USD",
"typeOfGood": {
"@type": "FoodService",
"name": "MealCredit"
}
}
]
}
}
availability property
The offer.availability property is used to annotate the sold out itineraries
for the hotel rooms.
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/SoldOut"
}
Syntax
The availability property has the following syntax:
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
...
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
...
<meta itemprop="availability" content="https://schema.org/SoldOut"/>
Sold Out
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
...
"@type": ["HotelRoom", "Product"],
"name": "room-type",
"identifier": "hotel-room-id-1234",
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/SoldOut"
}
}
Property
The following are the availability property:
| Attribute | Required? | Type | Description |
|---|---|---|---|
| Offer.availability | Optional | ItemAvailability | The availability of the hotel or room. Rates are extracted from
An offer without a
|
availability example
The following is a basic example to show hotel room unavailability. You should include the bed type, the number of beds and the occupancy details for the specified room.
Microdata
<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
<span itemprop="name">Deluxe Room, 1 King Bed</span>
<meta itemprop="identifier" content="hotel-room-id-1234"/>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">KING</span>
</div>
<div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
<span itemprop="numberOfBeds">1</span>
<span itemprop="typeOfBed">SINGLE</span>
</div>
<div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
Occupancy: <span itemprop="value">2</span>
</div>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<meta itemprop="availability" content="https://schema.org/SoldOut"/>
Sold Out
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<!-- Price Specification details -->
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id-1234",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"availability": "https://schema.org/SoldOut",
"priceSpecification": {...}
}
}
amenityFeature property
Amenities can be specified in either Hotel or HotelRoom type using the
amenityFeature property. You should use containsPlace property to specify
amenities provided in the room.
{
"@type": "Hotel",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "HotTub",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"opens": "HH:mm:ss",
"closes": "HH:mm:ss"
}
},
{
"@type": "LocationFeatureSpecification",
"name": "GymFitnessEquipment",
"value": "boolean"
}
],
"containsPlace": {
"@type": "HotelRoom",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Smoking",
"value": false
}
]
}
}
Syntax
The amenityFeature and the containsPlace properties has the following
syntax:
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
...
<!-- Hotel Amenity -->
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">HotTub</span>
<div itemprop="hoursAvailable" itemscope itemtype="https://schema.org/OpeningHoursSpecification">
<time itemprop="opens" content="HH:mm:ss">HH:mm:ss</time>
<time itemprop="closes" content="HH:mm:ss">HH:mm:ss</time>
</div>
</div>
<div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom">
<!-- Room Amenity -->
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">Minibar</span>
<meta itemprop="value" content="boolean"/>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"amenityFeature": {
"@type": "LocationFeatureSpecification",
"name": "HotTub",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"opens": "HH:mm:ss",
"closes": "HH:mm:ss"
}
},
"containsPlace": {
"@type": "HotelRoom",
"amenityFeature": {
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": "boolean"
}
}
}
Amenities
The following amenities are allowed and defined in the name property.
| Attribute | Required? | Type | Description |
|---|---|---|---|
| amenityFeature.AC | Optional | boolean | Whether the property has air conditioning. |
| amenityFeature.AirportShuttle | Optional | boolean | Whether the host provides transportation to and from the airport or other terminals. |
| amenityFeature.Balcony | Optional | boolean | Whether the accommodation has a balcony. |
| amenityFeature.BeachAccess | Optional | boolean | Whether the property has access to a public beach close to the property. |
| amenityFeature.ChildFriendly | Optional | boolean | Whether the property is suitable for children. |
| amenityFeature.Crib | Optional | boolean | Whether the property provides a crib. |
| amenityFeature.Elevator | Optional | boolean | Whether the property has an elevator. |
| amenityFeature.FirePlace | Optional | boolean | Whether the accommodation has a fireplace. |
| amenityFeature.FreeBreakfast | Optional | boolean | Whether the property has free breakfast included for all guests. Use rate features to indicate if breakfast is included only for specific rate plans. |
| amenityFeature.GymFitnessEquipment | Optional | boolean | Whether the property has a gym or any fitness equipment. |
| amenityFeature.Heating | Optional | boolean | Whether the accommodation has heating. |
| amenityFeature.HotTub | Optional | boolean | Whether the property has a hot tub. |
| amenityFeature.InstantBookable | Optional | boolean | Whether the property is instantly bookable through the checkout process. The alternative is waiting for approval. |
| amenityFeature.IroningBoard | Optional | boolean | Whether the property has ironing boards available. |
| amenityFeature.Kitchen | Optional | boolean | Whether the accommodation has a kitchen. |
| amenityFeature.Microwave | Optional | boolean | Whether the accommodation has a microwave available. |
| amenityFeature.OpenAirBath(Hotels only) | Optional | boolean | Whether the accommodation has an open air bath attached. If specified at the room level, the bath should be private for room occupants only. |
| amenityFeature.OutdoorGrill | Optional | boolean | Whether the property has a grill. |
| amenityFeature.OvenStove | Optional | boolean | Whether the property has a stove. |
| amenityFeature.Patio | Optional | boolean | Whether the property has a patio. |
| amenityFeature.Pool | Optional | boolean | Whether the accommodation has a pool. |
| amenityFeature.PrivateBeachAccess | Optional | boolean | Whether the property has dedicated access to a non-public beach. |
| amenityFeature.SelfCheckinCheckout | Optional | boolean | Whether the property supports self check-in and check-out. |
| amenityFeature.WasherDryer | Optional | boolean | Whether the accommodation has laundry appliances. |
| amenityFeature.Wifi | Optional | boolean | Whether the property has Wifi. |
| amenityFeature.Smoking | Optional | boolean | Whether the accommodation allows smoking. |
| amenityFeature.InternetType | Optional | Enum | The type of internet available on the property. Supported values are:
|
| amenityFeature.ParkingType | Optional | Enum | The type of parking available on the property. Supported values are:
|
| amenityFeature.PoolType | Optional | Enum | The type of pool available on the property. Supported values are:
|
| amenityFeature.RoomStyle | Optional | Enum | Indicates whether the room is a Japanese style design. Supported values are:
|
| amenityFeature.LicenseNum | Required | string | License number of the business that is to be shown on the property
in certain regions of the world. It can be repeated and if multiple
licenses exist then it is recommended to add the owner or authority of
the license. For example, |
Properties
The following are the amenityFeature properties:
| Property | Required? | Type | Description |
|---|---|---|---|
| amenityFeature | Optional | LocationFeatureSpecification | The amenities provided in the hotel or room. It can be specified
using the Amenities can be specified at either the |
| containsPlace | Optional | LocationFeatureSpecification | The amenities provided in the hotel or room to all hotel guests. It
can be specified using the
|
Amenities example
The following is a basic example of a hotel with a pool open from 10 AM to 10 PM and no gym availability at the property. The hotel room is non-smoking and has a minibar.
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<span itemprop="name">ACME Hotel</span>
<!-- Amenities -->
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">HotTub</span>
<div itemprop="hoursAvailable" itemscope itemtype="https://schema.org/OpeningHoursSpecification">
Open from <time itemprop="opens" content="10:00:00">10:00</time>
to <time itemprop="closes" content="22:00:00">22:00</time>
</div>
</div>
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">GymFitnessEquipment</span>:
<meta itemprop="value" content="false"/> No
</div>
<div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom">
<!-- Room Amenities -->
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">Minibar</span>:
<meta itemprop="value" content="true"/> Yes
</div>
<div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
<span itemprop="name">Smoking</span>:
<meta itemprop="value" content="false"/> No
</div>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
<meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
<div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
</div>
</div>
</div>
</div>
JSON-LD (Deprecated)
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"address": { ... },
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "HotTub",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"opens": "10:00:00",
"closes": "22:00:00"
}
},
{
"@type": "LocationFeatureSpecification",
"name": "GymFitnessEquipment",
"value": false
}
],
"containsPlace": {
"@type": "HotelRoom",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Smoking",
"value": false
}
],
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
}
Navigation tagging
Custom HTML5 attributes with the data-nav- prefix are used to annotate
interactive elements and declare page states, allowing the crawler to navigate
through the booking flow.
Syntax
The navigation tagging uses the following attribute syntax:
Attributes
<body data-nav-stage="stage_name">
...
<button data-nav-criticalpath="true"
data-nav-interactiontype="CLICK"
data-nav-interactionorder="1">
Action
</button>
...
<button data-nav-close="true">Dismiss</button>
</body>
Properties
The following are the navigation attributes:
| Attribute | Values | Description |
|---|---|---|
| data-nav-stage | landing, room-selection, checkout, confirmation | Declares active funnel state for crawlers. Attached to <body> or high-level wrapper. |
| data-nav-stage-final | true, false | Indicator for the last page of the flow (default false). If no elements with data-nav-criticalpath="true" are present on a page, the crawler automatically considers it the final page of the flow. |
| data-nav-criticalpath | true, false | Marks an element that the crawler MUST interact with to reach the final booking page. If no elements with data-nav-criticalpath="true" are present on a page, the crawler automatically considers it the final page of the flow. |
| data-nav-interactiontype | CLICK, SELECT | Specifies the interaction action. CLICK is for buttons/links. SELECT is for dropdowns/radio groups. |
| data-nav-interactionorder | integer | Provides an execution sequence for multi-step navigation. Lower numbers execute first. |
| data-nav-close | true | Marks dismissal buttons on popups, cookie banner overlays, or upsell modals. |
Navigation example
The following are examples of navigation tagging.
Click navigation
The following is a basic example of click navigation declaring the funnel stage.
<body data-nav-stage="room-selection" data-nav-stage-final="false">
<h1>Select Your Room</h1>
<!-- Crawler needs to click this to proceed -->
<button data-nav-criticalpath="true"
data-nav-interactiontype="CLICK"
data-nav-interactionorder="1">
Select & Proceed
</button>
</body>
Multi-step navigation
The following is an example of multi-step navigation including a cookie banner, accordion reveal, and click.
<div data-nav-stage="landing" data-nav-stage-final="false">
<!-- Hotel, LodgingReservation info, and Offer price are expected to be included in this page -->
<!-- Step 1: Accept cookies -->
<div class="cookie-banner">
<p>We use cookies to improve your experience.</p>
<button data-nav-close="true"
data-nav-criticalpath="true"
data-nav-interactiontype="CLICK"
data-nav-interactionorder="1">Accept cookies</button>
</div>
<!-- Step 2: Open accordion to reveal pricing (Crucial for making prices visible in Mobile UIs) -->
<div data-nav-criticalpath="true"
data-nav-interactiontype="CLICK"
data-nav-interactionorder="2"
class="accordion-header">
<span>View Room Rates</span>
</div>
<!-- Step 3: Book the room -->
<div class="accordion-content">
<button data-nav-criticalpath="true"
data-nav-interactiontype="CLICK"
data-nav-interactionorder="3">
Book Now
</button>
</div>
</div>
Final page declaration
The following is an example of declaring the final page of the booking flow.
<!-- Marks this as the final confirmation page where price is extracted -->
<!-- Hotel, LodgingReservation info, and Offer price are expected to be included in this page -->
<div data-nav-stage="confirmation" data-nav-stage-final="true">
<h1>Grand View Hotel</h1>
<!-- Price and other details here -->
</div>