房间套装

借助客房套餐,您可以为单个房源定义多种客房类型,或者将客房行程与价格功能(附带房价和销售条件的附加服务)相结合,从而在标准价格之外为用户提供。

主要概念和工作流程

借助客房套餐,您可以通过不同服务套餐提供物理客房类型的其他组合。

下图显示了客房套餐的示例:

在此示例中,第一个套餐是基本房间,仅有一位成人入住的折扣。第二种是不同的客房类型,最多可供 3 名成人入住。第三种是同一房源内的另一种客房类型。第四个是基础室的“高级”套餐,可能包含免费早餐或稍后结账等便利设施。

下图显示了费率功能的示例:

在搜索结果中显示客房套餐和房价特性的选择流程与标准房价相同。

客房套餐

您可以在交易消息中定义客房套餐和评分功能。事务消息的根元素是 <Transaction>

交易消息的结构取决于您正在执行的操作:定义有关客房套餐或房价功能的元数据,或更新客房套餐的价格或空房情况。

元数据
<PropertyDataSet> 元素中使用 <PackageData> 定义客房套餐和评分设施元数据。如需了解详情,请参阅定义会议室和套餐元数据。Room Bundle 使用现有的 <RoomData> 元素作为其实际房间说明。
价格和空房情况
使用 <Result> 中的 <RoomBundle> 元素为每个套餐/行程组合定义客房套餐价格和空房情况。如需了解详情,请参阅定义价格和可用性

基本房的房价、税费和其他费用在 <Result> 下是强制性的,如果未与客房套餐搭配使用,则基本房费用、税费和其他费用在与客房套餐搭配使用时是强制性的;与客房套餐搭配使用时,可以移除这些费用。如果您使用实际帐号实现 Room 软件包,请按以下步骤操作:

  1. <Result> 下添加基本房间的房价、税费和其他费用,并添加一个与基本客房套餐匹配的客房套餐。

  2. 如果需要,您可以在同一 <Result> 块中针对该房源的其他客房类型或不同的服务软件包定义其他客房套餐。

  3. 启动 Room Bundle 后,移除基本房间的房价、税费和其他费用。

客房套餐元数据

定义客房套餐和给特征评分时,您通常需要提前定义说明、包含在房价中的附加服务,以及其他有关客房套餐的信息。这些信息称为 Room Bundle 元数据。然后,您可以在价格更新中引用这些元数据,但不要将其包含在价格更新消息中。

定义客房套餐时,请为实际房间说明使用现有的 <RoomData> 元素,为实际房间说明中不包含的价格功能和条款使用 <PackageData> 元素。

使用 <RoomData><PackageData> 元素可以显著缩减酒店列表和酒店价格 Feed 的大小,因为这样可以减少交易消息中发送的重复数据量。

例如,每个行程通常会重复提供房间名称和说明等数据。您可以使用 <RoomData><PackageData> 元素定义此类数据一次。然后,特定于行程的客房套餐数据会与存储的客房和套餐定义合并,以便向最终用户显示。

Google 会将您的元数据与您的行程专用数据进行匹配,以呈现您的广告内容。系统进行了一项特殊处理,以合并 <RoomData><PackageData> 元素中的名称和说明,从而可以在 <RoomData> 中描述物理房间,并在 <PackageData> 中对功能和软件包详细信息进行评分。

如果您为单个房间或 Room 套餐定义了房间数据和套餐数据,Google 会在广告输出中包含这两项(用连字符分隔)。

照片准则

发送会议室照片时,您应遵循以下准则,以确保照片可以显示给用户:

  • 发送每种房间类型的照片,包括无障碍房间的照片,例如配有各种浴室装置(如滚入式淋浴间)的指定无障碍房间的照片。

  • 至少添加四张房间照片和至少一张浴室照片。

  • 照片应展示的是房间本身而非房源。最重要的照片包括床、整个房间、浴室、起居室、房间的景色(其余房间为同一张照片),以及阳台、露台或露台(如适用)。

    拍摄桌子、厨房、咖啡机/茶具和独特房间设施的照片也很有帮助。

  • 避免拍摄人物和财产的照片,例如外部或房产设施、观光/旅游和美食。

  • 避免对物体的特写拍摄,例如高脚杯的特写。

  • 避免品牌和品牌,但可以将带标签或品牌的洗漱用品包括在拍摄整个浴室区域的照片中。照片不应包含大块文字、徽标或水印。

  • 提供视野开阔的标准横向(横向)照片;请避免使用鱼眼和失真的照片。以最高分辨率拍摄照片,以提高排名。您无需提交不同分辨率的相同照片。

