中級向け
LINE対応自動化ワークフロー
LINE公式アカウントに届いた問い合わせに受付の返事だけ即答し、AIが在庫や来店枠を調べた返信案をスタッフにメールで送って、「送る」を押したものだけをLINEで返すワークフローです。署名の確認と再送の排除つき。JSONを配布し、取り込み直して動くことを確かめました。
公開 最終更新
動作確認: — n8n 2.36.8 / Claude Haiku 4.5 / LINE Messaging API
LINE公式アカウントに届いた問い合わせに、AIが在庫や来店枠を調べて返信案を作り、スタッフが承認したものだけをLINEで返すワークフローです。 お客様にはすぐに受付の返事だけを送り、本文はスタッフがメールの「送る」を押すまで届きません。
line-claude-approval-reply.json をダウンロード
見本データ(架空の家具店。メール版と共通): shop_products.csv(在庫12商品)/ shop_visit_slots.csv(来店枠18枠)


概要
メール版のテンプレートと同じ仕事を、LINEで受けて、LINEで返す形にしたものです。 メール版は Gmail に下書きを作るところで止めていましたが、LINEには下書きがありません。 そこで、返信案をスタッフにメールで送り、「送る」を押したものだけをお客様に送る形にしました。
お客様から見ると、こう進みます。
- 問い合わせを送ると、すぐに「お問い合わせありがとうございます。担当者が内容を確認して、このトークで改めてご返信いたします。」が届く
- スタッフが返信案を読んで「送る」を押すと、同じトークに返信が届く
動かした結果
この配布ファイルを作る前の版で、次のメッセージを順に送りました。最後のソファの質問は、配布ファイルを取り込み直した版でも試しています。
| 送ったもの | 結果 |
|---|---|
| グレーのソファありますか? | 「在庫切れ・11月中旬入荷予定」の返信案。「送る」を押すとLINEに届いた |
| 今週土曜の午後にお店に行きたいです | 今日(10月3日・土曜)を正しく取り、空いている16時を案内する返信案。「送る」でLINEに届いた |
| 本の写真 | AIの判定は「家具は写っていません」。返信案は「商品名を教えてください」。「送らない」を押し、何も届かないことを確かめた |
| スタンプ | 何も起きない(受付の返事も送らない) |
| 先週買ったチェアの脚がぐらつきます | 返信案は作らず、スタッフに「要対応のお問い合わせ」のメールが届いた |
| 一度受け取ったものを、本文も署名もそのまま送り直す | 署名の確認は通ったが、「同じイベントを捨てる」で止まった。返信案もメールも作られない |
| 署名を付けずに送る | 「署名が合わないので捨てる」で止まった |
| 承認メールのボタンを押さずに2分待つ(期限を2分にして試した) | スタッフに「承認されないまま期限が切れました」のメールが届いた |

