How to Test n8n Webhooks — Debug Trigger Nodes
n8n's Webhook node is a powerful trigger — but testing it in real environments can be frustrating. This guide shows you how to capture, inspect, and debug n8n webhook payloads before your workflow goes live.
The n8n Webhook Node: Trigger vs Respond
n8n's Webhook node has two distinct modes:
Webhook (Trigger node)
Receives an incoming HTTP request and starts the workflow. This is the entry point — n8n generates a unique URL for you. The node outputs the full request: body, headers, query params, and method.
Respond to Webhook node
Sends a response back to the caller — useful when the webhook sender (e.g., Stripe) expects a specific response body or when building webhook-based APIs that return data to the caller.
The most common testing challenge is the Trigger node: n8n generates a test URL and a separate production URL, and they behave differently. This guide covers both.
Setting Up Requex.me as Your n8n Test URL
Before wiring your webhook source to n8n, use Requex.me to capture the raw payload first. This lets you understand the exact data structure before building your n8n workflow.
Get a Requex capture URL
Visit requex.me — your unique URL is generated instantly. Copy it.
Paste into your webhook source
In the service that will trigger your n8n workflow (Stripe, GitHub, your app), set the webhook URL to your Requex URL.
Trigger the event
Fire a test event. The full payload appears in Requex in real-time — inspect the JSON structure, field names, and header values.
Build your n8n workflow with real field names
Now that you know the exact field names and structure, configure your n8n Webhook node and downstream nodes with confidence. Replace the webhook URL with the n8n test URL when ready.
# Send a test payload directly to your Requex URL (simulating your webhook source)
curl -X POST https://requex.me/hook/YOUR-WEBHOOK-ID \
-H "Content-Type: application/json" \
-d '{"event": "user.signed_up", "user_id": 4521, "email": "[email protected]", "plan": "pro"}'Reading Captured Payload Back in n8n Expressions
Once you know your payload structure from Requex inspection, you can write n8n expressions correctly:
For a payload like {"event": "user.signed_up", "user_id": 4521, "email": "[email protected]"}:
{{ $json.body.email }}→ [email protected]{{ $json.body.user_id }}→ 4521{{ $json.body.event }}→ user.signed_up{{ $json.headers["content-type"] }}→ application/json⚠️ n8n data path note: The Webhook node wraps the incoming request. Body fields are accessed via $json.body.fieldName, headers via $json.headers.headername (lowercase), and query params via $json.query.paramName.
Test vs Production Webhook URL in n8n
n8n generates two distinct URLs for each Webhook node:
| URL type | When to use | Behaviour |
|---|---|---|
| Test URL | During workflow development in n8n editor | Only active while the editor is open and "listening". Single-use — captures one request then stops. |
| Production URL | After activating the workflow | Always active when the workflow is activated. Processes every incoming request. |
💡 Best practice: Always use the test URL during development. Never point production services at n8n's test URL — it only captures a single request and requires the editor to be open.
Common n8n Webhook Errors
Trigger not firing / no data captured
Most likely causes: (1) You're sending to the test URL but the editor isn't in listening mode — click "Listen for Test Event" first. (2) Your n8n instance URL isn't publicly accessible — use Requex.me to verify the source is sending correctly, then check your n8n instance networking.
401 Unauthorized
Your Webhook node has authentication enabled (Basic Auth or Header Auth) but the sender isn't including the expected credentials. Check the Webhook node authentication settings and update the sender accordingly.
Workflow not active (production URL returns 404)
The production URL only works when the workflow is activated. Go to the workflow list, find your workflow, and toggle it to "Active". The production URL will then accept requests.
Expression error: Cannot read property of undefined
The field path in your n8n expression doesn't match the actual payload structure. Use Requex.me to capture the real payload and verify the exact field names and nesting before writing expressions.
Quick Reference cURL Commands
Send a test payload to n8n test URL:
curl -X POST https://your-n8n-instance.com/webhook-test/YOUR-WEBHOOK-ID \
-H "Content-Type: application/json" \
-d '{"event": "test.event", "data": {"key": "value"}}'Send to production URL (workflow must be active):
curl -X POST https://your-n8n-instance.com/webhook/YOUR-WEBHOOK-ID \
-H "Content-Type: application/json" \
-d '{"event": "user.created", "user_id": 123}'Capture to Requex first (inspect payload before n8n):
curl -X POST https://requex.me/hook/YOUR-REQUEX-ID \
-H "Content-Type: application/json" \
-d '{"event": "user.created", "user_id": 123}'Related Resources
Inspect Your n8n Webhook Payload
Get a free capture URL — understand your payload structure before building your n8n workflow.
Open Webhook Tester →