Add dining seating sections

It is common for restaurants to have distinct seating areas such a bar or patio and different experiences, like a five-course tasting menu or wine tasting. The Actions Center supports this distinction and allows the user to specify the area to book a table.

Availability Slots With Room Names

Figure 1: Example slot selection for a restaurant with seating sections

This inventory separation can be employed by setting the room_id, room_name, and fields in the resources message of an Availability slot. To include room descriptions, use room_description field inside the Resources message.

// A resource is used to disambiguate availability slots from one another when
// different staff, room or party_size values are part of the service.
// Multiple slots for the same service and time interval can co-exist when they
// have different resources.
message Resources {
  // One of staff_id, room_id, or party_size must be set.

  // Optional ID for a staff member providing the service. This field identifies
  // the staff member across all merchants, services, and availability records.
  // It also needs to be stable over time to allow correlation with past
  // bookings. (optional but required if staff_name is present)
  string staff_id = 1;

  // Optional name of a staff member providing the service. This field will be
  // displayed to users making a booking, and should be human-readable, as
  // opposed to an opaque identifier. (optional but required if staff_id is
  // present)
  string staff_name = 2;

  // An optional ID for the room the service is located in. This field
  // identifies the room across all merchants, services, and availability
  // records. It also needs to be stable over time to allow correlation with
  // past bookings. (optional but required if room_name is present)
  string room_id = 3;

  // An optional name for the room the service is located in or experience of
  // of the service. This field will be displayed to users making a booking,
  // and should be human readable, as opposed to an opaque identifier.
  // A room name should only be used for seating areas or prepaid experiences.
  // Examples of room names include "Bar", "Patio", "Dining Room". Examples of
  // dining experiences using room names include "Five-Course Tasting Menu",
  // "Chef Omakase". It is strongly recommended that the default seating area
  // does not have a room associated with it.
  string room_name = 4;

  // Applicable only for Dining: The party size that can be accommodated
  // during this time slot. A restaurant can be associated with multiple Slots
  // for the same time, each specifying a different party_size, if for instance
  // 2, 3, or 4 people can be seated with a reservation. (optional)
  int32 party_size = 5;

  // Localized room description with a limit of 500 characters. If set,
  // a default value must be provided, it is preferred to use the common
  // languages for the merchant's locale.
  Text room_description = 7;
}

This information is an integral part of a slots definition and will need to be included in the feeds as well as all booking and real-time update operations. You can see examples of the room_id and room_name being specified in the Dining, Vertical-Specific Feed example.

Availability Slots using Room Names for Experiences

If you have implemented or are in the process of implementing Reservations Payments Redirect, you may use room_name and room_descriptions to power prepaid dining experiences. The following screenshot details how the experience is shown on the web.

Figure 1: Example slot selection for a restaurant with seating sections including room descriptions

Room Sample

{
  "availability": [{
    "merchant_id": "dining-A",
    "service_id": "reservation",
    "start_sec": 1535853600,
    "duration_sec": 2700,
    "spots_total": 2,
    "spots_open": 2,
    "resources": {
      "room_id": "A-dining-room",
      "room_name": "Bar",
      "party_size": 2,
      }
  }]
}

Experiences Sample

{
  "availability": [{
    "merchant_id": "dining-A",
    "service_id": "reservation",
    "start_sec": 1535853600,
    "duration_sec": 2700,
    "spots_total": 2,
    "spots_open": 2,
    "resources": {
      "room_id": "experience-1",
      "room_name": "Wine Tasting Menu Pair",
      "description": "This Wine Tasting Menu Pair showcases American cuisine rooted in the nostalgic flavors of the 20th century American experience. Each experience is hand-crafted, with a progression from small bites to more substantial plates.",
      "party_size": 2,
      }
    }]
}

Ensure the Size of Your Feed Remains Small

If you have a large number of seating sections each with room descriptions, you can reduce the size of your feed by only including the room descriptions in one of the slots. We use the room_name and room_id across all slots and add the room_description from one of the slots.

When managing the size of your feed, consider following the best practices outlined in Compress Feed Files and Shard Feed Files

Room Description Sample

{
  "availability": [
    {
    "merchant_id": "dining-A",
    "service_id": "reservation",
    "start_sec": 1535853600,
    "duration_sec": 2700,
    "spots_total": 2,
    "spots_open": 2,
    "resources": {
      "room_id": "experience-1",
      "room_name": "Wine Tasting Menu Pair",
      "description": "This Wine Tasting Menu Pair showcases American cuisine rooted in the nostalgic flavors of the 20th century American experience. Each experience is hand-crafted, with a progression from small bites to more substantial plates.",
      "party_size": 2
      }
  },
  {
    "merchant_id": "dining-A",
    "service_id": "reservation",
    "start_sec": 1535854600,
    "duration_sec": 2700,
    "spots_total": 4,
    "spots_open": 4,
    "resources": {
      "room_id": "experience-1",
      "room_name": "Wine Tasting Menu Pair",
      "party_size": 6
      }
  }]
}