Webhooks — did anything fail in the last 24 hours?
Owner: PRODUCT (Receipt) — and Receipt-unique. Webhooks are Receipt’s event intake: a missed delivery is a missed attribution. The live viewer (latest-200, payload peek, staff-only retry) is already built server-side per its roadmap card — this page is its designed face.

Scope (§17): replay acts on ONE stored event; endpoint rows are Receipt’s own intake endpoints. Nothing here reaches other platforms.

Operator test: the ONE question is “did deliveries fail in the last 24h?” — and the one action is replaying the ones that did.

Delivery health per endpoint, the failures that need a replay, and why they failed.
Live · Receipt DBDemo rows
Deliveries 24h
142
received + processed across all sources
DEMO DATA · window: 24h · source: webhook_events
Failures 24h
3
3 need a decision — replay or accept the gap
DEMO DATA · window: 24h · source: webhook_events
Failure rate
2.1%
failed ÷ delivered, trailing 24h
DEMO DATA · one metric id, one formula
Last incident
07:42
stripe · signature mismatch after key roll
DEMO DATA · source: incident derivation

Endpoints

One row per intake endpoint. Last status is the newest event’s outcome; replay re-posts a stored event through the same pipeline.
S
/api/webhooks/stripepayments · 96 events 24h · last status failed · 401 at 07:42
Sh
/api/webhooks/shopifycommerce · 41 events 24h · last status processed · 200 at 09:15
healthy
/api/webhooks/first-partyfanogram + folo events · 5 events 24h · last status processed · 200 at 08:03
healthy
Write path: replay routes via the Receipt API, staff-only, and lands in the audit log as webhook.retry (actor · target · audit-id — the exact rows the live audit page already shows). Effect: reprocessing is idempotent: the original event is never mutated, a replay row is appended, and attribution recomputes only if the replay succeeds.
Signing-secret honesty: endpoint secrets are verified on every delivery, but there is no runtime switch — rotation happens via Receipt’s environment config and a redeploy. This page shows verification state; it will never offer a rotate button it cannot honestly wire.

Failure reasons — 24h

Grouped by cause, newest incident first. The reason names the fix.
ReasonCountSourceFix
401 · signature mismatch2stripesecret rolled provider-side — rotate via env, then replay
timeout · >10s processing1shopifyreplay — the slow read was transient
422 · unknown event type0none in window — logged, never dropped silently

Event log

Latest-200 viewer with a native payload peek per row — filters: source · status (Received / Processed / Failed).
evt_9f2c…a1stripe · checkout.session.completed · failed 07:42
evt_8be0…77shopify · orders/create · processed 09:15
Connection health lives in Integrations →
Receipt skinproduct-unique · no other skins