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
| Property | What to put | Why |
|---|---|---|
name, url, description | Your exact trading name, the property page and one factual sentence | Identity. Use the same name everywhere. |
address, geo | Full PostalAddress and latitude and longitude | Matches "near" and area questions |
telephone, email | Direct reservation contacts | Consistency with listings |
starRating | Your official star classification as a Rating | Filters like "4-star hotel in…" |
checkinTime, checkoutTime | Times such as 15:00 | Common practical questions |
priceRange | A short honest range | "Good value" and budget questions |
petsAllowed | true, false, or a short policy text | Pet-friendly questions |
amenityFeature | One LocationFeatureSpecification per amenity | Pool, parking, family rooms, spa |
numberOfRooms | Total rooms | "Small boutique" versus "large resort" |
parentOrganization | Your group's organisation record | Links 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
aggregateRatingout 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