ナレッジ

レート・パリティ監視:自社在庫のアンダーカットを見つける

自社の客室が他のチャネルでより安く表示されると、ホテルは直接予約を失います。誤検知を避けながら、チャネルや市場をまたいでレート・パリティを監視する方法。

Matt Brown

Matt Brown

2026年10月3日 · 3 分で読める

ゲストがあなたのホテルを見つけ、あなたのウェブサイトを確認し、その後別のサイトで同じ部屋がより安く売られているのを見る。ゲストはそちらで予約し、あなたは手数料を支払うことになり、ゲストは自社サイトが予約すべき場所ではないと学ぶ。これが、パートナーが本来一般公開するはずのなかったレートを漏らしたために起きている場合、あなた自身の在庫があなた自身を安売りするために使われていることになる。

レートパリティモニタリングは、ホテルや旅行ブランドがそれがどこで、どの市場で、どのチャネルを通じて起きているかを突き止める方法である。本ガイドでは、ルールが変わった今パリティが何を意味するのか、なぜほとんどのパリティチェックが誤報を発するのか、そして同等のものを同等に比較するテスト済みのコードを扱う。

Key takeaways

  • パリティは、もはやヨーロッパの大部分でオンライン旅行代理店がホテルに課せるものではなくなっている。今やそれは主にホテル自身の利益の問題であり、自社の部屋によって自社が安売りされないようにすることである。
  • 安売りは通常、ホテルが契約を結んでいないサイトに現れる、漏洩した卸売レートやパッケージレートに起因するものであり、主要な代理店自体から来るものではない。
  • 価格は、ゲストが予約する市場からチェックしなければならない。同じ部屋でも、購入者がどこにいるかによって、異なる価格、通貨、税表示で表示されることがある。
  • 比較するのは全く同一の商品に限る。同じ日程、部屋、食事条件、キャンセル条件で、税込み、通貨換算済みであること。我々が構築した例では、簡易チェックは5件のアラートを発し、そのうち3件は誤りだった。正規化したチェックは、実際の安売り2件だけを正確に検出した。
  • 安売りは調査の出発点として扱う。どのパートナーのレートが漏洩したのかを突き止め、契約または流通設定を修正する。

What rate parity means now

歴史的に、オンライン旅行代理店はホテルに対し、少なくとも他のどこよりも良い価格を提供するよう求めてきた。「ワイド」パリティ条項はすべてのチャネルを対象とし、「ナロー」条項はホテル自身のウェブサイトのみを対象としていた。どちらもヨーロッパの大部分で撤廃されている。

  • Germany. 連邦カルテル庁は2015年にBooking.comのナロー最良価格条項を禁止し、連邦通常裁判所は2021年5月にそれが競争法に違反することを確認した。
  • European Union. 2024年9月、欧州司法裁判所は、ワイドかナローかを問わずプラットフォームの価格パリティ条項は、原則として競争法の適用を免れる付随的制限として扱うことはできないと判断した。
  • Digital Markets Act. Booking.comは2024年5月にゲートキーパーに指定され、2024年11月までに遵守する必要があった。同法の下ではパリティ条項は禁止されており、ホテルやその他の事業者は自社ウェブサイトや他のチャネルで異なる、より良いものを含む価格や条件を提供できる。またBooking.comは、手数料の引き上げや掲載停止など、同様の効果を持つ措置を用いてはならない。
  • Elsewhere. フランス、イタリア、オーストリア、ベルギー、スイスを含むいくつかの国は、国内法で宿泊プラットフォームのパリティ条項を制限している。

これは一般的な情報であり、法的助言ではない。ルールは国や契約によって異なるため、自社の契約については弁護士に相談すること。

実務上の帰結として、パリティの立場は入れ替わった。ホテルは今や通常、自社サイトで代理店より安い価格を設定する自由があり、多くのホテルがそれを望んでいる。それでも知る必要があるのは、誰かが自社の直接価格より安く自社の部屋を販売しているかどうか、そしてどのようにしてかである。

Where undercuts come from

