Webhooks Ingester

A self-hosted solution to store all your Resend webhook events in your own database.

We believe you should own your data. Our data retention policy has always encouraged you to store your data in your own database.

PlanRetention
Free1 day
Pro3 days
Scale7 days
EnterpriseFlexible

As we look to tighten our practice to match our policy, we've created a tool to help you store your own data. Today, we're open-sourcing the Webhooks Ingester to enable you to easily store all Resend events in your own database.

The Webhooks Ingester is a self-hosted solution that you can easily deploy and configure to ingest Resend's webhooks and store your own content. By default, it includes retries, idempotency, deduplication, persistence, and edge cases.

Prefer a full video walkthrough?

What can you build?

With your webhook events stored in your database, you can:

  • Build custom analytics dashboards for open/click-through rates and bounce/complained rates
  • Ensure compliance by maintaining a complete event log easily auditable
  • Create alerting systems for delivery issues or complaints
  • Power internal tools with historical email data
  • Train ML models on engagement patterns

Supported databases

The ingester supports 8 different database connectors:

DatabaseEndpointBest For
Supabase/supabaseQuick setup with managed Postgres
PostgreSQL/postgresqlSelf-hosted or managed Postgres (Neon, Railway, Render)
MySQL/mysqlSelf-hosted or managed MySQL
PlanetScale/planetscaleServerless MySQL
MongoDB/mongodbDocument database (Atlas, self-hosted)
Snowflake/snowflakeData warehousing and analytics
BigQuery/bigqueryGoogle Cloud analytics
ClickHouse/clickhouseHigh-performance analytics

Is your preferred database not in the list? Feel free to open a PR for us to review.

All event types supported

The ingester captures all 17 Resend webhook events:

  • Email events: sent, delivered, delivery_delayed, bounced, complained, opened, clicked, failed, scheduled, suppressed, received
  • Contact events: created, updated, deleted
  • Domain events: created, updated, deleted

To learn more about each event type, check the webhooks documentation.

Built for production

Every webhook is verified using Svix signatures before being stored. Duplicate events are safely ignored thanks to idempotent inserts.

The project is fully typed with TypeScript, making it easy to extend or customize.

Deploy in minutes

You can deploy with one click to Vercel, Railway, or Render.

Or use Docker:

docker pull ghcr.io/resend/resend-webhooks-ingester

What's next?

We're excited to see what you build with the Webhooks Ingester.

Check out the GitHub repository for installation instructions and documentation.

If you have questions or ideas to make it better, please open an issue.