Stop rebuilding email inside every product.
You've written the in-house email service before — for your product, or a client's. Outsource that layer once: rootmail carries sending, templates, audiences, deliverability, and proof, so email keeps up with the market without you redeploying anything.
Typed Node SDK · CLI · REST — and everything stays editable from the dashboard by anyone you hand it to.
import { RootMail } from "@rootmail/node";
const mail = new RootMail({ apiKey: process.env.ROOTMAIL_API_KEY! });
// The last email code you write for this product.
await mail.send({
to: user.email,
template: "welcome", // designed & edited in the dashboard
variables: { name: user.name },
idempotencyKey: `welcome-${user.id}`,
});Email is a product of its own. Don't maintain two.
Every backend grows an accidental email service — templates in code, delivery mysteries, compliance TODOs. rootmail is that service, finished.
Change email without redeploying
Templates, sequences, sender domains, suppression rules — all live in rootmail, editable by you or the people you build for. Your product's code stays untouched when the email needs change.
The boring parts, guaranteed
Idempotent sends, automatic suppression and bounce handling, DKIM/SPF/DMARC, signed webhooks, and an append-only audit trail. You inherit a decade of email lessons in one integration.
Hand the keys to non-developers
Everything you wire up is drivable from a no-code dashboard. Build for a client, hand them the dashboard, keep the API — both of you work on the same data.
Grows into platform territory
Sending on behalf of YOUR customers? Client domains give each their own verified identity and isolated reputation — no re-platforming the day you become a platform.
An API you can hold in your head
snake_case JSON over HTTPS, a typed Node SDK and a terminal/CI-ready CLI, idempotency on every send, and sub-tenant scoping with a single call. Read the trail back whenever you need to prove what happened.
- Fully typed @rootmail/node SDK + @rootmail/cli
- Idempotency keys on every send
- Sub-tenant scoping with withSubTenant()
- Deliverability, analytics & the AI agent, in-SDK
import { RootMail } from "@rootmail/node";
const mail = new RootMail({ apiKey: process.env.ROOTMAIL_API_KEY! });
// Idempotent transactional send — retries never double-send.
await mail.send({
to: "user@example.com",
template: "password-reset",
variables: { reset_url, user_name },
idempotencyKey: `pwd-reset-${user.id}`,
});Everything the dashboard does, the API does.
The web dashboard, the SDK, the CLI, and raw REST are four doors into one product — whatever gets built no-code is yours to drive in code, and vice versa.
Send
idempotent, templated, sandboxed
Templates & blocks
the studio's output, versioned
Contacts & audiences
import, segment, suppress
Campaigns
send, schedule, funnel stats
Sequences
multi-step, stop-on-reply
Replies
threaded inbound, webhook-routed
Webhooks
signed, idempotent, replayable
Deliverability
score, fixes, DNS records
Analytics
per campaign, sequence, tenant
Client domains
per-customer DKIM + verify
Proof exports
Ed25519-signed, tamper-evident
Assistant
build, operate & diagnose via API
The guarantees you'd have to build yourself
- snake_case JSON over HTTPS — Bearer auth, no surprises
- Idempotency keys on every send — retries never double-send
- Test-mode keys & a hosted test inbox — sandbox sends are always free
- Signed webhooks with delivery logs you can replay
- Append-only audit trail on every message
- One-command migration: SendGrid, Postmark, Mailgun exports
3,000 sends a month, free. No card.
Then blocks of 25,000 sends priced to drop as you grow — and sandbox sends never count. Live prices are on the main site; add-ons ride the same bill.