Tips > Data, APIs & Webhooks

Understand Test vs. Production Webhook URLs

n8n provides two distinct URLs for every Webhook node: a **test URL** and a **production URL**.

TipIntermediate2 min read

n8n provides two distinct URLs for every Webhook node: a test URL and a production URL. Confusing them is one of the most common beginner mistakes. The test URL only works when you have the workflow open in the editor and click "Listen for Test Event." The production URL only works when the workflow is activated.

Real-world example: You configure Stripe to send events to your webhook URL, but nothing happens. Likely cause: you copied the test URL and activated the workflow, or you copied the production URL but forgot to activate.

Test URL format:
https://your-n8n.example.com/webhook-test/<path>

Production URL format:
https://your-n8n.example.com/webhook/<path>
```text
The key differences:

```yaml
Test URL (/webhook-test/...):
  works_when: Editor is open AND "Listen for Test Event" is clicked
  purpose: Development and debugging
  behavior: Captures one request, then stops listening
  data_visible: Yes, immediately in the editor

Production URL (/webhook/...):
  works_when: Workflow is activated (toggle ON)
  purpose: Live traffic from external systems
  behavior: Continuously listens for requests
  data_visible: Only in execution history
```text
A safe development workflow:

```text
1. Build and test with the TEST URL
   --> Send test requests while "Listen for Test Event" is active
   --> Verify data flows through all nodes

2. Pin successful test data (click "Pin Data" on the Webhook node output)
   --> Now you can modify downstream nodes without re-sending webhooks

3. When ready, activate the workflow
   --> Configure the external service with the PRODUCTION URL (no "-test")
   --> Verify in Execution History that real events are processing
```text
> **Warning: Common gotcha with n8n Cloud**
>
> On n8n Cloud, the URLs include your instance subdomain: `https://yourname.app.n8n.cloud/webhook/...`. If you switch between self-hosted and Cloud, all external services need their webhook URLs updated.

This distinction prevents the frustration of webhooks that "work in testing but not in production" or vice versa.

**Related:** [Set a Unique Encryption Key and Back It Up](../security-best-practices/01-set-a-unique-encryption-key-and-back-it-up.md) | [Use the HTTP Request Node as a Universal Connector](../integration-patterns/01-use-the-http-request-node-as-a-universal-connector.md)

Want this running in your stack?

I build production n8n and Cloudflare automation for teams — the same engineering behind HarperFlow. Fixed-price, escrow-protected, US-based.