< 2ms routing latency · Cloudflare edge · 1,000 webhooks/month free
The problem
One URL. Configured once. Expected to never change.
The fix
# Every time you switch branches... stripe webhooks update wh_xxx \ --url https://pr-NEW.myapp.com/webhooks # Then when you merge... stripe webhooks update wh_xxx \ --url https://myapp.com/webhooks # Oh you forgot to update the Paddle one # And the dev on your team has a different branch
# Configure Stripe once, forever: stripe webhooks update wh_xxx \ --url https://hookman.dev/w/acme/pay # Register your branch deployment: hookman register \ --branch feature/checkout \ --url https://pr-42.myapp.com # Done. Hookman routes it.
Setup
Sign up and create a project. Pick a slug — this becomes part of your Hookman endpoint. Your project maps to one webhook integration.
Tell Hookman where each branch lives. Use the dashboard, the CLI, or drop the GitHub Action into your workflow.
hookman register \ --branch feature/checkout \ --url https://pr-42.myapp.com/api/webhooks/stripe
In Stripe (or wherever), update the webhook endpoint URL to your Hookman endpoint. You'll never need to change this URL again.
stripe listen \ --forward-to https://hookman.dev/w/acme/payments
Flip the active deployment in the dashboard or CLI. No Stripe dashboard. No copy-pasting URLs. The GitHub Action handles it automatically on every deployment.
hookman switch \ --project payments \ --branch feature/checkout # Webhooks now routed to feature/checkout
How routing works
Rules are checked first; a match routes straight there and skips fan-out. Only when no rule matches does the request hit the active deployment — and that's when it's also mirrored to any fan-out deployments. Every delivery is logged and replayable.
Capabilities
Flip which deployment is live from the dashboard or hookman switch. Every webhook with no matching rule follows the active deployment — instantly, no provider changes.
Match on a header, query param or a field in the JSON body. First match wins; otherwise it falls through to the active deployment. The CLI and GitHub Action can register rules per-branch on deploy.
Mirror every default-routed webhook to extra deployments at once — test a refactor against real traffic while production keeps running. Toggle it per deployment.
Every payload is stored. Re-deliver it to any deployment without triggering a real payment or event again — syntax-highlighted bodies and headers in the log viewer.
The GitHub Action registers a deployment (and its branch rule) on every push, and tears it down when the PR merges. Scoped API keys keep CI access tight.
If your branch is still spinning up, Hookman retries delivery with backoff rather than dropping the webhook. Pro and Team.
Automation
The Hookman GitHub Action listens for deployment_status events — which fire when Vercel, Netlify, or Cloudflare Pages post a preview URL back to GitHub. It registers the deployment automatically, and removes it when the PR closes.
.github/workflows/hookman.ymlname: Hookman webhook routing on: deployment_status: # Vercel/Netlify/CF Pages posts the preview URL here pull_request: types: [closed] # Clean up on merge jobs: hookman: runs-on: ubuntu-latest steps: - uses: hookman-dev/register-deployment@v1 with: api-key: ${{ secrets.HOOKMAN_API_KEY }} org: acme project: payments webhook-path: /api/webhooks/stripe
Works with Vercel, Netlify, Cloudflare Pages, Render, Railway, and any platform that posts deployment URLs back to GitHub. Full reference →
Pricing
For solo devs and side projects.
For active teams shipping regularly.
For teams with multiple collaborators.
Get a Hookman endpoint in 60 seconds. Free to start, no card required.
Get your endpoint free