Receive
Point your provider at a stable Charon URL. We acknowledge fast, persist the payload, and hand off to the background — your destination's latency never touches the critical path.
Webhook DLQ & replay
Obsidian Dynamics Limited
Sits between your providers and your app: durable ingest, bounded retries, and replay — without touching the provider.
Duplicates are possible by design (retries, at-least-once); downstream idempotency is recommended.
POST /ingest/… → 202 Accepted → verify → forward → retry → DLQ → replay
Built for
Solo founders · Backend & platform engineers · Teams on Stripe, GitHub, Clerk, Resend, Shopify · Custom webhook producers
How it works
Point your provider at a stable Charon URL. We acknowledge fast, persist the payload, and hand off to the background — your destination's latency never touches the critical path.
Exponential backoff with jitter. Transient 5xx and timeouts get another chance; clear 4xx fails fast.
When policy exhausts, the event lands in DLQ with full context. Fix the destination, replay: a new delivery chain tied to the original — no asking the provider to resend.
Product
Webhook insurance: visibility, retries, DLQ, and replay for the path that carries your revenue.
Event stream
Headers, raw body, content type, and correlation IDs land in one place. Scan what arrived, filter by endpoint or provider, and trace an ID across retries without digging through logs.
evt_1a9
Stripe · invoice.paid
evt_8c2
GitHub · workflow_run
evt_4ff
Clerk · user.updated
Delivery attempts
No anonymous retries. Every POST to your app is an attempt row: latency, HTTP family, retryability, and a bounded response preview — the same facts your on-call will ask for.
Attempt chain
#4 · in flight
POST → 504 · 12.4s
#3
502 · 980ms
#2
200 · 210ms
policy: exponential · max 8 · jitter ±20%
Failure triage
When policy exhausts, the event lands in DLQ with context intact. Triage by status code family, endpoint, or provider — then decide: fix the destination, adjust policy, or replay.
Exhausted after 8 attempts · last error: upstream timeout
Replay controls
Manual replay issues a new event and delivery chain while preserving ties to the original. Recover from bad deploys or transient auth drift without asking Stripe to resend.
Source
evt_8c2
Original attempts preserved
Replay
evt_8c2_r1
New delivery chain · same payload
Verification
Stripe and GitHub adapters, plus generic HMAC where you bring your own secret. Timestamp windows where the format allows. We state semantics plainly: at-least-once — your handlers stay idempotent.
Secrets encrypted at rest · compared in constant time
Security & trust
No theatre. What ships: cryptography, isolation, and honest delivery semantics.
Duplicates can happen. Dedupe with provider IDs or Charon delivery headers.
Stripe and GitHub adapters, plus generic HMAC where you bring the secret. Constant-time compares; Stripe timestamps windowed.
Signing secrets and destination auth are encrypted at rest. Nothing sensitive echoed back from the API.
Timeouts, retry budgets, and backoff are explicit per destination — no hidden global defaults.
Every query is tenant-scoped. DLQ, replays, and exports stay inside the workspace boundary.
Secret-gated ops endpoint, Prometheus metrics, and a DLQ taxonomy SREs can act on without spelunking logs.
Pricing
Free tier is full-featured on reliability — retries, DLQ, replay — so you can evaluate honestly before scaling. Paid plans open signup and redirect to Stripe Checkout.
Run one real endpoint with the full pipeline: durable capture, retries, DLQ, replay, and exports — so you can prove value before scaling.
$0
For teams running multiple ingress surfaces and steady webhook volume — same product, higher safe throughput.
$19/ month
$190/yr ($15.83/mo billed annually)
When webhook traffic and surface area grow — higher per-day ingest ceilings and more projects without changing how you operate Charon Gate.
$49/ month
$490/yr ($40.83/mo billed annually)
Events are purged on a rolling schedule (14 days by default; adjustable with RETENTION_DEFAULT_DAYS).
When deploys wobble or rate limits bite, Charon holds the line: capture first, retry with discipline, and replay without re-wiring the provider.