SourceHow it happensWhat monitoring shows
漏洩した卸売レートパッケージに組み込まれるはずだったネットレートが、単独の部屋として再販売される直接レートより安い、見慣れないサイト。多くはメタサーチ上に現れる
パッケージの分解ツアーオペレーターのホテル+航空券レートが分解され、部屋だけとして販売される公開チャネルが提供すべき水準を下回る価格
会員向け・モバイル向けレートチャネルがログイン済みまたはアプリ利用者に対してより低い価格を表示する特定のデバイスやセッションでのみ現れる価格差
通貨・市場別価格設定チャネルが購入者の国や通貨によって異なる価格を設定する一部の市場でのみ発生する安売り
古いデータ・誤った反映レート変更がすべてのチャネルに反映されなかった特定の日付で短期間だけ生じる価格差

これらのうち、誰かの過失によるものはごく一部であり、電話一本で解決できるものもごく一部である。モニタリングは、それらを見分けられるだけの詳細を示す必要がある。

Why naive parity checks raise false alarms

パリティチェックは単純に見える。複数のサイトで同じホテルを見つけ、価格を比較するだけだ。しかしそのやり方では、ダッシュボードは実際には存在しないアラートで埋め尽くされ、一方で本物のアラートを見逃すことになる。よくある理由は以下の通り。

  • Different products. 返金不可レートや素泊まりレートは、朝食付きの柔軟なレートに対する安売りではない。
  • Tax display. 米国の購入者に表示される多くのサイトは税抜き価格を表示し、ヨーロッパのほとんどのサイトは税込みである。同じ合計額でも、数パーセント安く見えることがある。
  • Currency. 異なるレートで換算したり、そもそも異なる通貨間で比較したりするだけで、1〜2パーセント程度の差が生じる。
  • Market. 米国でのチャネルの価格は、ドイツで表示される自社の直接価格とは比較できない。各市場はその市場自身と比較すること。
  • Dates and occupancy. 滞在日数や宿泊人数が異なれば、同じ1泊あたりの料金でも合計額は変わる。

The code

以下のモジュールは、同一条件で同一のものを販売している場合に限り見積もりを比較し、税表示と通貨を正規化し、各チャネルを同じ市場に表示された直接価格と比較して、その差を報告する。部屋コードは、各チャネルが同じ部屋を異なる表現で記述するため、各チャネルの表記からマッピングした自社独自の正規化コードを用いるべきである。

from collections import defaultdict
from dataclasses import dataclass
from decimal import ROUND_HALF_UP, Decimal


@dataclass(frozen=True)
class Quote:
    channel: str          # "direct"、またはOTAやメタサーチ掲載の名称
    market: str           # 購入者がいた場所、例えば "DE" や "US"
    hotel: str
    check_in: str
    nights: int
    room: str             # チャネルの表記ではなく、自社独自の正規化された部屋コード
    board: str            # "room-only"、"breakfast" など
    refundable: bool
    price: Decimal        # 表示された通りの、滞在全体の合計額
    currency: str
    taxes_included: bool


def product_key(q):
    """2つの見積もりは、同一条件で同一のものを販売している場合に限り比較可能である。"""
    return (q.hotel, q.check_in, q.nights, q.room, q.board, q.refundable)


def comparable_total(q, fx_to_base, hotel_tax):
    """渡航先の税を含めた、基準通貨での合計価格。"""
    amount = q.price if q.taxes_included else q.price * (1 + hotel_tax[q.hotel])
    return (amount * fx_to_base[q.currency]).quantize(Decimal("0.01"), ROUND_HALF_UP)


def find_undercuts(quotes, fx_to_base, hotel_tax, tolerance=Decimal("0.01")):
    """すべてのチャネルを、同じ市場に表示された直接レートと比較し、より安いオファーを報告する。"""
    groups = defaultdict(list)
    for q in quotes:
        groups[(product_key(q), q.market)].append(q)
    undercuts, unmatched = [], []
    for (key, market), group in groups.items():
        direct = [comparable_total(q, fx_to_base, hotel_tax) for q in group if q.channel == "direct"]
        if not direct:
            unmatched.extend(q for q in group)
            continue
        best_direct = min(direct)
        for q in group:
            if q.channel == "direct":
                continue
            total = comparable_total(q, fx_to_base, hotel_tax)
            gap = (best_direct - total) / best_direct
            if gap > tolerance:
                undercuts.append({"channel": q.channel, "market": market, "hotel": key[0], "check_in": key[1],
                                  "direct": best_direct, "channel_total": total, "gap": round(gap, 3)})
    return sorted(undercuts, key=lambda u: u["gap"], reverse=True), unmatched

