Guide

Hotel schema markup: a complete guide

What to add to your property pages so search engines and AI assistants understand exactly what your hotel offers, with an example you can adapt.

Short answer

Hotel schema is a block of JSON-LD on your property page that describes the hotel in a standard vocabulary: that it's a Hotel, where it is, how to contact it, its star rating, check-in times, price range, policies and amenities. It helps search engines, and the AI assistants that rely on them, understand exactly what you offer, so they can match you to questions like "family hotel with parking near the beach".

What hotel schema is

Schema.org is a shared vocabulary that search engines agreed on for describing things on web pages. In it, Hotel is a type of LodgingBusiness, which is itself a type of LocalBusiness. Related types include Resort, BedAndBreakfast, Hostel and Motel; pick the one that honestly describes you.

You add it to a page as JSON-LD: a <script type="application/ld+json"> block, usually in the page head. Visitors don't see it. Machines read it.

Why it matters for AI answers

Search engines say structured data helps them understand pages. AI assistants that search the web, such as ChatGPT with search, Gemini, Perplexity and Google's AI Overviews, work from search results and from what they read on pages. A property page that states its facts plainly, both in visible text and in structured data, is easier to match to a specific question than one where the facts are scattered across photos and PDFs.

Be realistic about what it does. No assistant has published a rule that says "pages with schema get recommended". Schema is part of being easy to understand, alongside clear visible text, fast pages and consistent details. It's also not where hotel prices in Google come from: those come from Google Hotel Center feeds through your booking partners.

The properties that matter most

PropertyWhat to putWhy
name, url, descriptionYour exact trading name, the property page and one factual sentenceIdentity. Use the same name everywhere.
address, geoFull PostalAddress and latitude and longitudeMatches "near" and area questions
telephone, emailDirect reservation contactsConsistency with listings
starRatingYour official star classification as a RatingFilters like "4-star hotel in…"
checkinTime, checkoutTimeTimes such as 15:00Common practical questions
priceRangeA short honest range"Good value" and budget questions
petsAllowedtrue, false, or a short policy textPet-friendly questions
amenityFeatureOne LocationFeatureSpecification per amenityPool, parking, family rooms, spa
numberOfRoomsTotal rooms"Small boutique" versus "large resort"
parentOrganizationYour group's organisation recordLinks properties to the group

A complete example

Here's a full example for a fictional hotel. Replace every value with your own, and only include what's true and also stated on the page.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Hotel",
  "@id": "https://www.harbourlanehotel.example/#hotel",
  "name": "Harbour Lane Hotel",
  "url": "https://www.harbourlanehotel.example/",
  "description": "A 4-star boutique hotel in Dubai Marina with a rooftop pool, a 5-minute walk from JBR beach.",
  "image": ["https://www.harbourlanehotel.example/images/exterior.jpg"],
  "telephone": "+971 4 000 0000",
  "email": "stay@harbourlanehotel.example",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "12 Marina Walk",
    "addressLocality": "Dubai Marina",
    "addressRegion": "Dubai",
    "addressCountry": "AE"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": 25.0800, "longitude": 55.1400 },
  "starRating": { "@type": "Rating", "ratingValue": "4" },
  "priceRange": "AED 650 to AED 1,400 per night",
  "checkinTime": "15:00",
  "checkoutTime": "12:00",
  "numberOfRooms": 84,
  "petsAllowed": false,
  "availableLanguage": ["English", "Arabic"],
  "amenityFeature": [
    { "@type": "LocationFeatureSpecification", "name": "Rooftop pool", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Free parking", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Family rooms", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Airport transfer", "value": true }
  ],
  "parentOrganization": { "@id": "https://www.harbourlanegroup.example/#org" },
  "sameAs": ["https://www.instagram.com/harbourlanehotel.example"]
}
</script>

Hotel groups and multiple properties

Give every property its own page with its own Hotel record, its own address and its own @id. On the group's website, describe the group as an Organization and list its hotels with subOrganization; on each hotel, point back with parentOrganization. If a hotel's restaurant or spa has its own name, give it its own record (for example a Restaurant) and connect it with containedInPlace.

The most common group mistake is one generic organisation record copied onto every page, so machines can't tell the properties apart.

Common mistakes

  • Marking up facts that aren't on the page. Structured data should describe visible content. If the pool isn't mentioned on the page, mention it, then mark it up.
  • Self-serving review markup. Google doesn't show review stars for a business's own reviews of itself, and adding ratings you don't display on the page breaks its guidelines. Leave aggregateRating out unless you show genuine reviews there.
  • Conflicting plugins. Two SEO plugins and a theme can each output their own schema, sometimes contradicting each other. Check what's actually on the page.
  • Out-of-date details. An old phone number in the schema undoes the consistency you're trying to build.

How to check it

Paste your page address into the Schema Markup Validator to see exactly what machines read, and into Google's Rich Results Test to check for errors in the types Google supports. Re-check after every website update; themes and plugins change things quietly.

Checklist

  • One Hotel (or more specific) record per property page, with a unique @id
  • Address, map location, phone and email that match your listings exactly
  • Star rating, check-in and check-out times, price range and room count
  • Amenities and policies that guests ask about
  • Group, restaurant and spa relationships made explicit
  • No review markup you don't display; no facts that aren't on the page
  • Validated, and re-checked after updates

FAQ

Questions about this guide

Something else? Ask us directly, we reply within 48 hours.

Does hotel schema make Google show my prices?

No. Hotel prices and booking links in Google come from Google Hotel Center feeds, usually through your booking engine or channel manager. Schema helps Google understand the property page itself.

Should I use Hotel or LodgingBusiness?

Use the most specific type that's true: Hotel, Resort, BedAndBreakfast, Hostel or Motel. They all inherit LodgingBusiness properties.

Can my booking engine add schema for me?

Some add basic markup to their own booking pages, but the important record is on your property page, on your domain. Check what's there with the Schema Markup Validator.

Do I need a developer?

Not necessarily. Many website builders and SEO plugins let you paste a JSON-LD block. The care is in the details: accurate, consistent and matching the page.

Find out what AI tells your customers

Run the live demo, or request the full free check across five assistants. You'll see every answer, who was named instead, and what to fix first.