在过去三年里,我一直在为独立酒店和精品酒店集团构建自定义预订界面。我可以用完全的确定性告诉你:每个酒店 PMS API 都至少有一个未记录的行为会毁掉你的周末。本指南涵盖了我在与 Cloudbeds、Mews 和 SiteMinder 集成时实际学到的东西——好的、坏的,以及那个在凌晨 2 点消失的价格计划。

如果你是一名开发者,被要求构建一个原生预订 UI 来绕过这些平台附带的通用 iFrame 小部件,或者你是一名厌倦了千篇一律预订体验的酒店运营者,这就是为你准备的。我们将涵盖 API 架构、身份验证模式、实时可用性、价格管理和真正能转化客户的前端模式。

目录

Hotel Booking Engine Integration: Cloudbeds, Mews & SiteMinder API Guide

为什么要构建自定义预订引擎?

Cloudbeds、Mews 和 SiteMinder 的默认预订小部件可以工作。它们会接受预订并将其推送到 PMS 中。但它们带来了严重的权衡:

  • 品牌稀释:基于 iFrame 的小部件在精心设计的酒店网站上看起来很陌生。它们打破了视觉流,客人会注意到。
  • 定制能力有限:想要显示房间比较表?内联向上销售水疗套餐?展示与当地活动挂钩的动态定价?在小部件内做这一切?祝你好运。
  • 性能损失:iFrame 小部件加载自己的 CSS、JS 和跟踪代码。在移动设备上——2026 年 65%+ 的酒店搜索都发生在移动设备上——额外的负载会杀死转化率。
  • SEO 盲点:iFrame 内的内容不被索引。你的房间描述、便利设施和定价数据对 Google 来说是隐形的。
  • 分析缺口:跨域跟踪在你的网站和小部件域之间是脆弱的。你会不断丢失归因数据。

基于这些平台 API 构建的自定义原生预订 UI 让你获得完全的控制权。你拥有设计、数据流和用户体验。PMS 仍然处理操作后端——预订、客房服务、渠道管理——但面向客人的层是你的。

这正是我们在 Social Animal 通过我们的 headless CMS development 实践所做的工作类型。酒店的营销网站位于现代前端框架中,预订引擎是一等公民,而不是通过 iFrame 粗暴地拼接的事后考虑。

了解酒店科技堆栈

在深入探讨特定 API 之前,让我们建立这个景观。酒店技术有几个关键层:

PMS(物业管理系统)

操作大脑。管理预订、房间分配、客人档案、客房服务和计费。Cloudbeds 和 Mews 都是 PMS 平台。

渠道管理器

将库存和价格分发给 OTA(Booking.com、Expedia 等)并保持一切同步。SiteMinder 主要是渠道管理器,尽管他们已经扩展到直接预订。

预订引擎

客人面向的界面,直接预订发生的地方。这就是我们用自定义构建替换的。

CRS(中央预订系统)

对于多处房产集团,CRS 汇总跨位置的可用性。某些 PMS 平台包括这一点;其他则需要单独的系统。

集成的挑战是这些层重叠。Cloudbeds 捆绑了 PMS + 渠道管理器 + 预订引擎。Mews 是 PMS 优先的,具有开放 API 理念。SiteMinder 作为中间件连接一切。你的自定义 UI 需要理解每个平台的责任从哪里开始和结束。

Cloudbeds API 集成

Cloudbeds 截至 2026 年在 150 多个国家为 20,000+ 家酒店提供服务。他们的 API 已经成熟了很多,但仍然有一些怪癖。

身份验证

Cloudbeds 使用具有授权代码流的 OAuth 2.0。你需要在 Cloudbeds Marketplace 中注册你的应用程序以获取客户端凭证。

// OAuth 令牌交换
const tokenResponse = await fetch('https://hotels.cloudbeds.com/api/v1.2/access_token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    client_id: process.env.CLOUDBEDS_CLIENT_ID,
    client_secret: process.env.CLOUDBEDS_CLIENT_SECRET,
    redirect_uri: process.env.CLOUDBEDS_REDIRECT_URI,
    code: authorizationCode,
  }),
});

一个问题:Cloudbeds 访问令牌在 300 秒(5 分钟)后过期。是的,5 分钟。你绝对需要一个令牌刷新策略来优雅地处理这个问题。我将令牌存储在服务器端缓存(Redis 效果很好)中,并在 4 分钟标记处主动刷新。

