予約サイトと電話受付代行から届く宴会・貸切の予約通知を予約台帳にそろえ、確認の要る点を店長に知らせる
予約サイト・自社フォーム・電話受付代行から届く宴会と貸切の予約通知メールを n8n が受け取り、日時・人数・コース・アレルギーなどを決まった項目で抜き出して予約台帳にそろえます。席数や貸切の重なり、アレルギーのように確認の要る点は、店長に知らせます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- 宿泊/飲食
- 対象部門
- 営業
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 予約担当が予約専用アドレスの受信箱を開き、未読の通知メールを上から読む
- 通知の経路と、新規・変更・取消のどれかを本文から見分ける
- 新規なら、日時・店舗・人数・コース・予算・席の希望・アレルギー・幹事の名前と電話番号を予約台帳に写す
- 変更・取消なら、台帳で元の予約を探し、該当の行を直すか取消の印を付ける
- 店舗マスタで席数を見て、人数が席数を超えていないか、同じ日に貸切が重なっていないかを確かめる
- コース名を店のコースマスタの名前に読み替え、該当が無ければメモを残す
- アレルギーや確認の要る点があれば、店長に社内チャットかメールで伝える
- 自動予約専用アドレスに通知メールが届くと、n8n の Gmail Trigger が数分おきに拾う
- 自動送信元のアドレスから経路(予約サイトA/B、自社フォーム、電話受付代行)を決め、本文を取り出して整える
- 自動AIが本文から、通知の種類・外部の予約番号・日時・店舗・人数・コース・予算・席の希望・アレルギー・幹事の連絡先を抜き出す
- 自動店舗マスタとコースマスタを引き、席数の超過・貸切の重なり・コース名の読み替えを規則で確かめる
- 自動新規は台帳に行を足し、変更・取消は予約番号で元の行を探して直す。元の行が見つからないものは直さずに保留する
- 自動確認の要る点があるものは、店長と予約担当にメールで知らせる
- 人予約担当が「要確認」の行だけを開き、原文と照らして直す
- 人店長がアレルギー・貸切・人数の幅のある予約を確かめ、必要なら幹事に電話する
各工程の詳しい説明を読む
- 予約担当が予約専用アドレスの受信箱を開き、未読の通知メールを上から読む
- 通知の経路と、新規・変更・取消のどれかを本文から見分ける
- 新規なら、日時・店舗・人数・コース・予算・席の希望・アレルギー・幹事の名前と電話番号を予約台帳に写す
- 変更・取消なら、台帳で元の予約を探し、該当の行を直すか取消の印を付ける
- 店舗マスタで席数を見て、人数が席数を超えていないか、同じ日に貸切が重なっていないかを確かめる
- コース名を店のコースマスタの名前に読み替え、該当が無ければメモを残す
- アレルギーや確認の要る点があれば、店長に社内チャットかメールで伝える
(a)書式の違いが、そのまま転記の手間になる。 4つの経路の通知はどれも項目の場所が違い、電話受付代行の文章は毎回読み解く必要があります。 担当者が慣れていても、1通ずつ目で拾って台帳の列に合わせる作業は減りません。
(b)変更・取消の元予約を探すのに時間がかかる。 予約サイトの変更通知には予約番号が書かれていますが、台帳の側に予約番号の列を作っていなかった時期の予約は、幹事の名前と日付で探すしかありません。 同じ日に同じ会社名の宴会が2件あることもあります。
(c)アレルギーの書き漏れが、店に伝わらない。 予約サイトの備考欄や電話受付代行の文章の後半にアレルギーが書かれていると、台帳への転記で落ちることがあります。 店に伝わるのは当日の朝の台帳の印刷だけなので、台帳から落ちれば店は知りません。
(d)貸切の重なりに後から気づく。 2つの予約サイトと電話受付代行で別々に貸切を受けると、同じ店の同じ夜に貸切が2件入ることがあります。 台帳に写すときに気づければよいのですが、忙しい週ほど写すだけで手一杯になります。
- 【自動】 予約専用アドレスに通知メールが届くと、n8n の Gmail Trigger が数分おきに拾う
- 【自動】 送信元のアドレスから経路(予約サイトA/B、自社フォーム、電話受付代行)を決め、本文を取り出して整える
- 【自動】 AIが本文から、通知の種類・外部の予約番号・日時・店舗・人数・コース・予算・席の希望・アレルギー・幹事の連絡先を抜き出す
- 【自動】 店舗マスタとコースマスタを引き、席数の超過・貸切の重なり・コース名の読み替えを規則で確かめる
- 【自動】 新規は台帳に行を足し、変更・取消は予約番号で元の行を探して直す。元の行が見つからないものは直さずに保留する
- 【自動】 確認の要る点があるものは、店長と予約担当にメールで知らせる
- 【人】 予約担当が「要確認」の行だけを開き、原文と照らして直す
- 【人】 店長がアレルギー・貸切・人数の幅のある予約を確かめ、必要なら幹事に電話する
人が見るのは「要確認」の行だけです。 予約サイトの定型の通知で、項目がそろい、席数にも重なりにも問題がないものは、台帳に入った行を流し見るだけにします。全件を開く設計にすると、6分が2分に縮みません。
5番目で、元の行が見つからない変更・取消を直さずに保留するのは、意図してのことです。 名前と日付で近い行を推測して直すと、別の宴会の人数を書き換える事故が起きます。見つからないものは人が探します。
02今回想定するシステム構成
予約サイトA・B/自社フォーム/電話受付代行 │ いずれも予約専用アドレスへ通知メール ▼【トリガー】Gmail Trigger(数分おきに未読を確認) n8n ├──▶ Gmail(メッセージの取得、本文と送信元) ├──▶ Code(経路の判定、HTMLの除去、引用・署名の除去) ├──▶ Information Extractor + Anthropic Chat Model(Claude) │ 本文 → 種類・予約番号・日時・人数・コース・アレルギー等 ├──▶ Google Sheets(店舗マスタ・コースマスタ・予約台帳を引く) ├──▶ Code(席数の超過・貸切の重なり・読み替え・要確認の判定) ├──▶ Google Sheets(予約台帳に追加・更新) ├──▶ Gmail(店長と予約担当へ確認事項を送る) └──▶ Gmail(処理済みのラベルを付ける) ▼ 【予約担当が要確認の行を直し、店長がアレルギーと貸切を確かめる】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Zapier、Power Automate |
| 生成AI | Claude(n8n の Anthropic Chat Model ノード経由) | OpenAI API、Gemini API |
| 保管 | Google スプレッドシート(予約台帳・店舗マスタ・コースマスタ・処理ログ) | - |
| 通知 | Gmail | Google Chat、Slack |
新しく足すのは n8n だけです。 Gmail と Google スプレッドシートは今のものをそのまま使います。予約サイトの管理画面にはつなぎません。予約サイトの側で予約を確定・変更する操作は、これまでどおり人が管理画面で行います。
n8n の Gmail Trigger は、選んだ間隔でメールを確かめて新しいメッセージで動くトリガーです。公式のページでは、1回の確認で取るメールの数(Max Emails per Poll)が既定で10通、上限50通で、それを超えた未読は次の確認に回されるとされています。宴会シーズンの朝にまとめて届いても、取りこぼしではなく順に処理されます。
抜き出しは、Information Extractor ノードで行います。 入力の文章から構造化した情報を取り出すノードで、出力の形は「属性の説明から」「JSONの例から」「JSONスキーマで定義」の3つの書き方があります。JSONの例から作ると全項目が必須として扱われると公式のページにあるため、任意の項目(アレルギー・予算など)があるこの題材では、JSONスキーマで定義します。
モデルは Anthropic Chat Model ノードで Claude を選びます。 このノードはサブノードとして Information Extractor にぶら下げる形で、サンプリングの温度などを設定できます。抜き出しなので温度は低くします。
03どうやって実装するのか
処理の起点を決める
予約専用アドレスへの通知メールの着信を起点にします。 Gmail Trigger の確認の間隔は5分にします。宴会の予約は当日の朝に人数が変わることがあり、1時間おきでは、仕込みの前に台帳が直りません。
拾う範囲は、Gmail Trigger のフィルタで絞ります。公式のページでは、ラベル、Gmail の検索の書き方(from: など)、既読・未読、送信者で絞れるとされています。この構成では次のようにします。
| フィルタ | 設定 | 理由 |
|---|---|---|
| Search | from:(予約サイトAの通知アドレス OR 予約サイトBの通知アドレス OR 電話受付代行の通知アドレス OR 自社フォームの送信アドレス) | 営業メールや取引先のメールを拾わない |
| Read Status | 未読のみ(既定) | 人が先に読んで処理したものを二重に拾わない |
| Max Emails per Poll | 50 | シーズンの朝の集中に備える。超えた分は次の確認に回る |
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 通知メール | 送信元、件名、受信日時、本文(テキストまたはHTML)、Gmail のメッセージID | Gmail |
| 店舗マスタ | 店舗コード、店名、予約サイト上の店名、最大の席数、貸切の可否と最少人数、個室の数 | スプレッドシート |
| コースマスタ | 店のコースコード、コース名、1人あたりの料金、予約サイト上の掲載名(経路ごと) | スプレッドシート |
| 予約台帳 | 経路、外部の予約番号、日時、店舗、人数、状態(有効/取消)、席の区分 | スプレッドシート |
| 経路の一覧 | 送信元のアドレスと経路名の対応、経路ごとの予約番号の書式 | スプレッドシート |
質を決めるのは、コースマスタの「予約サイト上の掲載名」の列です。 予約サイトに載せているコース名は、季節ごとの売り文句が付いて店の呼び名と違っています。この列が無いと、毎回「該当コースなし」の確認が店長に飛びます。
店舗マスタの「予約サイト上の店名」も同じです。 「◯◯ 駅前店」「◯◯ 駅前本店」のような違いで店舗が決まらないと、席数の確認もできません。
データの取得方法を決める
Gmail Trigger は、既定の Simplify(簡略化) がオンだと、メッセージID・ラベル・送信元や件名などのヘッダーを返します。本文が要るので、続けて Gmail ノードの「メッセージの取得(Get)」を Simplify をオフにして呼び、本文を取ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 送信元のアドレス | トリガーの出力(From) | 経路の判定 |
| 本文(テキスト・HTML) | Gmail ノードの Get(Simplify をオフ) | AIに渡す本文 |
| メッセージID | トリガーの出力 | ラベル付けとログの照合 |
| 店舗・コース・台帳 | Google Sheets ノードの Get Row(s) | 照合と、変更・取消の元の行探し |
台帳の元の行は、Get Row(s) で「経路+外部の予約番号」の列を値で引きます。 公式のページでは、Get Row(s) は既定で最初の一致だけを返し、すべて返すには「When Filter Has Multiple Matches」を「Return All Matches」にするとされています。同じ予約番号が2行あるのは台帳の異常なので、すべて返させ、2行以上なら要確認にします。
AIへ渡す前に整形する
- 経路の判定 … 送信元のアドレスを経路の一覧と照らし、経路名を付けます。一覧に無い送信元は、AIに渡さず要確認にします
- HTMLの除去 … HTMLの通知は Code ノードでタグを外し、表の行は「項目名:値」の形の行に直します
- 引用と署名の除去 … 電話受付代行の通知に前回のやり取りが引用されていれば、
>で始まる行と「以下、前回のご連絡」以降を外します - 定型の文の除去 … 予約サイトの通知の末尾にある、規約やキャンセル規定の定型の文を外します。経路ごとに、外す範囲の始まりの語を一覧に持たせます
- 長さの確認 … 整えた本文が一定の長さを超えるものは、複数の予約がまとまっている可能性があるため、要確認の印を付けたうえで渡します
- 重複の確認 … 同じメッセージIDのものが処理ログにあれば、処理をやめます
3番目と4番目を省かないでください。 引用の中には前回の人数やコースが書かれており、残すと古い人数を抜き出します。 キャンセル規定の定型の文には「取消」「キャンセル」の語が並ぶので、新規の予約が取消と判定されるもとになります。
AIに処理させる
させるのは、本文から決まった項目を抜き出し、その根拠の語句を写すことだけです。
| 抜き出すもの | 中身 | 書かれていないとき |
|---|---|---|
| 通知の種類 | 新規/変更/取消/宴会・貸切ではない/判断できない | unknown |
| 外部の予約番号 | 通知に書かれた予約番号 | 空にする |
| 店舗 | 通知に書かれた店名(読み替えはしない) | 空にする |
| 日時 | 利用日と開始時刻。終了時刻があれば終了時刻 | 空にする |
| 人数 | 確定の人数。幅があれば下限と上限 | 空にする |
| コース | 通知に書かれたコース名と料金 | 空にする |
| 予算 | 1人あたりか総額か、飲み放題込みか | 空にする |
| 席の希望 | 貸切/個室/一般席/指定なし | unspecified |
| アレルギー・食事の制限 | 原文の語句をそのまま。人数が書かれていれば人数も | 空の配列 |
| 幹事の名前・電話番号 | 通知に書かれたとおり | 空にする |
| 変更の内容 | 変更の通知なら、何がどう変わったか | 空にする |
| させないこと | 理由 |
|---|---|
| 店舗やコースの読み替え | マスタとの照合は規則の側で行う。AIに寄せると誤った店に入る |
| 人数の幅を1つの数に丸める | 「30名前後」を30名にすると、店長が確かめる理由が消える |
| アレルギーの言い換え・要約 | 「甲殻類」と「えび・かに」は同じでない。原文で判断する |
| 席数の超過や重なりの判定 | 台帳とマスタを見る規則で決める |
| 客への返信文の作成と送信 | この構成は台帳と店への連絡まで |
2行目と3行目が、この構成でいちばん大事な制約です。 幅を丸める、言い換えるという処理は、どちらも読みやすくするための親切に見えますが、店長が電話で確かめるべき理由を、台帳から消してしまいます。
指示内容を固定する
Information Extractor の System Prompt Template に、次のように書きます(公式のページでは、出力の形の指示はノードが自動で付け足すとされているため、ここには項目の意味と禁止事項だけを書きます)。
あなたは飲食店の本部で、宴会・貸切の予約通知を予約台帳に写す担当です。
渡された通知メールの本文だけを根拠に、決められた項目を抜き出してください。
【通知の種類 notice_type】
- new ....... 新しい予約の通知
- change .... すでにある予約の内容が変わった通知
- cancel .... すでにある予約の取消の通知
- not_party . 宴会・貸切ではない通常の席の予約、または予約以外のメール
- unknown ... どれか決められない
キャンセル規定や注意書きの文に「キャンセル」とあるだけでは cancel にしないでください。
【厳守事項】
- 書かれていない項目は空にしてください。推測で埋めないでください。
- 店名とコース名は、本文に書かれた文字のまま写してください。
店のどの店舗・どのコースに当たるかを決めないでください。
- 人数に幅がある場合(「30名前後」「25〜30名」「確定は前週」)は、
party_size_min と party_size_max に分けて入れ、party_size_note に原文を写してください。
1つの数に丸めないでください。
- アレルギー・食事の制限は、原文の語句をそのまま allergies に入れてください。
言い換え・まとめ・分類をしないでください。「なし」と明記されていれば "なし" と入れます。
- 「軽いものなら大丈夫」「程度は当日確認」のような程度の記載も、原文のまま入れてください。
- 日付は本文のとおりに写し、曜日と日付が食い違う場合は date_note に両方を書いてください。
どちらが正しいかを決めないでください。
- 変更の通知では、変わった項目を changes に「項目:前→後」の形で書いてください。
前の値が書かれていなければ「項目:→後」としてください。
- 各項目について、根拠にした本文の語句を evidence にそのまま写してください。
- 1通に複数の予約が含まれていると判断した場合は、multiple_bookings を true にし、
最初の1件だけを抜き出してください。
- 客への返事や店への提案は書かないでください。
【経路】{source_name}
【受信日時】{received_at}
【本文】{body}
「キャンセル規定の文だけで cancel にしない」を明記するのは、予約サイトの新規の通知に、キャンセル料の規定がほぼ必ず書かれているからです。 前処理で外しきれなかったときの二重の守りです。
出力形式を固定する
Information Extractor の Schema Type を「Define using JSON Schema」にして、次の形を定義します。
{
"notice_type": "new | change | cancel | not_party | unknown",
"external_id": "",
"store_name_raw": "",
"date": "YYYY-MM-DD",
"date_note": "",
"start_time": "HH:MM",
"end_time": "",
"party_size_min": 0,
"party_size_max": 0,
"party_size_note": "",
"course_name_raw": "",
"course_price_raw": "",
"budget_raw": "",
"seating": "private_hire | private_room | regular | unspecified",
"allergies": [""],
"organizer_name": "",
"organizer_phone": "",
"changes": [""],
"multiple_bookings": false,
"evidence": { "date": "", "party_size": "", "allergies": "" }
}
required は notice_type と multiple_bookings だけにし、ほかは任意にします。JSONの例から作ると全項目が必須になり、書かれていない項目を何かで埋めようとします。
1つ目の理由は、AIの出力と規則の判定を分けられることです。 JSONはAIが埋め、その後ろの Code ノードが店舗マスタ・コースマスタ・台帳と照らして、次の印を付けます。
| 印 | 付ける条件 |
|---|---|
store_unmatched | 店名が店舗マスタの店名・予約サイト上の店名のどれにも一致しない |
course_unmatched | コース名がコースマスタの掲載名に一致しない |
over_capacity | 人数の上限が、その店の最大の席数を超える |
private_hire_conflict | 同じ店・同じ日に、有効な貸切が台帳に既にある |
size_range | 人数の下限と上限が違う |
allergy | allergies が空でなく、"なし" でもない |
date_conflict | date_note が空でない、または利用日が受信日より前 |
origin_not_found | 変更・取消で、元の行が台帳に見つからない |
multiple | multiple_bookings が true |
印が1つでも付いた行は「要確認」、付かない行は「自動登録」として台帳に入れます。 印の付け方は規則なので、店の席数が変わってもマスタを直すだけで済みます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Gmail(予約専用アドレス) | Gmail Trigger、Gmail ノード | 通知の受け取り、本文の取得、処理済みのラベル |
| Claude | Anthropic Chat Model ノード | 項目の抜き出し |
| 予約台帳 | Google Sheets ノード | 新規は行の追加、変更・取消は元の行の更新 |
| 店舗マスタ・コースマスタ | Google Sheets ノード | 読み取りのみ |
| 店長・予約担当 | Gmail ノード(送信) | 要確認の行の知らせ |
台帳への書き込みは、新規と変更・取消で分けます。 新規は Append Row で行を足します。変更・取消は、Get Row(s) で見つかった元の行を Update Row で直し、取消は行を消さずに「状態」の列を「取消」にします。 消すと、取消の連絡が来たという記録が台帳から消えます。
店長への知らせは、店舗ごとに宛先を分けます。 店舗マスタに店長のアドレスを持たせ、要確認の行のうち allergy・private_hire_conflict・over_capacity・size_range の印が付いたものだけを店長に送ります。store_unmatched や course_unmatched のような台帳の側の問題は、予約担当にだけ送ります。 店長に台帳の整備の話まで届くと、肝心のアレルギーの知らせが埋もれます。
最後に、処理したメールに Gmail ノードで「n8n処理済み」のラベルを付け、既読にします。 公式のページでは、メッセージの操作に「ラベルの追加」と「既読にする」があります。ラベルが付いていない未読のメールが受信箱に残っていれば、それが未処理の通知です。
人が確認する
人が見るのは「要確認」の行だけです。 自動登録の行は、予約担当が1日2回、一覧で件数と店舗を流し見ます。
- 予約担当が
origin_not_foundとmultipleを先に見る … 台帳の行が二重になるか、変更が反映されないおそれがあるものです。元の行を探して、手で直します - 予約担当が
store_unmatched・course_unmatchedを直す … 台帳の行を直し、マスタに掲載名が足りなければマスタにも足します - 店長が
allergyの行を確かめる … 原文の語句を料理長と見て、程度が書かれていなければ幹事に電話で確かめます - 店長が
private_hire_conflict・over_capacity・size_rangeを確かめる … 貸切が重なっていれば、どちらを受けるかを決めて幹事に連絡します - 直した内容を台帳の「確認者」「確認日時」の列に残す
3番目を省かないでください。 アレルギーの記載は、台帳に入った時点では「書かれていた」という事実にすぎません。どの料理を外すか、調理場で分けられるかは店が決めることで、AIの出力にはその答えがありません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 経路の一覧に無い送信元から届いた | AIに渡さず、予約担当に転送して要確認にする |
notice_type が unknown | 台帳に入れず、予約担当に本文ごと知らせる |
not_party(通常の席の予約など) | 台帳に入れずに処理済みのラベルを付ける。件数だけを処理ログに残す |
| 変更・取消で元の行が見つからない | 台帳を直さず origin_not_found。名前と日付で推測して直さない |
| 同じ予約番号の行が台帳に2行以上ある | どちらも直さず要確認。台帳の重複を人が整理する |
| 1通に複数の予約が書かれている | 最初の1件だけ入れて multiple。残りは人が足す |
| AIの応答がスキーマに合わない | 1回だけやり直し、だめなら要確認として本文を予約担当へ |
| Claude の API が応答しない | メールを未読のまま残し、処理済みのラベルを付けない。次の確認で再び拾う |
| 取消の通知が新規の通知より先に届いた | origin_not_found にして保留。後から届いた新規を人が取消にする |
| 店長のアドレスが店舗マスタに無い | 予約担当に送る |
上から4行目が、いちばん気をつけるところです。 予約サイトの通知は届く順が入れ替わることがあり、変更が新規より先に来ることもあります。見つからないときに推測で近い行を直すより、保留にして人が探すほうが、台帳の事故が起きません。
記録を残す
処理ログのシートに、1通ごとに次を残します。
- 受信日時、Gmail のメッセージID、経路、件名
- 整えた後の本文(AIに渡したもの)と、AIが返したJSONの全文
- 付いた印と、台帳に入れた区分(自動登録/要確認/入れていない)
- 台帳のどの行を足した・直したか(行の番号と、外部の予約番号)
- 人が直した内容 … どの項目を、何から何へ直したか、誰がいつ直したか
- 店長に送った知らせの宛先と日時
AIに渡した本文を残すのは、抜き出しの誤りを後から確かめるためです。 誤りが前処理で外し損ねた引用のせいか、AIの読み違いかは、渡した本文を見ないと分かりません。
人が直した記録は、月に1回まとめて見ます。 同じ経路の同じ項目で直しが続くなら、プロンプトよりも前処理か、マスタの掲載名に原因があります。直しの多い経路から手を入れます。
04実装レベルの3段階
本記事の想定は半自動化です。 本格構成は、予約サイトの側の連携の仕組みが使えるかどうかに左右されます。連携の可否と方法は予約サイトごとに違うため、この部分は利用環境に応じた個別確認が必要です。 最小構成では件数がさばけません。 1通ずつ貼るので月360件には使えず、読めるかを確かめる段階です。 半自動化にすると、人の作業は要確認の行の確認と、店長の電話だけになります。
05工数削減シミュレーション
導入後 360件 × 2分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 居酒屋・ダイニング・レストランを複数店舗運営し、宴会・貸切の予約が複数の予約サイト、自社サイトのフォーム、電話受付代行の通知メールとして本部や店舗の予約用アドレスに届く会社。通知の書式が経路ごとに違い、予約台帳への転記と、席数・貸切の重なり・アレルギーの確認を人が1通ずつしている場合。Gmail と Google スプレッドシートで予約台帳を持っている場合。
- 予約がすべて1つの予約管理システムに集まり、台帳への登録と席の割り当てが自動で済んでいる場合。宴会の予約が月に数十件で、店長が通知を読めば足りる場合。予約の内容を客へ自動で返信・確定させたい場合(この構成は台帳の下書きと確認の連絡までで、客への連絡は人が行います)。
07最小構成で試す方法
- 先月の宴会・貸切の通知メールから、経路ごとに10通ずつ、計40通を選ぶ(変更・取消と、アレルギーの書かれたものを必ず混ぜる)
- その40通について、台帳にどう写したか(直したか)を台帳から書き出しておく
- 手元の Claude の画面に、第7章の指示と通知の本文を1通ずつ貼り、JSONで返させる
- 返ってきたJSONを、台帳に写した内容と項目ごとに突き合わせる
- 違っていた項目を、「AIの読み違い」「台帳の側の誤り」「本文に書かれていなかった」に分ける
40通は必ず経路を混ぜてください。 予約サイトの定型の通知はほぼ読めるはずで、差が出るのは電話受付代行の文章です。 そこで項目が拾えるかが、この構成の成否を決めます。
| 出てきた内容 | 判断 |
|---|---|
| 項目がほぼ台帳と一致した | n8n でのワークフローに進む |
| 人数の幅を丸めた、アレルギーを言い換えた | 指示の書き方で直る。構成は有効 |
| 規定の文につられて取消と判定した | 前処理で外す範囲を経路ごとに決める |
| 台帳の側の転記の誤りが見つかった | 現在の作業の見落としが分かったということ。 台帳の整備から始める |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| キャンセル規定の文で新規が取消になる | 経路ごとに定型の文を前処理で外し、指示にも明記する |
| 引用された前回の人数を抜き出す | 引用の行と「以下、前回の…」以降を外す |
| 「30名前後」が30名になる | 下限・上限・原文の3つに分けて受ける |
| アレルギーが「甲殻類」に言い換えられる | 原文のまま写させ、言い換えを禁じる |
| JSONの例から作ったスキーマで全項目が必須になる | JSONスキーマで定義し、必須を絞る |
| 変更の通知が新規として足される | 予約番号で元の行を探し、見つからなければ保留 |
| 同じ予約番号が経路をまたいで重なる | 照合の鍵を「経路+外部の予約番号」にする |
| 店名・コース名の揺れで照合できない | マスタに予約サイト上の名前の列を持たせる |
| 本文が Simplify で取れない | Gmail ノードの Get を Simplify オフで呼ぶ |
| 失敗した通知が既読になり拾い直されない | 既読とラベルは書き込みの成功後だけにする |
| 店長への知らせが多すぎて読まれない | 店に関わる印だけを送り、台帳の整備の話は本部に止める |
上の4行が、抜き出しの失敗のほとんどです。 どれも「読みやすくする」「余計なものも読む」という方向の誤りで、原文のまま写させ、渡す前に余計なものを外すことで防ぎます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 幹事の名前と電話番号、会社名、宴会の日時と人数、そしてアレルギーや食事の制限です。食事の制限には、宗教上の理由や健康状態が推し量れる記載が含まれることがあります。
- AIに渡すのは通知の本文だけにする … 店舗マスタや過去の台帳はAIに渡さず、照合はワークフローの側で行います。顧客の一覧をAIに渡す理由はありません
- 客への連絡を自動で送らない … 出すのは台帳の行と店への知らせまでです。予約の確定や取消の連絡は、人が予約サイトの管理画面か電話で行います
- アレルギーの判断をAIの出力に任せない … AIが返すのは「書かれていた語句」だけです。どの料理を外すか、対応できるかは店が決め、必要なら幹事に確かめます
- 処理ログの保存期間を決める … AIに渡した本文と返ってきたJSONには連絡先が含まれます。宴会が終わってから何か月で消すかを決めます
- API の契約条件を確かめる … Claude の API に渡したデータの扱い(学習に使うか、保存期間)は、契約する時点の Anthropic の規約で確かめ、社内の個人情報の取り扱いの決まりと照らします
誤りが起きた場合のリスクは、アレルギーが店に伝わらないことと、宴会の席が二重に押さえられることの2つです。 前者はアレルギーの言い換え・落としで、後者は変更を新規として足すことで起きます。どちらも、原文のまま写すことと、予約番号で行を決めることで設計の側から防ぎます。
10まず何から始めるか
1週目:マスタに2つの列を足す
店舗マスタに「予約サイト上の店名」と「店長のアドレス」、コースマスタに「予約サイト上の掲載名(経路ごと)」の列を足します。掲載名は、予約サイトの管理画面のコース一覧から写すのが早いです。
2週目:40通で試す
先月の通知を経路ごとに10通ずつ選び、手元の Claude の画面で抜き出させて、台帳と突き合わせます。人数の幅、アレルギー、取消の判定の3つを最優先で見ます。
3週目:台帳に列を足し、予約番号を埋める
台帳に「経路」「外部の予約番号」「状態」「変更の履歴」「確認者」「確認日時」の列を足します。これから先の宴会の行だけでも、予約番号を埋めておきます。 埋めた行の分だけ、変更・取消の自動の反映が効きます。
4週目:n8n で受け取りから台帳までをつなぐ
Gmail Trigger から Information Extractor、Google Sheets への書き込みまでを作ります。最初の2週間は、台帳の本番のシートではなく、写しのシートに書かせます。 人がこれまでどおり転記した本番の台帳と見比べ、違いを数えます。
2か月目: 本番の台帳に書かせ、店長への知らせを始めます。要確認の印ごとの件数を毎週数えます。3か月目以降: 人が直した記録を見て、前処理とマスタを直し、1件6分が何分になったかを実測します。電話受付代行の通知の要確認の割合が下がり、店長が台帳を見て当日の準備を決められるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Gmail Trigger が選んだ確認の間隔で新しいメッセージを拾うこと。Simplify が既定でオンで、メッセージID・ラベル・ヘッダーを返すこと。Max Emails per Poll が既定10・上限50で、超えた未読は次の確認に回ること。ラベル・検索の書き方(from: など)・既読未読・送信者で絞れること。迷惑メールとごみ箱を含めるかを選べること | n8n Docs: Gmail Trigger node | 2026-10-13 |
| Gmail ノードのメッセージの操作に、ラベルの追加・削除、取得(Simplify の切り替え)、既読にする、返信、送信、承認を待つ送信があること | n8n Docs: Gmail node message operations | 2026-10-13 |
| Information Extractor が入力の文章から構造化した情報を取り出すこと。Schema Type に属性の説明・JSONの例・JSONスキーマの3つがあり、JSONの例から作ると全項目が必須になること。System Prompt Template を変えられ、出力の形の指示は自動で付け足されること | n8n Docs: Information Extractor node | 2026-10-13 |
| Anthropic Chat Model ノードで Claude を使えること。サンプリングの温度などを設定できること | n8n Docs: Anthropic Chat Model node | 2026-10-13 |
| Google Sheets ノードに Append Row・Update Row・Append or Update Row・Get Row(s) などの操作があること。Get Row(s) が既定で最初の一致だけを返し、「When Filter Has Multiple Matches」で全件を返せること | n8n Docs: Google Sheets sheet operations | 2026-10-13 |
予約サイトとの連携(席の在庫や受け付けの停止)の可否と方法は、予約サイトごとに異なります。この部分は利用環境に応じた個別確認が必要です。 アレルギーへの対応の可否は、各店舗の調理の体制に沿って店が判断してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1394)についてのご相談はこちらから。
