VacationRental schema: what Google needs for rental listings

VacationRental schema describes a single rental listing, such as a cabin, apartment or villa, so Google can show its name, photos, location, rating and amenities in search. The listing holds one Accommodation in containsPlace, which carries the guest capacity, rooms, beds and amenities.

Read the access rule before writing any code. Google's documentation is aimed at partners who already work with a Google Technical Account Manager and use Hotel Center, and the program for everyone else starts with an interest form that doesn't promise a place. For an owner with a few properties on a WordPress site, the markup alone won't create a listing. It still helps to have it ready, because the property details are the same ones a booking partner will ask for.

JSON-LD example

Copy this into a <script type="application/ld+json"> tag and replace the values with your own.

json
{
  "@context": "https://schema.org",
  "@type": "VacationRental",
  "additionalType": "Cabin",
  "name": "Lookout Ridge Cabin",
  "identifier": "LRC-0217",
  "latitude": 35.61234,
  "longitude": -83.51876,
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "412 Laurel Gap Road",
    "addressLocality": "Gatlinburg",
    "addressRegion": "TN",
    "postalCode": "37738",
    "addressCountry": "US"
  },
  "image": [
    "https://example.com/wp-content/uploads/lookout/exterior.jpg",
    "https://example.com/wp-content/uploads/lookout/living-room.jpg",
    "https://example.com/wp-content/uploads/lookout/kitchen.jpg",
    "https://example.com/wp-content/uploads/lookout/bedroom-1.jpg",
    "https://example.com/wp-content/uploads/lookout/bedroom-2.jpg",
    "https://example.com/wp-content/uploads/lookout/bathroom.jpg",
    "https://example.com/wp-content/uploads/lookout/deck.jpg",
    "https://example.com/wp-content/uploads/lookout/view.jpg"
  ],
  "checkinTime": "16:00:00-05:00",
  "checkoutTime": "10:00:00-05:00",
  "containsPlace": {
    "@type": "Accommodation",
    "additionalType": "EntirePlace",
    "numberOfBedrooms": 2,
    "numberOfBathroomsTotal": 1,
    "occupancy": {
      "@type": "QuantitativeValue",
      "value": 5
    },
    "amenityFeature": [
      {
        "@type": "LocationFeatureSpecification",
        "name": "hotTub",
        "value": true
      },
      {
        "@type": "LocationFeatureSpecification",
        "name": "wifi",
        "value": true
      },
      {
        "@type": "LocationFeatureSpecification",
        "name": "parkingType",
        "value": "Free"
      }
    ]
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.8,
    "reviewCount": 57
  }
}

Properties

PropertyStatusWhat it is
nameRequiredThe listing's name.
identifierRequiredA unique property ID that doesn't change when the owner edits the name or room count, and stays the same across language versions.
imageRequiredAt least 8 photos of the listing, including at least one each of a bedroom, a bathroom and a common area.
latitude / longitudeRequiredThe location, directly or under geo, with at least 5 decimal places.
containsPlaceRequiredOne Accommodation holding room, bed, occupancy and amenity details.
containsPlace.occupancy.valueRequiredThe maximum number of guests, as an integer.
containsPlace.additionalTypeRecommendedEntirePlace, PrivateRoom or SharedRoom.
containsPlace.amenityFeatureRecommendedLocationFeatureSpecification items with English names such as wifi, pool or petsAllowed, even on pages in other languages.
addressRecommendedThe full physical address, with unit number if any. P.O. boxes don't count.
additionalTypeRecommendedThe kind of property, such as Cabin, Cottage, Villa, Apartment or House.
checkinTime / checkoutTimeRecommendedTimes in ISO 8601 with an offset, such as 15:00:00-07:00.
aggregateRating / reviewRecommendedGuest ratings following review snippet rules. Listings in France also need review.contentReferenceTime, the start of the guest's stay.

Access comes before markup

Google calls vacation rentals an early adopters program. The steps, in order:

  1. Fill in Google's vacation rental interest form. That records interest; it isn't an invitation.
  2. If accepted, work with a Google Technical Account Manager and set up Hotel Center.
  3. Only then add the markup to listing pages and complete the integration.

If your site is one of many channels for the same property, check whether the listing already reaches Google through a platform you use. Markup on your own site doesn't replace that route, and two sources for one property can conflict.

Photos, coordinates and a stable ID

Three required properties cause most rejections:

  • Images: eight is the minimum, and they must include a bedroom, a bathroom and a common area. Five exterior shots and three of the view won't do. Google also points to its Hotel Center image requirements.
  • Coordinates: at least five decimal places, which is roughly one meter of precision. A value copied from a map at city zoom, like 35.6, fails.
  • identifier: it must survive edits. Renaming "Lookout Cabin" to "Lookout Ridge Cabin" or adding a bedroom must not change it.

That last rule matters on multilingual WordPress sites. Translation plugins such as WPML and Polylang store each language as a separate post with its own post ID, so using the post ID as the identifier would give one cabin several IDs. Use a property code stored in a custom field, or the ID of the original-language post, on every translation.

Amenities in fixed English values

amenityFeature takes fixed names, and Google requires them in English even on a Spanish or French listing. Yes-or-no amenities use a boolean value: ac, balcony, beachAccess, crib, fireplace, hotTub, kitchen, petsAllowed, pool, selfCheckinCheckout, washerDryer, wheelchairAccessible and wifi are among the supported names.

A few amenities take a text value instead: internetType (Free, Paid or None) and parkingType (such as Free or Paid) are two of them. Put amenities on the Accommodation inside containsPlace, not on the top-level listing, so they match how Google reads the unit.

Generating listings from a booking plugin

Rental and booking plugins usually keep each property as a custom post type with fields for guests, bedrooms and amenities. Build the markup from those fields so it updates when the listing does, then add it with Hydrogen SEO's hydrogen_seo_schemas filter on is_singular() for that post type. Pull the gallery images from the plugin's field rather than the featured image, so the eight-photo minimum is met.

Keep the rating honest. aggregateRating should summarize reviews shown on your listing page. Scores imported from another booking site don't belong there; see review snippet rules.

Common questions

Can any rental owner get vacation rental results with this markup?

No. Google limits the feature to eligible partners working with a Technical Account Manager and Hotel Center. Others can only register interest.

Why eight photos?

It is Google's stated minimum, and the set must include a bedroom, a bathroom and a common area.

Can I write amenity names in my site's language?

No. Amenity names and their text values must be in English, even for non-English listings.

Is LocalBusiness a substitute?

Not really. LocalBusiness describes a business with a location, such as a rental office. It doesn't describe an individual rental unit.