预订的关键端点

  • GET /getAvailableRoomTypes — 返回房间类型及其在日期范围内的可用性。这是搜索结果页面的主要端点。
  • GET /getRates — 获取价格计划。注意:价格可以特定于房间类型,某些价格只有在物业激活它们时才会显示。
  • POST /postReservation — 创建预订。需要客人详情、房间类型、日期和价格计划。
  • GET /getHotelDetails — 物业信息、便利设施、政策。积极缓存这个。

Cloudbeds 的陷阱

在高流量期间,可用性端点不总是返回实时数据。当物业处理批量 OTA 更新时,我已经看到 15-30 秒的延迟。构建你的 UI 以优雅地处理"可用性可能已更改"的场景——显示一个确认步骤,在收集付款之前重新验证。

另外,他们的价格结构可以深度嵌套。单个房间类型可能有 8+ 个价格计划,具有不同的取消政策、餐食包含和最少住宿夜数要求。你需要预先决定在你的 UI 中要公开多少这样的复杂性。

Hotel Booking Engine Integration: Cloudbeds, Mews & SiteMinder API Guide - architecture

Mews API 集成

Mews 采用了根本不同的方法。他们的 Connector API 是事件驱动的,设计用于深度集成。我会称其为酒店业最对开发者友好的 PMS API。

身份验证

Mews 使用更简单的模型:ClientToken(标识你的集成)和 AccessToken(标识房产)。服务器到服务器通信不需要 OAuth 舞蹈。

// Mews API 请求
const response = await fetch('https://api.mews.com/api/connector/v1/services/getAvailability', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    ClientToken: process.env.MEWS_CLIENT_TOKEN,
    AccessToken: process.env.MEWS_ACCESS_TOKEN,
    Client: 'YourApp',
    ServiceId: serviceId,
    StartUtc: '2026-08-01T00:00:00Z',
    EndUtc: '2026-08-07T00:00:00Z',
  }),
});

预订的关键端点

  • services/getAvailability — 按资源类别(Mews 术语中的房间类型)的实时可用性。
  • rates/getPricing — 返回特定价格计划和日期范围的定价。
  • reservations/add — 以原子方式创建一个或多个预订。
  • customers/add — 分别于预订创建客人档案。Mews 保持这些解耦,这对于回头客检测实际上很好。

Mews WebSockets

Mews 真正闪闪发光的地方。他们提供实时更新的 WebSocket 连接:

// 订阅预订更改
const ws = new WebSocket('wss://ws.mews.com/ws/connector');
ws.onopen = () => {
  ws.send(JSON.stringify({
    ClientToken: process.env.MEWS_CLIENT_TOKEN,
    AccessToken: process.env.MEWS_ACCESS_TOKEN,
  }));
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  // 处理实时可用性更改
  if (data.Type === 'Reservation') {
    invalidateAvailabilityCache(data.ServiceId);
  }
};

这意味着你的预订 UI 可以实时反映可用性更改——无需轮询。当另一位客人预订了最后一间豪华房间时,你的其他访客会实时看到它消失。

Mews 的陷阱

Mews 为一切都使用 UUID,他们的数据模型高度规范化。一个简单的"给我可用的房间及其价格"需要点击 3-4 个端点并自己连接数据。API 功能强大但冗长。在你的服务器上构建一个坚实的数据聚合层。

另外,Mews 的沙箱环境对于支付相关流程不能完美地镜像生产行为。在上线前在暂存房产中彻底测试。

SiteMinder API 集成

SiteMinder 位于不同的位置——它主要是渠道管理器和分发平台。他们的 API(Platform API 和较旧的 Channel Manager API)专注于价格和可用性分发。

身份验证

SiteMinder 使用带有 OAuth 2.0 客户端凭证流的 API 密钥:

const tokenResponse = await fetch('https://api.siteminder.com/oauth/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    grant_type: 'client_credentials',
    client_id: process.env.SITEMINDER_CLIENT_ID,
    client_secret: process.env.SITEMINDER_CLIENT_SECRET,
    scope: 'availability:read reservations:write',
  }),
});

关键考虑事项

SiteMinder 的直接预订 API 比 Cloudbeds 或 Mews 更受限制。你基本上是在他们的 TheBookingButton 产品后端基础上构建。API 允许:

  • 按房产和日期范围查询可用性
  • 检索具有限制的价格(最少住宿、不接受到达、等)
  • 使用客人详情创建预订
  • 修改和取消工作流