数据优先级

系统会从所有来源收集客房套餐数据,并根据优先规则进行组合,从而生成指定酒店、行程和客房套餐的最终数据。优先级顺序如下(从低到高):

  1. (最低)合作伙伴数据
  2. 媒体资源数据
  3. <RoomData>,其中 <RoomID><RoomBundle> 块中的 <RoomID> 匹配
  4. <PackageData>,其中 <PackageID><RoomBundle> 块中的 <PackageID> 匹配
  5. (最高)<RoomBundle>

定义价格和库存状况

如需定义客房套餐的价格和空房情况,请在交易消息中针对每个套餐或行程组合使用 <RoomBundle> 元素。<RoomBundle> 元素应在 <Result> 元素内。两个 <RoomBundle> 元素的示例代码如下所示。请注意,在此示例中,两个 <RoomBundle> 元素使用 <RoomID><PackageID> 引用 Room 和软件包元数据。

对于每个 <Result>,包含的一组客房套餐会覆盖该属性或行程组合的现有集合。如果您未在 <Result> 元素中定义任何客房套餐或评分功能,则系统会移除所有客房套餐,并且搜索结果中只会显示相应酒店或行程的基本客房。

请务必使用 <Name> 等元素,让您的客房套餐对潜在客户更具吸引力,并确保它们与酒店的着陆页保持一致。在此示例中,您将在元数据中定义名称和其他描述性信息。

<RatePlanID> 是可选的,表示客房和套餐组合的唯一标识符。我们强烈建议您使用 RatePlanID 作为变量来构建动态着陆页(以前称为销售终端)网址。如需了解详情,请参阅使用变量和条件

以下元素在 Room 软件包中是可选的:

<Baserate>
<Tax>
<OtherFees>
<RoomID>
<PackageID>
<Occupancy>
<OccupancyDetails>

在实际帐号中实现 Room 软件包时,请在启用 Room 软件包后移除 <Baserate>

<Result>
  <!-- Note: When using Room Bundles, the top level result price is no
       longer necessary. -->
  <Property>180054</Property>
  <Checkin>2017-10-07</Checkin>
  <Nights>2</Nights>
  <!-- Base Room Bundle -->
  <RoomBundle>
    <RoomID>060773</RoomID>
    <PackageID>P54321</PackageID>
    <Baserate currency="USD">199.99</Baserate>
    <Tax currency="USD">25.12</Tax>
    <OtherFees currency="USD">2.00</OtherFees>
    <!-- RatePlanID is optional and represents the unique identifier for a
    room and package data combination. We strongly recommend using RatePlanID
    as a variable to build your dynamic landing page (formerly Point of Sale)
    URL. For details, see Using Variables and Conditions. -->
    <RatePlanID>060773-P54321</RatePlanID>
  </RoomBundle>
  <!-- Premium Room Bundle -->
  <RoomBundle>
    <RoomID>436233</RoomID>
    <PackageID>P12345</PackageID>
    <!-- Price for 4 ("occupancy") -->
    <Baserate currency="USD">298.88</Baserate>
    <Tax currency="USD">42.12</Tax>
    <OtherFees currency="USD">10.00</OtherFees>
    <RatePlanID>436233-P12345</RatePlanID>
  </RoomBundle>
</Result>

定义客房和套餐元数据

如需定义客房套餐元数据,请使用交易消息的 <PropertyDataSet> 元素内的 <PackageData><RoomData> 元素。

您可以在交易消息中定义与价格和空房情况数据分开的客房和套餐元数据。通过提前定义这些数据,您的价格更新不需要包含重复信息,例如说明、照片网址、设施,以及每个行程的每个客房或套餐的其他数据。

Google 会为您存储元数据,并在您的广告展示时将其插入广告。您可以随时使用新的 Transaction 消息更新会议室和套餐元数据。

在“交易”消息中,您需要在每个块上设置一个套餐 ID 和客房 ID,然后在 <Result> 价格更新块中引用这些 ID。

