Schema Markup for Hospitality: A Technical Guide
By Delphium Labs
Why schema markup is the highest-impact change you can make
If you only do one technical thing to improve your AI visibility, implement schema markup. In testing across hundreds of hospitality properties, Delphium Labs has found that businesses with complete, accurate schema markup appear in AI engine recommendations 2-3x more often than comparable properties without it.
The reason is straightforward. AI engines like ChatGPT, Perplexity, and Gemini need to understand what your business is, where it is, what it offers, and what it costs. They can attempt to extract that from unstructured website copy, but structured data removes the guesswork. Schema markup is a direct, machine-readable description of your business that AI engines can parse instantly and trust completely.
This guide covers the four schema types most relevant to hospitality businesses, with JSON-LD code examples you can adapt and deploy today.
What schema markup actually is
Schema markup is a standardised vocabulary (defined at schema.org) that you add to your website's HTML to describe your content in a format machines can read. The most common implementation is JSON-LD (JavaScript Object Notation for Linked Data), which sits in a script tag in your page's head section. It does not affect how your website looks to visitors. It only affects how machines understand your content.
Think of it as filling out a structured form about your business that AI engines can read, rather than hoping they correctly interpret your marketing copy.
Every example below uses JSON-LD format. You paste the code into a <script type="application/ld+json"> tag in the relevant page's HTML head.
Section 1: Hotel schema
Hotel schema is the most important markup for any accommodation provider. Here is a comprehensive example:
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "The Harbour House Hotel",
"description": "A 28-room boutique hotel on Bristol's harbourside, offering waterfront dining, a seasonal cocktail terrace, and rooms with harbour or city views. Built in a converted 1820s warehouse.",
"url": "https://www.harbourhousehotel.co.uk",
"telephone": "+44-117-496-0012",
"email": "stay@harbourhousehotel.co.uk",
"address": {
"@type": "PostalAddress",
"streetAddress": "14 Narrow Quay",
"addressLocality": "Bristol",
"addressRegion": "Somerset",
"postalCode": "BS1 4QA",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.4500,
"longitude": -2.5975
},
"starRating": {
"@type": "Rating",
"ratingValue": "4"
},
"numberOfRooms": 28,
"priceRange": "145-320 GBP",
"checkinTime": "15:00",
"checkoutTime": "11:00",
"amenityFeature": [
{ "@type": "LocationFeatureSpecification", "name": "Free WiFi", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Restaurant", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Bar", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Room Service", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Accessible Rooms", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "EV Charging", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Concierge", "value": true }
],
"petsAllowed": true,
"image": "https://www.harbourhousehotel.co.uk/images/exterior-harbour-view.jpg",
"sameAs": [
"https://www.instagram.com/harbourhousehotel",
"https://www.facebook.com/harbourhousehotel"
]
}
Fields that matter most for AI
name must match your Google Business Profile exactly. Discrepancies between your schema name and your GBP name create ambiguity for AI engines.
description should be factual and specific, not aspirational. Include the number of rooms, the location, and your primary differentiators. "A 28-room boutique hotel on Bristol's harbourside" gives an AI engine concrete facts. "An unforgettable experience awaits" does not.
address must be fully structured. Every field matters. AI engines use this to answer location-based queries like "hotel near Bristol Temple Meads" or "waterfront hotel in Bristol."
amenityFeature is where many hotels fall short. List every amenity. AI engines use this data to match properties to specific traveller requests: "hotel with EV charging in Bristol", "dog-friendly hotel Bristol harbourside."
priceRange can be approximate but should be present. Without it, AI engines cannot recommend your property when someone asks for "affordable hotel in Bristol" or "luxury hotel Bristol."
checkinTime and checkoutTime seem minor but appear frequently in AI responses. When a traveller asks "what time is check-in at hotels in Bristol", properties with this in their schema can be cited directly.
Common mistakes
- Incomplete address: missing the postalCode or addressRegion. AI engines rely on the full address for geographic matching.
- No amenityFeature entries: listing amenities in your website copy but not in your schema means AI engines may miss them.
- Missing priceRange: this is one of the most commonly omitted fields, and one of the most frequently requested data points by AI engines.
- Mismatched name: your schema says "Harbour House Hotel" but your GBP says "The Harbour House Hotel." Pick one and use it everywhere.
Section 2: Restaurant schema
If your property includes a restaurant, or if you are a standalone restaurant, Restaurant schema is essential. Dining queries are among the most common AI engine requests in the hospitality space.
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "The Quay Kitchen",
"description": "Modern British restaurant on Bristol's harbourside serving seasonal menus built around West Country produce. 60 covers inside, 24 on the terrace.",
"url": "https://www.harbourhousehotel.co.uk/restaurant",
"telephone": "+44-117-496-0012",
"address": {
"@type": "PostalAddress",
"streetAddress": "14 Narrow Quay",
"addressLocality": "Bristol",
"postalCode": "BS1 4QA",
"addressCountry": "GB"
},
"servesCuisine": ["Modern British", "Seasonal"],
"priceRange": "35-65 GBP per person",
"acceptsReservations": true,
"menu": "https://www.harbourhousehotel.co.uk/restaurant/menu",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "12:00",
"closes": "22:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday", "Sunday"],
"opens": "10:00",
"closes": "22:30"
}
],
"hasMenu": {
"@type": "Menu",
"name": "Dinner Menu",
"hasMenuSection": [
{
"@type": "MenuSection",
"name": "Starters",
"hasMenuItem": [
{
"@type": "MenuItem",
"name": "Cornish Crab on Toast",
"description": "Brown and white crab meat, sourdough, lemon, chive oil",
"offers": {
"@type": "Offer",
"price": "14.50",
"priceCurrency": "GBP"
}
}
]
}
]
}
}
Key fields for AI
servesCuisine is critical. AI engines receive constant queries like "best Italian restaurant in Birmingham" or "where to eat seafood in Whitby." If your cuisine type is not in your schema, you are invisible to these queries.
menu should link to a crawlable HTML page, not a PDF. AI engines struggle to extract content from PDFs. If your menu only exists as a downloadable PDF, create an HTML version as well.
priceRange per person helps AI engines answer "affordable restaurant in [city]" or "fine dining in [area]" queries. Be specific: "35-65 GBP per person" is more useful than a dollar sign range.
acceptsReservations matters because travellers frequently ask AI engines "restaurants in [city] that take bookings" or "walk-in restaurants near me."
MenuItem schema is optional but powerful. If you mark up even your signature dishes, AI engines can cite them directly when someone asks "restaurants serving crab in Bristol" or "best Sunday roast in [area]."
Common mistakes
- PDF-only menus: if your menu URL points to a PDF, AI engines may not be able to read it. Always have an HTML menu page.
- Missing servesCuisine: this is how AI engines categorise your restaurant. Without it, you rely on the engine figuring out your cuisine from context.
- No opening hours: AI engines frequently answer "restaurants open on Monday in [city]" style queries. Without opening hours in your schema, you cannot appear.
Section 3: LocalBusiness schema
For hospitality businesses that are not strictly hotels or restaurants (spas, activity providers, wedding venues, tour operators, visitor attractions), LocalBusiness schema provides the foundation.
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"additionalType": "https://schema.org/DaySpa",
"name": "Thornbury Spa and Wellness",
"description": "A day spa in the Cotswolds offering thermal experiences, treatment rooms, and outdoor hydrotherapy. Capacity for 40 guests. Open to non-residents.",
"url": "https://www.thornburyspa.co.uk",
"telephone": "+44-1454-281-900",
"address": {
"@type": "PostalAddress",
"streetAddress": "Castle Lane",
"addressLocality": "Thornbury",
"addressRegion": "South Gloucestershire",
"postalCode": "BS35 1HH",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.6119,
"longitude": -2.5247
},
"priceRange": "85-195 GBP",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
"opens": "09:00",
"closes": "20:00"
}
],
"amenityFeature": [
{ "@type": "LocationFeatureSpecification", "name": "Outdoor Pool", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Sauna", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Steam Room", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Treatment Rooms", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Free Parking", "value": true }
],
"image": "https://www.thornburyspa.co.uk/images/thermal-suite.jpg"
}
Adapting for different venue types
Wedding venues: add fields for maximumCapacity, the types of events hosted, and whether you offer accommodation. Use the additionalType field to specify "WeddingVenue" or "EventVenue."
Tour operators: include the areas you cover, the duration of your tours, and your pricing. Use TouristTrip schema as an additionalType if it fits your offering.
Activity providers: include your activity types in the description and amenityFeature fields. Specify whether booking is required and your capacity.
The key principle is the same across all types: the more structured facts you provide, the more queries AI engines can match you to. A spa listing that includes "capacity for 40 guests" and "outdoor hydrotherapy" can surface for queries like "spa day for a group near Bristol" or "outdoor spa Cotswolds" that a bare-bones listing would miss.
Section 4: Event schema
If your venue hosts events, whether weddings, conferences, seasonal dinners, or live music, Event schema helps AI engines surface your property for event-related queries.
{
"@context": "https://schema.org",
"@type": "Event",
"name": "New Year's Eve Gala Dinner at The Harbour House",
"description": "Five-course tasting menu with champagne reception, live jazz quartet, and harbour fireworks viewing from the terrace. 80 covers available.",
"startDate": "2026-12-31T19:00:00+00:00",
"endDate": "2027-01-01T01:00:00+00:00",
"eventStatus": "https://schema.org/EventScheduled",
"location": {
"@type": "Hotel",
"name": "The Harbour House Hotel",
"address": {
"@type": "PostalAddress",
"streetAddress": "14 Narrow Quay",
"addressLocality": "Bristol",
"postalCode": "BS1 4QA",
"addressCountry": "GB"
}
},
"offers": {
"@type": "Offer",
"price": "125.00",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"validFrom": "2026-09-01",
"url": "https://www.harbourhousehotel.co.uk/events/nye-2026"
},
"organizer": {
"@type": "Hotel",
"name": "The Harbour House Hotel",
"url": "https://www.harbourhousehotel.co.uk"
},
"image": "https://www.harbourhousehotel.co.uk/images/nye-terrace.jpg"
}
When to use Event schema
Event schema is valuable for any time-bound offering:
- Seasonal events: Christmas dinners, Easter brunches, summer garden parties
- Weddings: if you are a wedding venue, create Event schema for open days and wedding showcases
- Conferences and meetings: mark up your conference facilities with event capacity and pricing
- Recurring events: Sunday roasts, wine tastings, afternoon tea services can all benefit from Event schema
The critical fields are startDate, endDate, offers (with price), and a specific location. AI engines surface event content heavily for time-sensitive queries. A traveller asking "New Year's Eve dinner Bristol" in November will get results from properties that have marked up their NYE events. Properties without Event schema will not appear regardless of how good their event page looks to human visitors.
Event schema for weddings
Wedding venues should consider creating Event schema for their wedding showcase days and open evenings. A query like "wedding venues near Bristol with open days" can only surface your property if the AI engine has structured data about your events. Add maximumAttendees to your event if capacity is a selling point.
Section 5: Testing your markup
Implementing schema is only useful if it is valid and complete. Here is how to verify your work.
Google Rich Results Test
Go to search.google.com/test/rich-results and enter your page URL. Google will crawl the page, identify your schema markup, and flag any errors or warnings. Fix every error. Warnings are worth addressing too, as they usually indicate missing fields that would improve your visibility.
Schema Markup Validator
The official Schema.org validator at validator.schema.org checks your markup against the full schema.org specification. It catches issues the Google tool might miss, particularly around field types and nested objects.
Manual AI testing
After deploying your schema, test it by asking AI engines about your property directly. Ask Perplexity "tell me about [your hotel name]" and see whether the response includes the structured facts from your schema: room count, star rating, amenities, price range. If these details appear, your schema is being read. If they do not, check for crawling issues or validation errors.
Common pitfalls across all schema types
Deploying schema only on the homepage. Your room-type pages, restaurant page, and event pages each need their own schema. A single block on the homepage is not enough.
Using outdated information. If your prices changed in January but your schema still shows last year's rates, AI engines are working with wrong data. Audit your schema quarterly at minimum.
Duplicating schema across pages without changes. Every page's schema should describe the content on that specific page. Copying the same Hotel schema across every page creates confusion rather than reinforcement.
Ignoring the geo field. Geographic coordinates are how AI engines place your property on a map. Without geo data, location-based queries like "hotels near [landmark]" are harder to match to your property.
Not including sameAs links. The sameAs field connects your schema to your social profiles and third-party listings, helping AI engines verify your identity across the web.
What to do next
Based on Delphium Labs research, properties with complete schema markup appear in AI recommendations 2-3x more often than those without it. The implementation work is technical but finite. A developer can add comprehensive schema to a hospitality website in one to two days, and the impact compounds over time as AI engines re-crawl and re-index your pages.
If you want to know how your current markup scores, FindingFin's audit includes a schema completeness check. It identifies missing fields, validation errors, and gaps between your schema and what competitors in your area have implemented. That gives you a precise technical roadmap rather than a guessing game.
Start with Hotel or Restaurant schema on your primary pages. Test it. Then expand to events and local business markup as your structured data foundation matures. The properties winning in AI search are not using secret techniques. They are simply giving AI engines clean, complete, machine-readable data about who they are and what they offer.