Resend, on your Cloudflare.
The same API, the same JSX templates — plus broadcasts, automations, inbound and real analytics. One click deploys it into your own account. No bill from us, ever.
or read the 3-minute quickstartnpx mailysend deploy --domain acme.dev~40–90simport { MailySend } from 'mailysend'; const ms = new MailySend(process.env.MAILYSEND_API_KEY); await ms.emails.send({ from: '[email protected]', to: '[email protected]', subject: 'Your login code', react: <LoginCode code="814205" />, });
Same call from a Worker, a Lambda or your laptop — and the same shape your Resend code already uses.
Four steps. Nothing hidden.
Most people are sending real email in under five minutes. Every step tells you exactly what happens next.
Already on Cloudflare DNS? We write the SPF, DKIM and DMARC records for you and verify in seconds.
Scoped keys (send-only, per-domain, per-environment) that start with ms_.
SDK, REST, SMTP relay, Wrangler CLI or a native Worker binding — whichever fits your stack.
Every event — accepted, delivered, opened, bounced — streams to your dashboard and your webhook.
See the dashboard →The whole email stack Resend
left on the table.
Emails API
Single and batch sends, attachments, scheduling, idempotency keys, tags, custom headers, reply-to threading.
Broadcasts & audiences
Contact lists in D1, a no-code editor, segments, scheduled sends, automatic unsubscribe handling and one-click list headers.
Receive & reply
Catch-all inbound over Cloudflare Email Routing, parsed to JSON, attachments in R2, threaded per-mailbox in a Durable Object.
Logs, webhooks, analytics
Searchable message log with full payloads, signed webhooks with retries, and per-tag delivery analytics from Analytics Engine.
Templates in JSX
Write email as React components, preview across 40 clients, version every template, render to HTML and plain text at the edge.
MCP server & agent tools
Give Claude, Cursor or your own agent a mailbox: search threads, draft replies, send with explicit confirmation. Built on the Cloudflare Agents SDK.
MCP docs →A first-party SDK, and the spec the rest generate from.
The Node SDK is written and published, with a Resend-compatible shim — your react-email components render unchanged. Every other language generates from the OpenAPI document your own deployment serves at /v1/openapi.json, so a client is one generator run away and is never out of date with the API it was generated from. Alongside them: a CLI, an SMTP relay, JSX templates and an MCP server, all MIT licensed.
Try it in one click.
Own it forever.
There is no MailySend cloud to sign up for. You deploy the platform into your own Cloudflare account — from the browser or from your terminal — and it is yours.
Press the button
Deploy to Cloudflare creates D1, KV, R2 and the Durable Objects in your account and hands you the dashboard on your own workers.dev subdomain. Queues and the analytics datasets take one command afterwards.
- Ready in about a minute — most of it DNS propagation
- Nothing to fill in — the deploy form has no fields at all
- Migrates itself and prints your first API key on boot
Or from your terminal
Clone the repo and run the two commands below against your own wrangler config — reviewable, scriptable, CI-friendly, and the same thing the button does.
$ npx mailysend provision && npx mailysend deploy✓ queues · do · d1 · kv · r2 ready in ~40–90s
Not a black box. Workers, all the way down.
Resend hides a managed MTA behind a lovely API. MailySend is eleven Cloudflare primitives you already know, wired together in code you can read — so you can reason about latency, retries and cost, and own every byte.
Read the self-hosting guide →Debug a delivery in two clicks.
Search the log by recipient, tag, status or subject. Open any message to see the exact payload you sent, the SMTP conversation, and every webhook attempt with its response code.
Take the product tourHard bounce. 550 5.1.1 — mailbox does not exist. Address added to your suppression list automatically. Why?
Same API. Different everything else.
Full comparison, all four providers →Already on Resend?
Change one line.
Same request shape, same field names, same status values, same webhook event names. Your react-email templates render unchanged. Point the base URL at your instance and your existing code keeps working — including the SDK, if you use the compat shim.
import { Resend } from 'resend';
const resend = new Resend('re_...');
await resend.emails.send({
from, to, subject,
react: <Receipt order={o} />,
});import { Resend } from 'mailysend/compat';
const resend = new Resend('ms_...');
await resend.emails.send({
from, to, subject,
react: <Receipt order={o} />, // unchanged
});emails, batch, domains, api-keys, audiences, contacts, broadcasts
Your existing handler needs no edits
Audiences, contacts, suppressions and 30 days of history
Keep Resend as the upstream provider, shift traffic a percent at a time
26 guides that
run the real code.
Task-shaped, not reference. Where a guide explains a rule the product enforces — how a bounce is classified, what a segment compiles to, what a hundred thousand emails cost — the page imports the same function the product calls, so the answer on the page is the answer your instance gives.
Straight answers, including the awkward ones
Your first email is
one deploy away.
One command, your Cloudflare account, MIT licensed. No MailySend invoice — ever — and no migration lock-in in either direction.