DEV Community

Cover image for Design Email Templates Once. Send With Any ESP
Obaseki Noruwa
Obaseki Noruwa

Posted on

Design Email Templates Once. Send With Any ESP

If you've ever migrated ESPs, you know the pain.

You have templates living in three different places — your ESP's
drag-and-drop editor, a folder of MJML files in your repo, and a
Figma doc your designer swears is the source of truth but hasn't
been updated in four months.

Then someone says "we're switching from Mailgun to Resend" and
suddenly you're rewriting every single template from scratch.

I've hit this wall too many times. So I built Maildeno.


What is Maildeno?

Maildeno is a headless email template builder for developers.

The idea is simple:

  • Design templates once in a visual editor
  • Define merge tags and visibility rules
  • Export to HTML, MJML, or React Email
  • Send with whatever ESP you already use

No lock-in. No migration cost. No scattered files.


The problem it solves

Most teams end up with one of these setups:

Setup A — Templates live in the ESP editor
Works fine until you want to switch ESPs. Then you're exporting
broken HTML and trying to reconstruct layouts you built two years ago.

Setup B — Templates live in your repo as MJML files
Better for version control, but now your designer can't touch them
without opening a PR. Every copy change becomes an engineering ticket.

Setup C — Templates live everywhere
The worst. Production uses the ESP version, staging uses the MJML
file, and nobody knows which one is correct.


How Maildeno works

1. Design in the visual editor

Drag and drop rows and columns into a layout. Typography controls,
spacing, gradients, custom borders. Output that doesn't look like
it was built in 2012.

2. Define merge tags

Insert dynamic placeholders directly into the design — customer name,
order total, CTA link. Three variants: text (HTML-escaped), url
(percent-encoded), attr (attribute-safe). The SDK applies correct
escaping automatically.

3. Set visibility rules

Attach show/hide conditions to any row or section visually. No code.
Just set conditions like plan === "pro" or daysLeft < 7 directly
in the editor.

4. Debug with the visual logic debugger

This is the feature I'm most proud of. Pass a context object directly
in the editor and see exactly what the template renders to for that
specific user. No deploys. No console logs. No guessing.

5. Export and send

Export to HTML, MJML, or React Email. Pass the output to AWS SES,
Postmark, Resend, Mailgun — whatever you already use.


The SDK

Install in seconds:

// JavaScript / TypeScript
npm install maildeno

// Python
pip install maildeno

Render in your app:

import { MaildenoClient } from "maildeno"

const client = new MaildenoClient({
apiKey: process.env.MAILDENO_API_KEY,
})

const html = await client.renderHtml("your-template-id")

// Pass to your ESP
await resend.emails.send({
to: user.email,
subject: "Welcome!",
html,
})


Customer data never leaves your server

Templates are rendered locally via an embedded WebAssembly engine.
Merge tags and context are applied in-process — your customer data
is never sent to Maildeno's servers.


Caching built in

The SDK resolves renders through a layered cache:

  1. Memory cache — zero config, sub-millisecond reads
  2. Disk cache — opt-in, survives Lambda cold starts
  3. Stale-on-error fallback — if Maildeno goes down and a cached copy exists, the SDK renders from cache and never throws

Your send pipeline never breaks.


Who it's for

  • SaaS teams with templates scattered across ESPs and repos
  • Developer-designer teams tired of handoff friction
  • Anyone shipping transactional email at scale

Maildeno Builder

Canvas

Merge Tag Preview On

Template Gallery

Email Template Health

Try it

Free tier available. No credit card required. Works with every ESP.

👉 maildeno.com
👉 Docs: docs.maildeno.com

Would love feedback from anyone who's dealt with this problem —
especially around the ESP migration pain or the designer-developer
handoff. Drop a comment below.

Top comments (0)