You know the loop. Your webhook handler breaks. You fix something. Then you go back to the Stripe dashboard, dig out the event, click "resend", and wait to see if it worked this time.
It didn't. So you do it again.
I did that more times than I want to admit. At some point I just wanted to fix the code and send the same request again, right from where I was looking at it. So I built a small tool for it.
What it does
It's called hookbin. You get a public URL, you give it to Stripe (or GitHub, or anything else that sends webhooks), and every request shows up in a simple inspector. A little CLI then passes each request on to the app running on your laptop.
The part I actually use every day is the Replay button. When my handler throws a 500, I fix it and replay the exact same request. Same body, same headers. Stripe never has to send it twice.
Trying it takes two minutes
Open hookbin.madebyflow.de and create a URL. No account, no credit card.
Paste that URL into Stripe under Developers → Webhooks.
Then run the CLI next to your app:
curl -fsSL https://hookbin.madebyflow.de/cli/install | sh
HOOKBIN_SECRET='…' hookbin listen <slug> -f http://localhost:3000/webhooks/stripe
That's really it. Trigger a test payment and watch it arrive.
A few things I cared about
I didn't want a tunnel. The CLI just opens one outgoing connection, so nothing on my machine is exposed.
I wanted signature checks to keep working, so the body and the Stripe-Signature header arrive exactly as Stripe sent them. One catch: Stripe rejects signatures older than five minutes, so if you replay something from an hour ago, loosen the tolerance in development.
And I wanted to try it without signing up. Anonymous URLs last eight hours. If you sign in with GitHub, they stay private and never expire.
It's early
This is a side project, and I'd love to hear what's missing or annoying. The CLI is open source if you want to poke around: github.com/AlexanderT02/hookbin-cli.
How do you test webhooks right now? I'm genuinely curious.
Top comments (0)