Native macOS Webhook Debugger

Why did this webhook fail?

WebhookMon gives Stripe, Polar, GitHub, Shopify and Slack webhooks one stable public URL, shows every event with headers and body, and tells you in plain English whether a bad signature is a wrong secret or a stale timestamp. Forward events to your local server, record the response, and replay any event byte for byte or re-signed with a fresh timestamp.

macOS 14 (Sonoma) or later • 14-day unrestricted trial • No account beyond an email for the relay

$brew install --cask suresk/tap/webhookmon
WebhookMon's main window: two endpoints in the sidebar, a list of Stripe, Shopify and Polar events with signature and local response columns, and an invoice.paid event whose Signature tab reads: Signature timestamp is 12 minutes old, outside the 5-minute tolerance

How it works

A hosted relay, and why we can't read your webhooks.

Every one of these providers wants to POST to a public URL. WebhookMon runs on your Mac, which usually doesn't have one, so a small Cloudflare Worker takes the delivery for you at a stable address and pushes it down a WebSocket to the app.

The relay cannot read the event. Before it ever writes an event to storage, it seals it with HPKE to your Mac's public key. Only the private key on your Mac can open it. The relay never holds that key, so a captured database or a subpoena gets ciphertext, not your Stripe or Slack payloads.

It doesn't sit there long either. An event is deleted the moment your Mac acknowledges it, or after 24 hours if it never does. The relay keeps just enough account data to route events to your devices: your email, your device keys, hashed tokens, and endpoint names and counts. See the privacy page for the full list.

# What the relay can see
Event body ......... never (HPKE ciphertext only)
Headers ............ never (sealed with the body)
Signing secrets .... never (they stay on your Mac)
# What it keeps
Account ............ email, device keys, hashed tokens
Endpoints .......... name, event counts
Ciphertext ......... until acked, or 24 hours
# Needs your private key?
✓ every event, always

Three things you need when a webhook breaks

See it, understand it, replay it.

WebhookMon doesn't just forward events. It tells you why one failed and lets you send it again.

Plain-English signature verdicts

Every event is verified on arrival against the provider's actual signature scheme, not a guess. WebhookMon tells a wrong secret apart from a stale timestamp apart from a malformed header, in a sentence, not a stack trace.

  • Stripe, Polar, GitHub, Shopify and Slack, each checked the way that provider signs.
  • A stale timestamp says how old it was against the 5-minute tolerance.
  • Each endpoint's settings take one signing secret per provider and say where that provider's dashboard keeps it. Secrets stay in your Keychain.
  • No secret yet? Events still arrive and display, with a note to add one to verify.
WebhookMon's Signature tab for a Shopify orders/create event: Signature does not match: the secret is wrong, with the x-shopify-hmac-sha256 value, the body size and the configured secret

Forward, replay, re-sign

Live events forward to your local server and the response is recorded next to them. Replay any event byte for byte, edit it first, or re-sign it with the current timestamp so Stripe, Polar and Slack don't reject it as too old.

  • Every forward and replay keeps its status, timing and response body.
  • Pick two deliveries and diff their responses to see what changed between a 400 and a 200.
  • Headers are shown as received, with credential-looking values masked until you reveal them.
WebhookMon comparing two deliveries of the same Stripe event: a forward that got 400 Bad Request and a modified replay that got 200 OK, with the one changed line of their JSON responses highlighted

An encrypted relay you don't run

One relay URL per endpoint, live the moment you create it. No tunnel process to keep open, no session that dies when your laptop sleeps: events queue for up to 24 hours until your Mac reconnects.

WebhookMon lives in the menu bar: the icon shows the unread count, and the menu lists each endpoint with its connection state.

WebhookMon's menu bar menu: signed in as dev@example.com, the endpoints Stripe storefront (connected, 3 unread) and GitHub + Slack ci-bot (connected), then Open WebhookMon, Settings and Quit

Simple, Transparent Pricing

Own it forever.

$29.99 one-time

Includes 12 months of updates • Optional $15/year renewal to extend updates

  • Use on up to 3 Macs
  • Keeps working after the update window ends
  • Stripe, Polar, GitHub, Shopify and Slack, no per-provider add-on
  • 14-day fully unrestricted trial, one email for the relay
  • 14-day no-questions-asked refund guarantee
Buy WebhookMon — $29.99 Download 14-day free trial

After the trial, viewing captured events, headers and verdicts keeps working. Creating endpoints, forwarding and replay need a license.

The hosted relay is included with your license for development and testing, up to 5,000 events a day per account and 300 a minute per endpoint; it is not meant for production traffic.

Frequently Asked Questions

Everything you need to know.

Why not just use ngrok or the Stripe CLI?

Both forward events, and ngrok can replay a request as it was captured. The Stripe CLI can ask Stripe to resend one of its own events with a fresh signature (stripe events resend), but neither can re-sign a payload you captured or edited, and neither tells you why a signature failed. Polar, Shopify, Slack and GitHub have nothing equivalent. The Stripe CLI is also Stripe-only: stripe listen opens an outbound connection to Stripe and forwards its events to localhost only while it runs on that machine, and it signs them with the CLI's own whsec_ secret, not the one on your dashboard endpoint. WebhookMon's URL is yours to keep, works with all five providers, and buffers events while your Mac is asleep.

What does the relay store?

Ciphertext it cannot read, deleted once your Mac acknowledges it or after 24 hours. On the account side: your email, your devices' public keys, hashed tokens, and your endpoints' names and event counts. No IP addresses, no plaintext payloads. See the privacy page for the exact list.

What happens to events while my Mac is asleep?

The relay keeps holding them, sealed, for up to 24 hours (or until per-endpoint storage caps are reached). When your Mac reconnects, WebhookMon replays the backlog in order. If anything was evicted or expired before that, it tells you how many events and why.

Is there a limit on the relay?

Yes. The hosted relay is included with your license for development and testing: up to 5,000 events a day per account and 300 a minute per endpoint. It is not meant for production traffic. An endpoint that no Mac has connected to for 30 days is paused until one connects again; in the meantime the relay refuses deliveries to it and keeps nothing, and your provider may disable the webhook, so check its dashboard when you come back. We may suspend accounts that abuse the service.

Polar, Shopify and Slack don't have a forwarding CLI. Does WebhookMon still work?

Yes. WebhookMon's relay accepts events from any provider that can POST to a URL, which is all five. That matters most for Polar, Shopify and Slack, since they don't ship an equivalent to stripe listen, and the usual fallback is a generic tunnel with no signature verdict.

How many Macs can I use it on?

A license covers up to 3 Macs, matching the relay's device limit per account. Sign in with the same email on each one.

What's your refund policy?

14 days, no questions asked. See the refund policy.

Why is it not in the Mac App Store?

It's not a sandbox conflict this time. WebhookMon skips the App Store for the same reason the rest of the family does: selling directly through Polar keeps licensing simple, with self-serve activation and no review cycle every time the relay changes.