中級向け

メール対応自動化で詰まったこと

在庫の問い合わせと来店予約にAIで返信の下書きを作るワークフローを組み、架空の客のメール7通で検証しました。エラーが1つも出ないまま、後ろのメールが処理されない、自分の下書きに返信する、空き枠がある客を断る、が起きました。

動作確認: — n8n 2.36.8 / Text Classifier v1.1 / Information Extractor v1.2 / Basic LLM Chain v1.9 / Gmail v2.2 / Claude Haiku 4.5

店に届く客のメールを、AIで仕分けて返信の下書きまで作るワークフローを組みました。 在庫の問い合わせには在庫を調べて答え、来店の相談には空いている枠を案内します。

架空の店と架空の客のメール7通で検証したところ、エラーは最後まで1つも出ませんでした。 それでも、次のことが起きています。

  • 分類できないメールが1通混ざっただけで、後ろに並んだ5通が処理されないまま終わった
  • 自分が書いた下書きを、客のメールとして読んで返信を書いた
  • 「今週の土曜」を正しく読めず、空き枠がある客を断る下書きを作った
  • AIが、データのどこにも無い「今月中にお届けできます」を書いた

前半の3つはn8nの組み方の問題で、実行はすべて「成功」と表示されました。 最後の1つはAIの問題で、下書きを人が読む以外に止める方法がありませんでした。

作ったもの

n8nのワークフロー全体。左からStart、テストメールを取得(Gmail)、1通ずつ処理(Loop Over Items)、用件を分類(Text Classifier)と続き、在庫の問い合わせ・来店予約・Otherの3つに分岐する。在庫側は商品の種類を抽出、在庫を検索、検索結果をまとめる、返信文を作る、返信の下書きを作る。予約側は来店希望を抽出、空き枠を検索、枠をまとめる、予約の返信文を作る、予約の下書きを作る。Otherは人に回すにつながる。下にClaude Haiku 4.5のモデルノードが1つあり、各AIノードに点線でつながっている
分類してから、用件ごとに決まった処理へ流す。各ルートの最後は「1通ずつ処理」に戻る
部品 使ったもの
受信 Gmail(件名に [n8n-test] が付いたメールだけ取得)
1通ずつ回す Loop Over Items
用件の分類 Text Classifier(在庫の問い合わせ/来店予約)
在庫と来店枠 n8n の Data Table(架空の家具店の12商品と、1週間分の来店枠)
文章 Basic LLM Chain。モデルはすべて Claude Haiku 4.5
出力 Gmail の下書き。送信はしない

決めたことが2つあります。

送信せず、下書きで止める。 客に送る前に必ず人が読みます。 この判断が最後まで効いてくるので、覚えておいてください。

下書きの時点では予約を確定させない。 空き枠を案内するだけにしました。 メールを読んだ時点で枠を押さえると、店側が下書きを送らなかったとき(修正待ち、送り忘れ)に、 誰も来ない予約で枠が埋まったままになります。

検証に使った7通

# 客のメール 正しい返事
1 グレーのリネン2人掛けソファの在庫は?今月中に届けてほしい 在庫切れ、11月中旬入荷予定(ベージュは在庫3)
2 幅150cmくらいのダイニングテーブルを探している ウォールナットは在庫2、オークは在庫切れ
3 シングルベッドは置いているか 扱っていない
4 今週土曜の午後に見に行きたい 14時は満席、16時なら空き
5 10月7日(水)11時に伺えるか 定休日(枠なし)
6 先月買ったチェアの脚がぐらつく 人が対応する
7 3人掛けソファを見に、日曜に行きたい 在庫あり、ただし日曜は満席

客の名前も商品も、すべて架空です。

分類できないメールが1通あると、後ろが全部止まる

最初の実行は6秒で「成功」と表示されました。7通分のAI処理にしては短すぎます。 中を見ると、こうなっていました。

処理した順 メール 結果
1通目 #7 ソファ+日曜来店 来店予約に分類
2通目 #6 チェアの不具合 どの分類にも入らず、捨てられた
3通目以降 #5〜#1 の5通 一度も処理されていない

Text Classifier には When No Clear Match(どの分類にも当てはまらないとき)という設定があり、 既定値は discard(捨てる)です。#6 はここで捨てられました。 この設定は Options に追加しないと画面に出てこないので、置いたままでは捨てる設定になっていることが見えません。

