React Email, built in
Pass a component as react and the SDK renders HTML and plain text for you, exactly like Resend. Your existing emails folder just works.
For developers
Write your emails as React components and send them with one call. Add subscribers from your own signup flow, start automations with events, and push your whole templates folder from the command line.
await mm.emails.send({from: "Manny <hello@mannysbakery.com>",to: "sam@example.com",subject: "Welcome to the bakery!",react: <WelcomeEmail name="Sam" />,});
Quickstart
Verify your domain, create a key, and send. Use the SDK for React Email, or plain HTTP from any language.
import { Mailmanny } from "mailmanny";import WelcomeEmail from "./emails/welcome";
const mm = new Mailmanny(process.env.MAILMANNY_API_KEY);
const { data, error } = await mm.emails.send({ from: "Manny's Bakery <hello@mannysbakery.com>", to: "sam@example.com", subject: "Welcome to the bakery!", react: <WelcomeEmail name="Sam" />,});
if (error) { console.error(error.name, error.message);} else { console.log("Queued", data.id);}curl -X POST https://www.mailmanny.com/api/v1/emails \ -H "Authorization: Bearer $MAILMANNY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "from": "Manny <hello@mannysbakery.com>", "to": "sam@example.com", "subject": "Welcome to the bakery!", "html": "<p>Your first croissant is on us.</p>" }'import { render } from "@react-email/render";import WelcomeEmail from "./emails/welcome";
const res = await fetch("https://www.mailmanny.com/api/v1/emails", { method: "POST", headers: { Authorization: `Bearer ${process.env.MAILMANNY_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ from: "Manny <hello@mannysbakery.com>", to: "sam@example.com", subject: "Welcome to the bakery!", html: await render(<WelcomeEmail name="Sam" />), }),});
const body = await res.json();if (!res.ok) throw new Error(`${body.name}: ${body.message}`);console.log("Queued", body.id);What you get
Pass a component as react and the SDK renders HTML and plain text for you, exactly like Resend. Your existing emails folder just works.
Give a signup integration a key that can only add people to the audiences you pick: no reading your list, no sending. Double opt-in and consent records included. On Essentials and up.
npx mailmanny templates push renders every React Email file and uploads it. Send by name, or use it in campaigns. On Essentials and up.
Track order.completed or trial.started from your backend and let a welcome series or win-back flow take it from there. On Standard and Pro.
Send an Idempotency-Key and retry as often as you like. Batches resume where they stopped; the SDK backs off on 429s.
DKIM and SPF on your own domain, automatic bounce and complaint suppression, and every workspace isolated from the others.
Change the import and the key. emails.send, batches, scheduling, tags and idempotency keys keep working.
- import { Resend } from "resend";- const resend = new Resend(process.env.RESEND_API_KEY);+ import { Mailmanny } from "mailmanny";+ const resend = new Mailmanny(process.env.MAILMANNY_API_KEY);
await resend.emails.send({ from: "Acme <hello@acme.com>", to: "sam@example.com", subject: "Your receipt", react: <ReceiptEmail order={order} />, });Contacts upsert by email, accept subscriber hashes, and take tags as { add, remove }. Double opt-in is on unless you say otherwise.
const { data, error } = await mm.contacts.create({ audienceId: "0199e9c1-2f3a-7b4c-8d5e-6f7a8b9c0d1e", email: "sam@example.com", firstName: "Sam", tags: ["newsletter"], consentSource: "Footer signup form on mannysbakery.com",});
// Double opt-in audiences: "pending" until they click// the confirmation email.console.log(data?.status);
The CLI compiles every React Email file with your own toolchain, renders it, and uploads HTML plus plain text. Run it in CI and your templates never drift from your code.
Templates & the CLInpx mailmanny templates pushMailmanny pushing 3 templates from emails → https://www.mailmanny.com/api/v1 ✓ welcome created 4.1 KB “Welcome to Manny's Bakery” ✓ receipt updated 6.8 KB “Your receipt” ✓ auth.reset created 1.2 KB “Reset your password”3 pushed. Use them with template_id: "<id>" when sending.Free to start, with 100 API emails a day. Verify a domain, create a key, and send with the code you already have. Essentials, from $9 a month, includes 10,000 API emails a month and no daily cap.
Essentials, from $9 a month, includes 10,000 API emails a month and no daily cap. Verify a domain, create a key, and send with the code you already have.