EE vs MailKite logo
Alternative to Elastic Email

The same inbound job — as a signed JSON event with the trust verdict already in it.

Elastic Email is one of the cheapest ways to send, and its Inbound Routing can receive: point your MX at it and it POSTs parsed fields to a URL. But that POST is unsigned form params with no SPF/DKIM/DMARC verdict, it's gated to the paid Pro plan, and there's no agent loop. MailKite (which we build) delivers the same message as one signed email.received event with a normalized auth block and a receive→reply loop.

A fair take on Elastic Email

Elastic Email's per-email price sits at the very bottom of the market, and it speaks both HTTP API and SMTP relay — for a send-heavy agent where outbound volume is the dominant cost, that's genuinely hard to beat. Its inbound parse is real too: body_text and body_html arrive already decoded.

How it works

Elastic Email vs MailKite, in one diagram

EE Elastic Email email in EE inboundmx.inbound MX form POSTno auth verdict your appparse + dig auth EE send APIsend reply MailKite email in MX edgeparse + auth JSON webhookauth block your agentyour model mk.send()reply out Blue = operated by MailKite. On Elastic Email the auth verdict isn't a field; you dig it out of header_list first.
Why teams switch

What MailKite does differently

The auth verdict is a field, not a regex

Elastic Email's inbound POST has no SPF/DKIM/DMARC or spam field — the only signal is whatever an upstream relay stamped into the raw header_list, which you string-parse yourself. MailKite normalizes it into event.auth { spf, dkim, dmarc, spam } at the edge.

Signed webhook, not an open URL

Elastic Email's form POST is unsigned, so anyone who learns your route URL can forge an email to it — guarding it (secret path, IP allowlist, token) is your job. MailKite signs every event; verifyWebhook() checks it in one call.

Inbound is included, not gated to Pro

Elastic Email's Inbound Email Processing is a paid Pro feature, and inbound draws down your sending allowance. MailKite's free tier of 3,000 messages/mo covers inbound and outbound, with unlimited domains and no per-domain fee.

The receive→reply loop is built in

On Elastic Email you wire the model and the send API yourself, and set In-Reply-To/References by hand to thread. A MailKite route with action: 'agent' runs the loop for you, or bring your own and reply with mk.send({ inReplyTo }).

Side by side

MailKite vs Elastic Email

MailKite Elastic Email
Inbound → parsed webhook Yes — signed JSON event Yes — form POST params
Inbound plan gate Included; free tier covers inbound Pro plan only; draws sending allowance
Auth verdict (SPF/DKIM/DMARC) Normalized auth block Not a field — grep raw header_list
Spam signal auth.spam (ham/spam) None in payload
Webhook authentication Signed; verifyWebhook() in one call Unsigned — guard the URL yourself
Body for the model Decoded text + html body_text + body_html (decoded)
Reply + threading mk.send({ inReplyTo }) resolves it Separate send API/SMTP; set headers yourself
Agent loop built in Optional route action: agent, or BYO None — wire model + send yourself

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

One signed JSON object with a normalized auth block and signed attachment URLs — instead of an unsigned form you guard yourself and a trust verdict you grep out of raw headers.

Elastic Email Inbound Routing (unsigned form POST)
http
POST /your-webhook
Content-Type: application/x-www-form-urlencoded

from_email=ada@example.com
from_name=Ada
env_from=ada@example.com
env_to_list=agent@myapp.ai
to_list=agent@myapp.ai
subject=Re: invoice #1042
body_text=Looks good — approved!
body_html=<p>Looks good — approved!</p>
header_list=…raw headers; dig out Authentication-Results yourself…
att1_name=po.pdf
att1_content=…inline base64…

# no signature to verify, no spf/dkim/dmarc/spam field
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

Elastic Email

  • Among the cheapest senders (API + SMTP relay)
  • Inbound Processing is Pro-only (Email API Pro $49/mo)
  • Inbound draws down your sending allowance

Elastic Email wins on raw send price for high outbound volume; MailKite includes inbound free and never bills per domain. Confirm current numbers on each pricing page before you commit.

See full MailKite pricing →

Switch in an afternoon

Moving from Elastic Email

  1. 1

    Point your MX at MailKite

    Swap the MX record off mx.inbound.elasticemail.com and DNS-verify the domain (MX to receive, SPF + DKIM to send). No Pro plan or sandbox wait to receive.

  2. 2

    Replace the form handler

    Delete the urlencoded middleware and the header_list regex. Read the JSON body directly: event.from.address, event.subject, event.text, and event.auth for the trust verdict.

  3. 3

    Verify and reply

    Check x-mailkite-signature with verifyWebhook(), then reply through mk.send({ inReplyTo }) — threading resolves for you. Keep bulk sending on Elastic Email for the price if you like; they're not exclusive.

Questions

Can Elastic Email receive inbound email?

Yes. Its Inbound Routing points your MX at mx.inbound.elasticemail.com, parses the message, and POSTs the fields (from_email, subject, body_text, body_html, header_list, att1_content, and more) to a URL you configure. MailKite delivers the same message as one signed email.received JSON event with a normalized auth block.

Does Elastic Email's inbound payload include an SPF/DKIM/DMARC verdict?

No. There's no SPF, DKIM, DMARC, or spam field in the POST. The only authentication signal is whatever an upstream relay stamped into the raw header_list, which you'd string-parse yourself. MailKite normalizes it into auth: { spf, dkim, dmarc, spam } at the edge.

Is Elastic Email's inbound feature free?

No. Inbound Email Processing is gated to the Pro plans (Email API Pro is $49/mo at the time of writing), not the free or Starter tiers, and inbound draws from your sending allowance. MailKite's free tier of 3,000 messages/month covers inbound and outbound with no per-domain fee. Confirm current numbers on each pricing page before you commit.

Go deeper

The Elastic Email alternative for AI agents →

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

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

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