SiteMinder 的优势是它连接到 400+ PMS 系统。如果你的酒店客户使用一个不太知名的 PMS,SiteMinder 可能是你用于自定义预订 UI 的唯一可行的 API 集成路径。

SiteMinder 的陷阱

通过 SiteMinder 的价格更新可能会比源 PMS 滞后 1-3 分钟。对于高需求房产,这会造成超订风险。始终实施一个预付款可用性检查,通过最实时的可用路径。

他们的 API 文档是...可用的。期待依赖他们的合作伙伴支持团队来处理边缘案例。对开发者询问的响应在 2026 年已经改进,但为集成预留额外的时间。

平台对比

功能 Cloudbeds Mews SiteMinder
API 风格 REST(v1.2) REST + WebSockets REST
身份验证方法 OAuth 2.0(授权代码) 基于令牌 OAuth 2.0(客户端凭证)
实时更新 仅轮询 WebSockets Webhooks
速率限制 120 请求/分钟 1000 请求/分钟 60 请求/分钟
沙箱环境 是(受限)
多房产支持 通过单独令牌 原生 原生
预订 API 成熟度 良好 优秀 中等
文档质量 良好 优秀 一般
典型集成时间 3-4 周 2-3 周 4-6 周
月度 API 成本(2026) 包含在 PMS 计划中 包含在 PMS 计划中 因等级而异

构建原生预订 UI

现在到了有趣的部分——实际构建这个东西。我将专注于模式而不是特定框架,尽管我们通常使用 Next.jsAstro 构建这些,取决于项目要求。

预订流架构

酒店预订流有 5 个不同的步骤:

  1. 搜索 — 日期、客人、房间
  2. 结果 — 有可用性和价格的房间类型
  3. 选择 — 房间和价格计划选择、附加服务
  4. 客人详情 — 联系信息、特殊请求
  5. 付款和确认 — 安全支付、预订确认

每个步骤应该是自己的路由(不是一个页面上的多步骤表单)。这给你:

  • 深度可链接的 URL(对营销活动有利)
  • 每个步骤更好的分析
  • 更容易的错误恢复
  • 浏览器后退按钮支持,不会破坏一切

搜索组件

// Next.js 服务器操作进行可用性搜索
'use server'

import { getAvailability, getRates } from '@/lib/pms-client';

export async function searchAvailability(formData: FormData) {
  const checkIn = formData.get('checkIn') as string;
  const checkOut = formData.get('checkOut') as string;
  const adults = parseInt(formData.get('adults') as string);
  const children = parseInt(formData.get('children') as string);

  const [availability, rates] = await Promise.all([
    getAvailability({ checkIn, checkOut }),
    getRates({ checkIn, checkOut }),
  ]);

  // 将可用性与定价合并
  const rooms = mergeAvailabilityWithRates(availability, rates, { adults, children });
  
  // 过滤掉无法容纳客人数量的房间
  return rooms.filter(room => 
    room.maxOccupancy >= adults + children
  );
}

能转化的房间展示模式

在多个酒店网站上进行 A/B 测试后,这是有效的:

  • 以房间照片开头,而不是价格。酒店销售的是体验,而不是交易。
  • 显示整个住宿总价突出显示,每晚价格为次要。客人以旅行预算来思考。
  • 提前显示取消政策。直接预订者的 #1 焦虑是"如果我的计划改变了怎么办?"在价格附近放置"[日期]之前免费取消"将转化率提高 12-18%(在我们的测试中)。
  • 限制每种房间类型的价格计划选择为 3 个。超过这个数字会造成决策瘫痪。
  • 诚实地使用紧迫感。"还有 2 间房"如果是真的就没问题。不要伪造稀缺性。

附加和向上销售集成

这正是自定义 UI 真正优于小部件的地方。在房间选择后,呈现相关的附加服务:

// 获取与预订背景相关的附加服务
async function getContextualAddOns(booking: BookingContext) {
  const addOns = await pmsClient.getServices();
  
  return addOns
    .filter(addOn => {
      // 仅为住宿 > 2 晚的客人显示水疗套餐
      if (addOn.category === 'spa' && booking.nights < 3) return false;
      // 如果办理入住日期到达,显示机场接送
      if (addOn.category === 'transfer') return true;
      // 如果价格计划中不包括早餐,显示早餐
      if (addOn.category === 'breakfast' && !booking.ratePlan.includesBreakfast) return true;
      return addOn.category === 'general';
    })
    .sort((a, b) => b.conversionRate - a.conversionRate)
    .slice(0, 4); // 最多显示 4 个附加服务
}

