複数の予約サイトの料金と残室を、エージェントが毎朝自社の料金台帳と突き合わせ、ずれの原因と直す案をまとめる
毎朝、各予約サイトと自社サイトに出ている料金と残室を、自社の料金台帳の「出すつもりの値」と突き合わせ、ずれを拾います。エージェントがずれごとに配信の記録やプランの紐付けを引いて原因を決め、直す案を施設ごとにまとめます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Python/Zapier
- 対象業界
- その他/不動産/宿泊
- 対象部門
- 営業
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 人手が足りない/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- エージェント
- 主な効果
- 判断支援/対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 予約担当が毎朝、PMSで今後の残室を確かめる
- サイトコントローラーの画面で、前日に配信した料金と残室に配信エラーが出ていないかを見る
- 主要なサイトの管理画面と、お客様と同じ検索画面を開き、繁忙日と翌週の料金を何日分か拾って見る
- 台帳の料金と違うものがあれば、サイトコントローラーの設定、プランの紐付け、サイト側のキャンペーンの参加状況を順に確かめる
- 原因が分かれば、サイトコントローラーで再配信するか、サイトの管理画面で直す
- 自分で直せないものは、本部のレベニュー担当にチャットで相談する
- 直したかどうかを、施設ごとのメモに書く
- 自動毎朝6時にワークフローが動き、料金台帳・PMSの残室・サイトコントローラーの配信状況を読み込む
- 自動楽天トラベルについては、公開されている空室検索APIで、お客様に見えている料金と空室を引く
- 自動計算のノードが、日付・部屋タイプ・経路ごとに「出すつもりの値」と「出ている値」の差を出し、ずれを拾う
- 自動拾ったずれを、施設・日付・部屋タイプでまとめてエージェントに渡す
- 自動エージェントが、配信の記録・プランの紐付け・意図した差の一覧・直近の料金改定を道具で引き、原因を決める
- 自動エージェントが、直す場所と直す案、本部へ確かめる事項を構造化した形で返す
- 自動急ぎの段階(A/B/C)を、残室のずれか料金のずれか、何日先かで規則で決める
- 自動施設ごとの一覧をチャットに出し、段階Aは施設の予約担当と本部の両方に知らせる
- 人予約担当が一覧と根拠を確かめ、サイトコントローラーやサイトの管理画面で直す
- 自動直したかどうかを、翌朝の見回りでもう一度確かめる
各工程の詳しい説明を読む
- 予約担当が毎朝、PMSで今後の残室を確かめる
- サイトコントローラーの画面で、前日に配信した料金と残室に配信エラーが出ていないかを見る
- 主要なサイトの管理画面と、お客様と同じ検索画面を開き、繁忙日と翌週の料金を何日分か拾って見る
- 台帳の料金と違うものがあれば、サイトコントローラーの設定、プランの紐付け、サイト側のキャンペーンの参加状況を順に確かめる
- 原因が分かれば、サイトコントローラーで再配信するか、サイトの管理画面で直す
- 自分で直せないものは、本部のレベニュー担当にチャットで相談する
- 直したかどうかを、施設ごとのメモに書く
(a)見る範囲が日によって違う。 7経路 × 部屋タイプ × 今後90日をすべて目で見ることはできません。担当者は「繁忙日」と「翌週」を中心に、気になったところだけを拾って見ます。 遠い日付や閑散日の誤りは、予約が入るまで見つかりません。
(b)残室の食い違いは、予約が入った後に分かる。 売り止めにしたはずの部屋がどこかのサイトに残っていると、満室の日に予約が入ります。 その時点でできるのは、お客様へのお詫びと他の施設への振り替えの相談だけです。
(c)安く見えている理由を探すのに時間がかかる。 サイトで台帳より安い料金が出ていても、配信の誤りなのか、サイトの会員向けの割引なのか、サイト専用のプランなのかは、画面を3つも4つも開かないと分かりません。 原因が分からないまま再配信して、何も変わらないこともあります。
(d)料金の改定の直後が抜ける。 改定の夜に配信が一部だけ失敗すると、担当者が見ていない日付に限って古い料金が残ります。
- 【自動】 毎朝6時にワークフローが動き、料金台帳・PMSの残室・サイトコントローラーの配信状況を読み込む
- 【自動】 楽天トラベルについては、公開されている空室検索APIで、お客様に見えている料金と空室を引く
- 【自動】 計算のノードが、日付・部屋タイプ・経路ごとに「出すつもりの値」と「出ている値」の差を出し、ずれを拾う
- 【自動】 拾ったずれを、施設・日付・部屋タイプでまとめてエージェントに渡す
- 【自動】 エージェントが、配信の記録・プランの紐付け・意図した差の一覧・直近の料金改定を道具で引き、原因を決める
- 【自動】 エージェントが、直す場所と直す案、本部へ確かめる事項を構造化した形で返す
- 【自動】 急ぎの段階(A/B/C)を、残室のずれか料金のずれか、何日先かで規則で決める
- 【自動】 施設ごとの一覧をチャットに出し、段階Aは施設の予約担当と本部の両方に知らせる
- 【人】 予約担当が一覧と根拠を確かめ、サイトコントローラーやサイトの管理画面で直す
- 【自動】 直したかどうかを、翌朝の見回りでもう一度確かめる
9番目が、この設計の分かれ目です。料金と残室を書き換えるのは、必ず人です。 エージェントには配信や管理画面を操作する道具を持たせません。誤った直し方は、誤ったずれよりも大きな損になります。
10番目で、直したはずのずれが翌朝も残っていれば、「指摘済み・未解消・2日目」として段階が上がります。
02今回想定するシステム構成
【トリガー】毎朝6:00(Schedule Trigger) ▼ n8n ├──▶ 料金台帳(施設ごとのスプレッドシート) ├──▶ PMS の残室(夜間の書き出し) ├──▶ サイトコントローラーの配信状況(書き出し、またはAPI) ├──▶ 楽天トラベル空室検索API(HTTP Request ノード) ▼ Code ノード ── 出すつもりの値と出ている値の差、意図した差の除外(計算) ▼ 直す対象のずれだけ AI Agent ノード(OpenAI API) │ 道具:配信の記録/プランの紐付け/意図した差の一覧 │ 直近の料金改定/過去の指摘の履歴 ▼ 原因・直す場所・直す案(構造化出力) n8n ── 急ぎの段階を規則で決める ├──▶ 社内チャット(施設の予約担当への一覧/段階Aは本部にも) └──▶ 見回りの記録(翌朝の追いかけに使う)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n(Schedule Trigger と AI Agent ノード) | Make、Zapier、Power Automate |
| 生成AI | OpenAI API(n8n の OpenAI Chat Model ノードで接続) | Claude API、Gemini API |
| 差異計算 | JavaScript(n8n の Code ノード。台帳の値と出ている値の差を出す) | Python |
| 連携 | 楽天トラベル空室検索API(HTTP Request ノードで呼ぶ) | サイトコントローラーの配信結果の書き出し |
| 保管 | 見回りの記録(データベースの表) | スプレッドシート |
| 通知 | 社内チャット(Microsoft Teams) | Slack、メール |
サイトコントローラーとPMSには書き込みません。 再配信も、売り止めも、これまでどおり人が画面で行います。この構成が出すのは、ずれと、その原因と、直す案までです。
土台になるのは、n8n の AI Agent ノード(Tools Agent)です。 つないだ道具の中から、課題に応じてどれを使うかを判断する仕組みです。System Message で判断の方針を与え、Max Iterations(既定は10)で答えを作ろうとする回数の上限を決め、Require Specific Output Format を有効にすると出力パーサーをつなぐ形になります。Return Intermediate Steps を有効にすると、途中の判断の過程も出力に含まれます。
道具はすべて、Call n8n Workflow Tool で作ります。 別のワークフローを道具として呼び、その出力を受け取るノードです。Description に「いつこの道具を使うか」を書き、Workflow Inputs の値を $fromAI() でAIに埋めさせます。台帳やデータベースへの接続を道具の側のワークフローに閉じ込めるので、エージェントが何を読めるかを道具の数だけに絞れます。
お客様から見た料金を外から確かめる経路は、楽天トラベルの空室検索APIだけにします。 施設番号やチェックイン日を指定すると、リアルタイムな空室の情報として、部屋とプランごとの料金(rakutenCharge、total)が返ります。ほかのサイトの検索画面を自動で巡回することはしません。 各サイトの利用条件に触れるおそれがあるからです。ほかのサイトは、サイトコントローラーが記録している配信の結果を「出ている値」とします。
03どうやって実装するのか
処理の起点を決める
毎朝6時の定時実行にします。 PMSの夜間の書き出しと前夜の配信が終わり、予約担当が出勤する前の時刻です。Schedule Trigger は秒〜月の間隔と Custom(Cron)を指定でき、曜日を限らず毎日動かします。
時刻の基準に注意してください。 Schedule Trigger はワークフローのタイムゾーン、無ければインスタンスの既定を使い、自前で立てたインスタンスの既定は America/New York です。 ワークフローの設定で Asia/Tokyo を指定します。
また、Schedule Trigger を起点にしたワークフローは、保存して公開(publish)しないと定時に動きません。 道具として呼ぶワークフローも、公開されていないと「Workflow is not active and cannot be executed」で失敗します。親だけ公開して道具を公開し忘れるのが、最初の週にいちばん起きる失敗です。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 料金台帳 | 施設、日付、部屋タイプ、基本の料金ランク、プランごとの上乗せ、経路ごとの意図した差 | 施設ごとのスプレッドシート |
| 残室 | 施設、日付、部屋タイプ、販売できる部屋数、売り止めの指定、取得した時刻 | PMSの夜間の書き出し |
| 配信状況 | 経路、日付、部屋タイプ、プランのコード、配信した料金と残室、配信の日時、成功・失敗の別 | サイトコントローラーの書き出し、またはAPI |
| プランの紐付け | 自社のプランのコードと、各サイトのプラン・部屋の対応 | サイトコントローラーの設定の書き出し |
| 楽天トラベルの表示 | 施設番号、日付、部屋とプラン、rakutenCharge、total、空室 | 楽天トラベル空室検索API |
| 料金改定の記録 | 改定した日時、対象の日付と部屋タイプ、改定の理由 | 本部の改定の一覧 |
質を決めるのは、料金台帳の「経路ごとの意図した差」の列です。 「海外のサイトは税・サービス料の見せ方が違う」「このサイトは会員割引をサイト側の負担で付けている」。これが台帳に無いと、意図した差がすべて「ずれ」として出ます。
残室の「取得した時刻」も必ず持ちます。 夜間の書き出しが止まった日に前日の残室で計算すると、昨夜埋まった部屋が「サイトに出ていない」と出ます。
サイトコントローラーの書き出しやAPIの有無は、製品と契約によって違い、この部分は利用環境に応じた個別実装になります。
データの取得方法を決める
ずれの計算に使うデータは、エージェントの外で先にそろえます。 エージェントが道具で引くのは、ずれと出た組み合わせの詳細だけです。
楽天トラベルの空室検索APIは、n8n の HTTP Request ノードで呼びます。applicationId と accessKey が必須で、施設番号は1回に最大15個まで指定できます。短い時間に大量に呼ぶと一定時間使えなくなることがあり、上限を超えると429が返ります。 HTTP Request ノードの Batching で呼ぶ速さを抑え、Never Error は使わずに2xx以外を失敗として扱います。呼ぶ日付は、繁忙日と翌14日と、前日にずれが出た日に絞ります。
| 道具の名前 | 引くもの | 使いどころ |
|---|---|---|
get_distribution_log | その経路・日付・部屋タイプの、直近の配信の日時、配信した値、成功・失敗とエラーの文面 | 配信の失敗か、配信は成功しているかを見分ける |
get_plan_mapping | 自社のプランのコードと、そのサイトのプラン・部屋の対応 | 別の部屋に紐付いていないか、紐付けが外れていないかを見る |
get_intended_diff | その経路の意図した差と、サイト側の割引・会員料金の登録 | ずれが意図した差で説明できるかを見る |
get_rate_changes | その日付・部屋タイプの直近の料金改定 | 改定の後に配信が追いついていないかを見る |
get_past_findings | 同じ組み合わせへの過去の指摘と、その後の処置 | 何度目の指摘か、前回どう直したかを知る |
AIへ渡す前に整形する
- 鮮度の確認 … 残室と配信状況の取得時刻が当日の夜間の処理より後かを確かめます。古ければ見回りを止め、本部へ知らせます
- 単位をそろえる … 1人あたりか1室あたりか、税・サービス料を含むか、何名利用の料金かを、経路ごとの決まりで台帳と同じ単位に直します。楽天トラベルは料金が1人単位か1室単位かを示す値が返るので、それで換算します
- 出すつもりの値の計算 … 台帳の基本料金ランクに、プランごとの上乗せと経路ごとの意図した差を当てて、経路ごとの「出すつもりの値」を出します
- ずれの判定 … 出すつもりの値と出ている値の差が、決めた幅を超えたものを候補にします。残室は1室でも違えば候補にします
- 意図した差の除外 … 差が意図した差の一覧で説明できるものは、候補から外して「説明済み」として記録だけ残します
- 前日との差分 … 前日も拾ったものか、新しく出たものかを付けます
- 束ねる … 同じプランのコード・同じ配信の日時のものを1件にまとめます
2番目が、この構成の要です。 単位をそろえずに比べると、すべての経路が「ずれ」になります。 換算の規則は台帳の別のシートに持たせます。計算はすべて Code ノードで行い、AIには結果だけを渡します。
AIに処理させる
させるのは、計算が拾ったずれの原因を記録から決め、直す場所と直す案を作ることです。
| 決めること | 選ぶ値 | 判断の材料 |
|---|---|---|
| 原因 | 配信の失敗/配信の遅れ(改定の後)/プランの紐付けの誤り/サイト側の割引・会員料金/台帳が古い/単位の換算の誤り/不明 | 配信の記録、紐付け、意図した差、改定の記録 |
| 直す場所 | サイトコントローラー/サイトの管理画面/料金台帳/PMS | 原因 |
| 直す案 | 再配信/紐付けの修正/売り止め/台帳の更新/サイト側の設定の確認 | 原因、何日先か、残室のずれか |
| 施設への説明文 | 何が、どの経路の何日に、どう違って見えているか | 計算の結果と根拠 |
| 本部へ確かめる事項 | 人が決めることの箇条書き | 料金の判断、サイトとの取り決め |
原因の「サイト側の割引・会員料金」は、直す対象にしません。 施設の配信は正しいからです。ただし、その割引への参加を施設が把握していなければ questions_for_hq に回します。
| させないこと | 理由 |
|---|---|
| 差の金額・残室の計算や書き換え | 計算のノードの結果だけを使う。AIが直すと根拠が二重になる |
| 急ぎの段階(A/B/C)の決定 | 残室のずれか、何日先かから規則で決める |
| 料金や残室の書き換え | 配信と売り止めの道具を持たせない。直すのは人 |
| 「どの料金が正しいか」の判断 | 台帳が正。台帳が古い疑いは本部に確かめる |
| 他のサイトにそろえる案 | 経路ごとの料金をどう決めるかは施設と本部の判断 |
最後の行は、意図して置いています。 この構成が見るのは、自社が決めた料金どおりに出ているかであって、サイト同士をそろえることではありません(第13章)。
指示内容を固定する
System Message に次の内容を入れます。
あなたは宿泊施設の販売部門で、予約サイトに出ている料金と残室のずれの
原因を調べる担当です。計算のノードから渡される「ずれ」の結果を前提に、
道具で記録を引き、原因と直す場所、直す案、施設への説明文を作ってください。
【前提として変えないこと】
- expected、observed、diff、unit は計算の結果です。書き換えないでください。
- 金額や部屋数の足し引き、税や人数の換算をしないでください。
必要な数値は道具の結果から写してください。
- 料金台帳を正として扱ってください。台帳が古い疑いがあれば
questions_for_hq に書き、台帳の値を変えないでください。
【道具の使い方】
1. まず get_distribution_log で、その経路・日付の配信が成功しているかを確認してください。
2. 配信が成功しているのに値が違う場合は get_plan_mapping を呼んでください。
3. 台帳より安く見えている場合は get_intended_diff を呼んでください。
4. 直近に料金を改定した日付なら get_rate_changes を呼んでください。
5. 同じ組み合わせを前にも指摘していれば get_past_findings で処置を確認してください。
同じ道具を同じ引数で2回呼ばないでください。
【原因の選び方】
- push_failed ....... 配信の記録に失敗またはエラーがある
- push_delayed ...... 改定の後の配信がまだ無い、または改定より前の値が出ている
- mapping_error ..... プランや部屋の紐付けが別のもの、または外れている
- channel_discount .. サイト側の割引・会員料金の登録で説明できる
- ledger_stale ...... 改定の記録より台帳が古いと読める
- unit_mismatch ..... 人数・税・1室か1人かの扱いが経路の決まりと違う
- unknown ........... 上のどれとも決められない
迷ったときは unknown を選び、questions_for_hq に理由を書いてください。
【厳守事項】
- 記録に無いことは書かないでください。サイト側の設定を推測しないでください。
- サイトの画面がどう見えているかは、楽天トラベルの API の結果以外は分かりません。
分からないことは「配信の記録上は」と書き分けてください。
- 他の経路の料金にそろえる案を出さないでください。
直す案は、台帳どおりに出すための操作だけにしてください。
- 料金の値上げ・値下げの提案をしないでください。
- 残室のずれは、売り止めの漏れか配信の失敗かを必ず区別してください。
- evidence には、判断の根拠にした記録の種類と識別子と、該当する文字列を写してください。
- 急ぎの段階は決めないでください。
【計算の結果】{discrepancy}
【前日の見回りの結果】{previous}
【施設と担当】{property}
「楽天トラベルの API の結果以外は分からない」を書かないと、AIは配信の記録が成功というだけで「サイト上も正しく表示されています」と書きます。 確かめていないことを確かめたように報告させないためです。
「他の経路にそろえる案を出さない」を明記しないと、AIは一番安いサイトに合わせる案を出します。 消したいのは台帳とのずれであって、経路の間の差ではありません。
出力形式を固定する
Require Specific Output Format を有効にし、Structured Output Parser をつなぎます。 次の形のJSONで受け取ります。
{
"property_code": "",
"run_date": "",
"discrepancy": {
"channel": "", "stay_date": "", "room_type": "", "plan_code": "",
"kind": "rate | availability",
"expected": 0, "observed": 0, "diff": 0, "unit": "",
"observed_source": "rakuten_api | distribution_log"
},
"cause": "push_failed | push_delayed | mapping_error | channel_discount | ledger_stale | unit_mismatch | unknown",
"evidence": [ { "source": "distribution_log | mapping | intended_diff | rate_change", "id": "", "quote": "" } ],
"fix_location": "site_controller | channel_extranet | rate_ledger | pms | none",
"proposed_fix": "repush | fix_mapping | stop_sell | update_ledger | check_channel_setting | no_action",
"message_to_property": "",
"questions_for_hq": [],
"confidence": "high | low"
}
Structured Output Parser は、JSONの例から形を作る方法と、JSON Schema を書く方法の2つから選べます。例から作ると、すべての項目が必須として扱われます。 原因が channel_discount のときは proposed_fix を no_action にし、questions_for_hq が空のこともあるので、JSON Schema で書き、必須の項目を自分で決めます。 JSON Schema の $ref による参照は使えないとされているので、discrepancy の入れ子はその場に展開して書きます。
1つ目の理由は、原因と段階を別の層に置けることです。 段階は後段の規則で決めます。
| 段階 | 条件(規則) | 行き先 |
|---|---|---|
| A | 残室のずれで、PMSでは満室・売り止めなのにサイトに残室がある。または7日以内の料金のずれで、台帳より安く出ている | 施設の予約担当と本部の両方。すぐに通知 |
| B | 8〜30日先の料金のずれ、または台帳より高く出ている | 施設の予約担当へ。本部へは日報でまとめて |
| C | 31日以降の料金のずれ、または channel_discount で施設が未把握のもの | 施設の一覧だけ |
残室のずれを料金より上に置いているのは、取り返しがつかないからです。 満室の日に入った予約は、お客様の旅行の予定そのものに響きます。
2つ目は、observed_source で「見えている」と「記録上そうなっている」を分けられることです。 楽天トラベルのAPIで確かめた値と、配信の記録から読んだ値を、一覧で見分けられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 料金台帳 | スプレッドシートの読み取り | 料金ランク、上乗せ、経路ごとの意図した差を引く |
| PMS | 夜間の書き出しの読み取り | 残室と売り止めを引く |
| サイトコントローラー | 書き出しの読み取り、またはAPI | 配信の結果とエラー、プランの紐付けを引く |
| 楽天トラベル空室検索API | HTTP Request ノード | 自施設の部屋とプランの料金・空室を引く |
| Microsoft Teams | チャネルへの投稿 | 施設ごとの一覧、段階Aの通知 |
| 見回りの記録 | 書き込み | その日の結果、直したかどうか、翌日の追いかけ |
エージェントに渡す道具はすべて読み取りです。 投稿と記録への書き込みは、後段のノードが規則で行います。AIが書き込みを持たないので、料金が勝手に変わることはありません。 OpenAI Chat Model ノードの Sampling Temperature は高いほど誤りのおそれが増えるとされているので低めに置き、Timeout と Max Retries で見回り全体が止まらないようにします。
人が確認する
人が見るのは、エージェントが出した全件です。 ただし、見る深さを段階で変えます。
- 段階Aを最初に見る … 施設の予約担当は、残室のずれから先に、サイトコントローラーかサイトの管理画面で売り止めを確かめます
confidenceがlowとunknownのものを見る … 原因が決まらないものは、紐付けか台帳の側に欠けがあることが多いmapping_errorを見る … 直す前に、同じプランのコードを使う他の経路に響かないかを確かめますledger_staleは本部が見る … 台帳を直すか、配信を直すかは本部のレベニュー担当が決めます- 段階B・Cは一覧で見る … 再配信で済むものはまとめて行います
目標は1件をならして10分です。
例外に対処する
| 起きること | 対応 |
|---|---|
| PMSの書き出しが終わっていない | 取得時刻で検知して残室の見回りを止め、本部へ知らせる。前日の値で計算しない |
| サイトコントローラーの書き出しが無い | その日は楽天トラベルの分だけ見回り、残りは「未確認」として一覧に載せる |
| 楽天トラベルのAPIが429を返す | Batching の間隔を広げて残りを翌回へ。取れなかった日付を一覧に出す |
| 台帳に無いプランが配信されている | mapping_error の候補として人へ回す |
| Max Iterations に達した | 途中までの結果と unknown で人へ回す |
| 同じずれを3日続けて指摘している | 段階を1つ上げ、本部にも通知する |
上の3行で、誤った指摘の大半を止めます。 どれもAIの問題ではなく、データがそろわないまま計算した問題です。
記録を残す
- その日の計算の入力(台帳・残室・配信状況の取得時刻と件数、楽天トラベルのAPIで取れた日付と取れなかった日付)
- 経路・日付・部屋タイプごとの、出すつもりの値と出ている値、差、「説明済み」として外したもの
- エージェントの出力の全文と、Return Intermediate Steps で残した途中の過程
- 規則で決めた段階と、知らせた先
- 施設の担当者が直したかどうかと、直した日時と場所
- 翌朝の見回りで解消したかどうか
2つ目で「説明済み」を残すのは、意図した差の一覧が古くなるためです。 外したものの記録が無いと、いつから説明がつかなくなったかが分かりません。
04実装レベルの3段階
最小構成では件数がさばけません。 記録を書き出す作業が重く、6施設の毎朝には使えません。確かめるための段階です。 半自動化で、1件40分が20分程度になります。 ①と②の画面の見比べが計算に置き換わりますが、ずれの原因を設定と紐付けの画面で探す作業が残ります。本格構成で10分になり、この段階が本記事の想定です。 差が大きいのは、原因を探す作業が、1件ごとにサイトコントローラーの画面を行き来する手作業だからです。 段階を飛ばさないでください。 計算が空振りする状態でエージェントを足すと、空振りに丁寧な説明が付くだけです。
05工数削減シミュレーション
導入後 180件 × 10分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の施設を運営し、楽天トラベル・じゃらん・一休・海外の予約サイトと自社サイトに同じ部屋を並べて売っているホテル・旅館。料金と残室をサイトコントローラーで配信しているが、配信後に各サイトでどう見えているかを確かめる作業が予約担当者の目に頼っている場合。料金の改定が週に何度もあり、改定のたびに配信漏れやプランの紐付けの誤りが起きている場合。料金の決め方を施設ごとの料金台帳に残せる場合。
- 予約サイトを1〜2つしか使っておらず、画面を見れば数分で確かめられる場合。料金を季節ごとに一度決めたらほとんど動かさない場合。サイトコントローラーを使っておらず、各サイトの管理画面で個別に料金を入れている場合(先に配信の経路を一本にするほうが効く)。各サイトとの契約や料金の決め方そのものを見直したい場合(この構成は判断を代替しません)。
07最小構成で試す方法
- 先月、実際に起きた料金や残室の誤り(予約が入ってから気づいたもの、お客様から指摘されたもの)を10件集める
- その10件について、当時の料金台帳、サイトコントローラーの配信の記録、プランの紐付けの画面を書き出す
- 手元の生成AIのサービスに、1件ずつ記録を貼り付ける
- 「この料金のずれの原因を、配信の失敗/改定の後の配信の遅れ/プランの紐付けの誤り/サイト側の割引/台帳が古い/単位の換算のどれかで答え、根拠の記録を示してください。記録に無いことは推測しないでください。他のサイトにそろえる案は出さないでください」と指示する
- 出てきた原因を、当時担当者が実際に突き止めた原因と突き合わせる
10件は必ずやってください。 「記録がそろっていれば原因が決まるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時と同じ原因が根拠付きで出た | 計算のノードとエージェントの組み立てに進む |
| サイトの設定を推測して原因を決めた | 指示の書き方で直る。構成は有効 |
| 意図した差が台帳に無く、原因が決まらない | 台帳の整備が先。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 意図した差がすべてずれとして出る | 台帳に経路ごとの意図した差を書く。 説明済みは外して記録だけ残す |
| 経路によって料金の見せ方が違い、全部がずれになる | 人数・税・1室か1人かの換算を、計算のノードで台帳と同じ単位にそろえる |
| 朝ではなく夜に動く | Schedule Trigger はワークフローかインスタンスのタイムゾーンを使う。Asia/Tokyo を指定 |
| 道具のワークフローが動かない | 公開していないと失敗する。親と一緒に公開する |
| 楽天トラベルのAPIで429が返る | 呼ぶ日付を絞り、Batching で間隔を空ける |
| 配信の記録だけで「表示も正しい」と報告する | 見えている値と記録上の値を observed_source で分ける |
| 一番安いサイトにそろえる案が出る | 指示で禁じる。直す案は台帳どおりに出す操作だけ |
| 直したことが記録されず、同じ指摘が毎朝出る | 直した日時と場所を見回りの記録に残す |
上の2行が、この構成の失敗のほとんどです。 どちらも生成AIの精度とは関係がありません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 施設ごとの料金の決め方と今後の料金、残室と売り止め、サイトとの取り決め(意図した差や割引の参加状況)です。宿泊客の氏名や連絡先は使いません。
- 外部へ渡す範囲を、調査に必要な項目までに限る … 予約の明細や宿泊客の情報は、ずれの原因の調査に要りません。PMSの書き出しは日付・部屋タイプ・残室・売り止めの列だけにします
- 料金と残室を自動で書き換えない … 出すのは直す案までです。売上とお客様の予約に直接ひびきます
- 経路の間で料金をそろえる方向の判断をAIにさせない … 公正取引委員会は、予約サイトの運営事業者が宿泊施設に、宿泊料金と部屋数を他の販売経路と同等以上とする条件を定めていた行為について、独占禁止法第19条(拘束条件付取引)の疑いとして確約計画を認定しています。認定は違反を認定したものではないとされていますが、どの経路にいくらで出すかは施設が決めることです。 この構成は、施設が自分で決めた料金どおりに出ているかだけを見ます
- 今後の料金とAPIのキーを外へ出さない … 生成AIのサービスは入力を学習に使わない契約と設定のものを選び、楽天トラベルのアクセスキーは n8n の認証情報に保存します
誤りが起きた場合のリスクは、残室のずれを見落とすことと、誤った直す案で正しい料金を書き換えることの2つです。 前者は鮮度の確認を省くと起き、後者は台帳が古いまま正として扱うと起きます。
10まず何から始めるか
1週目:意図した差を書き出す
施設の予約担当に、経路ごとに料金を変えているところ、サイト側の割引に参加しているところ、税・サービス料の見せ方が違うところを聞き取り、料金台帳に列を足して書きます。この列が無いと、計算はすべてをずれとして出します。
2週目:10件で試す
先月の誤りから10件を選び、手元の生成AIで原因を整理させます。サイトの設定を推測していないかを最優先で見ます。
3週目:書き出しと換算の規則を決める
サイトコントローラーから配信の結果とプランの紐付けを毎晩書き出せるかを確かめ、経路ごとの単位の換算の規則と、段階A/B/Cの境目を、施設と本部で決めます。 あわせて、楽天トラベルのアプリIDとアクセスキーを発行します。
4週目:計算のノードまでをつなぐ
n8n の Schedule Trigger から台帳と書き出しを読み、楽天トラベルの空室検索APIを呼び、Code ノードでずれを出して、ずれの一覧をチャットに出すところまで作ります。この時点ではエージェントを入れません。
2か月目: 道具のワークフローを5本作り、AI Agent ノードで原因と直す案を出します。施設の担当者が案を直した割合を毎週数えます。3か月目以降: 翌朝の追いかけと段階の規則を足し、1件40分が何分になったかを実測します。満室の日に入る予約がなくなり、一覧が毎朝読まれ続けている時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Schedule Trigger の間隔と Custom(Cron)。タイムゾーンの扱いと、自前のインスタンスの既定が America/New York であること。保存して公開する必要があること | n8n Docs: Schedule Trigger node | 2026-10-06 |
| Tools Agent の System Message、Max Iterations(既定10)、Return Intermediate Steps、Require Specific Output Format の各設定 | n8n Docs: Tools AI Agent node | 2026-10-06 |
Call n8n Workflow Tool の Description、Workflow Inputs、$fromAI()。公開されていないと「Workflow is not active and cannot be executed」で失敗すること | n8n Docs: Call n8n Workflow Tool node | 2026-10-06 |
Structured Output Parser の2つの書き方。例から作ると全項目が必須になること。$ref が使えないこと | n8n Docs: Structured Output Parser node | 2026-10-06 |
| HTTP Request ノードの Batching(Items per Batch、Batch Interval)、Timeout、Never Error(既定では2xxのみ成功)の各設定 | n8n Docs: HTTP Request node | 2026-10-06 |
| OpenAI Chat Model ノードの Sampling Temperature(高いほど誤りのおそれが増える)、Timeout、Max Retries の各設定 | n8n Docs: OpenAI Chat Model node | 2026-10-06 |
楽天トラベル空室検索APIがリアルタイムな空室の情報を返すこと。applicationId と accessKey が必須、施設番号は最大15個。rakutenCharge、total。上限超過で429が返ること | 楽天ウェブサービス: 楽天トラベル空室検索API | 2026-10-06 |
| 宿泊料金と部屋数を他の販売経路と同等又は有利なものとする条件について、独占禁止法第19条(拘束条件付取引)の疑いとして確約計画が認定されたこと(令和元年10月25日)。違反を認定したものではないこと | 公正取引委員会: 楽天株式会社から申請があった確約計画の認定について | 2026-10-06 |
各予約サイトとの契約の中身や、経路ごとの料金の決め方が取引上どう扱われるかは、施設の責任者と、必要に応じて法務で確認してください。 本記事は公正取引委員会のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0490)についてのご相談はこちらから。
