DEV Community

Cover image for Webhook debugging shouldn’t require a weekend’s worth of scaffolding
Jameel Shaikh
Jameel Shaikh

Posted on

Webhook debugging shouldn’t require a weekend’s worth of scaffolding

How we built a disposable Webhook Tester into BracketView — live capture, mocks, replay, and browser-side HMAC verification


If you’ve ever connected Stripe, GitHub, Shopify, or any “we’ll POST to your URL” product, you know the drill:

  1. Spin up a random request bin
  2. Trigger an event and hope the payload still looks like the docs
  3. Copy/paste JSON into Postman or Slack
  4. Fight signature verification on localhost
  5. Discover the bin expired and start over

That loop burns more time than the actual handler.

Webhook Tester is our answer — a disposable public endpoint + live inspect loop, built into BracketView (the same place people already go for JSON tools).

Try it free: https://app.bracketview.in/webhooks


What you get

Capability Why it matters
Public URL in seconds Paste into any provider dashboard (hooks.bracketview.in/e/… style)
Live request feed See POSTs/GETs land as they happen
Headers / query / body / raw JSON tree when the body is JSON
Mock responses Status, headers, body, optional delay — so setup isn’t blocked on a real server
Replay & edit-and-resend Hit your tunnel or staging once you have code
Stripe / GitHub / Shopify signatures HMAC verify in the browser — signing secrets stay local
Share one capture (Pro) Encrypted snapshot link for that one cursed payload

No account required to try. Guests own endpoints via a cookie; signed-in users get a more permanent attachment to their endpoints and Pro limits when needed.


The workflow we optimized for

BracketView's new Webhook Tester

1. Create → paste → watch

On the dashboard, create an endpoint (e.g. “Stripe test”), pick retention, copy the public URL into the provider.

Open the endpoint page for a live feed. Pause when you’re mid-inspect so new arrivals don’t jump the list out from under you.

Click a request → tabs for headers, query, body (JSON tree), raw, mock response, and signatures.

2. Mock before you implement

Many providers won’t finish webhook registration until they get a 2xx (or a specific body).

Configure:

  • Status code
  • Response headers
  • Body
  • Optional delay

Changes apply to future requests — so you can unblock product setup before your real handler exists.

3. Replay when the code is ready

When your app is up (local via tunnel or staging), replay a capture — or edit and resend after small tweaks.

Replay is intentionally constrained (SSRF-minded): private/metadata ranges, credentialed URLs, and similar foot-guns are blocked. Goal: “send this to my URL,” not “open proxy.”

4. Verify signatures locally

The Signature tab walks the common schemes:

  • Stripe
  • GitHub
  • Shopify

Verification runs client-side. Your signing secret never needs to leave the browser for that check. Treat the public URL like a temporary secret; treat signing secrets like… actual secrets.

5. Share one capture (Pro)

Sometimes you don’t need a full log export — you need a second pair of eyes on one payload. Pro can share a single capture via an encrypted snapshot link (same pattern as BracketView’s JSON snapshots), instead of dumping PII into chat.


Free vs Pro

Free

  • Active endpoints: 3
  • Captures per endpoint: 25
  • Max retention: 2 days (default 2)
  • Body size: 256 KB
  • Share a capture: No

Pro

  • Active endpoints: 25
  • Captures per endpoint: 5,000
  • Max retention: 30 days (default 7)
  • Body size: 1 MB
  • Share a capture: Yes (encrypted snapshot)

Enough free for side projects and demos. Enough Pro for multi-project integration work without treating us as free forever-storage for production traffic.

Pricing / plans: https://app.bracketview.in/pricing


Why this lives inside a JSON toolkit

A huge share of modern webhooks are JSON. If you’re already opening a tree viewer to understand payloads, compare fixtures, or share a snapshot, jumping to another random “requestbin clone” that only dumps raw body is friction you don’t need.

Webhook Tester sits next to that workflow:

Capture → understand shape → mock provider demands → implement → replay → (optionally) share one bad event.

Also: webhooks aren’t free infinite logs. TTL, per-endpoint caps, and rate limits keep free usable for builders while keeping ops sane.


Security notes (worth spelling out)

  • Public URLs are temporary secrets. Anyone with the URL can POST. Prefer shorter retention when you’re done exploring.
  • Replay is guarded against classic SSRF patterns (private IPs, metadata endpoints, etc.).
  • Mock/replay headers are sanitized (no nasty CRLF / Set-Cookie games).
  • Signature verification is client-side for provider secrets.
  • This accelerates development — it doesn’t replace production hardening of your real endpoints.

Who it’s for

  • Indie builders wiring payments, OAuth, or marketplace events
  • Backend engineers comparing sandbox vs live payload shape
  • Support/debug when someone says “the webhook fired” and you need the body without production log archaeology
  • Anyone tired of half a request bin + half of Postman’s job spread across five tabs

Quick start

  1. Open app.bracketview.in/webhooks
  2. New endpoint → name it → set retention
  3. Copy the public URL into Stripe / GitHub / Shopify / etc.
  4. Trigger a test event → watch the live feed
  5. Mock a 200 if the provider needs it
  6. When your handler is ready → replay to your tunnel
  7. Open Signature if you’re debugging HMAC failures

Closing

Webhook debugging shouldn’t start with scaffold and end with expired bins.

If you try Webhook Tester this week, I’d love a comment:

What webhook would you aim a disposable URL at first — Stripe, GitHub, Shopify, or something we should add signature presets for next?

🔗 Webhook Tester: https://app.bracketview.in/webhooks

🔗 BracketView app: https://app.bracketview.in

Happy building.

Top comments (0)