N8N Webhook Tutorial: Trigger Workflows from Any App (2026)
Webhooks let external apps push data into your N8N workflows in real time. No polling. No delays. When something happens in Stripe, GitHub, Typeform, or your own custom app, N8N receives the event instantly and kicks off whatever automation you need. This tutorial walks you through setting up N8N webhooks from scratch, processing incoming data, and connecting it all to real downstream actions.
How N8N Webhooks Work
A webhook is a URL that listens for incoming HTTP requests. When an external service sends data to that URL, N8N treats it as a trigger and starts the workflow.
The flow looks like this:
- N8N creates a unique webhook URL when you add a Webhook node to your workflow.
- An external app sends an HTTP POST request to that URL whenever an event occurs (new payment, form submission, code push, etc.).
- N8N receives the payload and passes the data to the next node in your workflow.
- Your workflow processes the data and routes it wherever it needs to go.
That is the entire concept. The Webhook node is the entry point. Everything after it is up to you.
Step 1: Create Your First Webhook in N8N
Open your N8N instance and create a new workflow. Then follow these steps.
Add the Webhook Node
Click the + button to add a new node. Search for "Webhook" and select it. This becomes the trigger for your workflow.
Configure the HTTP Method
Set the HTTP method to POST. Most webhook providers send POST requests with a JSON body. You can also accept GET, PUT, or DELETE if your use case requires it, but POST covers 90% of scenarios.
Copy the Webhook URL
N8N generates two URLs for every Webhook node:
- Test URL: Active only when you click "Listen for Test Event" in the editor. Use this during development.
- Production URL: Active when the workflow is turned on. Use this in your live integrations.
Copy the test URL for now. You will switch to the production URL once everything works.
Test with a curl Command
Click "Listen for Test Event" in N8N, then open your terminal and run:
curl -X POST https://your-n8n-instance.com/webhook-test/your-unique-id \
-H "Content-Type: application/json" \
-d '{"name": "Jane Smith", "email": "jane@example.com", "event": "signup"}'
Switch back to N8N. You should see the incoming data displayed in the Webhook node output. If you see the JSON payload, your webhook is working.
Step 2: Process Incoming Data
Raw webhook payloads often contain more data than you need, or the field names do not match what downstream services expect. The Set node fixes this.
Accessing Webhook Payload Fields
Every field from the incoming JSON is available through expressions. If your payload looks like this:
{
"name": "Jane Smith",
"email": "jane@example.com",
"event": "signup",
"metadata": {
"source": "landing-page",
"campaign": "spring-2026"
}
}
You can reference these values in any subsequent node using expressions like:
{{ $json.name }}returns "Jane Smith"{{ $json.email }}returns "jane@example.com"{{ $json.metadata.source }}returns "landing-page"
Data Transformation with the Set Node
Add a Set node after your Webhook node. Use it to rename fields, combine values, or strip out data you do not need. For example:
- Map
nametofull_name - Create a new field
lead_sourcefrommetadata.source - Add a
received_attimestamp using{{ $now.toISO() }}
This keeps your downstream nodes clean and predictable. Every service gets exactly the data format it expects.
Step 3: Connect to Downstream Actions
Here is where webhooks get powerful. Once the data is cleaned up, you can route it to any combination of services.
Route Data Based on Payload Content
Use the IF node to create conditional branches. For example, if your webhook receives events from multiple sources, you can route them differently:
- If
eventequals "signup", add the contact to your CRM and send a welcome email. - If
eventequals "purchase", update your order database and trigger a fulfillment workflow. - If
eventequals "support_ticket", create a ticket in your helpdesk and notify the support team on Slack.
A single webhook endpoint can handle multiple event types. The IF node lets you branch the logic cleanly without creating separate workflows for each event.
Connect Multiple Services in Parallel
N8N lets you connect one node to multiple downstream nodes. After your IF node, you might send data to Google Sheets and Slack and your CRM all at once. They run in parallel, so your workflow stays fast.
If you are new to building workflows in N8N, our beginner's guide to building your first N8N workflow covers the fundamentals.
Real-World Webhook Examples
Theory is fine, but these are the webhook workflows we build most often for clients.
Stripe Payment Received: Update CRM + Send Confirmation
Stripe sends a payment_intent.succeeded event to your N8N webhook. The workflow extracts the customer email, payment amount, and product ID. It updates the contact record in HubSpot (or whatever CRM you use), then sends a personalized confirmation email through SendGrid. Total setup time: about 30 minutes.
Typeform Submission: Enrich Lead + Google Sheets + Slack
A prospect fills out your intake form on Typeform. Typeform fires a webhook to N8N with the form data. The workflow enriches the lead using an API call (company size, industry, LinkedIn profile), writes the enriched data to a Google Sheets tracking spreadsheet, and posts a summary to your sales team's Slack channel. Your team sees qualified leads in real time instead of checking Typeform manually.
GitHub Push: Deploy Notification + Team Alert
A developer pushes to the main branch. GitHub sends a webhook to N8N with the commit details. The workflow checks if the push includes changes to specific directories, sends a deployment notification to your staging environment via API call, and alerts the team on Slack with the commit message, author, and changed files. Good for small teams that want lightweight CI/CD notifications without a full pipeline.
Custom App Event: Trigger AI Processing Pipeline
Your internal app fires a webhook when a customer uploads a document. N8N receives the file reference, downloads it, sends the content to an LLM for extraction or summarization, stores the results in your database, and notifies the account manager. This pattern is common for lead generation automation and document processing pipelines.
Webhook Security: Protecting Your Endpoints
Any public URL can receive requests from anyone. You need to verify that incoming requests are legitimate. Here are the three main approaches.
Header Authentication
Set a secret token in your Webhook node's authentication settings. The sending app must include this token in the request headers. If the token is missing or wrong, N8N rejects the request. This is the simplest method and works with any app that lets you customize webhook headers.
Signature Validation
Services like Stripe and GitHub sign every webhook payload with a secret key. You can add a Code node after your Webhook to verify the signature before processing any data. If the signature does not match, the workflow stops. This is the most secure approach for services that support it.
IP Whitelisting
If you self-host N8N behind a reverse proxy like Nginx, you can restrict webhook endpoints to specific IP ranges. Stripe, GitHub, and most major providers publish their webhook IP ranges. This adds a network-level layer of protection on top of header or signature authentication.
For production workflows, combine at least two of these methods. Header auth plus signature validation covers most cases well.
Webhook Not Firing? Common Troubleshooting Steps
Webhooks are reliable once configured, but a few issues come up regularly during setup.
- Using the test URL in production. Test URLs only work when you are actively listening in the N8N editor. Switch to the production URL and make sure the workflow is activated.
- Workflow is not active. The production webhook URL only responds when the workflow toggle is switched on. Check the workflow list to confirm it is active.
- Firewall or network blocking. If you self-host N8N, make sure your server's firewall allows incoming HTTP traffic on the correct port. Check that your reverse proxy is forwarding requests to N8N.
- Wrong HTTP method. If your app sends a POST but your Webhook node expects GET (or vice versa), the request will fail silently. Match the method to what the sending app uses.
- Payload format mismatch. Some apps send form-encoded data instead of JSON. Check the Content-Type header and adjust your Webhook node's settings if needed.
- URL typo. Copy the URL directly from N8N. Do not type it manually. One wrong character and the request goes nowhere.
N8N's execution log shows every incoming request and any errors that occurred. Check there first when something is not working.
Need help building webhook-powered workflows?
We build N8N automation systems for businesses every day. Book a free call and we will map out your webhook architecture together.
Book Your Free CallFrequently Asked Questions
Can I use N8N webhooks with any app?
Yes. Any application that can send an HTTP request can trigger an N8N webhook. This includes Stripe, Shopify, GitHub, Typeform, HubSpot, custom apps, and thousands of other services. If the app supports outgoing webhooks or has an API that can make HTTP calls, you can connect it to N8N. For apps that do not have native webhook support, you can use intermediary services or write a small script to send HTTP requests to your N8N webhook URL.
Is the N8N webhook URL permanent?
The webhook URL stays the same as long as you do not delete and recreate the Webhook node. N8N generates a unique URL per Webhook node, and it persists across workflow updates and server restarts. If you are self-hosting, the URL is tied to your domain, so it remains stable indefinitely. Just be aware that duplicating a workflow creates a new Webhook node with a different URL.
How do I secure my N8N webhook endpoint?
There are several ways to secure N8N webhooks. You can require a secret header token that the sending app must include with every request. You can validate webhook signatures, which services like Stripe and GitHub support natively. You can restrict access by IP address using a reverse proxy like Nginx. For maximum security, combine header authentication with signature validation. Our N8N automation services include security configuration as part of every webhook implementation.