# Agent readiness for hotels, tours and restaurants

> How hotels, tour operators and restaurants can make booking widgets, date pickers, rates and cancellation terms work for AI agents booking for travelers.

By Ghost Agent Lab · Guide · https://ghostagentlab.com/blog/agent-readiness-for-travel-and-hospitality/

"Find me somewhere for two nights and book it" is the kind of job people now give an AI assistant. For hotels, tour operators and restaurants, that puts booking widgets, date pickers and cancellation terms in front of a second audience. This guide covers where that audience gets stuck and seven fixes, in order.

## Trip requests are lists of conditions

Travel requests arrive loaded with conditions, and each one is a fact the agent has to find on your site:

- **Hotels:** "Two nights in Portland from March 12, under $250 a night, free cancellation, parking, and they take dogs."
- **Tours and activities:** "A half-day kayak tour on Saturday morning for two adults and a 10-year-old."
- **Restaurants:** "A table for four at 8pm on Friday, somewhere with vegan options, near the hotel."

To act on any of these, the agent checks availability for specific dates, reads the price with taxes and fees, reads the cancellation terms, starts the booking and hands back to the traveler for payment or a card guarantee. If your site won't give it a straight answer, another site that lists your property might, and the booking goes there.

1. **Dates and guests:** Typed into your booking form
2. **Availability and rate:** Price with taxes and fees, in text
3. **Policies:** Cancellation, deposit, pets, check-in
4. **Guest details:** Labelled fields
5. ✓ **Hand back:** Traveler pays or guarantees the booking

**A booking, as an agent sees it.** Every step is a fact to read or a field to fill, and payment stays with the traveler.

## Where bookings fall apart

- **Availability lives only inside a widget.** Nothing about rooms, times or prices is in the page until someone picks dates in a script-driven calendar.
- **Date pickers you can't type into.** A grid of unlabelled day cells, where reaching March 12 means clicking through months.
- **Rates that grow at the last step.** Resort fees and taxes appear only on the final screen.
- **Cancellation terms in fine print.** Hidden in a rate details pop-up, or worded differently on the room page and the confirmation.
- **Third-party booking engines.** An engine inside an iframe, or a "Book now" button that leaves for the vendor's domain, with its own bot rules and its own form quality.
- **Menus and hours as images or PDFs.** A photographed menu card, and opening hours in a banner graphic.
- **Strict bot rules.** Rates attract scrapers, so protection on booking pages is often set high, and assistants acting for travelers get caught too.

## Reading your AgentScore as a hotel or restaurant

