CloudMailin turns incoming email into an HTTP POST — a job it has done reliably for over a decade. MailKite does the same thing with a modern JSON webhook, adds a first-class send API so you can reply from the same platform, and never charges per domain.
CloudMailin pioneered inbound-email-to-HTTP and is genuinely dependable at it — if all you need is a battle-tested inbound POST, it works.
Parse an incoming email and reply to it with the same account and SDK. CloudMailin is inbound-first; MailKite treats send and receive as one platform with a shared quota.
Run every product, every client, and every alias from one account at no per-domain cost. You never pick which domains are 'worth' paying for.
A modern JSON payload with parsed text, HTML, threading, auth results, and signed attachment URLs — plus an HMAC signature you verify locally, no callback.
Cross your quota and we meter it gently — never a hard cutoff mid-flow. On Free we soft-pause with notice.
| MailKite | CloudMailin | |
|---|---|---|
| Inbound → JSON webhook | Yes — full parsed message | Yes — its core product |
| Send / reply from same API | Yes — one platform, one quota | Inbound-focused; sending is secondary |
| Per-domain fees | None — unlimited domains | Address/volume-based plans |
| HMAC-signed webhooks | Yes, every plan | Signature/basic-auth options |
| One-click webhook replay | Yes (paid) | Limited |
| Zero-retention passthrough | Per-domain toggle | Not offered |
| OSS webmail component | @mailkite/mail (MIT) | None |
| MCP server + Claude Code plugin | Yes | None |
Competitor capabilities change — we re-audit these tables regularly. Spot something out of date? Tell us and we'll fix it.
One JSON object with parsed body, threading, auth results, and signed attachment URLs — instead of prising fields out of a multipart form.
POST /your-webhook
Content-Type: multipart/form-data; boundary=…
--…
Content-Disposition: form-data; name="plain"
Looks good — approved!
--…
Content-Disposition: form-data; name="headers[Subject]"
Re: invoice #1042
--… (attachments as multipart file parts,
headers split across many form fields) 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=…" }
]
} MailKite counts inbound and outbound against one quota, and never bills per domain — so shipping ten products costs the same as shipping one.
Add the MailKite MX records to your domain — or start instantly on a managed subdomain while DNS propagates. No Cloudflare-only requirement.
Set your endpoint in the dashboard. Read event.from.address, event.subject, event.text — no multipart parsing to port.
Check the x-mailkite-signature header with the SDK's verifyWebhook helper and you're live — replies go out through the same send API.
For the inbound-to-webhook job, effectively yes — you repoint MX and swap the webhook URL. The payload is JSON instead of multipart, so most integrations get simpler, not harder.
Yes. Sending is a first-class part of the same API and shares your monthly quota — reply to an inbound message or send transactional mail from your own SPF/DKIM-aligned domain.
Correct. Domains are unlimited and free on every plan, including Free. You only pay once combined inbound + outbound volume crosses your tier.
Point a domain, drop in a webhook URL, receive your first email. Unlimited domains, no credit card.