Solution

One inbox per customer, no provisioning.

Turn on catch-all and every workspace, customer, or tenant gets its own address at your domain — acct+customer@yourapp.com — with nothing to pre-create. Route specific patterns to specific endpoints, or let everything else fall through to one webhook.

Why it fits

What you get

No mailbox to pre-create

Catch-all makes every address at the domain deliverable instantly — a new signup's address works the moment they use it, not after an admin step.

Route by pattern

Match a specific address, a wildcard like invoices+*@yourapp.com, or the whole domain, and send each to its own webhook, an inbox agent, or a forward address.

One parsed payload per tenant

Every message arrives as the same signed JSON regardless of which tenant it's for — read to.address to know which workspace it belongs to.

Unlimited addresses, one quota

Tenants share the domain's quota and account — no per-mailbox fee to charge back, no second vendor as you add customers.

How it works

Three steps to live

  1. 1

    Enable catch-all on your domain

    Point MX at MailKite (or a managed subdomain) and flip catch-all on — every address at the domain becomes deliverable.

  2. 2

    Add routes for specific patterns

    Create a route matching invoices+*@yourapp.com (or similar) to send that slice to a dedicated endpoint or inbox agent.

  3. 3

    Read to.address in your handler

    The webhook payload's to field tells you exactly which tenant address received the mail — key your lookup off it.

Show me

route a tenant pattern

One wildcard route covers every tenant address — the tenant is just a field in the payload.

route a tenant pattern
import { MailKite } from "mailkite";

const mk = new MailKite(process.env.MAILKITE_API_KEY);

// Every acct+<tenant>@yourapp.com address routes to one webhook;
// nothing to provision per customer.
await mk.createRoute({
match: "acct+*@yourapp.com",
action: "webhook",
destination: "https://yourapp.com/hooks/tenant-mail",
});

// In the handler: evt.to[0].address is "acct+acme@yourapp.com" —
// split on "+" to resolve the tenant.
Install Docs →
In the box

What's included

Questions

Do I need to create a mailbox for every customer?

No — enable catch-all on the domain and any address works the instant a customer uses it. There's nothing to pre-provision as you onboard new tenants.

Can different tenants go to different endpoints?

Yes. Routes match a specific address or a wildcard pattern and send that slice to its own webhook, forward address, or inbox agent, while everything else falls through to the domain's default.

How do I know which tenant a message is for?

The parsed webhook payload includes the exact to.address that received it — key your lookup off that (or the +tag if you use plus-addressing).

Keep reading

Ready to build?

Start free on unlimited domains — no credit card. Or browse the other solutions.