Managed webhook delivery for your app. HMAC-signed, retried, replayable.
Stop writing your own retry queue. Customers POST events to us with an Idempotency-Key; we fan out to every matching endpoint, sign with HMAC-SHA256, retry with exponential backoff, abandon after N attempts, and surface delivery logs your support team can actually search. Same shape as Svix at a third the price.
No credit card to start. Free · $19 · $49.
Publish an event
curl -X POST https://hooks.photonforge.io/v1/events \
-H "Authorization: Bearer pf_..." \
-H "Idempotency-Key: order-12345" \
-H "Content-Type: application/json" \
-d '{"eventType":"order.created","payload":{"id":"o_12345","amount":4200}}'Why PhotonHooks
Not your job to write a queue
Exponential backoff, dead-letter, per-tenant isolation, audit trail. Built once correctly by us so you don't get paged at 2am for a downstream you don't control.
Idempotency-Key dedups publisher retries
Send the same event twice with the same key — second one returns the prior event id, no double fan-out. Stripe + Shopify use this shape and so should you.
Manual replay from the dashboard
Customer says 'I missed an event' — you find the delivery, click replay, attempts reset to 0, fires immediately. Pro tier.
Payload transforms (Business)
One JS expression per endpoint reshapes the payload — let each receiver get exactly the format they expect, without writing adapter glue in your app.
Features
HMAC-SHA256 signing
X-PhotonHooks-Signature header. Constant-time verify in any language.
Idempotency-Key dedup
Standard HTTP header (or body field). Safe retries for publishers.
Exponential-backoff retries
1m → 5m → 15m → 1h → 6h → 12h → 24h → 48h. Free: 5 attempts. Pro: 8.
Auto-disable
Endpoint with 15 consecutive failures across deliveries is auto-disabled.
Event filters
Per-endpoint event-type globs. 'order.*' matches order.created + order.updated.
Delivery logs
Every attempt with status, HTTP response code, response body snippet.
Manual replay (Pro)
Reset attempts to 0 + fire immediately. Pro tier.
Payload transforms (Business)
JS expression per endpoint reshapes outgoing payload.
Content filters (Business)
Only deliver if {path} {op} {value}. e.g. amount >= 1000.
Custom headers (Business)
Add Authorization or X-Tenant-Id to every delivery.
Per-endpoint throttling (Business)
Rate cap per endpoint URL. Don't overwhelm slow receivers.
API + MCP
Publish events + manage endpoints programmatically.
Pricing
Pay for what costs us money.
Free
Enough to wire one downstream endpoint for a small app.
- 1 endpoint
- 1,000 events / month
- 7-day event retention
- HMAC-SHA256 signing
- Exponential-backoff retries (5 attempts)
- Idempotency-Key dedup
- API + MCP access
Pro
For apps shipping real volume to real customers.
- Unlimited endpoints
- 50,000 events / month
- 30-day event retention
- 8 retry attempts (24h+ ladder)
- Manual replay from the dashboard
- Per-endpoint health + analytics
Business
Svix-class delivery shaping for production event buses.
- Everything in Pro
- Payload transforms (JS expression per endpoint)
- Content filters (path + op + value)
- Custom headers per endpoint
- Per-endpoint throttle + concurrency caps
- Bulk operations + event payload search
Cancel anytime via the Stripe customer portal. No annual lock-in, no email-us-to-cancel routine.
Composes with
PhotonHooks talks to the rest of PhotonForge automatically.
- PhotonWatch — Watch publishes watch.target.{down,recovered} into Hooks on state change.
- PhotonBeat — Beat publishes beat.{missed,recovered} into Hooks when a heartbeat drops.
- PhotonCMP — CMP Business+ fires cmp.consent.changed into Hooks.
Common questions
›Why not just write this myself?
You can. Roughly: 50 lines of code for the happy path, ~5,000 lines once you handle every failure mode at scale. Customers pay us to make that someone else's problem.
›How do I verify the signature?
Constant-time-compare the X-PhotonHooks-Signature header to HMAC-SHA256 of the raw body with your endpoint's secret. We ship code snippets in the dashboard for Node, Python, Ruby, PHP, Go, Rust.
›What happens if my endpoint is down for 24 hours?
We keep retrying on the exponential-backoff ladder up to your tier's maxDeliveryAttempts (5 free / 8 Pro). After that the delivery is ABANDONED and surfaced in your dashboard for manual replay.