AI電話エージェントをn8nで構築!Retell×n8nで電話受付を自動化

目次

はじめに

「電話対応に人手を割かれて、本来の業務が進まない」「営業時間外の問い合わせに対応できず、予約の取りこぼしが発生している」——こうした悩みを抱えていませんか?

本記事では、RetellAI(AI音声通話プラットフォーム)とn8n(ワークフロー自動化ツール)を組み合わせて、電話受付を自動化する方法を解説します。着信時に顧客情報を自動取得してパーソナライズされた応対を行い、予約受付からGoogle Sheetsへの登録、Slack通知までを一気通貫で処理するシステムを構築します。

RetellAIが「会話」を担当し、n8nが「業務バックエンド」を担当する——この役割分担により、電話応対のフロントエンドとデータ処理のバックエンドを分離し、柔軟で拡張性の高い電話受付システムを実現できます。

完成イメージ

顧客が電話すると、RetellAIエージェントが発信者の名前を呼んで応答し、要件をヒアリングします。予約情報はGoogle Sheetsに自動登録され、Slackにリアルタイム通知が届きます。人手をかけずに、24時間365日の電話受付が実現できます。

こんなシーンでの活用に適しています

  • 店舗やクリニックの予約受付を自動化し、電話対応の人手を削減したい
  • 着信時に顧客情報を自動で引き当て、パーソナライズされた応対を実現したい
  • 営業時間外や繁忙期でも電話対応を途切れさせたくない

方法: RetellAI + n8n + Google Sheets + Slack

項目内容
メリット24時間対応: 営業時間外でも電話応答・予約受付が可能
人件費削減: 電話対応を自動化し、スタッフの負担を軽減
パーソナライズ応対: 着信時に顧客情報を動的に取得し、名前を呼んで応対
リアルタイム通知: 予約確定時にSlackへ即時通知
デメリット複数サービスのAPI設定が必要: RetellAI、n8n、Google Sheets、Slackの連携設定が必要
英語圏向け電話番号(+1): Twilio経由の番号は米国番号が中心
難易度★★★☆☆(中級)
特徴インバウンド電話受付の自動化
動的変数による個別応対
Google Sheetsへの予約自動登録
Slack通知
価格RetellAI: 初回$10無料クレジット
Twilio電話番号: $10無料クレジット内で利用可能
n8n: セルフホスト版無料 / クラウド版有料プランあり
Google Sheets: 無料
Slack: 無料プランあり

事前準備

以下のアカウント・サービスを用意してください。

  • n8nアカウント(クラウド版 または セルフホスト版)
  • RetellAIアカウント(初回$10無料クレジット付き)
  • Googleアカウント(Google Sheets用 — 顧客情報管理・予約情報保存)
  • Slackワークスペース(予約確定通知の受信用)
  • Twilio電話番号(RetellAI経由で購入 — 月額$2、クレジットカード登録が必要)

設定手順

本記事では、RetellAIエージェントのインポートと、2つのn8nワークフローの構築を行います。