当从通用小部件转移到上下文感知的自定义 UI 时,我们已经看到附加服务收入增加 35-50%。仅这一点就通常能证明开发投资的合理性。

实时可用性和价格同步

最大的技术挑战不是预订流——而是在你的 UI 和 PMS 之间保持可用性准确。

缓存策略

你需要缓存(PMS API 对于每个页面加载时的直接调用来说太慢且速率受限),但陈旧的可用性会导致超订。这是我使用的模式:

// 具有积极失效的多层缓存
const CACHE_TTL = {
  availability: 60,      // 1 分钟
  rates: 300,            // 5 分钟
  hotelDetails: 86400,   // 24 小时
  roomTypes: 3600,       // 1 小时
};

async function getCachedAvailability(params: SearchParams) {
  const cacheKey = `avail:${params.propertyId}:${params.checkIn}:${params.checkOut}`;
  
  // 检查缓存
  const cached = await redis.get(cacheKey);
  if (cached) return JSON.parse(cached);
  
  // 获取新鲜数据
  const fresh = await pmsClient.getAvailability(params);
  await redis.setex(cacheKey, CACHE_TTL.availability, JSON.stringify(fresh));
  
  return fresh;
}

对于 Mews,使用 WebSocket 连接来主动失效缓存项。对于 Cloudbeds 和 SiteMinder,如果可用的话设置 webhook 监听器,或者对高流量房产回退到 30 秒间隔的轮询。

双重检查模式

始终在支付步骤重新验证可用性。流程如下:

  1. 客人搜索 → 缓存可用性(快速,可能略微陈旧)
  2. 客人选择房间 → 新鲜可用性检查(确认房间仍可用)
  3. 客人输入详情 → 无需额外检查
  4. 客人点击"预订" → 原子可用性检查 + 预订创建

第 4 步至关重要。Mews 和 Cloudbeds 都在其预订创建端点中以原子方式处理这个——如果房间不可用,API 返回错误而不是创建预订。不要尝试将检查-然后-预订作为两个单独的调用;你会创建竞态条件。

支付处理和 PCI 合规

酒店支付是独特的复杂,因为预授权和延迟清算模式。客人今天预订,你授权他们的卡,但你不会在办理入住或退房时捕获费用。

Stripe 集成模式

Stripe 是我们为酒店客户集成的最常见的支付处理器。这是流程:

// 创建带有手动捕获的支付意图
const paymentIntent = await stripe.paymentIntents.create({
  amount: totalInCents,
  currency: property.currency,
  capture_method: 'manual', // 现在授权,稍后捕获
  metadata: {
    pms_reservation_id: reservation.id,
    property_id: property.id,
    check_in: booking.checkIn,
    check_out: booking.checkOut,
  },
});

重要:你必须在 7 天内使用 Stripe 捕获(之前对大多数卡类型来说是 7 天,现在有些支持最多 31 天)。对于预约时间超过一周的预订,你需要选择立即收费加退款政策,或者实施预入住捕获工作流。

PCI 合规

如果你使用 Stripe Elements 或类似的令牌化支付表单,你处理 PCI 合规在 SAQ-A 级别,这是可管理的。永远不要通过你的服务器发送原始卡号。接受卡详情的 PMS API(Mews 有这个能力)应该只接收令牌化或加密的卡数据。

性能和转化优化

直接渠道的酒店预订转化率在行业范围内徘徊在 2-3%。一个精心构建的自定义 UI 可以将其推至 4-6%。这里是能改变结果的:

  • 亚 2 秒的搜索结果:预获取热门日期范围的可用性。对房产页面使用 ISR(增量静态再生)。
  • 移动优先日期选择器:默认 HTML 日期输入在移动设备上很糟糕。使用专用构建的组件。我喜欢带有自定义触摸友好样式的 react-day-picker
  • 渐进式披露:不要从一开始就显示所有费率详情。让客人展开他们关心的内容。
  • 信任信号:显著显示"最佳价格保证"。包含 TripAdvisor/Google 评论分数。在结账按钮附近显示安全支付徽章。
  • 粘性预订摘要:在桌面上,当客人滚动浏览详情和支付时,保持选定的房间和总价可见。在移动设备上,使用可折叠的底部栏。

