中級向け

メール対応自動化ワークフロー

届いたメールをAIで仕分け、在庫の問い合わせには在庫を、来店の相談には空き枠を調べて、Gmailに返信の下書きを作るワークフローです。送信はしません。インポートできるJSONと見本データを配布し、取り込みから実行まで手順どおりに確かめました。

動作確認: — n8n 2.36.8 / Claude Haiku 4.5

届いた問い合わせメールに、AIが在庫や空き枠を調べて返信の下書きを作るワークフローです。 送信はしません。下書きを人が読んで、直してから送る前提です。

gmail-claude-stock-visit-drafts.json をダウンロード

見本データ(架空の家具店): shop_products.csv(在庫12商品)/ shop_visit_slots.csv(来店枠18枠)

設定を終えたn8nのワークフロー全体。左に設定手順の付箋。5分ごとに実行、未処理のメールを取得、1通ずつ処理、用件を分類と続き、上段が在庫の流れ(商品の種類を抽出、在庫を検索、検索結果をまとめる、在庫の返信文を作る、在庫の下書きを作る)、中段が来店予約の流れ(来店希望を抽出、空き枠を検索、枠をまとめる、予約の返信文を作る、予約の下書きを作る)で、両方がai-draftedラベルを付けるに合流する。下段はneeds-humanラベルを付ける。Claude Haiku 4.5のモデルノードが5つのAIノードに点線でつながっている
設定を終えた状態。上段が在庫、中段が来店予約、下段が人に回すメール

概要

店に届くメールを5分ごとに読み、AIで用件を仕分けます。 在庫の問い合わせには在庫を、来店の相談にはその日の空き枠を n8n の Data Table から調べ、 データに書かれていることだけを根拠に返信の下書きを Gmail に作ります。 どちらにも当てはまらないメールは、人が対応するようにラベルを付けて残します。

動かした結果

架空の客から届いた7通を流した結果です(この配布ファイルを取り込み直して実行しました)。

客のメール 下書き
グレーのリネン2人掛けソファの在庫は?今月中に届けてほしい 在庫切れ・11月中旬入荷予定。今月中は難しい
幅150cmくらいのダイニングテーブルを探している ウォールナットは在庫2、オークは在庫切れ・入荷未定
シングルベッドは置いているか 取り扱いがない
今週土曜の午後に見に行きたい 14時は満席、16時なら空きがあると案内
10月7日(水)11時に伺えるか その日は来店枠がない
先月買ったチェアの脚がぐらつく 下書きは作らず、needs-human ラベル
3人掛けソファを見に、日曜に行きたい その日は全枠満席

同じ条件でもう一度実行すると、取得は0件で何も起きません。 処理したメールにラベルを付けて、次から読まないようにしているためです。

仕組み

  1. 5分ごとに起動し、Gmail からまだ処理していないメールを最大10通取得する
  2. 1通ずつ、Text Classifier で「在庫の問い合わせ」「来店予約」「どちらでもない」に仕分ける
  3. 在庫の問い合わせ:AIで商品の種類(ソファ、テーブルなど)を取り出し、Data Table の在庫表から同じ種類の行を取得する
  4. 来店予約:AIで希望の日付と時間帯を取り出し、Data Table の来店枠表からその日の枠を取得する。取り出すときに今日の日付と曜日を一緒に渡すので、「今週の土曜」のような書き方でも日付になる
  5. 取得したデータだけを根拠に、AIが返信の本文を書き、元のメールへの返信として Gmail に下書きを作る
  6. 下書きを作ったメールには ai-drafted、どちらでもないメールには needs-human のラベルを付ける。次の実行では、どちらかのラベルが付いたメールを読まない

AIは Anthropic の Claude Haiku 4.5 で、1通につき3回呼びます(仕分け・取り出し・返信)。

設定

取り込んでから実行できるまでの手順です。キャンバス左上の付箋にも同じことを書いてあります。

1. 取り込む

n8n で新しいワークフローを開き、右上の ... から Import from File… で JSON を選びます。

JSONを取り込んだ直後のn8nキャンバス。左に設定手順の付箋、その右に5分ごとに実行、未処理のメールを取得、1通ずつ処理、用件を分類と続き、在庫と来店予約の2本の流れと、needs-humanラベルを付けるノードがある。Gmailのノードと2つの検索ノードに赤い警告マークが付いている
取り込んだ直後。赤い警告は、認証情報とテーブル・ラベルが未選択なことを示している

2. 認証情報を選ぶ

ノード 認証情報
Claude Haiku 4.5 Anthropic
未処理のメールを取得、在庫の下書きを作る、予約の下書きを作る、ai-draftedラベルを付ける、needs-humanラベルを付ける Gmail

Anthropic のAPIキーの取り方と注意点は n8n で Claude を使う にまとめています。

3. Data Table を2つ作る

見本データの CSV から、そのままテーブルを作れます。検索の条件の書き方や落とし穴は Data Tableの使い方 にまとめています。

  1. n8n の Data tables の一覧で、新しいテーブルを作る
  2. Data table name に shop_products と入れ、Import CSV を選んで shop_products.csv を指定する
  3. My CSV file contains a header row にチェックが入っていることを確かめて、Create
  4. 次の画面で列名と型が表示されるので、そのまま Create
  5. shop_visit_slots も同じように作る
