
Step by Step Guide to solve n8n Webhook Invalid URL Errors
Who this is for: n8n developers and integrators who receive “Invalid URL” errors when configuring Webhook nodes, whether in local development or production. We cover this in detail in the n8n Webhook Errors
Quick Diagnosis
The error appears when the webhook URL is malformed, uses an unsupported protocol, or contains unresolved expressions.
Quick fix
- Open the Webhook node → Webhook URL field.
- Verify the URL starts with
https://(orhttp://for local testing). - Remove stray spaces, line‑breaks, or un‑escaped characters (
{,},|, etc.). - If you use expressions, wrap the entire URL in double quotes and test it with the Execute Node button.
- Save the workflow and re‑trigger the webhook.
If the problem persists, follow the step‑by‑step troubleshooting below.
1. Why n8n Marks a URL as “Invalid”
If you encounter any duplicate webhook ids resolve them before continuing with the setup.
Root‑cause table – each row shows a single validation rule that n8n applies.
| Root Cause | What n8n Checks | Typical Symptom |
|---|---|---|
Missing protocol (http:// or https://) |
URL must match ^https?:// regex |
“Invalid URL” immediately after saving |
Illegal characters (spaces, <, >, |, {, }) |
Parsed with Node.js new URL() |
Error appears only after workflow activation |
Unresolved expression ({{$json["url"]}}) |
Expression must evaluate to a string before validation | Error shows only when expression returns undefined or an object |
Trailing slash misuse (…/webhook/ vs …/webhook) |
n8n trims trailing slash for GET, but not for POST | “Invalid URL” only on POST requests |
Port out of range (:0 or :65536) |
Port must be 1‑65535 | Validation fails on save |
| Proxy/reverse‑proxy rewrite | URL must be reachable from n8n’s runtime environment | “Invalid URL” even though the URL looks correct in the browser |
2. Step‑by‑Step Diagnosis
If you encounter any payload validation failure resolve them before continuing with the setup.
2.1 Validate the URL Manually
Context – Use Node’s URL parser to confirm the string is syntactically valid.
node -e "new URL(process.argv[1])" "YOUR_URL_HERE"
If Node throws TypeError: Invalid URL, the same error will surface in n8n.
2.2 Check for Hidden Characters
Context – Hidden line‑breaks or tabs can slip in when copying URLs.
- Open the node’s Raw JSON view (three‑dot menu → Export as JSON).
- Search for
\n,\r, or\tand delete any occurrences.
2.3 Verify Expression Resolution
When the URL is built dynamically, test the expression first.
Context – The Execute Node UI can render an expression without running the whole workflow.
// Example expression that may fail
{{ $json["url"] }}
Fix – Wrap the expression in double quotes so the result is a plain string:
"{{ $json["url"] }}"
Run Execute Node → Test Expression to see the rendered URL, e.g. https://api.example.com/123/callback.
2.4 Confirm Protocol Compatibility
Context – n8n enforces HTTPS for production for security reasons.
- Local development –
http://localhost:5678/webhook/123works only if n8n runs on the same host. - Production – Use
https://with a valid TLS certificate; otherwise n8n rejects the URL.
2.5 Test Reachability from the n8n Runtime
Context – The URL must be reachable from the same container or host where n8n runs.
curl -I "YOUR_WEBHOOK_URL"
A DNS, firewall, or network failure will cause n8n to flag the URL as invalid on activation.
3. Real‑World Fixes & Code Samples
3.1 Hard‑Coded Valid URL
Context – A static webhook path that works out of the box.
{
"parameters": {
"httpMethod": "POST",
"path": "order/receive",
"responseMode": "onReceived"
},
"name": "Webhook",
"type": "n8n-nodes-base.webhook"
}
Resulting URL (n8n hosted at https://n8n.example.com):
https://n8n.example.com/webhook/order/receive
3.2 Dynamic URL Using Expressions
Context – Adding a customer ID to the webhook path.
{
"parameters": {
"httpMethod": "POST",
"path": "callback/{{ $json.customerId }}",
"responseMode": "onReceived"
},
"name": "Webhook",
"type": "n8n-nodes-base.webhook"
}
Expression test (run in Execute Node):
// Input: { "customerId": "CUST-9876" }
// Rendered path: callback/CUST-9876
3.3 Guarding Against undefined Values
Context – Providing a fallback when the source field is missing.
{
"parameters": {
"httpMethod": "POST",
"path": "callback/{{ $json.customerId || 'default' }}",
"responseMode": "onReceived"
},
"name": "Webhook",
"type": "n8n-nodes-base.webhook"
}
The || 'default' ensures the URL never contains an empty segment, preventing the “Invalid URL” error.
4. Checklist: Before Saving a Webhook Node
| Steps | Item |
|---|---|
| 1 | URL starts with http:// or https:// (HTTPS recommended). |
| 2 | No spaces, line‑breaks, or unescaped special characters. |
| 3 | All dynamic parts are wrapped in double quotes and evaluate to a string. |
| 4 | Port (if present) is between 1‑65535. |
| 5 | URL is reachable from the n8n host (curl -I). |
| 6 | If behind a reverse proxy, the external URL matches the internal route. |
5. EEFA (Experience, Errors, Fixes, Advice)
| Situation | Why it Happens | Production‑Grade Fix |
|---|---|---|
URL contains { or } |
new URL() treats them as illegal characters. |
Encode them (%7B, %7D) or use encodeURIComponent() in an expression. |
| Self‑signed cert on HTTPS | n8n validates TLS by default and rejects insecure endpoints. | Use a valid certificate in production; for local testing set NODE_TLS_REJECT_UNAUTHORIZED=0 only temporarily. |
| Webhook behind a corporate proxy | Proxy rewrites the host, making the saved URL unreachable. | Use the proxy’s public address in the Webhook URL and configure HTTP_PROXY/HTTPS_PROXY env vars for n8n. |
| Dynamic URL built from a CSV column | Missing values create empty segments (…/callback//). |
Add a fallback ({{ $json.column || 'unknown' }}) or filter rows before the webhook node. |
| Port 0 or >65535 | Out‑of‑range ports are rejected by the URL parser. | Choose a valid port or omit the port if using the default (80/443). |
7. Next Steps
- Secure your webhook – add HMAC verification (see the “Webhook authentication” page).
- Scaling webhooks – use n8n’s Workflow Trigger with a queue (covered in the “Webhook scaling” pillar section).
Conclusion
The “Invalid URL” error is a deterministic validation failure: n8n checks protocol, characters, expression resolution, port range, and network reachability. By confirming the URL format, sanitising hidden characters, guaranteeing that expressions return plain strings, and testing reachability from the runtime environment, you eliminate the error in both development and production. Apply the checklist and EEFA fixes above to keep your webhook integrations reliable, secure, and ready for scale.



