AEO Explained

Hotel and accommodation schema markup: a JSON-LD walkthrough for golf resorts and small hotels

We wrote recently about why a golf resort's course can win almost every AI recommendation prompt while its attached hotel loses on the same platforms. Part of that gap comes down to a detail most sites get wrong: accommodation needs its own, more specific schema type. A general LocalBusiness or GolfCourse block, the kind covered in our earlier golf club schema walkthrough, doesn't carry the fields a model needs to answer "is there a hotel here, what are the rooms like, and what's included."

Why a golf club's course schema doesn't cover its hotel

If your site has one schema block describing the golf course, and the accommodation is mentioned only as a paragraph of amenity text, an AI model has no structured way to separate "this is a golf course" from "this also has 42 hotel rooms with a spa." The two need to be described as genuinely different entities, even when they sit on the same property and the same website, because a prospect asking about a place to stay is asking a fundamentally different question to one asking about a place to play.

The schema type to use

Schema.org's Hotel type, a subtype of LodgingBusiness, is built specifically for this. It supports room level detail, amenity lists, and check in and check out timing that a general business schema doesn't carry. For a golf resort with an attached hotel, the practical approach is two linked schema blocks: one for the golf facility, one for the hotel, referencing each other so a model understands they're part of the same property without conflating what each one actually offers.

FieldWhat goes in itWhy it matters
@typeHotel, nested under LodgingBusinessSignals room and stay specific detail that a generic business type doesn't support
nameThe hotel's actual trading name, distinct from the golf club name if they differAvoids a model conflating the golf brand with the accommodation brand when they're marketed separately
starRatingAn honest, verifiable rating if one appliesA concrete trust signal a model can cite directly in an answer
numberOfRoomsThe actual room countA specific fact that helps distinguish a boutique property from a larger resort in a comparison style prompt
amenityFeatureSpa, restaurant open to non-residents, parking, pool, accessible rooms, and so onLets AI match the property to specific buyer questions like "hotel with a spa near a golf course"
checkinTime / checkoutTimeActual times, not "flexible"Answers a genuinely common direct question without needing a phone call
petsAllowedtrue or false, stated plainlyOne of the most frequently asked practical questions in accommodation prompts, and one of the least answered in text anywhere on site
priceRangeAn honest rate indication, even a banded rangeGives a model something concrete instead of guessing or omitting price entirely
The same pattern we see everywhere else applies here too. Room detail, amenities, and policies living only inside an interactive booking engine are invisible to an AI crawler no matter how well the schema block is written elsewhere on the page. Schema and plain text content need to agree with each other, not substitute for one another.

A minimal working example

The block below is deliberately short. Accuracy across fewer fields outperforms a long block with several left blank or wrong, the same principle that applies to golf club schema generally.

StructureContent
@typeHotel
nameThe property's hotel trading name
addressFull street address, matching the golf club's address exactly if it's the same site
telephoneThe accommodation booking line, if distinct from the golf club's general number
starRating.ratingValueThe verified star rating, as a number
numberOfRoomsThe room count, as a number
amenityFeatureA list of named amenities, each as its own entry
checkinTime / checkoutTimeActual times in 24 hour format
priceRangeAn honest rate banding, such as "£110 to £220 per night"

Where to check it

Google's Rich Results Test and Schema.org's own validator will parse whatever markup already exists and confirm which fields are populated and which are missing or malformed. Run the accommodation page specifically, not just the homepage, since many resort sites only carry structured data on the top level page and leave the dedicated hotel or stay page with none at all.

The wider point

None of this replaces the plain text content a model actually reads first. Schema confirms and structures facts that should already exist somewhere in readable form on the page. Get the room detail, amenities, and policies written in plain English first, then structure them, in that order, and the accommodation side of a resort stops being the weaker half of the same AI recommendation answer.

Find out if your accommodation schema is helping or hurting you.

Our AI Recommendation Score checks structured data, content depth and three other categories, then hands you a ranked fix list. Start with a free AI Snapshot.

Get my free AI Snapshot