---
title: "Webhooks Ingester"
slug: webhooks-ingester
description: "A self-hosted solution to store all your Resend webhook events in your own database."
created_at: "2026-01-26"
updated_at: "2026-01-26"
image: https://cdn.resend.com/posts/webhooks-ingester.jpg
humans: ["jp-valery", "joao-melo"]
---

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

<Table
  data={{
    headers: ["Plan", "Retention"],
    rows: [["Free", "30 days"], ["Pro", "30 days"], ["Scale", "30 days"], ["Enterprise", "Flexible"]],
  }}
/>

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](https://github.com/resend/resend-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?

<YouTube videoId="-RzkHd9s8HM" />

## 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:

<Table
  data={{
    headers: ["Database", "Endpoint", "Best For"],
    rows: [
      ["Supabase", "/supabase", "Quick setup with managed Postgres"],
      ["PostgreSQL", "/postgresql", "Self-hosted or managed Postgres (Neon, Railway, Render)"],
      ["MySQL", "/mysql", "Self-hosted or managed MySQL"],
      ["PlanetScale", "/planetscale", "Serverless MySQL"],
      ["MongoDB", "/mongodb", "Document database (Atlas, self-hosted)"],
      ["Snowflake", "/snowflake", "Data warehousing and analytics"],
      ["BigQuery", "/bigquery", "Google Cloud analytics"],
      ["ClickHouse", "/clickhouse", "High-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](https://resend.com/docs/webhooks/event-types).

## Built for production

Every webhook is [verified using Svix signatures](https://resend.com/docs/webhooks/verify-webhooks-requests) 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:

```bash
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](https://github.com/resend/resend-webhooks-ingester) for installation instructions and documentation.

If you have questions or ideas to make it better, please [open an issue](https://github.com/resend/resend-webhooks-ingester/issues).
