Route support@yourapp.com to a signed webhook and create a ticket the instant mail lands — sender, subject, body, and threadId already parsed. Reply through the same API and it threads correctly in the customer's inbox.
The parsed message — from, subject, text/HTML, threadId, attachments — arrives as JSON, so creating a ticket is a few field reads, not a MIME parser.
Send your reply through the Send API with the message-id and In-Reply-To/References are handled — the customer sees one clean thread.
Webhooks retry with backoff, and you can replay any message in one click if your app was down — no support email lost to a 500.
Every event carries SPF/DKIM/DMARC and spam results, so you can flag or drop forged 'urgent' support mail before it becomes a ticket.
Add MX (or use a managed subdomain) and route the support@ address — or a catch-all — to your webhook URL in the dashboard.
Read event.from.address, event.subject, event.text, and event.threadId in your handler and upsert a ticket.
Send the agent's reply through /v1/send referencing the thread — it lands back in the customer's inbox, correctly threaded.
Verify the HMAC signature, then a ticket is a handful of field reads — no MIME parsing, no polling.
// POST /webhooks/mailkite
export async function POST(req) {
const raw = await req.text();
if (!verifyWebhook(req.headers, raw, process.env.MK_SECRET))
return new Response("bad signature", { status: 401 });
const evt = JSON.parse(raw);
await tickets.create({
from: evt.from.address,
subject: evt.subject,
body: evt.text,
thread: evt.threadId, // reply to this to thread correctly
spoofed: evt.auth.dkim !== "pass",
});
return new Response("ok");
} No — you decide what a 'ticket' is. The webhook hands you the parsed message; create a row in your database, open an issue, page someone, whatever fits. Many teams wire it into their existing helpdesk.
Send your reply through the Send API referencing the original message; MailKite sets In-Reply-To/References so the customer's mail client shows a single conversation.
Deliveries retry automatically with backoff, and every message is replayable in one click from the dashboard on paid plans, so nothing is lost while you recover.
Start free on unlimited domains — no credit card. Or browse the other solutions.