仕組み
- LINE から Webhook で問い合わせを受け取る(受け取った時点で LINE には 200 を返す)
- 署名を確かめる。LINE は本文をチャネルシークレットで署名して
x-line-signatureヘッダーに入れてくるので、受け取った本文から同じ計算をして一致するか比べる。一致しないものは捨てる - 1回の送信に複数のイベントが入ることがあるので、1件ずつに分け、
webhookEventIdで一度処理したイベントを捨てる - テキストと画像だけを残し、受付の返事を送る(reply API)
- 画像なら LINE から画像を取り出し、AIに「何の家具が写っているか」を書かせて、テキストの問い合わせと同じ形にそろえる
- ここからはメール版と同じ。AIで「在庫の問い合わせ」「来店予約」「どちらでもない」に仕分け、Data Table を調べて返信案を作る。どちらでもないものはスタッフにメールで知らせる
- 返信案をスタッフに Gmail の Send and Wait で送り、「送る」「送らない」のボタンが押されるのを待つ
- 押された結果で3つに分ける。送るならお客様に送る(push API)、送らないなら何もしない、24時間押されなければスタッフに期限切れを知らせる
AIは Claude Haiku 4.5 で、テキストなら3回、写真なら4回呼びます。
設定
取り込んでから動くまでの手順です。キャンバス左の付箋にも同じことを書いてあります。
LINE 公式アカウントと Messaging API のチャネルは、先に作ってある前提です。
1. 取り込む
n8n で新しいワークフローを開き、右上の ... から Import from File… で JSON を選びます。
2. 認証情報を4種類選ぶ
| ノード | 認証情報 | 入れるもの |
|---|---|---|
| 受付の返事をする、画像を取得、お客様に送る | Header Auth | Name に Authorization、Value に Bearer + チャネルアクセストークン |
| 署名を計算 | Crypto | Hmac Secret にチャネルシークレット |
| Claude Haiku 4.5 | Anthropic | APIキー |
| スタッフに知らせる、スタッフに承認を頼む、期限切れを知らせる | Gmail | スタッフのGmail |
チャネルアクセストークンとチャネルシークレットは、どちらも LINE Developers のチャネルの画面にあります。
| 何に使うか | 置き場所 | |
|---|---|---|
| チャネルシークレット | LINE から届いたものが本物かを確かめる | 「チャネル基本設定」タブ |
| チャネルアクセストークン | n8n から LINE に送る・画像を取り出す | 「Messaging API設定」タブの一番下(長期のトークン) |
3. Data Table を2つ作る
メール版の記事と同じテーブルです。見本の CSV から作り、「在庫を検索」で shop_products、「空き枠を検索」で shop_visit_slots を選びます。
メール版をすでに使っているなら、同じテーブルを選べば済みます。
4. Gmail の宛先を3つ書き換える
「スタッフに知らせる」「スタッフに承認を頼む」「期限切れを知らせる」の宛先は、staff@example.com にしてあります。スタッフのアドレスに書き換えてください。
5. 公開して、LINE に Webhook URL を入れる
- n8n で Publish する
- 「LINEから受信」を開き、Production URL(
/webhook/line-shopで終わるもの)をコピーする - LINE Developers の「Messaging API設定」タブで、Webhook URL に貼って「更新」し、「検証」を押す。「成功」と出れば届いている
- 同じタブで Webhookの利用 をオンにする
LINE から n8n に届くには、n8n が外から https で開ける必要があります。 localhost のままでは届きません。
検証では Cloudflare の一時的なトンネル(cloudflared tunnel --url http://localhost:5678)を使いました。
このトンネルは起動し直すたびに URL が変わるので、そのたびに LINE の Webhook URL も入れ直す必要があります。続けて使うなら、固定の URL で n8n を公開してください。
6. LINE の応答設定を変える
LINE Official Account Manager の 設定 → 応答設定 で、次のようにします。
| 項目 | 設定 | 理由 |
|---|---|---|
| Webhook | オン | オフだと n8n に届かない |
| 応答メッセージ | オフ | オンのままだと、LINE の自動応答(「メッセージありがとうございます!」など)も届く |
| チャット | オン | 在庫・来店以外の問い合わせと、期限切れのものは、スタッフがチャットから返す |
応答メッセージは、Webhook の受信だけを試していた段階ではオンのままで、送るたびに LINE の自動応答が返ってきていました。 オフにしてから試したので、受付の返事と自動応答が両方届くところは確かめていません。
承認ボタンについて分かったこと
返信案の承認には、Gmail ノードの Send and Wait(メールを送って返事を待つ)を使っています。 スタッフにはこう届きます。

このボタン(Gmail ノードの Send and Wait for Response)について、動かして分かったことを短くまとめます。 細かい挙動と実測は Send and Wait の使い方 に書きました。
- ボタンは localhost を向いている。 n8n を動かしているパソコンからしか押せない。スマホから押すには
WEBHOOK_URLの設定が要る(試していない) - 期限を付けないと、西暦3000年まで待つ。 誰も押さなければ、お客様は受付の返事だけで放置される。配布版は24時間で切れるようにした
- 期限切れは「送る」でも「送らない」でもない形で出てくる。 配布版は Switch で「送る/送らない/どちらでもない」に分け、3つ目を期限切れとしてスタッフに知らせる
- 2回押しても二重には送られない。 押し終えたボタンは「何もする必要はありません」と出るだけ
- 承認メールのコピーを持っている人は誰でも押せる。 宛先を書き換え忘れた承認メールでも、送信済みに残ったコピーから承認できた
費用
AIの呼び出しを実行記録から数えました(Claude Haiku 4.5、1ドル150円で計算)。
| 問い合わせ | AIの呼び出し | 入力/出力トークン | 1件あたり |
|---|---|---|---|
| ソファの在庫(テキスト) | 3回 | 1,806 / 146 | 約0.4円 |
| 土曜の来店(テキスト) | 3回 | 1,718 / 175 | 約0.4円 |
| 本の写真 | 4回 | 3,176 / 170 | 約0.6円 |
| チェアの不具合(どちらでもない) | 1回 | 599 / 34 | 約0.1円 |
写真は、画像を読ませる1回だけで入力が1,674トークンありました。
LINE の送信にも費用の考え方があります。受付の返事に使っている reply API は、届いたメッセージに付いてくる返信用のトークンで送るもので、 承認後の返信に使っている push API は、こちらから任意のときに送るものです。 LINE Developers の資料では、push で送ったメッセージは月のメッセージ通数に数えられ、reply は数えられないとされています(Messaging APIの料金)。 このワークフローでは、承認して送った返信1件ごとに1通数えられます。 無料で送れる通数はプランで決まっています。実際のカウントは確かめていません。
承認を待ってから送る形にしている以上、reply API は使えません。返信用のトークンは「Webhookを受信してから1分以内」に使う必要があり(Messaging APIリファレンス)、スタッフが読み終わるころには切れているためです(資料で読んだだけで、切れるところは試していません)。
入っていないもの
- 予約の確定。空き枠を案内するだけで、Data Table の
bookedは増やしません - 会話の続き。お客様が「16時でお願いします」と返しても、新しい問い合わせとして一から処理します。前のやりとりは覚えていません
- テキストと画像以外。スタンプ、位置情報、動画などは無視します。受付の返事も送りません
- 用件が2つある問い合わせ。どちらか1つに仕分けます(メール版と同じ)
- 承認する人の確認。上に書いたとおり、承認メールを持っている人は誰でも送れます
取り込むときに気づいたこと
- ワークフローのタイムゾーン設定は、取り込みで引き継がれませんでした。 メール版と同じです。「今日の日付」は式の中で
$now.setZone('Asia/Tokyo')として日本時間に固定してあるので、動作には影響しません - 取り込んだワークフローは、既定で MCP から見えません。 Claude Code から実行記録を読むときは、ワークフローの設定で MCP からのアクセスを有効にしてください
- 元のワークフローと取り込んだワークフローは、どちらも受け口が
line-shopなので、同時に公開できません。片方を Unpublish してから公開してください
確認していないこと
- n8n 2.36.8 でしか確かめていません
- 送ったメッセージは上の表の数件だけです。実際の問い合わせは書き方がもっとばらつきます
WEBHOOK_URLを設定して、スマホから承認するところは試していません- push で送った通数が、LINE の管理画面でどう数えられるかは見ていません
- LINE が実際に同じイベントを再送してきたところは見ていません。再送の排除は、受け取ったものを自分で送り直して確かめました
- 一時的なトンネルで動かしただけで、固定の URL で長時間動かしたときの挙動は見ていません
次に読む
承認をメールではなく Slack のスレッドで行い、答えが決まるものは AI が即答する形は LINE×Slack 問い合わせ対応 で配布しています。
同じ仕事をメールで受けるテンプレートは メール対応自動化ワークフロー で配布しています。
この仕事を AI Agent 1つに任せたらどうなるかは AI Agentに任せるか、手順を組むか で比べました。
ほかの実例や、止まった場所のまとめは n8n 業務自動化の実例 にあります。
再送されたイベントを捨てる仕組みは Remove Duplicatesノードの使い方 で、実行をまたぐ記憶の持ち方まで確かめています。