Webhook Testing
Test webhook integrations from services like Stripe, GitHub, Shopify, and Twilio against your local development server — no deployment needed.
The problem
Third-party services need a public URL to send webhooks. During development, your server is on localhost. You could deploy to a staging server every time you change a handler, or you could just open a tunnel.
Quick setup
# Your webhook handler is on port 3000
nullbore open --port 3000 --ttl 2h
# ✓ https://a7f3bc.tunnel.nullbore.com → localhost:3000
Now paste https://a7f3bc.tunnel.nullbore.com/webhooks/stripe into Stripe's webhook settings.
Stable URLs: Use
--name stripe-test(Dev+) to gethttps://stripe-test.yourname.nullbore.com— the same URL every time. Pro plans can also use a custom domain (stripe-test.tunnel.yourcompany.com).
With daemon mode
If you're testing webhooks regularly, add it to your config:
# ~/.config/nullbore/config.toml
server = "https://tunnel.nullbore.com"
api_key = "nbk_your_key"
[[tunnels]]
name = "stripe-test"
port = 3000
nullbore daemon --detach
# Tunnel stays up, reconnects automatically
Inspect requests
Check what the webhook sender is actually sending:
nullbore requests stripe-test
# Shows recent request metadata: method, path, headers, body preview
You can also see request logs in the dashboard.
Tips
- Set a sensible TTL — 2 hours is usually enough for a testing session. Daemon mode auto-renews if you need it longer.
- Check signatures — services like Stripe and GitHub sign webhook payloads. Make sure your handler validates signatures even during testing.
- Use daemon mode for regular testing — avoids re-opening tunnels and updating webhook URLs every session.
Works great with
- Stripe webhooks
- GitHub webhooks (push, PR, release events)
- Shopify webhooks
- Twilio callbacks
- Slack event subscriptions
- Any service that sends HTTP callbacks