捨てられると、そのメールの処理はそこで終わります。 ループの「次の1通へ」に戻る線を通らないので、Loop Over Items は残りの5通を持ったまま止まりました。 在庫の問い合わせ(#1〜#3)は1通も処理されず、下書きは0件です。

When No Clear Match を Output on Extra, ‘Other’ Branch にすると、 当てはまらないメールが3つ目の出口から出てきます。そこを「人に回す」処理につないで、 ループに戻しました。

なお、ループの外で Text Classifier を使った場合は、捨てられるのは当てはまらない1件だけで、残りは止まりませんでした。止まったのは Loop Over Items で1件ずつ回していたためです(Text Classifierの使い方)。

n8nのText Classifierノードの設定画面。Text to Classifyに件名と本文の式、CategoriesにCategories 1とCategories 2、OptionsにWhen No Clear Matchが追加され、値はOutput on Extra, 'Other' Branchになっている
When No Clear Match は Add Option から追加して初めて表示される

在庫が0件でも、後ろが止まる

other に直して流すと、今度は #3(ベッド)で止まりました。

#3 → 在庫の問い合わせ → 種類は「その他」(正しい)
   → 在庫を検索:0件
   → 0件なので後ろのノードが動かない → ループに戻れない → 終了

扱っていない商品を聞かれただけで、後ろの #2・#1 が未処理になりました。 これも「成功」です。

n8n のノードは、受け取ったアイテムが0件だと何もしません。 在庫検索のノードの Settings で Always Output Data をオンにすると、0件でも空のアイテムを1件出すので、 後ろが動いてループに戻ります。オンにすると、出力欄に 「This node will output an empty item if nothing would normally be returned」と表示されます。

このとき、返信文を作るAIには空の在庫データが渡ります。#3 の下書きは 「シングルベッドの取り扱いはございません」で、存在しない商品をでっち上げることはありませんでした。

自分の下書きに、自分で返信を書いた

ある実行で、ループが10回回りました。メールは7通です。

増えた3回は、1つ前の実行で作った下書きでした。下書きの件名は Re: [n8n-test] … なので、 取得条件の subject:"[n8n-test]" に一致します。ワークフローは自分の下書きを客のメールとして読み、 その下書きへの返信を書いていました。

そのうちの1通にはこう書かれていました。

ご希望の来店日時が抽出されていないようです。

客に向けた文に、社内の処理の言葉が出ています。

取得条件に in:inbox -in:drafts を足して、受信箱だけを読むようにしました。

AIは今日の日付を知らない

来店の相談から日付を取り出すとき、今日の日付を渡さずに実行した結果です。

# メールの表現 取り出された日付 正しい日付
#7 今度の日曜日 2025-01-12 2026-10-04
#5 10月7日の水曜日 2024-10-07 2026-10-07
#4 今週の土曜日 土曜日(日付ですらない) 2026-10-03

形式は YYYY-MM-DD と指定していましたが、土曜日 がそのまま返ってきました。 Information Extractor は形式を強制しません。

どの日付も来店枠の検索に引っかからず、下書きはこうなりました。

  • #4:「今週の土曜日につきましては、現在来店枠の情報がございません」── 土曜16時は空いているのに断っている
  • #7:「ご希望いただいた2025年1月12日(日)につきましては…」── 客が書いていない日付を客に向けて書いている
  • #5:「その日のご来店枠に余裕がございません」── 来られないのは合っているが、理由は満席ではなく定休日

抽出に渡す文の先頭に、今日の日付と曜日を付けました。

今日は {{ $now.toFormat('yyyy-MM-dd') }}({{ $now.setLocale('ja').toFormat('cccc') }})です。

これで3通とも正しい日付になり、#4 には16時の空きが案内されました。

Gmailの返信下書きの本文。お問い合わせありがとうございます。2026年10月3日(土)の午後のご来店をご希望とのことですね。この日の午後の来店枠をご確認したところ、以下の時間に空きがございます。16:00(午後4時)。ご希望の時間をお知らせいただければ、予約を確定させていただきます。と書かれている
日付を渡したあとの下書き。満席の14時は出さず、16時だけを案内している

0件でも、何も起きずに「成功」になる

Gmail の取得が0件だった実行は、何もせずに「成功」で終わりました。 取得条件を書き間違えると、何も処理しない実行が毎回「成功」として並びます。 メールが来ていないのか、条件が間違っているのかは、実行一覧からは区別できません。

AIの返信:数字は正しかった

在庫の問い合わせへの下書きです。

# 下書きの内容 判定
#1 グレーのソファ 在庫切れ、11月中旬入荷予定。ベージュなら在庫あり 正しい。色の取り違えなし
#2 幅150cmのテーブル ウォールナットは在庫2、オークは在庫切れ・入荷未定 正しい
#3 シングルベッド 取り扱いがない 正しい。でっち上げなし

在庫・価格・入荷予定について、データに無いことは書いていません。 ただ、そのまま客に送れる文ではありませんでした。

Gmailの返信下書きの本文。高橋様、いつもご利用いただきありがとうございます、と始まり、商品名が**ダイニングテーブル ウォールナット**と星印で囲まれたまま表示され、その下に- SKU: DT-151 と社内の商品コードが箇条書きで書かれている
プレーンテキストのメールに ** がそのまま出ている。SKU(商品コード)も客向けの文に入っている
  • 商品名を ** で囲んでいる。プレーンテキストのメールなので、記号のまま客に届く
  • 社内の商品コード(SKU)や「在庫データを確認いたしましたところ」と、社内の言葉が出ている
  • 初めての客に「いつもご利用いただき」「お疲れさまです」と書いている

そしてもう1つ。#1 の下書きにこう書かれていました。

同シリーズのベージュ色でしたら現在3点在庫がございますので、今月中のお届けが可能です。

配送の情報は、在庫データのどこにもありません。 客が「今月中に届けてほしい」と書いていたのに引っ張られて、 根拠のない約束をしています。指示では「在庫・価格・入荷予定はデータだけを根拠に」と書いていて、 配送は挙げていなかったので、そこをすり抜けました。

同じ条件で3回流して、この約束が出たのは1回でした。 1回試して出なかったからといって、出ないとは言えません。

指示を足して、直ったもの・直らなかったもの

返信を書くAIへの指示に、見つかった問題への対策を足しました。

  • データに無いこと(配送・納期・割引・取り置き)は約束しない。分からなければ「担当者から改めてご連絡します」
  • ** や # を使わない
  • 社内の言葉と商品コードを書かない
  • 「お問い合わせありがとうございます」で始め、「いつも」「お疲れさま」は使わない

同じ条件で3回流した結果です。

問題 指示を足す前 足した後(3回)
** などの記号 出た 出なかった
商品コード・社内の言葉 出た 出なかった
不適切な挨拶 出た 出なかった
根拠のない配送の約束 3回中1回 はっきりした約束は出なかった。ただし「お待たせせずにご用意可能」という言い回しが1回
誤字 ── 「お探いのようですね」「お受けしることができない」「来店枠が満いており」、そして「お届けは难しい」── 「難」ではなく中国語の簡体字が混ざっていた
事実の言い換え ── 定休日(枠が無い日)を「満席」と書いたのが1回

名指しで禁じたものは消えました。 一方で、誤字と事実の言い換えは回ごとに形を変えて出てきます。 上の16時の下書きにも「来店枠をご確認したところ」と、敬語の使い方の誤りが残っています。

これは指示を足しても潰しきれない種類の誤りです。下書きを人が読む工程は、外せませんでした。

用件が2つあるメールは、片方が消える

#7 は「3人掛けソファを見たい」と「日曜に行きたい」の2つの用件があります。 分類は毎回「来店予約」で、ソファの在庫には一度も触れませんでした(確認した5回すべて)。

返信を書くAIには「来店枠以外のことを聞かれたら『担当者から改めてご連絡します』と書く」と指示していましたが、 それでも触れていません。Text Classifier には複数の分類を同時に当てる設定 (Allow Multiple Classes To Be True)があります。この記事の時点では試していませんでしたが、あとで試したところ、用件をはっきり2つ書いた文は両方の分類に入り、この #7 の書き方では複数を許しても来店予約だけでした(Text Classifierの使い方)。

1通あたりの費用

在庫か予約の問い合わせ1通で、AIを3回呼んでいます(分類・取り出し・返信作成)。

呼び出し 入力トークン 出力トークン
分類 約620 約30
商品の種類・来店日の取り出し 約500 約40
返信の作成 400〜850 110〜340

合計で入力1,500〜2,000、出力200〜400トークンほど。 Claude Haiku 4.5 で 1通あたり約0.4〜0.6円です(1ドル150円で計算)。

確認していないこと

  • Gmail Trigger は使っていません。 検証は手動で実行し、Gmail ノードでメールを取得しました。定期的に新着を拾うときの挙動は未確認です
  • 「人に回す」は何もしないノードです。 実際にはラベルを付ける、担当者に通知するなどが要りますが、作っていません
  • 送信まで自動にした場合は試していません。 自分の返信を読み続けるループは、下書きで起きたことからの推測です
  • モデルは Claude Haiku 4.5 だけです。 誤字や言い換えの出方は、モデルによって変わるはずです
  • 検証したメールは7通、指示を足した後の実行は3回です。出なかった誤りが、出ないとは言えません

次に読む

ツールを持たせて何度も考えさせる AI Agent ノードの費用と止まり方は n8n AI Agentノードの使い方 にまとめています。

モデルの設定と、設定しても効かない項目は n8n で Claude を使う:Anthropic Chat Model の設定と、効かない項目 に書きました。

ほかの実例や、止まった場所のまとめは n8n 業務自動化の実例 にあります。

次に読む