借助客房套餐,您可以为单个房源定义多种客房类型,或者将客房的行程与费率功能(附带费率和销售条件的附加服务)相结合,以区别于标准价格。
主要概念和工作流
借助客房套餐,您可以将实体客房类型与不同的服务套餐搭配出更多组合。
示例
下图显示了桌面设备和移动设备中的 Room 软件包示例:
包含图片的客房套餐
此示例是移动版客房套装,其中包含所需入住人数对应的所有不同客房类型及其各自的客房图片。
注意:没有图片的客房套餐会替换为床铺占位符图片。
为功能评分
下图显示了费率功能的示例:
在搜索结果中显示客房套餐和房价特性的选择流程与标准房价相同。
客房套餐
您可以在交易消息中定义客房套餐和房价功能。事务消息的根元素是 <Transaction>
。
交易消息的结构取决于您正在执行的操作:定义有关客房套餐或房价功能的元数据,或更新客房套餐的价格或空房情况。
- 元数据
- 在
<PropertyDataSet>
元素中使用<PackageData>
定义客房套餐和评分设施元数据。如需了解详情,请参阅定义会议室和套餐元数据。客房套餐会使用现有的<RoomData>
元素来描述实际客房。 - 价格和空房情况
- 为每个套餐/行程组合使用
<Result>
中的<RoomBundle>
元素定义客房套餐价格和空房情况。如需了解详情,请参阅定义价格和可用性。
基本房的房价、税费和其他费用在 <Result>
下是强制性的,如果未与客房套餐搭配使用,则基本房费用、税费和其他费用在与客房套餐搭配使用时是强制性的;与客房套餐搭配使用时,可以移除这些费用。如果您使用实际账号实现 Room 软件包,请按以下步骤操作:
在
<Result>
下添加基本客房的房价、税费和其他费用,并添加一个与基本客房套餐匹配的客房套餐。如果需要,您可以在同一
<Result>
块中针对该房源的其他客房类型或不同的服务软件包定义其他客房套餐。客房套餐发布后,请移除基本客房的房价、税费和其他费用。
客房套餐元数据
定义客房套餐和给特征评分时,您通常需要提前定义说明、包含在房价中的附加服务,以及其他有关客房套餐的信息。这些信息称为 Room Bundle 元数据。然后,您可以在价格更新中引用此元数据,但不要将其包含在价格更新消息中。
定义客房套餐时,请为实际房间说明使用现有的 <RoomData>
元素,为实际房间说明中不包含的价格功能和条款使用 <PackageData>
元素。
使用 <RoomData>
和 <PackageData>
元素可以显著缩减酒店列表和酒店价格 Feed 的大小,因为这会减少在交易消息中发送的重复数据量。
例如,每个行程通常会重复提供房间名称和说明等数据。您可以使用 <RoomData>
和 <PackageData>
元素定义此类数据一次。然后,行程专用客房套餐数据会与存储的客房和套餐定义合并,以便向最终用户显示。
Google 会将您的元数据与行程专用数据进行匹配,以呈现广告内容。系统进行了一项特殊处理,以合并 <RoomData>
和 <PackageData>
元素中的名称和说明,从而可以在 <RoomData>
中描述物理房间,并在 <PackageData>
中对功能和软件包详细信息进行评分。
如果您为单个房间或 Room 套餐定义了房间数据和套餐数据,Google 会在广告输出中包含这两项(用连字符分隔)。
照片准则
在发送客房照片时,您应遵循以下准则,以确保向用户展示您的照片:
发送每种房型(包括无障碍客房)的照片,例如,配有各种浴室设施(例如无障碍淋浴间)的指定无障碍客房。
至少包含 4 张客房照片和 1 张浴室照片。
照片应展示的是房间本身而非房源。最重要的照片包括床、整个房间、浴室、起居室、房间的景色(其余房间为同一张照片),以及阳台、露台或露台(如适用)。
另外,拍摄书桌、厨房、咖啡/茶机和独特的客房特色的照片也很有帮助。
避免拍摄人物和财产的照片,例如外部或房产设施、观光/旅游和美食。
避免拍摄物体的特写镜头,例如高脚杯的特写镜头。
避免品牌和品牌,但可以将带标签或品牌的洗漱用品包括在拍摄整个浴室区域的照片中。照片不应包含大块文字、徽标或水印。
提供视野范围开阔的标准横向(水平)照片;避免提供鱼眼照片和失真照片。以最高分辨率拍摄照片,以提高排名。您无需提交不同分辨率的同一张照片。
数据优先级
系统会从所有来源收集客房套餐数据,并根据优先规则进行组合,从而生成指定酒店、行程和客房套餐的最终数据。优先级顺序如下(从低到高):
- (最低)合作伙伴数据
- 媒体资源数据
<RoomData>
,其中<RoomID>
与<RoomBundle>
块中的<RoomID>
匹配<PackageData>
,其中<PackageID>
与<RoomBundle>
块中的<PackageID>
匹配- (最高)
<RoomBundle>
定义价格和库存状况
如需定义客房套餐的价格和空房情况,请在每个套餐或行程组合对应的交易消息中使用 <RoomBundle>
元素。<RoomBundle>
元素应在 <Result>
元素内。两个 <RoomBundle>
元素的示例代码如下所示。请注意,在此示例中,两个 <RoomBundle>
元素使用 <RoomID>
和 <PackageID>
引用了房间和软件包元数据。
对于每个 <Result>
,包含的客房套餐集会覆盖该房源或行程组合的现有集。如果您未在 <Result>
元素中定义任何客房套餐或房价功能,则系统会移除所有客房套餐,并且搜索结果中只会显示相应酒店或行程的基本客房。
请务必使用 <Name>
等元素,让您的客房套餐对潜在客户更具吸引力,并确保其与酒店的着陆页保持一致。在此示例中,您需要在元数据中定义名称和其他描述信息。
<RatePlanID>
是可选的,表示客房和套餐组合的唯一标识符。我们强烈建议您使用 RatePlanID 作为变量来构建动态着陆页(以前称为销售终端)网址。如需了解详情,请参阅使用变量和条件。
以下元素在 Room 软件包中是可选的:
<Baserate>
<Tax>
<OtherFees>
<RoomID>
<PackageID>
<Occupancy>
<OccupancyDetails>
在正式版账号中实现客房套餐后,请在启用客房套餐后移除 <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 会为您存储元数据,并在您的广告展示时将其插入广告。您可以随时使用新的交易消息更新客房和套餐元数据。
在“交易”消息中,您需要在每个块上设置一个套餐 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
。如需移除指定客房或行程的客房套餐,请从“Transaction”消息中的 <Result>
块中移除 <RoomBundle>
元素。
数据 Feed 中的客房套餐被视为一个集合,数量从 0 到数十个不等。将 Room 软件包发送给 Google 时,就是发送当前的完整集合。您无需更改单个 Room Bundle 的值以将之前的可用资源包标记为不可用。最新的交易消息中的任何一组软件包都会替换当前的软件包。
例如,有 A、B、C 和 D 套装。您首先发送一条消息,定义一组房间套餐 A、B、C 和 D。之后,如果套装 B 售罄,则只需重新发送包含套装 A、C 和 D 的整套商品。如果所有 Room 软件包均售罄,则发送一组空的 Room 软件包。
价格调整
如需更改客房软件包的价格,请在 <Result>
元素中设置新的 <Baserate>
。
每次在事务消息中更新客房/行程的 <Result>
块时,您都必须为每个 <Result>
添加一组完整的可用 Room Bundle。Google 会将现有的一组客房套餐替换为新一组。如果您未在 <Result>
中添加任何客房套餐,Google 会移除相应客房或行程的所有客房套餐。
元数据更新
您可以通过对 Google 发出的 <Query>
的响应来更新 Room Bundle 元数据。
您使用“Transaction”消息响应“Query”消息,该消息定义了指定酒店的客房和套餐元数据。如需了解详情,请参阅查询消息。