Webhookは、外部サービスからのHTTPリクエストを受け取ってワークフローを起動する、n8nの最も重要なトリガーの一つです。
APIを持つあらゆるサービスと連携でき、フォーム送信、決済完了、GitHub Push、Slackコマンドなど、リアルタイムなイベント駆動型の自動化を実現できます。
この記事では、Webhookノードの基本設定から、認証、レスポンス制御、実践的な活用例まで、詳しく解説します。
Webhookとは?ポーリングとの違い
Webhookの仕組み
Webhookは、あるシステムでイベントが発生した際に、別のシステムに自動的にHTTPリクエストを送信する仕組みです。
ポーリング方式
- 定期的にデータを取得しに行く
- 変化がなくてもリクエストが発生
- リアルタイム性が低い
- リソース消費が多い
Webhook方式
- イベント発生時のみ通知を受け取る
- リアルタイムに処理を開始
- 効率的なリソース利用
- 即時性が高い
n8n Webhookの特徴
- HTTPメソッド(GET / POST / PUT / DELETE等)に対応
- 認証機能(Basic認証、Header認証等)
- レスポンスの柔軟な制御
- テスト用URLと本番用URLの分離
- 最大ペイロードサイズ:16MB(セルフホスト版は変更可能)
Webhookノードの基本設定
Step 1:Webhookノードの追加
- 新規ワークフローを作成
- 「+」ボタンまたは「Add first step」をクリック
- 検索ボックスに「Webhook」と入力
- 「Webhook」ノードを選択
Step 2:基本パラメータの設定
| パラメータ | 説明 | 設定例 |
|---|---|---|
| HTTP Method | 受け付けるHTTPメソッド | POST(最も一般的) |
| Path | WebhookのURLパス | /order-notification |
| Authentication | 認証方式 | None / Basic Auth / Header Auth |
| Respond | レスポンスのタイミング | Immediately / When Last Node Finishes |
Step 3:Webhook URLの確認
Webhookノードを設定すると、2種類のURLが生成されます。
Test URL
https://your-n8n-instance.com/webhook-test/xxxxxxxx-xxxx-xxxx
- テスト実行用
- 「Listen for Test Event」で待機状態にする必要あり
- 受信データがエディタに表示される
Production URL
https://your-n8n-instance.com/webhook/xxxxxxxx-xxxx-xxxx
- 本番運用用
- ワークフローをアクティブ化すると有効になる
- Executionsタブで実行履歴を確認
カスタムパスの設定
デフォルトではランダムなUUIDがパスに設定されますが、わかりやすいカスタムパスに変更できます。
設定例
- /contact-form
- /payment-complete
- /github-webhook
- /api/v1/orders
ルートパラメータの使用
動的なパスも設定可能です。
/orders/:orderId
/users/:userId/profile
Webhookのテスト方法
方法1:n8nのテスト機能を使う
- Webhookノードを選択
- 「Listen for Test Event」をクリック
- 待機状態になったら、Test URLにリクエストを送信
- 受信データがノードに表示される
方法2:curlコマンドでテスト
GETリクエスト
curl -X GET "https://your-n8n-instance.com/webhook-test/your-path"
POSTリクエスト(JSONデータ)
curl -X POST "https://your-n8n-instance.com/webhook-test/your-path"
-H "Content-Type: application/json"
-d '{"name": "テスト", "email": "test@example.com"}'
方法3:ブラウザ拡張機能を使う
- Talend API Tester(Chrome拡張)
- Postman
- Insomnia
GUIでリクエストを作成・送信でき、レスポンスも確認できます。
認証の設定
セキュリティのため、Webhookには認証を設定することを推奨します。
Basic認証
ユーザー名とパスワードで認証します。
設定手順
- Authentication:「Basic Auth」を選択
- Credentialを作成(ユーザー名・パスワードを設定)
リクエスト例
curl -X POST "https://your-n8n-instance.com/webhook/your-path"
-u "username:password"
-H "Content-Type: application/json"
-d '{"data": "test"}'
Header認証
カスタムヘッダーで認証します。APIキーの検証に適しています。
設定手順
- Authentication:「Header Auth」を選択
- Credentialを作成
- Header Name:X-API-Key
- Header Value:your-secret-api-key
リクエスト例
curl -X POST "https://your-n8n-instance.com/webhook/your-path"
-H "X-API-Key: your-secret-api-key"
-H "Content-Type: application/json"
-d '{"data": "test"}'
JWT認証
JWTトークンによる認証も設定可能です。
レスポンスの制御
Webhookノードは、リクエストに対するレスポンスを柔軟に制御できます。
Respond設定の種類
| 設定 | 動作 | 用途 |
|---|---|---|
| Immediately | 即座に応答を返す | 処理完了を待たない場合 |
| When Last Node Finishes | 最後のノード完了時に応答 | 処理結果を返す場合 |
| Using ‘Respond to Webhook’ Node | 専用ノードで制御 | 柔軟なレスポンス制御 |
Respond to Webhookノードの使用
レスポンスを細かく制御したい場合は、「Respond to Webhook」ノードを使用します。
設定可能な項目
- Response Code:200、201、400、500など
- Response Headers:カスタムヘッダー
- Response Body:JSON、テキスト、バイナリ
構成例
[Webhook] → [処理ノード] → [Respond to Webhook]
Respond to Webhookの設定例
Response Code: 200
Response Body:
{
"success": true,
"message": "データを受信しました",
"orderId": "{{ $json.orderId }}"
}
受信データの取得方法
Webhookで受信したデータは、後続のノードで参照できます。
JSONボディの取得
// リクエストボディ全体
{{ $json }}
// 特定のフィールド
{{ $json.name }}
{{ $json.email }}
{{ $json.order.items[0].name }}
クエリパラメータの取得
GETリクエストのクエリパラメータは以下で取得します。
// ?userId=123&action=view の場合
{{ $json.query.userId }}
{{ $json.query.action }}
ヘッダーの取得
{{ $json.headers['content-type'] }}
{{ $json.headers['x-custom-header'] }}
ルートパラメータの取得
パスに :param を含む場合:
// /orders/:orderId でアクセスした場合
{{ $json.params.orderId }}
実践ワークフロー①:フォーム送信→Slack通知
Webサイトのお問い合わせフォームからデータを受け取り、Slackに通知します。
ワークフロー構成
[Webhook] → [Slack]
Webhookノードの設定
- HTTP Method:POST
- Path:/contact-form
- Authentication:Header Auth(推奨)
- Respond:Immediately
Slackノードの設定
- Operation:Send a Message
- Channel:#contact
- Text:
📩 *新規お問い合わせ*
*お名前:* {{ $json.body.name }}
*メール:* {{ $json.body.email }}
*内容:*
{{ $json.body.message }}
フォームからの送信例(JavaScript)
fetch('https://your-n8n-instance.com/webhook/contact-form', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'your-secret-key'
},
body: JSON.stringify({
name: document.getElementById('name').value,
email: document.getElementById('email').value,
message: document.getElementById('message').value
})
});
実践ワークフロー②:決済完了→顧客通知
Stripeなどの決済サービスからWebhookを受け取り、顧客にメールを送信します。
ワークフロー構成
[Webhook] → [IF(イベント判定)] → [Gmail] → [Google Sheets]
Webhookノードの設定
- HTTP Method:POST
- Path:/stripe-webhook
- Respond:Immediately(Stripeは即時応答を期待)
IFノードの設定
条件: {{ $json.body.type }} equals "payment_intent.succeeded"
Gmailノードの設定
- To:{{ $json.body.data.object.receipt_email }}
- Subject:ご購入ありがとうございます
- Message:決済完了のお知らせメール本文
実践ワークフロー③:GitHub Webhook→自動デプロイ通知
GitHubリポジトリへのPushを検知して、Slackに通知します。
ワークフロー構成
[Webhook] → [IF(ブランチ判定)] → [Slack]
Webhookノードの設定
- HTTP Method:POST
- Path:/github-push
IFノードの設定
条件: {{ $json.body.ref }} equals "refs/heads/main"
Slackメッセージ
🚀 *本番ブランチにPushがありました*
*リポジトリ:* {{ $json.body.repository.full_name }}
*コミッター:* {{ $json.body.pusher.name }}
*コミット:* {{ $json.body.head_commit.message }}
*URL:* {{ $json.body.head_commit.url }}
GitHub側の設定
- リポジトリの「Settings」→「Webhooks」
- 「Add webhook」をクリック
- Payload URL:n8nのProduction URLを入力
- Content type:application/json
- Secret:任意のシークレットキー(署名検証用)
- Which events:「Just the push event」を選択
実践ワークフロー④:APIエンドポイントの構築
Webhookを使って独自のAPIエンドポイントを構築できます。
ワークフロー構成
[Webhook] → [データ処理] → [Respond to Webhook]
ユーザー情報取得APIの例
Webhookノード
- HTTP Method:GET
- Path:/api/users/:userId
- Respond:Using ‘Respond to Webhook’ Node
PostgreSQLノード(データ取得)
SELECT * FROM users WHERE id = {{ $json.params.userId }}
Respond to Webhookノード
{
"success": true,
"data": {
"id": {{ $json.id }},
"name": "{{ $json.name }}",
"email": "{{ $json.email }}"
}
}
セルフホスト版でのWebhook設定
セルフホスト版のn8nでWebhookを外部から受け取るには、いくつかの設定が必要です。
環境変数の設定
# Webhook URL のベースURL
WEBHOOK_URL=https://your-domain.com/
# ペイロードサイズの上限(デフォルト16MB)
N8N_PAYLOAD_SIZE_MAX=16777216
ローカル環境での外部公開(ngrok)
ローカル環境でWebhookを受け取るには、ngrokなどのトンネリングサービスを使用します。
ngrokのインストールと起動
# インストール
brew install ngrok
# トンネル開始(n8nが5678ポートで動作している場合)
ngrok http 5678
生成されるURL
このURLをn8nの環境変数 WEBHOOK_URL に設定します。
トラブルシューティング
よくある問題と解決方法
| 問題 | 原因 | 解決方法 |
|---|---|---|
| Webhookが受信できない | ワークフローが非アクティブ | ワークフローをアクティブ化 |
| Test URLで受信できない | 待機状態になっていない | 「Listen for Test Event」をクリック |
| 404エラー | URLパスが間違っている | 正しいURLをコピーして使用 |
| 401エラー | 認証情報が不正 | 認証ヘッダー/パスワードを確認 |
| タイムアウト | 処理に時間がかかりすぎ | Respond: Immediatelyに変更 |
| ペイロードエラー | データサイズ超過 | 16MB以下に抑える、または上限変更 |
デバッグ方法
- Executionsタブで実行履歴を確認:成功/失敗したリクエストの詳細を確認
- 受信データの確認:Webhookノードの出力を確認して、期待するデータが来ているか確認
- 外部ツールでリクエスト確認:Postmanやcurlで直接リクエストして動作確認
よくある質問(FAQ)
Q. Test URLとProduction URLの違いは?
A. Test URLはテスト実行時に使用し、「Listen for Test Event」で待機状態にする必要があります。Production URLはワークフローをアクティブ化すると常に有効になり、本番運用に使用します。
Q. Webhookの認証は必須ですか?
A. 必須ではありませんが、セキュリティのため強く推奨します。認証なしのWebhookは誰でもリクエストを送信できるため、不正なデータ送信やDoS攻撃のリスクがあります。
Q. 同じパスで複数のHTTPメソッドに対応できますか?
A. 1つのWebhookノードでは1つのHTTPメソッドのみ対応します。複数のメソッドに対応する場合は、別々のWebhookノードを作成するか、HTTP Methodを「ALL」に設定します。
Q. Webhookで画像やファイルを受け取れますか?
A. はい、バイナリデータも受け取れます。最大16MB(セルフホスト版では設定変更可能)まで対応しています。
Q. レスポンスを返さないとどうなりますか?
A. Respond設定が「Immediately」の場合、ワークフロー開始時に自動的に200レスポンスが返されます。「When Last Node Finishes」の場合、処理完了まで接続が維持され、完了後にレスポンスが返されます。
まとめ
この記事では、n8nのWebhookノードの使い方を詳しく解説しました。
基本設定のポイント
- HTTPメソッドは用途に応じて選択(POST が最も一般的)
- パスはわかりやすい名前を設定
- Test URLとProduction URLを使い分ける
- セキュリティのため認証を設定
レスポンス制御
- Immediately:即時応答(処理完了を待たない)
- When Last Node Finishes:処理結果を返す
- Respond to Webhook:細かいレスポンス制御
活用例
- フォーム送信の処理
- 決済Webhookの受信
- Git操作の通知
- 独自APIエンドポイントの構築
次のステップ
- シンプルなWebhook→Slack通知を構築してテスト
- 認証を追加してセキュリティを強化
- Respond to Webhookでレスポンスを制御
- 実際の外部サービスと連携
Webhookを使いこなすことで、n8nの活用範囲が大きく広がります。ぜひ様々なサービスとの連携に活用してください。