如果客房和套餐数据发生变化(例如,如果您在媒体资源中添加新的客房类型,则发送一条包含更新后的客房和套餐数据的新 Transaction 消息),Google 会将客房或套餐的现有元数据替换为新数据。

Google 建议您在初始设置期间定义元数据。预定义元数据后,您只需在价格更新中引用 <RoomID><PackageID> 值,而无需再次包含所有这些信息。Google 使用这些 ID 将客房和客房套餐与存储的元数据进行匹配。这样可以大大减小事务消息的总大小。

由于客房或行程组合的价格变化比客房或套餐说明频繁得多,因此定义一次元数据然后引用元数据可以更高效地使用交易消息。此外,通过使用元数据(而不是以内嵌方式定义数据),可以消除会议室说明不匹配等错误。

下面推荐了最高效的单独定义元数据和价格的方法:

<!-- Efficient method of defining Room Bundles -->
<!----- Occupancy of 2 and 4 example ------>

<Transaction timestamp="2019-04-18T16:20:00-04:00" id="12345678">
  <!-- Part1: Define RoomData and PackageData in PropertyDataSet -->
  <!-- Note: Once defined it does not have to be repeated for future Transaction Messages. -->
  <!--       PropertyDataSets can also be defined and sent in their own Transaction Message -->
  <!--       separately from pricing. Google can be configured to pull just PropertyDataSets -->
  <!--       once per day (or on a predefined frequency). -->
  <PropertyDataSet>
    <Property>180054</Property>
    <!-- Can be reused by multiple Room Bundles -->
    <RoomData>
      <RoomID>060773</RoomID>
      <Name>
        <Text text="Single Queen Room - Non-Smoking" language="en"/>
        <Text text="Chambre de la Roi Premium - Pas de Fumeurs" language="fr"/>
      </Name>
      <!-- Room can accommodate 4, but bundle is for 2 -->
      <Capacity>4</Capacity>
      <PhotoURL>
        <URL>http://www.foo.com/static/bar/imageQueen.jpg</URL>
        <Caption>
          <Text text="A bright and breezy way to enjoy your mornin'
            cuppa tea." language="en"/>
          <Text text="Une façon lumineuse et aérée pour profiter
            de votre journée tasse de thé." language="fr"/>
        </Caption>
      </PhotoURL>
    </RoomData>
    <RoomData>
      <RoomID>436233</RoomID>
      <Name>
        <Text text="Premium King Room - Non-Smoking" language="en"/>
        <Text text="Chambre de le Roi Premium - Pas de Fumeurs" language="fr"/>
      </Name>
      <!-- Room can accommodate 4 and bundle is for 4 -->
      <Capacity>4</Capacity>
      <PhotoURL>
        <URL>http://www.foo.com/static/bar/imageKing.jpg</URL>
        <Caption>
          <Text text="A bright and breezy way to enjoy your mornin'
            cuppa tea." language="en"/>
          <Text text="Une façon lumineuse et aérée pour profiter
            de votre journée tasse de thé." language="fr"/>
        </Caption>
      </PhotoURL>
    </RoomData>
    <!-- Can be reused by multiple Room Bundles -->
    <PackageData>
      <PackageID>P54321</PackageID>
      <Occupancy>2</Occupancy>
      <ChargeCurrency>web</ChargeCurrency>
      <Refundable available="1" refundable_until_days="7"
           refundable_until_time="18:00:00"/>
      <ParkingIncluded>1</ParkingIncluded>
      <InternetIncluded>1</InternetIncluded>
    </PackageData>
    <PackageData>
      <PackageID>P12345</PackageID>
      <Occupancy>4</Occupancy>
      <ChargeCurrency>web</ChargeCurrency>
      <Refundable available="1" refundable_until_days="1"
           refundable_until_time="18:00:00"/>
      <BreakfastIncluded/>
      <ParkingIncluded>1</ParkingIncluded>
      <InternetIncluded>1</InternetIncluded>
    </PackageData>
  </PropertyDataSet>

    <!-- Efficient method of defining Room Bundles -->
    <!-- Part 2: Reference RoomData and PackageData through ID -->
  <Result>
    <Property>180054</Property>
    <Checkin>2017-10-07</Checkin>
    <Nights>2</Nights>

    <!-- Base Room Bundle -->
    <RoomBundle>
      <RoomID>060773</RoomID>
      <PackageID>P54321</PackageID>
      <Baserate currency="USD">199.99</Baserate>
      <Tax currency="USD">25.12</Tax>
      <OtherFees currency="USD">2.00</OtherFees>
      <!-- RatePlanID is optional and represents the unique identifier for a
      room and package data combination. We strongly recommend using RatePlanID
      as a variable to build your dynamic landing page (formerly Point of Sale)
      URL. For details, see Using Variables and Conditions. -->
      <RatePlanID>060773-P54321</RatePlanID>
    </RoomBundle>
    <!-- Premium Room Bundle -->
    <RoomBundle>
      <RoomID>436233</RoomID>
      <PackageID>P12345</PackageID>
      <!-- Price for 4 ("occupancy") -->
      <Baserate currency="USD">298.88</Baserate>
      <Tax currency="USD">42.12</Tax>
      <OtherFees currency="USD">10.00</OtherFees>
      <RatePlanID>060773-P12345</RatePlanID>
    </RoomBundle>
    <!-- Continue providing all available RoomBundle rates under matched
         property for any other occupancies -->
  </Result>