構成要素役割インポート方法
RetellAIエージェント(In bound Agent)AI音声エージェント。会話フロー・動的変数・Custom Functionを含むRetellAIダッシュボードでJSONインポート
n8nフロー1: Retell Inbound Webhook – 顧客情報取得着信時に発信者の顧客情報を検索し、RetellAIに返送n8nでJSONインポート(Webhookパス: /retell-inbound
n8nフロー2: Retell Custom Function – 予約処理会話中に予約リクエストを受け付け、Google Sheetsに保存・Slack通知n8nでJSONインポート(Webhookパス: /retell-booking

Step 1: RetellAIアカウント登録とエージェントのインポート

まず、RetellAIでアカウントを登録し、電話応対を行うAIエージェントをインポートします。

1-1. RetellAI公式サイトでアカウントを作成します。Gmailアカウントがあれば簡単に作成できます。初回$10の無料クレジットが付与されます。

1-2. 以下のコードをコピーし、JSONファイル形式(.json)で保存します。

{
  "agent_id": "",
  "channel": "voice",
  "last_modification_timestamp": 1774348855656,
  "agent_name": "In bound Agent",
  "version_description": "n8n test",
  "response_engine": {
    "type": "conversation-flow",
    "version": 13,
    "conversation_flow_id": "conversation_flow_92bd3e52ce82"
  },
  "language": "ja-JP",
  "data_storage_setting": "everything",
  "opt_in_signed_url": false,
  "version": 13,
  "is_published": false,
  "post_call_analysis_model": "gpt-4.1-mini",
  "pii_config": {
    "mode": "post_call",
    "categories": []
  },
  "voice_id": "retell-Della",
  "voice_temperature": 1,
  "voice_speed": 1.2,
  "volume": 1,
  "max_call_duration_ms": 3600000,
  "interruption_sensitivity": 0.9,
  "normalize_for_speech": false,
  "allow_user_dtmf": true,
  "user_dtmf_options": {},
  "conversationFlow": {
    "conversation_flow_id": "conversation_flow_92bd3e52ce82",
    "version": 13,
    "global_prompt": " 予約が確定したら、お礼を述べて通話を終了してください。\nユーザーが「終わり」「切ります」「ありがとう」と言ったら通話を終了してください。",
    "nodes": [
      {
        "instruction": {
          "type": "prompt",
          "text": "あなたはData-Xの受付アシスタントです。お客様からの着信に対応し、無料面談の予約を受け付けます。\n\n## 動的変数\n- 顧客名: {{customer_name}}\n- 会社名: {{company_name}}\n- 備考: {{notes}}\n\n## 応答ルール\n\n### 1. 挨拶\n-「{{customer_name}}さん、お電話ありがとうございます。Data-Xでございます。」と挨拶してください。\n\n### 2. 用件の確認\n備考に「{{notes}}」と記録がありますので、その内容に触れながら用件を確認してください。\n例: 「{{company_name}}様では生成AIの導入にご関心をお持ちいただいているとうかがっております。無料面談のご予約についてでしょうか?」\n\n### 3. 無料面談の案内\n無料面談の概要を簡潔に説明してください。\n- 所要時間: 30分\n- 形式: オンライン(Zoom)\n- 内容: お客様の課題に合わせたAI導入の方向性をご提案\n\n### 4. ヒアリング\n以下の情報をお客様から聞き取ってください。\n- ご希望の日時\n- ご相談されたい内容(例: 業務の自動化、AI導入の進め方、特定のツールの選定など)\n回答があった場合は必ず復唱してください。\n\n### 5. 予約確認\n日時・相談内容がすべて揃ったら、以下の形式で読み上げて確認してください。\n「それでは、〇月〇日〇時、ご相談内容は〇〇ということで、オンライン無料面談のご予約でよろしいでしょうか?」\n\n### 6. 変更対応\nお客様が内容の変更を希望した場合は、修正内容を確認し直してください。\n\n## 注意事項\n- 丁寧語(です・ます調)で応答してください。\n- 情報が不足する場合はお客様に確認してください。推測で進めないでください。"
        },
        "name": "Welcome Node",
        "edges": [
          {
            "destination_node_id": "node-1774256583866",
            "id": "edge-1774148093768-m5o64l809",
            "transition_condition": {
              "type": "prompt",
              "prompt": "ユーザーが予約内容の復唱に対して了承し、予約が確定した"
            }
          }
        ],
        "start_speaker": "agent",
        "id": "start-node-1774147274581",
        "type": "conversation",
        "display_position": {
          "x": 558,
          "y": 6
        }
      },
      {
        "name": "End Call",
        "id": "end-call-node-1774147274581",
        "type": "end",
        "display_position": {
          "x": 2190,
          "y": 198
        },
        "instruction": {
          "type": "prompt",
          "text": "Politely end the call"
        }
      },
      {
        "instruction": {
          "type": "prompt",
          "text": "「ご予約ありがとうございます。面談のご案内を改めてお送りいたします。お電話ありがとうございました。」と締めてください。"
        },
        "name": "Closing Node",
        "edges": [],
        "id": "node-1774149010830",
        "type": "conversation",
        "display_position": {
          "x": 1662,
          "y": 198
        },
        "skip_response_edge": {
          "destination_node_id": "end-call-node-1774147274581",
          "id": "skip-response-edge-1774149347741-pggkg4kn9",
          "transition_condition": {
            "type": "prompt",
            "prompt": "Skip response"
          }
        }
      },
      {
        "tool_id": "tool-1774256469779",
        "else_edge": {
          "destination_node_id": "node-1774149010830",
          "id": "node-1774256583866-else-edge",
          "transition_condition": {
            "type": "prompt",
            "prompt": "Else"
          }
        },
        "name": "Save-reservation",
        "edges": [],
        "id": "node-1774256583866",
        "type": "function",
        "tool_type": "local",
        "speak_during_execution": false,
        "display_position": {
          "x": 1134,
          "y": 198
        },
        "wait_for_result": true
      }
    ],
    "start_node_id": "start-node-1774147274581",
    "start_speaker": "agent",
    "tools": [
      {
        "headers": {},
        "parameter_type": "json",
        "method": "POST",
        "query_params": {},
        "description": "ユーザーが予約内容(希望日時・相談内容)を確認し了承した後、予約情報をデータベースに保存する。\n",
        "type": "custom",
        "url": "https://n8n-example/webhook/retell-booking",
        "tool_id": "tool-1774256469779",
        "args_at_root": false,
        "timeout_ms": 120000,
        "speak_after_execution": true,
        "name": "Save-Reservation",
        "response_variables": {},
        "speak_during_execution": false,
        "parameters": {
          "type": "object",
          "properties": {
            "customer_name": {
              "type": "string",
              "description": "顧客の名前"
            },
            "company_name": {
              "type": "string",
              "description": "顧客の会社名"
            },
            "preferred_date": {
              "type": "string",
              "description": "希望日時(例: 3月25日 14時)"
            },
            "consultation_topic": {
              "type": "string",
              "description": "相談したい内容"
            }
          },
          "required": [
            "customer_name",
            "preferred_date",
            "consultation_topic"
          ]
        }
      }
    ],
    "model_choice": {
      "type": "cascading",
      "model": "gpt-4.1"
    },
    "tool_call_strict_mode": true,
    "knowledge_base_ids": [],
    "kb_config": {
      "top_k": 3,
      "filter_score": 0.6
    },
    "begin_tag_display_position": {
      "x": 6,
      "y": 198
    },
    "is_published": false,
    "is_transfer_cf": false
  }
}

1-3. RetellAIダッシュボードの「Agents」セクションで「Import」ボタンをクリックし、保存したJSONファイルをインポートします。

1-4. インポートが完了すると、以下の設定が適用されたエージェントが作成されます。

項目設定値
Response EngineConversation Flow
言語(Language)ja-JP(日本語)
音声(Voice)retell-Della
音声速度(Voice Speed)1.2
割り込み感度(Interruption Sensitivity)0.9
モデルGPT-4.1(cascading)
Tool Call Strict Mode有効

作成されたエージェントを開くと以下のようになっています。

1-5. エージェントのプロンプトには以下の動的変数が定義されています。これらの変数は、後のステップでn8nのInbound Webhookからdynamic_variablesとして返送する値と一致させます。

  • {{customer_name}} — 顧客名
  • {{company_name}} — 会社名
  • {{notes}} — 備考

1-6. 会話フローは以下の4ノードで構成されています。

ノード名種類役割
Welcome NodeConversation挨拶・用件確認・面談案内・ヒアリング・復唱確認
Save-reservationFunctionCustom Functionでn8nに予約情報を送信
Closing NodeConversation締めの挨拶(Skip User Response有効)
End CallEnd通話終了

Welcome Nodeのプロンプトでは、以下の流れで会話が進行します。

  1. 挨拶: 「{{customer_name}}さん、お電話ありがとうございます。Data-Xでございます。」
  2. 用件の確認: 備考({{notes}})の内容に触れながら用件を確認
  3. 無料面談の案内: 所要時間 約30分、形式 オンライン(Zoom)
  4. ヒアリング: ご希望の日時、ご相談されたい内容を聞き取り
  5. 予約確認: 予約内容を復唱し、お客様に確認
  6. 変更対応: 内容の変更を希望された場合は修正内容を確認し直す

トランジションの条件は「ユーザーが予約内容の復唱に対して了承し、予約が確定した」とし、了承後にSave-reservationノード(Custom Function)へ遷移します。

1-7. Global Promptは以下の内容で設定されています。

予約が確定したら、お礼を述べて通話を終了してください。ユーザーが「終わり」「切ります」「ありがとう」と言ったら通話を終了してください。

注意: インポートしたエージェントのCustom Function(Save-Reservation)には仮のWebhook URLが設定されています。Step 5でn8nの予約処理ワークフローを構築した後、正しいProduction URLに更新してください。

Step 2: 電話番号の取得とエージェントへの紐付け

RetellAI経由でTwilioの電話番号を取得し、エージェントに紐付けます。

2-1. RetellAIダッシュボードで①「Phone Numbers」タブを開き、②+ボタンからBuy New Numberを開きます。

2-2.Twilio電話番号(+1プレフィックス)を選択し、Purchaseをクリックして購入します。電話番号の購入にはクレジットカードの登録が必要で、月額$2の費用がかかります(RetellAIの$10無料クレジットとは別枠です)。

2-3. RetellAIダッシュボードの「Phone Numbers」タブを開き、購入した電話番号をRetellAIエージェントに紐付けます。同一の電話番号・エージェントでインバウンドとアウトバウンドの両方に対応可能です。①でインストールしたエージェントを選択します。続いて、②「Add an inbound webhook」を有効にします。URLの入力欄は空のままにしておきます(Step 4でn8nのWebhook URLを設定します)。

ポイント: 電話番号の選択肢として、Twilio以外にもTelnyxがあります。Telnyxはローカル番号対応や安価な通話料(Voice API $0.002/分)が特徴ですが、別途サインアップと設定が必要です。まずはRetellAI経由のTwilio番号で手軽に始め、運用が安定してから必要に応じてTelnyxへの移行を検討するのがおすすめです。

Step 3: Google Sheetsで顧客管理スプレッドシートを作成

n8nワークフローで使用する顧客情報・予約情報のスプレッドシートを作成します。このスプレッドシートは、フロー1(顧客情報取得)とフロー2(予約処理)の両方で使用します。

3-1. Google Sheetsで新しいスプレッドシートを作成します。

3-2. 1行目にヘッダーとして、以下のカラムを設定します。

カラム名説明用途入力例
user_phone_number電話番号(E.164形式)フロー1: フィルタキー / フロー2: マッチングキー+819012345678
customer_name顧客名フロー1 → RetellAI動的変数 {{customer_name}}山田太郎
company_name会社名フロー1 → RetellAI動的変数 {{company_name}}株式会社サンプル
last_contact_date最終連絡日顧客管理用2026-01-15
notes備考フロー1 → RetellAI動的変数 {{notes}}生成AI導入に関心あり
Reservation Date予約希望日(自動記入)フロー2が書き込み(空欄のまま)
Consultation Content相談内容(自動記入)フロー2が書き込み(空欄のまま)

3-3. 2行目以降に顧客情報を入力します。user_phone_number にはE.164形式(例: +819012345678)で電話番号を入力してください。

重要: カラム名は正確に一致させてください。このスプレッドシートのカラム名は、RetellAIの動的変数({{customer_name}}{{company_name}}{{notes}})およびn8nワークフローのフィルタ・マッピング設定と連動しています。カラム名を変更すると、顧客情報の取得や予約情報の保存が正しく動作しません。

ポイント: user_phone_number 列の表示形式は「書式なしテキスト」に設定してください。通常の数値形式では + が消えたり、数値として解釈されてE.164形式が崩れる場合があります。

Step 4: n8nでインバウンドWebhookワークフローをインポート

着信時に発信者情報を検索し、パーソナライズされた応答を返すワークフロー(フロー1)をインポートします。

4-1. 以下のコードをコピーし、JSONファイル形式(.json)で保存します。

{
  "name": "Retell Inbound Webhook - 顧客情報取得",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "retell-inbound",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "a1b2c3d4-1001-4000-a001-000000000001",
      "name": "Webhook - Inbound",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [256, 304],
      "webhookId": "a1b2c3d4-wh01-4000-a001-000000000001"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1doPBvAbJoiOqEitrD5aMgbpOL7kLwGxuX6nYqaLon1s",
          "mode": "list",
          "cachedResultName": "phone_number_list",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1doPBvAbJoiOqEitrD5aMgbpOL7kLwGxuX6nYqaLon1s/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "シート1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1doPBvAbJoiOqEitrD5aMgbpOL7kLwGxuX6nYqaLon1s/edit#gid=0"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "user_phone_number",
              "lookupValue": "={{ $json.body.call_inbound.from_number }}"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-1001-4000-a001-000000000002",
      "name": "Google Sheets - 顧客リスト取得",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [512, 304],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "fo3lC5VtAEDoLFxZ",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"dynamic_variables\": {\n    \"customer_name\": \"{{ $json.customer_name }}\",\n    \"company_name\": \"{{ $json.company_name }}\",\n    \"notes\": \"{{ $json.notes }}\"\n  }\n}\n",
        "options": {}
      },
      "id": "a1b2c3d4-1001-4000-a001-000000000004",
      "name": "Respond to Webhook - 顧客情報返送",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [720, 304]
    }
  ],
  "pinData": {},
  "connections": {
    "Webhook - Inbound": {
      "main": [
        [{ "node": "Google Sheets - 顧客リスト取得", "type": "main", "index": 0 }]
      ]
    },
    "Google Sheets - 顧客リスト取得": {
      "main": [
        [{ "node": "Respond to Webhook - 顧客情報返送", "type": "main", "index": 0 }]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

4-2. n8nで新規ワークフローを作成し、右上の「…」からImport from Fileを選択し、保存したJSONファイルを選択します。

4-3. インポートが完了すると、以下の3つのノードが表示されます。

ノード名種別役割
Webhook – InboundWebhookRetellAIからの着信時Webhook受信(POST /retell-inbound
Google Sheets – 顧客リスト取得Google Sheets発信者の電話番号で顧客情報をフィルタ検索
Respond to Webhook – 顧客情報返送Respond to Webhookdynamic_variables形式で顧客情報をRetellAIに返送

処理の流れ

Webhook - Inbound (POST /retell-inbound)
    ↓
Google Sheets - 顧客リスト取得 (filtersUIで電話番号照合)
    ↓
Respond to Webhook - 顧客情報返送 (JSON)

4-4. Webhook URLの取得とRetellAIへの設定: 「Webhook – Inbound」ノードをクリックし、Production URLをコピーします。Step 2で空にしておいたRetellAIのInbound WebhookのURL欄に、このProduction URLを貼り付けます。

RerellAIのwebhookURLの入力場所は以下です。

注意: RetellAI側に設定するのは必ずProduction URLです。Test URLではないことを確認してください。

電話番号の保存形式に注意: RetellAIのWebhookから送られるfrom_numberはE.164形式(例: +819012345678)で届きます。Google Sheets側も同じE.164形式で保存することを推奨します。09012345678の形式で保存する場合は、該当列の表示形式を「書式なしテキスト」に設定し、フィルタ値に国番号の変換処理を追加する必要があります。

元の番号Webhookで届く形式(E.164)
090-1234-5678+819012345678
080-1234-5678+818012345678
070-1234-5678+817012345678

4-4. Google Sheetsの認証設定: 「Google Sheets – 顧客リスト取得」ノードをクリックし、「Credential」欄で「Create New Credential」を選択します。GoogleアカウントでOAuth2認証を行います。

4-5. Google Sheetsノードのスプレッドシート指定: 「Document」欄でStep 3で作成したスプレッドシートを選択し、「Sheet」欄で対象のシートを選択します。

ポイント: フィルタ設定(filtersUI)はインポート済みです。フィルタ列は user_phone_number、フィルタ値は {{ $json.body.call_inbound.from_number }} で、着信時にRetellAIから送られる発信者番号で自動照合されます。

4-5.Respond to Webhookノードの設定: Respond to Webhook - 顧客情報返送ノードのレスポンスボディは、以下のJSON形式でインポート済みです。

{
  "dynamic_variables": {
    "customer_name": "{{ $json.customer_name }}",
    "company_name": "{{ $json.company_name }}",
    "notes": "{{ $json.notes }}"
  }
}

n8nでの設定は以下のようになっています。

注意点:

  • 動的変数は必ずdynamic_variablesオブジェクト内にネストする必要があります。トップレベルに置くとRetellAIが認識しません
  • キー名はRetellAIエージェントのプロンプト内で定義した動的変数名({{customer_name}}等)と一致させてください
  • {{ $json.xxx }}の部分はExpressionモードで入力されています。値を変更する場合はExpressionモードのまま編集してください

Step 5: Custom Functionで予約処理ワークフローをインポート

会話中に予約リクエストが発生したタイミングで呼び出されるワークフロー(フロー2)をインポートします。

5-1. 以下のコードをコピーし、JSONファイル形式(.json)で保存します。

{
  "name": "Retell Custom Function - 予約処理",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "retell-booking",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "b2c3d4e5-2001-4000-b001-000000000001",
      "name": "Webhook - Custom Function",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [-128, 304],
      "webhookId": "b2c3d4e5-wh02-4000-b001-000000000001"
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1doPBvAbJoiOqEitrD5aMgbpOL7kLwGxuX6nYqaLon1s",
          "mode": "list",
          "cachedResultName": "phone_number_list",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1doPBvAbJoiOqEitrD5aMgbpOL7kLwGxuX6nYqaLon1s/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "シート1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1doPBvAbJoiOqEitrD5aMgbpOL7kLwGxuX6nYqaLon1s/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Reservation Date": "={{ $json.body.args.preferred_date }}",
            "Consultation Content": "={{ $json.body.args.consultation_topic }}",
            "user_phone_number": "={{ $json.body.call.from_number }}"
          },
          "matchingColumns": ["user_phone_number"],
          "schema": [
            {
              "id": "user_phone_number",
              "displayName": "user_phone_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "customer_name",
              "displayName": "customer_name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "company_name",
              "displayName": "company_name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "last_contact_date",
              "displayName": "last_contact_date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "notes",
              "displayName": "notes",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Reservation Date",
              "displayName": "Reservation Date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Consultation Content",
              "displayName": "Consultation Content",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "id": "b2c3d4e5-2001-4000-b001-000000000002",
      "name": "Google Sheets - 予約情報保存",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [304, 304],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "fo3lC5VtAEDoLFxZ",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ booking_confirmed: true, message: \"予約が確定しました\" }) }}",
        "options": {}
      },
      "id": "b2c3d4e5-2001-4000-b001-000000000006",
      "name": "Respond to Webhook - 予約確定返送",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [704, 304]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "C09G8RU6RPC",
          "mode": "list",
          "cachedResultName": "n8n-test"
        },
        "text": "新規予約が入りました",
        "otherOptions": {}
      },
      "id": "b2c3d4e5-2001-4000-b001-000000000005",
      "name": "Slack - 予約通知",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [928, 304],
      "credentials": {
        "slackApi": {
          "id": "KyHQfIGnYhJNhWhg",
          "name": "Slack account"
        }
      }
    }
  ],
  "pinData": {},
  "connections": {
    "Webhook - Custom Function": {
      "main": [
        [{ "node": "Google Sheets - 予約情報保存", "type": "main", "index": 0 }]
      ]
    },
    "Google Sheets - 予約情報保存": {
      "main": [
        [{ "node": "Respond to Webhook - 予約確定返送", "type": "main", "index": 0 }]
      ]
    },
    "Respond to Webhook - 予約確定返送": {
      "main": [
        [{ "node": "Slack - 予約通知", "type": "main", "index": 0 }]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

5-2. n8nで新規ワークフローを作成し、右上の「…」からImport from Fileを選択し、保存したJSONファイルを選択します。

5-3. インポートが完了すると、以下の4つのノードが表示されます。

ノード名種別役割
Webhook – Custom FunctionWebhookRetellAIからのCustom Function呼び出し受信(POST /retell-booking
Google Sheets – 予約情報保存Google Sheets電話番号をキーに予約情報を保存(Append or Update)
Respond to Webhook – 予約確定返送Respond to Webhook予約確定結果(booking_confirmed: true)をRetellAIに返送
Slack – 予約通知Slack「新規予約が入りました」をSlackチャンネルに通知

処理の流れ

Webhook - Custom Function (POST /retell-booking)
    ↓
Google Sheets - 予約情報保存 (Append or Update)
    ↓
Respond to Webhook - 予約確定返送 (JSON)
    ↓
Slack - 予約通知

5-4. Webhook URLの取得とRetellAIへの設定: 「Webhook – Custom Function」ノードをクリックし、Production URLをコピーします。RetellAIダッシュボードでエージェントの設定を開き、Step 1でインポート済みのCustom Function(Save-Reservation)のAPI Endpointを、コピーしたProduction URLに更新します。

Step 1のインポート時に、Custom Functionには以下の設定とパラメータが含まれています。

設定項目
タイムアウト120,000ms(2分)
speak_after_executiontrue
speak_during_executionfalse
args_at_rootfalse
パラメータ名必須説明
customer_namestringYes顧客の名前
company_namestringNo顧客の会社名
preferred_datestringYes希望日時(例: 3月25日 14時)
consultation_topicstringYes相談したい内容

注意: Custom Functionでの電話番号パスは body.call.from_number です。インバウンドWebhook(フロー1)の body.call_inbound.from_number とは異なるため、n8nのノード設定を変更する場合は間違えないようにしてください。

5-5. Google Sheetsの認証設定: 「Google Sheets – 予約情報保存」ノードをクリックし、「Credential」欄でStep 4と同じGoogle Sheets認証情報を選択します。「Document」欄と「Sheet」欄で、Step 3で作成したスプレッドシート(フロー1と同じもの)を指定します。

ポイント: フロー1(顧客情報取得)とフロー2(予約処理)は同じスプレッドシートを使用します。フロー1で電話番号をもとに顧客情報を検索し、フロー2で同じ行に予約情報(希望日・相談内容)を書き込む構成です。

5-6. Respond to Webhookノードの設定: Respond to Webhook - 予約確定返送ノードのレスポンスボディは、以下のJSON形式でインポート済みです。

{{ JSON.stringify({ booking_confirmed: true, message: "予約が確定しました" }) }}

n8nでの設定は以下のようになっています。

5-7. Slackの認証設定: 「Slack – 予約通知」ノードをクリックし、「Credential」欄で「Create New Credential」を選択してSlack認証を行います。通知を送信したいチャンネルを指定します。

Step 6: 動作確認とデプロイ

すべての設定が完了したら、テスト通話で動作を確認しましょう。

6-1. n8nの各ワークフロー(フロー1・フロー2)をActiveに設定します。

6-2. 取得した電話番号に発信してテスト通話を行います。以下の項目を確認してください。

  • インバウンドWebhook: 発信者名({{customer_name}})でパーソナライズされた挨拶が返ってくるか
  • ヒアリング: エージェントが希望日時・相談内容を正しく聞き取り、復唱するか
  • Custom Function: 予約リクエスト後、Google Sheetsに予約情報が保存されるか
  • Slack通知: 予約確定後、Slackチャンネルに通知が届くか

6-3. RetellAI側に設定したURLがProduction URL(Test URLではない)であることを再確認します。

6-4. Google Sheetsで顧客情報の取得・予約情報の記録が正しく行われていることを確認します。

よくある質問

日本語での通話に対応していますか?

対応しています。RetellAIのエージェント設定で言語をja-JP(日本語)に設定し、音声をretell-Dellaにすることで、日本語での会話が可能です。

RetellAIの無料クレジットはどのくらい持ちますか?

RetellAIでは初回$10の無料クレジットが付与されます。通話時間やモデルの種類によって消費量は変わりますが、テスト通話やプロトタイプの検証には十分な量です。

電話番号は日本の番号(+81)を使えますか?

RetellAI経由で購入できるTwilio番号は主に米国番号(+1プレフィックス)です。日本の番号の取得も可能です(コンプライアンス書類の提出が必要な場合があります)。

つまずきやすいポイント

  • RetellAIのInbound Webhook URLが正しく設定されていない: n8nのWebhookノードで発行したProduction URL(Test URLではない)をRetellAI側に設定してください。URLが未設定または間違っていると、着信時に顧客情報が取得できず、動的変数が空のまま読み上げられてしまいます
  • Google Sheetsの電話番号フォーマットが一致しない: RetellAIから届く電話番号はE.164形式(例: +819012345678)です。Google Sheets側のデータも同じ形式で保存してください。片方にだけ国番号が付いていると、フィルタで一致せず顧客情報を取得できません
  • Respond to Webhookノードの応答形式が不正: レスポンスボディのJSON末尾にカンマを入れないでください。また、Inbound Webhookでは動的変数を必ずdynamic_variablesオブジェクト内にネストする必要があります。トップレベルに直接変数を置いてもRetellAIは認識しません

なかなかうまくいかないときは?

初めてRetellAIやn8nを使うと「Webhook URLの設定がわかりにくい」「dynamic_variablesの形式を間違えて顧客情報が取得できない」「Custom Functionが正しく発火しない」などでつまずく方もいます。また、「電話番号のフォーマットが一致しない」「Respond to Webhookの応答方法を変更し忘れた」といったトラブルも起こりがちです。

そこで、おすすめしたいのが「ジドウカ」です。

ジドウカは、これまで合計800タスク以上の業務の自動化をしてきた実績のある法人専用の自動化サービスです。

ジドウカ

業務の一部を”タスク単位”で自動化し、【月額1万円から】安定運用できるサブスクリプション型のサービスです。技術のことが分からなくても「こういう作業をラクにしたい」と伝えるだけで自動化することが可能です。

「自分のやりたい自動化って本当に実現できるのかな…」という方には、少額・短期間での「お試し開発」があるので、お気軽にご活用ください。

まとめ

本記事では、RetellAI × n8n × Google Sheets × Slackを使って、インバウンド電話受付を自動化するシステムの構築方法を解説しました。

  • RetellAIでAI音声エージェントを作成し、Conversation Flow形式で会話フローを設計
  • Twilio電話番号を取得してエージェントに紐付け、Inbound Webhookを有効化
  • n8nフロー1(インバウンドWebhook)で着信時に顧客情報をGoogle Sheetsから取得し、動的変数としてRetellAIに返送
  • n8nフロー2(Custom Function)で予約情報をGoogle Sheetsに保存し、Slack通知を送信
  • RetellAI = 会話担当、n8n = 業務バックエンドという役割分担でシステムを構成

一度仕組みを構築すれば、24時間365日、顧客からの電話に自動で応答し、予約受付から通知までを人手をかけずに処理できます。

「電話対応の負担を減らしたい」「営業時間外でも予約を受け付けたい」という方は、ぜひ今回の手順を参考に構築してみてください。対応言語の変更やGoogle Calendar連携の追加など、n8nベースのためカスタマイズも柔軟に行えます。

目次