Webhook:讓外部系統打進 n8n
前面 21 章教的都是「n8n 主動去做事」——按時間排程、去打別人 API、去讀 Gmail。這章反過來:讓別人打你。表單填完自動觸發、Line Bot 收到訊息、HA 感應器動了、GitHub 有人 push——全部走 Webhook 節點進 n8n。這也是整本書的最後一章,收尾看到最後。
為什麼 Webhook 是最後一塊拼圖
把前面幾章的觸發方式攤開,你會發現一件事:
- Manual Trigger(第 10 章)——你按按鈕,workflow 才動。
- Schedule Trigger——時間到,workflow 自己動。
- Gmail / Slack / Sheets Trigger(第 11 章)——SaaS 那邊有新事件,n8n 定期去輪詢拿回來。
- HTTP Request 節點(第 12 章)——n8n 主動去打別人的 API。
共通點:都是 n8n 自己出手。少了一種模式——「外部系統想主動叫醒你的 workflow」。這就是 Webhook 節點在做的事。
會用到 Webhook 的情境比你想的多很多:
- 公司網站的聯絡表單填完,資料自動進 Google Sheets、發 Slack 通知業務、寫進 CRM。
- Line 官方帳號收到客人訊息,走 AI Agent(第 21 章)產生回覆,再回傳給 Line。
- Home Assistant 門磁感應到「有人回家」,觸發 n8n workflow 記日誌到 Notion、順便關公司 VPN。
- GitHub 有人開 PR,通知 QA、開 Jira ticket、跑一輪內部 lint。
- Stripe / 綠界金流有新訂單,寫進 ERP、寄發票、加會員紅利。
簡單講:只要對方系統有「webhook」或「回呼 URL」欄位可填,就能打進 n8n。這一章教你怎麼收、怎麼設定、怎麼回覆、怎麼避免亂人來打。
Webhook 是「你的 workflow 的門鈴」
用最白話的比喻:
- Schedule Trigger 是鬧鐘——時間到就響。
- HTTP Request 節點是你打電話出去——主動要問人家事情。
- Webhook 節點是門鈴——別人來了、按一下、你就會知道。
當你在 workflow 裡加一個 Webhook 節點,n8n 會給你一個 URL,長得像:
https://n8n.woowtech.io/webhook/form-abc123
任何人(人、伺服器、Line、HA、curl 指令)打這個 URL,你的 workflow 就會被觸發。打進來的資料(body、query string、header)會全部變成 workflow 第一個 item 的 $json——你後面的節點就可以用 Expression({{ $json.name }} 等等)拿出來用。
換句話說,Webhook 節點把你的 workflow 變成一個簡易 HTTP API。任何知道 URL 的服務都能觸發它。這也是為什麼你在 Zapier / Make 也會看到「Webhooks」這種 trigger——是自動化平台之間彼此通用的橋樑。
兩種 URL:Test 跟 Production 差在哪
打開 Webhook 節點的設定面板,你會看到兩個 URL——這是新手第一個大坑。
| 類型 | 什麼時候活著 | 用途 | 存活時間 |
|---|---|---|---|
| Test URL | 你按下節點裡的 Listen for test event 按鈕之後才活。 | 開發時測試——按下按鈕、去打一次、看資料進來的樣子。 | 按下按鈕後開始 listen,收到一次事件就自動關掉;沒事件時官方沒明講超時,實務上約兩分鐘會停,重按可再開一次。 |
| Production URL | workflow 被 Active(右上角開關打開)之後永久活。 | 正式上線——交給外部服務長期使用。 | 只要 workflow 保持 Active 就一直活;關 Active 就 404。 |
這兩個 URL 差別很細節但很重要:
- 兩者的 URL path 不一樣——Test URL 通常是
/webhook-test/xxx,Production 是/webhook/xxx。你在節點面板複製時務必看清楚選對。 - Test URL 每次觸發只吃一次事件就自己關掉,適合對著調欄位、看 Schema。
- Production URL 是不會出現在 Executions 的即時預覽——你要看實際跑起來的紀錄要去 Executions 分頁看。
/webhook/ 不是 /webhook-test/)。動手做:收表單資料存進 Google Sheets
最經典也最實用的入門範例:對外露一個 URL,讓網頁表單把使用者填的資料 POST 進來,n8n 自動寫進 Google Sheets。做完你就能拿去接自家官網或 landing page 的聯絡表單。
-
開新 workflow,第一個節點選 Webhook
右上 + Add workflow → 進入空 canvas → 點中間 + → 在節點抽屜搜 Webhook(在 Triggers 分類底下)。加進來。
-
設定 HTTP Method 跟 Path
Webhook 節點打開後:
- HTTP Method 選
POST——表單送資料進來預設用 POST。 - Path 隨便取一個好記的英文名字,例:
form-contact。這段會加到 URL 末端。
設完,節點面板下方會顯示兩個 URL:
Test URL: https://n8n.woowtech.io/webhook-test/form-contact Production URL: https://n8n.woowtech.io/webhook/form-contact - HTTP Method 選
-
按 Listen for test event,跟 curl 打一次
Webhook 節點右上角按 Listen for test event——節點會進入等待狀態(收到第一次事件就自動結束,若一直沒事件實務上約兩分鐘停)。開一個 terminal,用
curl打 Test URL 送假資料:curl -X POST https://n8n.woowtech.io/webhook-test/form-contact \ -H "Content-Type: application/json" \ -d '{"name":"王小明","email":"[email protected]","message":"想詢問報價"}'回到 n8n canvas,Webhook 節點會亮綠、右邊 output 面板出現剛剛的 JSON。看到資料進來,這一步就成功了。
-
接 Google Sheets 節點:Append Row
Webhook 節點後面接 Google Sheets 節點。Operation 選 Append Row in Sheet。Credentials 選好(第一次用要新增,見 第 13 章)。挑一個試算表跟工作表(欄位建好
name、email、message、received_at)。Columns 區塊每個欄位切 Expression 模式,對應到:
name → {{ $json.body.name }} email → {{ $json.body.email }} message → {{ $json.body.message }} received_at → {{ $now.toISO() }}注意 Webhook 節點的 body 內容包在
$json.body底下,query string 在$json.query,header 在$json.headers。 -
Execute step 確認 Sheet 真的多了一列
對 Google Sheets 節點按 Execute step——會拿剛剛 Webhook 收到的 item 送一次。開 Google Sheets 檢查有沒有多一列剛剛的資料。有的話代表整條鏈接通。
圖 22-1Webhook 觸發後串接下游節點的典型三節點結構:外部 POST 打進 Webhook 節點,資料流到下一個節點做事。 -
Save,然後右上把 Active 打開
右上 Save 存檔。存完後把右上的 Active 開關撥到開啟——這一步很重要,不開 Production URL 是 404。
-
用 Production URL 打一次驗證
回 terminal 改打 Production URL(把
/webhook-test/換成/webhook/):curl -X POST https://n8n.woowtech.io/webhook/form-contact \ -H "Content-Type: application/json" \ -d '{"name":"李小華","email":"[email protected]","message":"正式送出"}'Sheet 又多一列——這條 URL 就可以直接交給外部前端工程師或客戶用了。要看歷史紀錄去左側 Executions 分頁。
HTTP 方法:什麼時候用哪個
Webhook 節點的 HTTP Method 下拉可以選 GET / POST / PUT / PATCH / DELETE / HEAD。實務上你只會常用前兩種,其他是做 REST 風格 API 才用得到。
| Method | 對方拿它做什麼 | 資料在哪裡 | 經典場景 |
|---|---|---|---|
GET |
外部想「查詢」或「觸發但不帶太多資料」。 | Query string(URL 後面的 ?key=value),n8n 收在 $json.query。 |
簡單 ping、健康檢查、瀏覽器貼網址測試。 |
POST |
外部「送新資料」進來。 | Body(JSON 或表單),n8n 收在 $json.body。 |
表單提交、Line webhook、GitHub webhook、金流回調——最常用。 |
PUT |
外部「整筆更新」某個資源。 | Body。 | 把 n8n 當 REST API 給別人用時才用得到。 |
PATCH |
外部「部分更新」某個資源。 | Body。 | 同上,只更新幾個欄位的情境。 |
DELETE |
外部「刪除」某個資源。 | URL path 或 query。 | 同上,REST 風格 API 才需要。 |
選錯 Method 會 404——外部用 POST 打,你 Webhook 節點設 GET,n8n 會直接回 404(因為它認為「這個 path 沒有 POST 路由」)。查資料進來卡住時,第一件事就是確認雙方 Method 對齊。
Response 模式:n8n 要回什麼給外部
Webhook 節點的 Respond 選項決定「外部打進來後,n8n 要回什麼 HTTP response」。這件事很重要——Line、Slack、Stripe 這種服務都會看你回什麼來判斷 webhook 有沒有成功。回不對的話它們可能會重試(造成重複執行)或直接停用你的 webhook。
| Response 模式 | 行為 | 什麼時候用 |
|---|---|---|
| Immediately | n8n 收到 request 立刻回 200 OK 空 body,workflow 在背景繼續跑。 |
對方只在乎「收到沒」不看內容;workflow 跑很久(如 AI Agent 生成 30 秒)不想讓對方等;Stripe / GitHub 這種要「3 秒內回」的 webhook。 |
| When Last Node Finishes | 整個 workflow 跑完,把最後一個節點的 output當作 response 回傳。 | 對方想要拿到 workflow 處理後的結果(例:Line Bot 收訊息、n8n 處理完直接把回覆傳回 Line)。workflow 要在幾秒內跑完。 |
| Using 'Respond to Webhook' Node | 由你在 workflow 中間某個節點指定「這裡回覆」——把 Respond to Webhook 節點插在你想回應的位置。 | 要客製回應——回什麼 status code、什麼 header、什麼 body、什麼 content type,都自己決定。做 API 給別人用時的正確選擇。 |
| Streaming Response | 以串流方式一段一段回,多半配合 AI Agent 這種會產生 chunked 內容的節點。 | 要做 ChatGPT 風格的即時逐字輸出前端,或串接支援 SSE / streaming 的下游。 |
Respond to Webhook 節點是搭配第三種模式的關鍵——把它插在 workflow 你想回應的節點後面(不一定要在最後),可以指定:
- Respond With——選回什麼形態:JSON、Text、Binary File、Redirect、JWT Token、No Data、All Incoming Items、First Incoming Item。
- Response Code——自己填數字。常見:
200(成功)、201(Created)、400(客戶端錯)、500(伺服器錯)。 - Response Headers——例:
Content-Type: application/json、CORS 相關 header。
要注意:Respond to Webhook 節點只處理第一筆 incoming item;就算前面節點吐出很多筆,也只有第一筆會被拿來回覆。同一個 workflow 若跑到第二個 Respond to Webhook 節點會被忽略;若整個 workflow 跑完都沒經過任何 Respond to Webhook 節點,n8n 會自動回一個標準的 200;若中途錯誤未經該節點,會回 500。
常見會打 Webhook 進來的服務
幾乎所有現代 SaaS 都有 webhook 功能——他們有事件想通知你時,會 POST 到你指定的 URL。把 URL 填成 n8n Webhook 節點的 Production URL 就串起來了。以下是最常見的幾家:
| 來源 | 怎麼設定 | 要注意 |
|---|---|---|
| Google Forms | Google Forms 沒有原生 webhook——需要 Apps Script 或 Zapier / Make 當橋樑。或改用 Tally、Typeform 這種有原生 webhook 的表單服務。 | 如果一定要用 Google Forms,也可以走 Google Sheets Trigger(表單答案會寫進 Sheet)。 |
| Line 官方帳號 | Line Developers Console → Messaging API channel → Webhook URL 貼 n8n Production URL。開啟 Use webhook。 | Line 要求 3 秒內回 200,選 Response = Immediately;驗簽章要用 Header X-Line-Signature。 |
| Home Assistant | HA Automation → Trigger 選 Webhook,指定一個 webhook_id → 在 HA 觸發(例:門磁感應)時它會打你指定的 URL。或反過來,HA 收 webhook:把 URL 設在 webhook trigger。 | HA 打出去時可以自己選 Method 跟 body,跟 n8n Webhook 節點設定要對齊。 |
| Typeform / Tally | Form 設定裡的 Integrations 或 Webhooks 分頁貼 URL。填答有人送出就打你 n8n。 | 對方 body 是他們自己的 schema,先用 Test URL 看清楚欄位路徑再對映。 |
| GitHub / GitLab | Repo Settings → Webhooks → Add webhook → Payload URL 貼 n8n URL。選 events(push / PR / issue)。 | GitHub 會發非常多種 event,用 IF 節點(第 15 章)過濾只處理你關心的。 |
| Slack slash command / event | Slack App 設定 → Slash Commands 或 Event Subscriptions → Request URL 貼 n8n URL。 | Slack 也要 3 秒內回 200;Event Subscriptions 第一次會發驗證 challenge,要回 challenge 欄位。 |
| Stripe / 綠界 / TapPay | 金流後台的 webhook / 通知網址設定。 | 驗簽章、Idempotency、失敗會重試——一定要選 Immediately 快速回 200,實際處理丟給後面節點慢慢跑。 |
共通規則:任何服務在 webhook 送出時,都會用它自己的 JSON schema——先用 Test URL 手動觸發一次、把 body 拉出來看清楚欄位路徑,再往下寫節點。閉眼寫 $json.body.foo 常常會 undefined。
加 auth:避免亂人猜到 URL 亂打
Webhook URL 一但曝光就誰都能打。惡意的話可以塞垃圾資料到你 Sheet、觸發成本很高的 AI Agent、發垃圾 Line 訊息。有幾種保護做法,從最簡到最進階:
| 方式 | 設定位置 | 安全性 | 什麼時候用 |
|---|---|---|---|
| 不設 auth,只靠 URL 難猜 | Webhook 節點 Authentication = None。Path 用 UUID 或長亂數。 | 低——URL 就是密碼。 | 只給信賴的內部服務用(HA、內部工具)。絕對不要放 client side JavaScript 或公開文件。 |
| Basic Auth | Authentication 選 Basic Auth,設 username / password。 | 中——打的人要在 header 帶 Authorization: Basic base64(user:pass)。 |
簡單伺服器對伺服器場景,對方支援 Basic Auth 時。 |
| Header Auth | Authentication 選 Header Auth,指定 header 名字與值(例:X-Api-Key: your-secret-value)。 |
中——沒帶 header 或值不對 n8n 直接回 401。 | 大部分現代 API 慣例,最推薦的「一般用」選項。 |
| JWT | Authentication 選 JWT Auth,設 secret / algorithm。n8n 會驗簽章。 | 高——搭配過期時間、簽章驗證。 | 對方是有 JWT 發放能力的正式系統(企業 SSO、行動 App)。 |
| HMAC 簽章驗證 | Authentication 選 None,改用 Code 節點(第 7 章)算 HMAC 對比 header。 | 高——每個 request 都有唯一簽章。 | Line、Stripe、GitHub 都用這招;照對方文件實作。 |
實例:Line Bot 打進 n8n → AI Agent 回覆
整合 Webhook + AI Agent(第 21 章)+ HTTP Request(第 12 章),做出一個「客人在 Line 傳訊息,n8n 用 GPT 產出回覆,再自動回傳給客人」的完整鏈——所有前面章節的內容在這裡收斂成一個實戰。
-
Line Developers Console 建 Messaging API channel
到
developers.line.biz登入 → 建 Provider → 新增 Messaging API channel。填基本資訊送出。 -
拿 Channel Secret 跟 Access Token
Channel 建好後,在 Basic settings 分頁抄下 Channel Secret;在 Messaging API 分頁最下面 Channel Access Token 按 Issue 產一個抄下來。這兩個等下要存進 n8n Credentials。
-
n8n 新 workflow:Webhook 節點 POST + 生 URL
n8n 建新 workflow,加 Webhook 節點:Method = POST、Path =
line-bot、Response = Immediately(Line 要求 3 秒內回 200)。抄下 Production URL——但這時還不能用,因為 workflow 沒 Active。先按 Listen for test event 用 Test URL 開發。 -
Line 那邊 Webhook URL 填 n8n URL
回 Line Console 的 Messaging API 分頁 → Webhook settings → 貼 n8n Test URL → 開啟 Use webhook。按 Verify 應該顯示 Success(Line 會實測打一次)。
-
用手機加 Line Bot 為好友、傳訊息
用手機掃 Line Console 顯示的 QR code 加官方帳號為好友,傳一句「你好」。回 n8n canvas,Webhook 節點會亮綠、output 出現 Line 的 payload。找到訊息內容的路徑,通常是:
{{ $json.body.events[0].message.text }} → 使用者輸入的文字 {{ $json.body.events[0].replyToken }} → 回覆這則要用的 token {{ $json.body.events[0].source.userId }} → 使用者 ID -
接 AI Agent 節點產生回覆
接 AI Agent 節點(第 21 章)。Text 欄位用 Expression 帶入使用者訊息:
{{ $json.body.events[0].message.text }}。掛好 Chat Model(OpenAI GPT-4o mini 或其他)。可視情況加 Memory 記住對話。 -
接 HTTP Request 節點打 Line Reply API
接 HTTP Request:Method = POST、URL =
https://api.line.me/v2/bot/message/reply、Authentication 選 Header Auth,帶Authorization: Bearer <你的 Channel Access Token>。Body 用 JSON:{ "replyToken": "{{ $('Webhook').item.json.body.events[0].replyToken }}", "messages": [ { "type": "text", "text": "{{ $json.output }}" } ] }$('Webhook')是回頭抓 Webhook 節點的 replyToken;$json.output是 AI Agent 剛產生的回覆。 -
Save + Active,把 Line webhook 換成 Production URL
Save 存檔、開 Active。回 Line Console 把 Webhook URL 從 Test URL 換成 Production URL(
/webhook/line-bot)。手機再傳訊息一次——秒回。
常見卡關
-
Test URL 打完沒反應、n8n 沒收到
兩個原因:(a)沒按 Listen for test event——Test URL 只在 listen mode 存活;(b)Listen session 過期了(收到一次事件會結束、久沒事件實務上也會停)——重按一次就好。另外要看 URL 有沒有選對——複製時務必看清楚是
/webhook-test/那條。 -
Production URL 打了回 404 Not Found
幾乎一定是 workflow 沒有 Active——右上開關關著時 Production URL 就是 404。解法:Save 完把右上 Active 開啟。如果 Active 開了還 404,檢查 Path 有沒有跟你打的一致(大小寫敏感、多空白會出事)。
-
Webhook 有收到但 body 是空的
對方的 request 沒設
Content-Type,或者設成text/plain而不是application/json——n8n 不會自動 parse。要對方在打時加 headerContent-Type: application/json;或者 Webhook 節點 Options → Raw Body 打開,用 Code 節點自己 parse。另外注意 n8n Webhook 節點單次 payload 最大 16MB——超過會直接被擋掉,大檔案要走 upload URL 或分段丟。 -
回 405 Method Not Allowed
對方用的 Method 跟 Webhook 節點設定不一致——外部 POST 但你節點設 GET,或反過來。到節點面板改成一致的 Method。有時候是外部服務預設用 GET 但你以為是 POST,用 curl 或 Postman 手動測一次確認。
-
對方一直重試同一個 request(同一筆資料處理很多次)
對方(Stripe / Line / GitHub)沒在時效內收到 200 就會重試。原因通常是你選 Response = When last node finishes 而 workflow 跑超過對方 timeout(Line 是 3 秒、Stripe 是 3 秒、GitHub 是 10 秒)。解法:改成 Response = Immediately,讓 n8n 秒回 200,處理放背景跑。
-
打太快被 n8n 拒掉、Executions 排隊
n8n instance 有 concurrency 限制——短時間打進來太多,會有請求塞車或直接被拒。解法:(a)開 Queue Mode(附錄 B)加 worker;(b)搭配 Split In Batches 或 Wait 節點錯開處理;(c)把「收到就存」跟「後續處理」拆兩個 workflow,前者只做寫入很快回,後者定時來讀。
-
Auth 開了但對方一直 401
對方 header 名稱或值打錯——大小寫敏感、多空白、value 前後有 quote 都會 fail。用 curl 手動打模擬對方帶的 header 測一次;或者對方文件的 header 名字跟 n8n Header Auth 節點裡的欄位名要對齊。也可能是選錯 Authentication 類型(Basic vs Header)。
-
Executions 看不到 Webhook 觸發的紀錄
Executions 分頁預設只顯示最近的成功執行——上方 filter 有 Include failed 打開才看得到失敗的。另外把 workflow Setting 裡的 Save Execution Progress 打開才能看每個節點的細節。開發階段建議 Save Manual / Save Failed / Save Successful 三個都設 Save。
收尾:22 章走完,接下來換你做
你已經走完這整本《Woow n8n 入住指南》。從第 1 章「什麼是 n8n」到第 22 章「Webhook」,這條學習路徑帶你從「聽過 Zapier」走到「能自己接 Line Bot 給 workflow 一顆會想的腦」。整理一下你現在能做的事:
- 能自己開新 workflow、拉節點、串 Trigger + Action + Core(第 7~10 章)。
- 能整合公司最常用的 SaaS——Slack、Gmail、Google Sheets、Drive、任何有 API 的服務(第 11~13 章)。
- 能寫 Expression 抓上游資料、能用 IF/Switch 做條件、能用 Merge/Split 處理多筆(第 14~16 章)。
- 能處理錯誤、能整形資料、能抽 sub-workflow 重用、能寫幾行 Code 逃生(第 17~20 章)。
- 能讓 workflow 有 AI 判斷力、能收外部 webhook(第 21~22 章)。
剩下的就是動手。真心建議:找一個公司內部過去三個月來重複做過的事——每天早上手動整理報表、每週寄提醒信、客人來 Line 一律先手動回制式訊息——開一個 workflow 把它幹掉。第一個 workflow 上線那一刻你會發現:「原來這種事真的可以不用人做。」然後就會停不下來。
過程遇到卡關的時候:
- 忘記某個節點怎麼設 → 翻對應章節(章節目錄一開始就有列)。
- 節點紅色框、跑不動 → 翻 附錄 B · 常見錯誤排錯。
- 設定不知道在哪 → 翻附錄 A · 設定速查。
- 想深入了解 self-host → 翻附錄 C · 底層架構。
祝你的 workflow 都跑得順、上線都不出事、老闆看到自動化成果都給你加薪。有問題永遠可以回來翻章節,或者到 n8n 官方社群 community.n8n.io 問——多的是同路人。
常見問題
Webhook URL 會不會被爬蟲爬到、被外人猜到亂打?
/webhook/form-abc123)如果是像 form-abc123 這種好猜的字串,機器人掃站確實可能撞到。用 UUID 當 path(例:/webhook/8f3b2c9a-...),機率極低。再加 Header Auth 更安全。真的很怕就把 URL 當作只有一層鎖、實際靠 auth 或 IP 白名單當第二層。一個 workflow 可以有幾個 Webhook 節點?
/webhook/order-create、/webhook/order-cancel)走不同分支處理。