MailKite
Get started
Alternative to Mailgun Routes

Inbound routing without the regex-rule plumbing.

Mailgun Routes match incoming mail with expression rules and forward it on. MailKite gives you address-level routing in a dashboard, a structured JSON payload, HMAC signatures, and built-in retries — without hand-writing match(...) expressions.

A fair take on Mailgun Routes

Mailgun is a mature sending platform and Routes are flexible once you know the expression syntax. The cost is the plumbing: regex/filter rules, store-and-notify actions, and stitching retries yourself.

Why teams switch

What MailKite does differently

Routing without expressions

Point an address (or a whole domain, or catch-all) at a webhook in the dashboard. No match_recipient(...) / match_header(...) rule language to learn or maintain.

Structured payload out of the box

Parsed text, HTML, threadId, and auth results arrive as JSON — you don't choose between 'forward the raw MIME' and 'store and notify'.

Retries and replay included

Failed deliveries retry automatically and are replayable in one click, instead of being wired up per-route.

Unlimited domains, graceful overage

No per-domain cost and no hard cutoff when you cross your quota — run every product from one account.

Side by side

MailKite vs Mailgun Routes

MailKite Mailgun Routes
Routing model Address / domain / catch-all in UI Expression-rule engine (regex)
Inbound payload Parsed JSON Raw MIME or form fields per action
Automatic retries Yes, built in Configurable per route
One-click replay Yes (paid) Limited
HMAC-signed webhooks Yes, every plan Signature verification available
Per-domain fees None — unlimited Plan/volume tiered
Send from same account Yes — shared quota Yes — sending is the core product

Competitor capabilities change — we re-audit these tables regularly. Spot something out of date? Tell us and we'll fix it.

Show the payload

What actually hits your webhook

Point support@myapp.ai at a URL in the dashboard once. Every message arrives parsed, signed, and retried — no expression rules, no store-and-notify wiring.

Mailgun Route (expression + action)
http
# You author and maintain rules like:
match_recipient("support@myapp\\.ai")
  → forward("https://your-app/webhook")

match_header("subject", ".*invoice.*")
  → store(notify="https://your-app/webhook")

# then parse the delivered MIME or form fields
# and wire up your own retry handling.
MailKite
json
POST /your-webhook   Content-Type: application/json
x-mailkite-signature: t=…,v1=…   (HMAC-SHA256 — verify locally)

{
  "id": "msg_2Hk9…",
  "type": "email.received",
  "from": { "address": "ada@example.com" },
  "to": [{ "address": "support@myapp.ai" }],
  "subject": "Re: invoice #1042",
  "text": "Looks good — approved!",
  "html": "<p>Looks good — approved!</p>",
  "threadId": "<a1b2c3@mail.example.com>",
  "auth": { "spf": "pass", "dkim": "pass", "dmarc": "pass", "spam": "ham" },
  "attachments": [
    { "filename": "po.pdf", "contentType": "application/pdf",
      "size": 18213, "url": "https://api.mailkite.dev/att/2Hk9…/0?sig=…" }
  ]
}
The price advantage

Unlimited domains. One quota. Free to start.

MailKite

  • Free: 3,000 emails/mo (in + out)
  • Unlimited domains + catch-all, free
  • Pro $20/mo → 50,000, no hard cut

Mailgun

  • Sending-first, volume-tiered plans
  • Inbound Routes ride on the sending account
  • Pay-as-you-go beyond plan volume

MailKite's routing lives in a dashboard, not a rule DSL — and every domain and alias is free.

See full MailKite pricing →

Switch in an afternoon

Moving from Mailgun Routes

  1. 1

    Point MX at MailKite

    Add our MX records or start on a managed subdomain. Set up catch-all with one toggle if you want everything.

  2. 2

    Recreate routes as addresses

    Translate each match rule into an address or catch-all in the dashboard — no expression syntax to port.

  3. 3

    Read the JSON and verify

    Consume the parsed JSON payload, verify the HMAC signature, and rely on built-in retries instead of custom logic.

Questions

I have complex Mailgun match rules — will they port?

Most rules reduce to 'this address (or the whole domain) goes to this webhook.' Content-based branching moves into your own handler, where it's easier to test than an expression DSL. Catch-all covers the wildcard cases.

Does MailKite retry failed webhooks like Mailgun?

Yes — deliveries retry automatically with backoff, and you can replay any message in one click from the dashboard on paid plans.

Can I still send through Mailgun and only receive on MailKite?

Absolutely — many teams start by moving just inbound. You can also consolidate sending onto MailKite later, since it shares the same quota.

Go deeper

The honest Mailgun Routes alternative →

The long-form take on our blog — receipts, runnable code, and where we won't overclaim.

Try MailKite free — keep Mailgun Routes running until you're ready.

Point a domain, drop in a webhook URL, receive your first email. Unlimited domains, no credit card.