n8n is a powerful automation tool, but it has a webhook problem: changing a workflow generates a new URL. If you have Stripe, GitHub, Shopify, or any other service pointing at that URL, you need to update all of them manually.
Hookpipe sits between your providers and n8n. You get a stable URL that routes to whatever workflow version is currently active. Swap versions, test canary releases, or roll back, all without touching your external integrations.
Providers always hit the same Hookpipe URL. You change the destination in Hookpipe, not in every service.
Route by headers, payload fields, or query params. Send v1 traffic to the old workflow, v2 to the new one.
Buffer bursts so your n8n instance doesn't get overwhelmed. Hookpipe queues and throttles delivery.
Swap workflow URLs in seconds. No provider reconfiguration, no outage window.
Route traffic based on an HTTP header. Your providers send X-App-Version: 2.0 and Hookpipe forwards to the right workflow.
# Hook for v1 workflow
curl -X POST https://hookpipe.app/api/hooks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "onboarding-v1",
"destinationUrl": "https://n8n.yourcompany.com/webhook/onboarding-v1",
"transformConfig": {
"filters": [
{ "field": "headers.x-app-version", "operator": "equals", "value": "1.0" }
]
}
}'
# Hook for v2 workflow
curl -X POST https://hookpipe.app/api/hooks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "onboarding-v2",
"destinationUrl": "https://n8n.yourcompany.com/webhook/onboarding-v2",
"transformConfig": {
"filters": [
{ "field": "headers.x-app-version", "operator": "equals", "value": "2.0" }
]
}
}'
Providers always hit the v2 hook URL. Traffic without the header or with an unknown version goes to your default — just add a third hook without filters as the catch-all.
Test a new n8n workflow with real traffic before switching over completely. Route a percentage of traffic to the new version.
The easiest way: use a header or payload field to control routing. A "canary" hook with a filter:
{
"filters": [
{ "field": "payload.canary", "operator": "equals", "value": "true" }
]
}
Send test traffic with {"canary": true} to the new workflow. When ready, update your main hook's destination URL:
curl -X PUT https://hookpipe.app/api/hooks/HOOK_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"destinationUrl": "https://n8n.yourcompany.com/webhook/onboarding-v2"}'
All traffic now hits v2. The old n8n workflow can be decommissioned or kept as a rollback target.
n8n expects specific JSON structures. If your providers send something different, transform it before it reaches n8n. No middleware code required.
{
"fieldMapping": {
"email": "customer.email",
"amount": "payment.amount_cents",
"currency": "payment.currency",
"subscription_id": "subscription.id"
},
"filters": [
{ "field": "type", "operator": "equals", "value": "payment_succeeded" }
]
}
n8n receives a flat, clean payload instead of the nested provider format.
When deprecating a workflow version, keep the old hook active for legacy clients while new clients use the new URL:
Monitor traffic to Hook A. When it drops to zero, delete the hook and the old workflow.
Create a hook for your n8n workflow. The receive URL is:
https://hookpipe.app/hooks/YOUR_HOOK_ID
Update Stripe, GitHub, or whoever sends webhooks to use your Hookpipe URL instead of the n8n URL.
When you deploy a new n8n workflow, just update the destination URL:
curl -X PUT https://hookpipe.app/api/hooks/HOOK_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"destinationUrl": "https://n8n.yourcompany.com/webhook/new-version"}'
No more URL hunting. No more manual provider updates.