Inbound webhooks · MIT self-host

Swap one URL.
Stop losing webhook events.

Create a connection in the console, paste Tuma's webhook URL into Stripe, GitHub, or EasyPost, and get signature verification, dedup, automatic retries, and replay when your handler was down.

See how it works · Stripe · GitHub · EasyPost · MIT · Docker Compose

quickstart
# clone, then:
cd deploy
docker compose up --build

Console:  http://localhost
Webhook:  http://localhost/e/your-path

# Before
Stripe ──► your-app.com/webhooks/stripe

# After
Stripe ──► tuma/e/your-path ──► your-app.com/webhooks/stripe
                      verify · dedup · retry · replay

How it works

Three steps. Same mental model as Hookdeck.

No SDK. No code changes. One URL swap in your provider's dashboard.

[01]

Create a connection

Pick a source — Stripe, GitHub, EasyPost, generic HMAC, or internal. Tuma gives you a unique inbound URL and a signing secret.

[02]

Paste into your provider

Put Tuma's webhook URL and signing secret into Stripe, GitHub, or EasyPost. Set your destination URL — where events should land in your app.

[03]

Replay from Issues

Handler was down? Retries exhaust and the event opens in Issues. Fix your app, inspect the payload, and replay — one event or in bulk.

inbound proxy flow

verify · dedup · retry · replay — open Issues when your handler was down

Console

Everything visible. Nothing buried in logs.

A React dashboard ships with the stack — no separate observability setup required for day-to-day ops.

Connections

Source-to-destination pipes with 24h stats — delivered count, p95 latency, open issues. Status pills: Delivering, Degraded, or Failing.

Metrics

Platform-wide throughput, failure rate, p95, and hourly charts. Per-connection breakdown. Grafana on port 3001 for deeper Prometheus ops.

Issues

Failed deliveries after retries exhaust. Inspect payloads, replay individually, or bulk-replay after you fix the destination.

Why Tuma

Hookdeck-simple inbound reliability — MIT self-hosted, Temporal-backed.

Same URL-swap idea as Hookdeck, without cloud-only lock-in. Narrower scope than Convoy — inbound only, one compose stack, genuinely MIT with no license key for core features.

Self-hostable

No vendor lock-in. docker compose up --build in deploy/, Caddy on port 80, payloads stay in your Postgres. MIT licensed.

Replay when it matters

Issues isn't a graveyard — it's a queue you drain from the console. Fix the destination, replay, and delivery resumes from durable history.

Durable by design

Built on Temporal — battle-tested durable execution, not hand-rolled retry loops. At-least-once delivery; dedupe on X-Tuma-Delivery-Id or your own business key.

Observable out of the box

In-app Metrics plus bundled Prometheus and Grafana. Go API, Temporal worker, Postgres, React UI — one compose file, no external SaaS dependencies.

Compare

Self-hostable Hookdeck. Simpler than Convoy.

Not a price war — Hookdeck has a real free tier and Convoy Community is free to self-host. Tuma wins on where your payloads live, license terms, and scope. Tuma v1 is early; we don't claim maturity or scale parity with either.

Tuma vs Hookdeck

Same inbound job — different deployment model. Hookdeck Event Gateway is cloud-only; Tuma is first-class self-host.

Hookdeck Tuma
Self-host No — cloud only Yes — MIT
Setup Sign up → paste URL docker compose up
Entry price $0 tier, then from $39/mo $0 self-hosted, always
Data location Their cloud Your Postgres, your infra
Maturity Years, SOC2, transforms, CLI v1 OSS — Connections, Issues, replay

Tuma vs Convoy

Convoy is a multi-tenant gateway for inbound and outbound. Tuma is inbound-only — one stack, actually MIT.

Convoy Tuma
Scope Inbound + outbound gateway Inbound only (v1)
Complexity API, workers, scheduler, socket One compose stack
Self-host license Community: source-available. Premium: $999/mo license Full v1 MIT — no license key
Mental model Event bus for platforms Provider → you pipe
Best for Sending webhooks to your customers Receiving Stripe, GitHub, EasyPost reliably

Competitor pricing verified Aug 25, 2026 — hookdeck.com/pricing, getconvoy.io/pricing. Convoy's core gateway is source-available under Frain's license, not MIT — only their client SDKs are MIT.

Pricing

MIT self-host, always. Hosted when you don't want ops.

Self-hosting is the product — not a cheaper Hookdeck tier. Hosted SaaS (instant URL, zero infra) is what we're building next for teams that won't run compose.

OPEN SOURCE

$0

Self-hosted · you run the stack

  • Connections, signature verification, inbound dedup
  • Retries, Issues, UI replay (single + bulk)
  • Metrics dashboard + Grafana/Prometheus
  • MIT · community support via GitHub
View on GitHub

HOSTED

Coming soon

Managed SaaS · we run the stack

  • Instant ingress URL — paste into Stripe
  • Connections, Metrics, Issues dashboard
  • Zero infra to manage
  • Dogfooded on koto7 production workloads
Join hosted waitlist

Built for

Hookdeck-shaped teams

You want URL-swap simplicity but payloads can't live in someone else's cloud. Honest at-least-once semantics, durable retries via Temporal.

Convoy evaluators

You only receive webhooks — you don't need outbound delivery or a multi-tenant gateway. Actually MIT, no $999/mo license for basics.

Logistics & shipping

EasyPost tracking and shipment events into your stack — same retry and Issues flow as payments, self-hosted in your Postgres.

Ops-critical inbound

Stripe, GitHub, EasyPost, or any signed POST — one URL, one console, replay from Issues. Try the live playground with bundled simulators.

Hosted SaaS

Want us to host it?

The open-source v1 is live — clone it, run compose, you're in. Join the waitlist for the managed tier: instant URL, no Docker, dogfooded on koto7 before we open it up.

tuma-demo.koto7.dev/playground · github.com/koto7-io/koto7-tuma