Keep webhook event records — queryable, searchable, joinable
Enable collection persistence for verified webhooks and choose how to manage your records. The inbound replay buffer is separate and defaults to 30-day retention.
The 30-day cliff
You integrate Stripe, GitHub, or any webhook sender into your platform. For the first month, everything works fine. Then a customer disputes a charge in month four.
Stripe — 30-day retention
Events are queryable in the Stripe Dashboard for 30 days. After that, gone. You can't trace the original request, can't replay it, can't build a historical audit trail.
GitHub — 30-day delivery history
Webhook deliveries are available for 30 days via the webhook details page. A security incident in month three? The delivery logs are already deleted.
DIY webhook system — retention is a decision you avoid
Most teams keep events as long as the database table exists. When it grows too large, you delete the old ones. Now you own a retention policy nobody documented.
We store events as records, not deliveries
Competitors keep delivery metadata — when it was sent, how many retries, did it succeed. We keep the business event itself.
| Aspect | Competitors | Centrali |
|---|---|---|
| What is kept | Delivery metadata: attempt count, response status, timestamp | An encrypted inbound payload; optionally a separate collection record |
| Retention window | 30 days (Stripe, GitHub) or self-managed | Inbound buffer: 30 days by default, operator-configurable. Collection records follow separate retention and deletion settings. |
| Query and search | Via the sender's dashboard (if at all) | Via saved queries, full-text search, joins with your data |
| Reconciliation in month 4 | Request lost, event lost, no audit trail | Query retained collection records. Inbound replay requires the original buffer row to remain available. |
How it works
Signature-verified HTTP-trigger arrivals are buffered before function dispatch. Enable auto-persist or write a function to store separate collection records for queries and search.
Webhook arrives
GitHub sends a webhook event to your Centrali endpoint. Signature is verified at the HTTP layer.
Becomes a record
Opt into auto-persist to a linked collection, or normalize the payload in a function. Auto-persist stores an encrypted full-payload envelope and projects declared non-secret fields; inspect persistence outcomes for failures.
Query anytime
Save a query for projected fields such as payments over $1,000 or failed deployments. Queries remain available while the collection records are retained.
Join with your data
Link webhook events to your own records via saved queries. Match Stripe payments to your orders. Connect GitHub pushes to your deployments.
Query events like you query any other data
Query retained collection records for the business event and link them to the actions your application recorded.
// Define a saved query in the console or via APIconst eventQuery = {resource: 'stripe-events',where: {and: [{ 'data.type': { eq: 'charge.dispute.created' } },{ 'data.amount': { gte: 50000 } },{ 'createdAt': { gte: '2026-01-01T00:00:00Z' } }]},select: { fields: ['id', 'data.id', 'data.amount', 'data.reason', 'createdAt'] }};// Run it anytimeconst disputes = await api.queryRecords('stripe-events', eventQuery);return disputes.data;
Stored queries run over your collections. Events stored as records are queryable; events stored only in a delivery log are not.
Built for teams that need audit trails
Compliance and dispute resolution
Persist selected verified arrivals as records and link them to your actions. Inbound replay is available while the original buffer row is retained.
Debugging production incidents
Inspect retained arrivals and function runs alongside your logs. Replay a buffered arrival through the trigger's current configuration; protect downstream work from duplicate side effects.
Long-tail analytics
Query retained collection records to investigate GitHub workflow failures or Stripe processing times. Plan record retention for the history you need.
Migrating off a webhook service
Plan provider cutover and send signed events to a configured Centrali HTTP trigger. Inbound replay operates on Centrali's own retained buffer rows, not arbitrary imported provider archives.
Trace events end-to-end
Every inbound event, record change, and outbound delivery carries a correlation ID. Follow a single webhook through the entire system.
A GitHub webhook arrives → becomes a record → triggers a function → emits an outbound webhook to your customer. One correlation ID ties them all together. Query the Event Log to see the entire chain.
How we compare
Competitors in the webhook space focus on delivery reliability. We focus on what makes the event worth keeping in the first place.
Svix and Hookdeck hold SOC 2 Type II; we do not. On reliability and compliance certifications, they are the stronger choice. We differentiate on the business event itself.
| Feature | Centrali | Svix | Hookdeck |
|---|---|---|---|
| Store event payloads long-term | — | — | |
| Query events with saved queries | — | — | |
| Join events with your own data | — | — | |
| HMAC signing and retries | |||
| Delivery log and replay | |||
| SOC 2 Type II certification | — | ||
| Per-customer delivery dashboard | — |
Related capabilities
Signed webhook delivery
HMAC signing, secret rotation, signature verification
Webhook replay and DLQ
Failed deliveries, manual replay, dead-letter queue
Best webhook infrastructure tools
Compare Svix, Hookdeck, Inngest, and Centrali
Verify webhook signatures
Cross-provider signature verification without a preset
Compare: Centrali vs Svix
Detailed feature and pricing comparison
Compare: Centrali vs Hookdeck
Detailed feature and pricing comparison
Keep useful webhook event records
Enable verified-arrival persistence or store records in your function. Manage collection retention separately from the inbound replay buffer.
5-minute setup. No credit card.
View the docs →