[AgentScore](https://ghostagentlab.com/agentscore/) looks for product pages, a cart and a pricing page. Most hotel, tour and restaurant sites have none of those in the sense it means, so it usually treats them as neither a store nor software. The product, pricing and checkout checks are then marked "not tested" and don't count against you.

The rest still applies: whether robots.txt and bot protection let AI assistants in, whether your home page's content is in the HTML without JavaScript, whether it has structured data, a title and description, and a sitemap, and whether its buttons, links, form fields and pop-ups work for agents. The structured data check passes when your home page has schema.org JSON-LD in its HTML. It doesn't judge whether you chose the right type, so that part is up to you (fix 2). AgentScore doesn't try a booking either; that takes a real agent.

## Seven fixes, in order

### 1. Let travelers' agents in

Check that your bot protection tells assistants acting for a traveler apart from rate scrapers. Allow verified assistants, and rate limit expensive requests such as availability searches rather than challenging everyone. Ask the same of your booking engine vendor. See [bot protection and CAPTCHAs](https://ghostagentlab.com/articles/bot-protection-ai-agents/).

### 2. Describe the business with the right type

Schema.org has a type for each kind of hospitality business: [Hotel](https://schema.org/Hotel) and other kinds of [LodgingBusiness](https://schema.org/LodgingBusiness), [Restaurant](https://schema.org/Restaurant) and other kinds of [FoodEstablishment](https://schema.org/FoodEstablishment), and [TouristTrip](https://schema.org/TouristTrip) for itineraries. Lodging businesses can state [checkinTime](https://schema.org/checkinTime), [checkoutTime](https://schema.org/checkoutTime), [petsAllowed](https://schema.org/petsAllowed) and [amenityFeature](https://schema.org/amenityFeature). Food establishments can state [servesCuisine](https://schema.org/servesCuisine), [acceptsReservations](https://schema.org/acceptsReservations) (which can be the address of your booking page) and [hasMenu](https://schema.org/hasMenu). Schema.org's [guide to marking up hotels](https://schema.org/docs/hotels.html) explains how rooms and offers fit together.

```
{
  "@context": "https://schema.org",
  "@type": "Hotel",
  "name": "Saltmarsh Inn",
  "url": "https://saltmarsh.example/",
  "checkinTime": "15:00:00",
  "checkoutTime": "11:00:00",
  "petsAllowed": true,
  "amenityFeature": [{
    "@type": "LocationFeatureSpecification",
    "name": "Free parking",
    "value": true
  }]
}
```

Address, phone and opening hours work as for any local business; see [Organization and LocalBusiness data](https://ghostagentlab.com/articles/organization-structured-data/) and [agent readiness for local businesses](https://ghostagentlab.com/blog/agent-readiness-for-local-businesses/).

### 3. Publish the facts as text

Room types with occupancy and beds, amenities, accessibility, parking, pet rules, tour meeting points and age limits, menus with dietary labels: all as HTML, on pages with ordinary links. Keep the PDF menu as a download if you like, but not as the only copy.

### 4. Show rates the way travelers compare them

On each room or tour page, give a "from" price in the HTML and say what it covers: per night or per person, taxes, and any resort or booking fees. An agent weighing you against a listing elsewhere needs a like-for-like number. See [prices AI agents can read](https://ghostagentlab.com/articles/machine-readable-prices/).

### 5. Write cancellation terms once, in plain sentences

"Free cancellation until 48 hours before arrival. After that, the first night is charged." Put each rate's policy in text beside the rate, and use the same words on the confirmation. Whatever your structured data says, the visible sentence is what an assistant will quote. See [policy pages AI assistants can quote](https://ghostagentlab.com/articles/policy-pages-ai-assistants/).

`saltmarsh.example/rooms/harbor-king`

- **Harbor King room:** · Sleeps 2 · One king bed · Dogs welcome
- From $210 per night, including taxes. Free parking (✓ What the price includes)
- Free cancellation until 48 hours before arrival (✓ Policy next to the rate)
- [Check-in date: 2027-03-12] [Nights: 2] (✓ Typed, labelled fields)
- [Check availability]

**A room page an agent can book from.** The rate, what it includes and the cancellation terms are text, and the dates can be typed.

### 6. Make the booking form typeable and linkable

Let people type a date into a labelled field (a native `<input type="date">` works), label the guests and rooms fields, and say "No availability on these dates" in text. Better still, accept dates and guests in the address, so an assistant can link a traveler straight to live availability:

```
https://saltmarsh.example/book?checkin=2027-03-12&nights=2&adults=2
```

See [sign-up, booking and lead forms AI agents can finish](https://ghostagentlab.com/articles/agent-friendly-sign-up-booking/).

### 7. Hold your booking engine vendor to the same standard

If bookings run through a third party, much of the journey is in their hands. Ask them: Are AI assistants blocked or challenged on your pages? Can dates and guests be passed in the address? Are the form fields labelled? Is there a direct link to the engine as well as the embed? [Iframes, shadow DOM and embedded widgets](https://ghostagentlab.com/articles/iframes-shadow-dom-widgets-ai-agents/) explains what to look for.

## Testing a booking

1. Run AgentScore on your home page. Fix anything under Access first, then pop-ups and unnamed buttons.
2. Use View Source on a room, tour or menu page and search for a price, your check-in time and the word "cancellation". If they aren't there, assistants that read HTML can't quote them.
3. Ask an assistant what your guests ask, such as "Does Saltmarsh Inn allow dogs, and can I cancel for free?", and compare the answer with your site.
4. Give a [Ghost Agent](https://ghostagentlab.com/ghost-agent/) a goal like "Check availability for two adults for two nights from March 12 and get to the guest details step". Ghost Agents stop before payment and stay on your site, so if your booking engine runs on the vendor's domain, the test covers your part of the journey. Raise the rest with the vendor.

> **For restaurants:** the same order applies, with the menu and reservation form doing the work of rooms and rates. If you take orders online, treat that part like a store; see [agent readiness for grocery and food](https://ghostagentlab.com/blog/agent-readiness-for-grocery-and-food/).
