Every time I integrate a third-party webhook I do the same annoying dance:
- Start a local server
- Open a terminal, run
ngrok http 3000 - Copy the URL
- Paste it into the webhook dashboard
- Trigger a test event
- Stare at the ngrok terminal output
That's 5 minutes of setup before I've written a single line of handler code.
And the URL changes every restart.
The read-only trap
The next tool most developers reach for is webhook.site.
It's much faster — you get a URL instantly, no install.
But it has one big limitation: it's read-only.
Your webhook source gets a fixed 200 OK with no body. That means you can't test:
- How your code handles a
422response (retry logic) - Whether your handler correctly parses a
201with a payload - What actually gets returned to the calling service
For pure inspection ("what does Stripe actually send?") it's fine.
For anything more, you're stuck.
What I use instead
MockBolt is an instant mock API — paste JSON,
get a live public HTTPS endpoint in seconds. Every request is logged in real time.
For webhook testing it means you get both sides:
- See the full incoming request (body, headers, IP, timing)
- Control exactly what goes back to the webhook source
No install. No account. No CLI. No local server.
Testing a Stripe webhook in 60 seconds
Step 1 — Create the endpoint
Go to mockbolt.com, paste the response Stripe expects back:
{
"received": true
}
Set status code to 200. Click Generate Mock.
You get a URL like https://mockbolt.com/b/7f3d2c1a-...
Step 2 — Add it in Stripe
Dashboard → Developers → Webhooks → Add endpoint → paste your MockBolt URL.
Step 3 — Send a test event
Click "Send test webhook" → pick payment_intent.succeeded.
Open the MockBolt manage tab. The full Stripe payload appears in the
real-time inspector instantly — headers, body, everything Stripe sends.
No terminal. No restart. No port forwarding.
Testing a GitHub webhook
Same flow:
{ "status": "ok" }
Status 200. Generate Mock. Copy URL.
Repo → Settings → Webhooks → Add webhook → paste URL.
Select application/json. Choose events (push, pull_request, etc.)
GitHub fires a ping immediately when you save. You'll see the full
ping payload arrive in MockBolt within 2 seconds.
Testing a Shopify order webhook
Shopify expects 200 with an empty body on success:
{}
Add the endpoint in your Shopify Partners app settings.
Trigger a test order from the Shopify admin.
See the exact orders/create payload — line items, customer, totals, everything.
When to use each tool
| Situation | Best tool |
|---|---|
| Just need to see what payload a webhook sends | webhook.site or MockBolt |
| Need to control the response (status + body) | MockBolt |
| Need to forward to your local running server | ngrok |
| Testing retry logic end-to-end | MockBolt |
| Permanent staging webhook endpoint | MockBolt ($2 one-time, never expires) |
| Debugging a webhook that fires infrequently | MockBolt (auto-extends if active) |
One more thing: request replay
MockBolt logs every request. There's a replay button (↩) on each row —
re-sends the exact request to your endpoint with one click.
Useful when you want to test a handler change without triggering
a new real event from Stripe/GitHub/Shopify.
Try it
→ mockbolt.com/webhook-testing
Create a free endpoint in 5 seconds. No account, no install.
What webhook services are you integrating? Drop a comment and I'll show
the exact payload setup for each one.
Top comments (0)