</Transaction>

入住人数和容纳人数

定义客房软件包时,您必须了解“入住人数”和“容量”之间的区别:

在家/外出
客房套餐的入住人数。例如,“蜜月套餐”的入住人数为 2。您可以使用 <PackageData><RoomBundle> 元素的 <Occupancy> 子元素来设置包裹占用率值。
容量
每间会议室可容纳的人数上限。客房的容纳人数始终等于或高于入住人数。例如,您酒店中的“蜜月套房”最多可容纳 6 人,但您为 2 名房客定价。您可以使用 <RoomData> 元素的 <Capacity> 子元素设置软件包容量的值。

为客房套餐定价时,您必须提供套餐预定的房客数量价格(套餐的 <Occupancy> 元素中指定的值)。如果 <Occupancy> 设为两人,则该套餐中的价格必须为两人。您不能将 <Occupancy> 设置为 4 人,而设置 2 人入住的套餐价格。

共享房间

您还可以在客房套餐中使用“入住人数”和“容纳人数”功能为共享客房(例如招待所)设置价格。例如,如需为有 8 张床的宿舍设置每人价格,您需要将“入住人数”设置为 1 并将“容纳人数”设置为 8,并在 <RoomData> 名称中按此方式进行标识。查看示例

更新客房套餐

本部分介绍了如何移除不再可用的客房套餐,以及如何更新现有客房套餐的价格。

客房套餐移除

移除客房套餐与酒店价格有所不同。

如需从商品目录中移除客房或行程组合,请将 <Result> 元素的 <Baserate> 设置为 -1。如需移除指定客房或行程的客房套餐,请从事务消息的 <Result> 代码块中移除 <RoomBundle> 元素。

数据 Feed 中的客房套餐被视为集合,其数字介于 0 到十之间。将 Room 软件包发送给 Google 时,就是发送当前的完整集合。您无需更改单个 Room Bundle 的值以将之前的可用资源包标记为不可用。最新的事务消息中包含的任何软件包集都会替换当前的那组软件包。

例如,有 A、B、C 和 D 套装。您首先发送一条消息,定义一组房间套餐 A、B、C 和 D。之后,如果套装 B 售罄,则只需重新发送包含套装 A、C 和 D 的整套商品。如果所有 Room Bundle 都已售罄,请发送一组空的 Room Bundle。

价格调整

如需更改客房软件包的价格,请在 <Result> 元素中设置新的 <Baserate>

每次在事务消息中更新房间/行程的 <Result> 块时,您都必须为每个 <Result> 添加一组完整的可用 Room Bundle。Google 会将现有的 Room Bundle 集替换为新的 Room Bundle 集。如果您未在 <Result> 中添加任何客房套餐,Google 会移除该客房或行程的所有客房套餐。

元数据更新

通过对 Google 发送的 <Query> 的响应,您可以更新客房套餐元数据。

您使用 Transaction 消息响应“Query”消息,该消息定义了指定酒店的客房和套餐元数据。如需了解详情,请参阅查询消息