n8nのCreate new data tableダイアログ。Data table nameにテーブル名が入り、From scratchとImport CSVのうちImport CSVが選ばれ、shop_products.csvが指定されている。下にMy CSV file contains a header rowのチェックボックスがオン。右下にCancelとCreateのボタン
Import CSV を選ぶと、列を手で作らずにテーブルができる

shop_products.csv を取り込んでみたところ、列の型は自動で判定されました。width_cm・price・stock は Number、ほかは String です。 日本語もそのまま入り、空のセルは null になりました。(shop_visit_slots.csv の取り込みは試していません。capacity と booked が Number になっているか、作成時の画面で確かめてください)

自分の店のデータに置き換えるときは、列名を変えないでください(ワークフローがこの名前で検索します)。

shop_products(在庫)

列名 型 例
sku string SF-201
name string ソファ リネン 2人掛け
category string ソファ
color string ベージュ
width_cm number 160
price number 89000
stock number 3
note string 次回入荷 11月中旬予定

category は、AIが取り出す商品の種類(ソファ、テーブル、チェア、照明、ラグ、収納)と同じ言葉にします。 自分の店の分類に変えるときは、「商品の種類を抽出」の説明文も同じ言葉に書き換えてください。

shop_visit_slots(来店枠)

列名 型 例
slot_date string 2026-10-03
slot_time string 16:00
capacity number 2
booked number 1

booked が capacity より少ない枠だけが「空き」として案内されます。 枠の行が無い日は「来店を受け付けていない日」として扱われるので、定休日は行を作らないでおけば済みます。

作ったら、「在庫を検索」で shop_products、「空き枠を検索」で shop_visit_slots を選びます。 条件(category と slot_date が Equals)は最初から入っているので、触らなくて構いません。

4. Gmail にラベルを2つ作る

Gmail の左メニュー「ラベル」の + から、ai-drafted と needs-human を作ります。 作ったら、「ai-draftedラベルを付ける」「needs-humanラベルを付ける」でそれぞれ選びます。

ラベル名は英数字にしてあります。日本語のラベル名が検索条件で確実に効くかは確かめていません。

5. 検索条件を書き換える

「未処理のメールを取得」の検索条件は、こうなっています。

in:inbox -in:drafts -label:ai-drafted -label:needs-human newer_than:1d to:support@example.com

最後の to:support@example.com を、問い合わせを受けるアドレスに書き換えてください。 書き換えるまでは1通も一致しないようにしてあります。書き換え忘れたまま実行しても、何も処理されません(実際に0件になることを確かめました)。

条件 意味
in:inbox -in:drafts 受信箱だけを読む。自分が作った下書きを客のメールとして読まないため
-label:ai-drafted -label:needs-human 処理済みのメールを読まない
newer_than:1d 初回に、受信箱の過去のメールを全部処理しないため

6. 手動で1回実行してから公開する

Execute workflow で1回実行し、Gmail の下書きを読んでください。問題なければ Publish で5分ごとに動き始めます。

費用

1通につきAIを3回呼んで、入力は合計1,500〜2,000、出力は200〜400トークンほどでした。 Claude Haiku 4.5 で 1通あたり約0.4〜0.6円です(1ドル150円で計算)。 どちらでもないメールは仕分けの1回だけです。

入っていないもの

このワークフローは下書きを作るところまでです。次のものは入っていません。

  • 送信。下書きを人が読んで送る前提です。AIの返信には誤字や、データに無いことの言い換えが残ります(検証の記録)
  • 予約の確定。空き枠を案内するだけで、Data Table の booked は増やしません。下書きを送らなかったときに枠が埋まったままになるのを避けるためです
  • needs-human の通知。ラベルを付けるだけです。Slack などへの通知は足していません
  • 用件が2つあるメール。「ソファを見に、日曜に行きたい」は来店予約として扱われ、ソファの在庫には触れません

取り込むときに気づいたこと

  • ワークフローのタイムゾーン設定は、取り込みで引き継がれませんでした。 配布 JSON には Asia/Tokyo を入れていましたが、取り込んだワークフローの設定には残っていません。そのため「今日の日付」の式を $now.setZone('Asia/Tokyo') で日本時間に固定しています
  • 取り込んだワークフローは、既定で MCP から見えません。 Claude Code から操作するときは、ワークフローの設定で MCP からのアクセスを有効にしてください

確認していないこと

  • n8n 2.36.8 でしか確かめていません
  • Gmail Trigger は使っていません。 5分ごとに取得する形にしたのは、手動で何度でも検証できるためです
  • 検証したメールは架空の7通です。実際の問い合わせは書き方がもっとばらつきます
  • 公開(Publish)して5分ごとに動かし続けたときの挙動は、まだ長時間見ていません

次に読む

このワークフローを作る途中で踏んだ落とし穴(1通で後ろが全部止まる、自分の下書きに返信する、空き枠がある客を断る)は n8nで客のメール対応を自動化したら、1通の問い合わせで残りが全部止まった に書きました。

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

次に読む