部署架构

对于生产酒店预订引擎,这是为我们很好地服务的架构:

[CDN(Vercel/Cloudflare)]
    → [Next.js 前端 + API 路由]
        → [Redis 缓存层]
            → [PMS API(Cloudbeds/Mews/SiteMinder)]
        → [Stripe 支付 API]
        → [电子邮件服务(Resend/SendGrid)]

我们在 Vercel 上部署大多数项目。边缘函数处理搜索 API 路由,以便可用性查询从最近的区域解析。PMS API 调用通过中央 Node.js 无服务器函数传递,具有 Redis 缓存层。

对于多房产酒店集团,我们添加一个房产解析器,将传入的域或 URL 路径映射到正确的 PMS 凭证和配置。这让一个代码库为数十个房产提供服务。

如果你正在评估这种架构,请查看我们的 pricing page 以了解我们如何规划无头酒店项目的范围,或 直接联系 讨论细节。

常见问题

构建自定义酒店预订引擎要花多少钱? 对于单房产集成与一个 PMS(Cloudbeds、Mews 或 SiteMinder),预计初始构建花费 $15,000-$40,000 USD,具体取决于复杂性。具有共享基础设施的多房产部署通常需要 $40,000-$80,000。正在进行的维护和 PMS API 更改每月增加 $500-$2,000。投资回报率计算应该考虑直接预订转化率的 2-4% 提升以及与 OTA 预订相比的佣金节省(通常每次预订 15-25%)。

我可以在不使用他们预订引擎小部件的情况下使用 Cloudbeds API 吗? 是的。Cloudbeds 的 API 与他们的预订引擎小部件分开。你可以构建一个完全自定义的前端,使用他们的 API 进行可用性、价格和预订创建。你需要是经批准的 Cloudbeds Marketplace 合作伙伴,这涉及一个需要 2-4 周的申请和审查流程。

Mews 或 Cloudbeds 哪个更适合自定义预订引擎集成? Mews 具有更好的开发者体验——更高的速率限制、WebSocket 支持、更清晰的文档和更规范化的数据模型。Cloudbeds 在独立房产中有更广泛的市场采用,所以你的客户更有可能已经在使用它。如果从零开始,客户没有 PMS 偏好,我建议对想要深度自定义集成的房产选择 Mews。

我如何使用自定义预订 UI 处理超订? 当缓存可用性变陈旧时超订就会发生。实施双重检查模式:为搜索结果显示缓存,但总是在创建预订前进行新鲜 API 调用重新验证。Mews 和 Cloudbeds 在预订创建期间处理原子可用性检查,所以如果你让 PMS 在预订时是真实来源,超订实际上被消除了。

我需要 PCI 合规来处理自定义酒店预订引擎吗? 是的,但程度取决于你的实现。使用令牌化支付解决方案如 Stripe Elements、Adyen Drop-in 或类似的意味着你永远不会处理原始卡数据,让你符合 SAQ-A(最简单的 PCI 合规级别)。如果你通过你的服务器向 PMS 传递卡数据,你需要 SAQ-D,这是显著更复杂且维护昂贵的。始终使用令牌化支付。

自定义预订 UI 如何影响我的酒店 SEO? 积极地影响。房间类型、描述、便利设施和定价呈现为原生 HTML(不困在 iFrame 中)完全可被搜索引擎索引。你可以实现结构化数据(schema.org/Hotel、schema.org/LodgingReservation)以在丰富结果中出现。与 iFrame 小部件设置相比,具有自定义构建预订页面的房产通常看到房间特定页面的自然流量增加 20-40%。

我能在一个预订 UI 中集成多个 PMS 平台吗? 是的,这对于不同房产使用不同系统的酒店集团来说很常见。构建一个将 API 响应规范化为通用模式的抽象层。你的前端与你的抽象层交谈,它根据房产路由到正确的 PMS API。我们已经为运行着在城市房产上 Mews 和度假村房产上 Cloudbeds 的集团在一个品牌下构建了这种模式。

当 PMS API 宕机时会发生什么? 构建优雅降级。缓存最后已知的可用性,并显示"价格可能不同"免责声明。显著显示电话号码和电子邮件,以便客人仍然可以联系前台。实施监视 API 响应时间和错误率的健康检查,在客人注意到之前告警你的团队。对于关键预订期间(假期、活动),考虑重定向到 PMS 原生预订小部件作为最后手段的降级。