The Webhook node is the front door of almost every n8n integration. Whenever you need to receive data from an external service — a form submission, a Stripe event, a GitHub push, a custom app — the Webhook node is what catches it.
This tutorial walks through the Webhook node end-to-end: setting it up, parsing the request body, sending a response, and chaining it to a real action. A copy-paste workflow JSON is in the comments.
What the Webhook node does
The Webhook node creates an HTTP endpoint on your n8n instance. When something hits that URL with a POST (or GET), n8n wakes up the workflow and passes the request data downstream as a JSON object you can use like any other node output.
It replaces the need for a custom API server for simple integrations.
Step 1: Add and configure the Webhook node
- Create a new workflow in n8n
- Click + and search for "Webhook"
- Set HTTP Method to POST (most common for receiving data)
- Set Response Mode to "When Last Node Finishes" if you want to return data, or "Immediately" if you just want to acknowledge receipt fast
- Copy the Test URL shown — you'll use this to send test requests
Step 2: Trigger a test request
With the workflow open and the Webhook node selected, click Listen for Test Event. Then send a POST request to the test URL:
curl -X POST https://your-n8n-instance/webhook-test/YOUR-ID \
-H "Content-Type: application/json" \
-d '{"name": "Jane", "email": "jane@example.com"}'
The node will show the incoming data immediately. You'll see the body parsed into {{ $json.name }} and {{ $json.email }} — ready to use in any downstream node.
Step 3: Use the data downstream
After the Webhook node you can add any node — a Google Sheets append, a Slack message, an email send, a database write. Reference the incoming fields with:
-
{{ $json.name }}— the name field from the POST body -
{{ $json.email }}— the email field -
{{ $json.body }}— full raw body if you sent something non-standard
For headers (useful for webhook signatures/auth): {{ $request.headers['x-my-header'] }}
Step 4: Send a response back
If the calling service expects a response (many do — Stripe, Typeform, etc.), add a Respond to Webhook node at the end of your chain:
- Add the Respond to Webhook node after your last action node
- Set Response Body to whatever you want to return — e.g.
{ "status": "received" } - Set Response Code to 200
Now the external service gets a proper acknowledgment instead of a timeout.
Step 5: Switch to the Production URL
Once your workflow is tested:
- Activate the workflow (toggle in top right)
- Switch your external service from the Test URL to the Production URL shown in the Webhook node settings
- The production URL stays stable — it won't change if you edit the workflow
Common patterns
Webhook + email notification: Catch a form submission → send an email via Gmail or SMTP node → respond with 200.
Webhook + CRM write: Catch a lead form → append to Google Sheets or POST to your CRM API → acknowledge.
Webhook + Slack alert: Catch a monitoring ping → post to Slack → respond OK.
Webhook + conditional logic: Catch an event → IF node to route by type → different actions per branch.
All four of these patterns are in the n8n Workflow Starter Pack (link below) as ready-to-import JSON files.
Free workflow JSON
Drop a comment below and I'll share the Webhook → Google Sheets workflow JSON. Already posted it as the first comment.
If you're building out a full automation stack, the n8n Workflow Starter Pack ($29) has 5 production-ready workflows covering the most common patterns — lead capture, form → Sheets, Stripe receipts, CRM sync, and scheduled reports. Each is documented and import-ready.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.