XooCode(){

Reservation

Reservation is an Intangible type (not an Event or Product) for any booking or reservation: hotel stays, restaurant tables, flights, rental cars, event tickets. It has 12 properties of its own covering booking details (reservationId, bookingTime, reservationStatus), pricing (totalPrice, priceCurrency), and the parties involved (underName for the guest, provider for the business, broker for the booking platform).

The type hierarchy is Thing → Intangible → Reservation. The key property is reservationFor, which points to the thing being reserved: a LodgingBusiness, a FoodEstablishment, a Event, a Flight. Google reads Reservation markup primarily in email (Gmail structured data) and Google Travel, not on web pages.

Full example of schema.org/Reservation json-ld markup

The markup is verified as valid with Rich Results Test from Google.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/Reservation
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Reservation",
  "@id": "https://thunderdomedunmore.com/bookings/TOUR-2026-1142#reservation",
  "reservationId": "TOUR-2026-1142",
  "reservationStatus": "https://schema.org/ReservationConfirmed",
  "bookingTime": "2026-10-01T14:22:00-04:00",
  "modifiedTime": "2026-10-01T14:22:00-04:00",
  "reservationFor": {
    "@type": "TouristAttraction",
    "@id": "https://thunderdomedunmore.com#attraction",
    "name": "The Thunderdome",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "500 Main Street",
      "addressLocality": "Dunmore",
      "addressRegion": "PA",
      "addressCountry": "US"
    }
  },
  "underName": {
    "@type": "Person",
    "name": "Erik Dahl",
    "email": "erik@example.com"
  },
  "provider": {
    "@id": "https://thunderdomedunmore.com#attraction",
    "@type": "TouristAttraction",
    "name": "The Thunderdome"
  },
  "totalPrice": "25.00",
  "priceCurrency": "USD",
  "reservedTicket": {
    "@type": "Ticket",
    "ticketNumber": "TOUR-2026-1142-A",
    "dateIssued": "2026-10-01",
    "ticketedSeat": {
      "@type": "Seat",
      "seatSection": "Group A"
    }
  }
}
</script>

reservationStatus

reservationStatus takes a ReservationStatusType enum: ReservationConfirmed, ReservationPending, ReservationHold, or ReservationCancelled. Use the full schema.org URL. Gmail uses this to show booking cards in the inbox: confirmed bookings get a green checkmark, pending ones get an orange clock.

reservationFor

reservationFor links the reservation to the thing being reserved. Its expected type is Thing, so it can be anything: a LodgingBusiness for hotel bookings, a FoodEstablishment for restaurant reservations, an Event for ticket bookings, a Flight for air travel. The subtype-specific Reservation types (LodgingReservation, FlightReservation, etc.) constrain what reservationFor should point to.

underName and provider

underName is the person or organization the reservation is for (the guest). provider is the business providing the service (the hotel, the airline). broker is the intermediary that facilitated the booking (Booking.com, Expedia, a travel agent). Not every reservation has a broker, but if you are the booking platform, set yourself as the broker and the service provider as the provider.

reservedTicket

reservedTicket takes a Ticket object for reservations that produce a ticket: event tickets, boarding passes, train tickets. The Ticket has its own properties: ticketNumber, ticketedSeat, dateIssued. For restaurant or hotel reservations, there is no ticket, so omit this property.

When to use Reservation subtypes

Use the most specific subtype available: LodgingReservation for hotels, FoodEstablishmentReservation for restaurants, FlightReservation for flights. Each subtype adds properties specific to that domain (checkinTime, partySize, boardingGroup). Only use the generic Reservation type when no subtype fits.

Minimal valid version

The smallest markup that still produces a valid Reservation entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.

schema.org/Reservation (minimal)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Reservation",
  "reservationId": "TOUR-2026-1142",
  "reservationStatus": "https://schema.org/ReservationConfirmed",
  "reservationFor": { "@type": "TouristAttraction", "name": "The Thunderdome" },
  "underName": { "@type": "Person", "name": "Erik Dahl" }
}
</script>

Google rich results this unlocks

Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.

Common Reservation mistakes

Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.

  1. 01

    reservationStatus as a plain string

    Wrong
    "reservationStatus": "Confirmed"
    Right
    "reservationStatus": "https://schema.org/ReservationConfirmed"

    reservationStatus takes a ReservationStatusType enum value as a full schema.org URL. The four values are ReservationConfirmed, ReservationPending, ReservationHold, and ReservationCancelled.

  2. 02

    Missing reservationFor

    Wrong
    Reservation with reservationId and status but no reservationFor
    Right
    "reservationFor": { "@type": "LodgingBusiness", "name": "Hotel Dunmore" }

    reservationFor connects the reservation to the thing being reserved. Without it, the reservation is a booking for nothing. Gmail and Google Travel need this to display the booking card correctly.

  3. 03

    Using generic Reservation when a subtype exists

    Wrong
    "@type": "Reservation" for a hotel booking
    Right
    "@type": "LodgingReservation"

    Subtypes like LodgingReservation, FlightReservation, and FoodEstablishmentReservation add domain-specific properties (checkinTime, boardingGroup, partySize). Using generic Reservation loses these properties and gives Google less structured data to work with.

  4. 04

    Confusing underName with provider

    Wrong
    "underName": { "@type": "Organization", "name": "Hotel Dunmore" }
    Right
    "underName" is the guest; "provider" is the business

    underName is who the reservation is for (the person traveling or dining). provider is the business providing the service. Getting these backwards means the hotel appears as the guest and the guest appears as the provider.

About the example data

A generic reservation for a private tour of The Thunderdome in Dunmore, booked through Xoo Code Inc. as the provider.

Comments

Loading comments...

Leave a comment