重要な設計上の選択が2つある。税金はホテルごとに適用される。なぜなら税金は購入者の国ではなく渡航先に属するものだからである。また、比較可能な直接オファーがない見積もりは、破棄するのではなく別途返される。自社が直接販売していない商品をチャネルが販売していること自体が、1つの発見だからである。

A worked example

このモジュールを、1つのホテルと1つの滞在について、ドイツ、米国、英国の購入者に表示された10件の見積もりからなる構築済みデータセットでテストした。そのうち2件は本物の安売りとして意図的に組み込んだものである。これは架空の価格による例示であり、実在するホテルやチャネルの測定ではない。

CheckAlerts raisedReal undercuts foundFalse alarms
簡易チェック: 同じ市場内での表示価格と直接価格の比較523
正規化チェック: 同一商品、税込み、単一通貨220

3件の誤報は典型的なものだった。税抜き価格を表示していて実際にはパリティが取れていた米国の掲載、返金不可レート、そして素泊まりレートである。正規化チェックでは、後者の2件は比較不可能として除外し、別途リストに挙げた。換算後に直接価格より0.5%安かった英国の掲載は、許容範囲の1%を下回っており、これは通貨換算だけで生じ得る程度の差である。

Collecting the quotes

パリティモニタリングの質は、ゲストが実際に目にしているものを収集できるかどうかにかかっている。

  • Shop from the guest’s market. チャネルやメタサーチの結果は訪問者の国によって異なるため、自社にとって重要な各市場の内部から収集すること。航空会社やホテルが出発国によって異なる見積もりを提示するかどうかについての我々のテストは、これが任意ではない理由を示している。
  • Keep sessions consistent. プロキシの地域、タイムゾーン、ロケールを一致させるで扱っているように、言語、通貨、タイムゾーンを市場に合わせること。そうすれば、チャネルがセッションの途中で別の市場の価格に切り替えることがなくなる。
  • Check devices separately. モバイルやアプリのレートはデスクトップのレートと異なることがある。ゲストが両方を使う場合は両方をテストすること。
  • Capture the full terms. 見出しの価格だけでなく、食事条件、キャンセルポリシー、宿泊人数、税込みかどうかを記録すること。表示された数値もロケールごとに解析する必要がある。詳しくはロケールをまたいだ価格、数値、日付の正規化を参照のこと。
  • Sample dates, not just tomorrow. 漏洩は特定の将来の日付に現れることが多いため、到着日や滞在日数を幅広くカバーすること。
  • Collect politely. 検索結果を連打するのではなく、妥当な範囲の日程をスケジュールに沿って確認し、各サイトの利用規約を尊重すること。

同じ収集アプローチは、より一般的な航空券やホテル価格のスクレイピングの基盤ともなっており、我々のトラベルのユースケースでは、チームが多数の施設にわたってこれをどう運用しているかを扱っている。

From alert to fix

安売りのアラートは作業の終わりではなく、始まりである。

  1. Confirm it. 同じ市場からそのオファーを再確認し、予約の流れが実際にその価格で終わることを確かめる。
  2. Trace it. テスト予約、またはチェックアウト時に表示されるレートコードやサプライヤーから、通常はどのパートナーのレートが漏洩したのかを特定できる。
  3. Act on the source. 卸売契約を厳格化する、パートナーが受け取るレートを変更する、あるいは影響を受けた日付についてチャネルを閉鎖する。
  4. Track it over time. パートナーおよび市場ごとに安売りを記録する。繰り返し漏洩するパートナーは、モニタリングの問題ではなく商取引上の話し合いの対象である。

The bottom line

レートパリティは、もはや代理店が強制する条項ではなくなり、ホテル自身が自問する問いになった。誰かが自分より安く自分の部屋を売っていないか、という問いである。これに確実に答えるには、ゲストが予約する市場から価格を収集し、税と通貨を正規化した上で、完全に同一の商品のみを比較する必要がある。

それを行えば、パリティのアラートはまれで、かつ本物のものになる。それを省けば、ダッシュボードは税表示や返金不可レートで埋め尽くされ、予約を奪っている漏洩レートはそのノイズの中に埋もれたままになる。

Sources and references

始める準備はできていますか?

Shifterのレジデンシャルプロキシをお試しください。IP 205M+件、195+カ国、$0.10/GBから。

始める