MailerSend logo vs MailKite logo
Alternative to MailerSend

The same parsed inbound feed — with a normalized trust verdict and unlimited domains free.

MailerSend is a developer-friendly transactional service, and its Inbound Routing genuinely parses incoming mail to JSON. The friction for an agent is narrower: you compose the trust decision yourself from spf_check and dkim_check (no DMARC, no spam verdict), and you host the model loop. MailKite hands you one resolved auth block and will run the receive→reply loop for you.

A fair take on MailerSend

MailerSend's inbound is not a bolt-on: it parses to JSON with decoded text/html/attachments, signs each webhook with HMAC-SHA256, and the sending half (REST, SMTP, templates, a real Node SDK) makes replying a few setters. As a send-and-receive pair for an agent, it genuinely works.

How it works

MailerSend vs MailKite, in one diagram

MailerSend sender MailerSendinbound route signed webhookspf_check + dkim_check your handlercompose trust + model send APIreply out No DMARC and no spam verdict in the payload, and no built-in agent loop: the trust call and the model loop are both yours to assemble. MailKite sender MX edgeparse + auth JSON webhookauth: {spf,dkim,dmarc,spam} agent + replyyours or action:agent One normalized verdict block, and the model loop is optional — MailKite can run it.
Why teams switch

What MailKite does differently

One normalized auth verdict

MailerSend gives you spf_check ({code, value}) and dkim_check (a boolean), with no DMARC alignment and no spam classification in the payload. MailKite resolves SPF, DKIM, DMARC, and spam into one auth block, so the agent reads a single field before it acts instead of composing a partial decision.

The agent loop is built in

MailerSend delivers the message and stops — the model call, retries, and run bookkeeping are yours to build. A MailKite route with action:'agent' runs the receive→reply loop on a Cloudflare Queue, capped and reaped at five minutes, recorded as a drill-in transcript.

Unlimited domains, free

MailerSend's free plan is one verified domain. MailKite adds every domain and scoped agent address at no per-domain cost, on every plan including Free — an agent can own as many addresses as it needs.

No account-approval wait

MailerSend gates new accounts behind a trial-approval step that can take up to a day. MailKite is DNS-verify only: MX to receive, SPF + DKIM to send, no sandbox and no approval queue.

Side by side

MailKite vs MailerSend

MailKite MailerSend
Inbound → JSON webhook Yes — email.received Yes — Inbound Routing (data.*)
Auth signals in payload auth: {spf, dkim, dmarc, spam} spf_check + dkim_check only
DMARC / spam verdict Included, normalized Not in the payload
HMAC-signed webhooks HMAC + replay window, one-call verify HMAC-SHA256 Signature header
Built-in agent loop Optional route action:'agent' None — webhook only
Failed-delivery replay Retries + one-click replay Retries
MCP server Hosted MCP — send + inbox Official MCP — sending only, no inbox read
Per-domain fees None — unlimited domains Free plan is 1 verified domain

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

MailerSend parses cleanly and signs, but hands you two raw signals to combine; MailKite delivers one resolved auth verdict the agent reads directly.

MailerSend Inbound Routing (message nested under data)
http
POST /your-webhook
Content-Type: application/json
Signature: <HMAC-SHA256 of the raw body>

{
"data": {
"from": { "email": "ada@example.com" },
"recipients": { "rcptTo": "agent@myapp.ai" },
"subject": "Re: invoice #1042",
"text": "Looks good — approved!",
"html": "<p>Looks good — approved!</p>",
"headers": { "message-id": "<a1b2c3@mail.example.com>" },
"spf_check": { "code": "...", "value": "pass" },
"dkim_check": true,
"attachments": [ /* decoded parts */ ]
}
}
// no DMARC alignment, no spam verdict — you compose trust yourself
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 on every plan
  • Pro $20/mo → 50,000, graceful overage

MailerSend

  • Free: 500 emails/mo (100/day, card required)
  • One verified domain on free
  • Former 3,000/mo tier now paid from $7/mo

MailerSend counts forwarded/posted inbound messages against the same monthly quota. MailKite counts inbound and outbound against one quota and never bills per domain.

See full MailKite pricing →

Switch in an afternoon

Moving from MailerSend

  1. 1

    Point your MX at MailKite

    Add the MailKite MX records (or start on a managed subdomain while DNS propagates). No trial-approval wait — DNS verification is the only gate to receive.

  2. 2

    Swap the webhook and drop the trust plumbing

    Read event.auth.dmarc and event.auth.spam directly instead of composing a verdict from spf_check.value and dkim_check. Verify x-mailkite-signature with the SDK's verifyWebhook helper.

  3. 3

    Reply — or let the route do it

    Reply with mk.send({ inReplyTo: event.id }) through the same API, or set a route to action:'agent' and MailKite runs the receive→reply loop for you. Keep sending on MailerSend if you like; you're only replacing the inbound trust-and-loop layer.

Questions

Can MailerSend receive inbound email for an agent?

Yes. MailerSend's Inbound Routing points your MX at MailerSend, matches messages with catch-all or per-recipient filters, and POSTs the parsed email as JSON under a data object, HMAC-SHA256 signed. It's a real inbound feed — the agent-specific gaps are the trust verdict and the loop, not parsing.

Does MailerSend's inbound payload include DMARC and a spam verdict?

No. It includes spf_check (a {code, value} object) and dkim_check (a boolean). There's no DMARC alignment result and no spam classification, so an agent composes its trust decision from the two signals it does get. MailKite delivers a single normalized auth: {spf, dkim, dmarc, spam} block.

Doesn't MailerSend's MCP server let an agent read its inbox?

MailerSend's official MCP server exposes sending, domain management, and analytics as tools — not inbox reading. An agent can send through it, but the inbound half is still a webhook you wire up. MailKite's hosted MCP covers both send and inbox, alongside a Claude Code plugin.

Go deeper

The MailerSend alternative for AI agents →

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

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

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