Theme

Emails

Every message you send lives in the email library. You write the body in markdown with Liquid for personalization, and a template wraps it in your branding.

The library

The library lists one row per email. It's the single place your content lives, which means the same email can be used in more than one context without being copied around.

Where an email comes from

Everywhere an email gets attached — a new broadcast, a new sequence step, or swapping the email on either — Mimeo asks the same question first, rather than guessing:

If you pick the library, there's a second question, and it's the one that matters later:

There is deliberately no default on that second question. Sharing and copying are opposite answers to "what does my next edit change", and picking wrong is the usual source of "why did that email change?"

Broadcasts always get their own email

A broadcast never shares a library email, so it isn't asked the second question. Whichever way you start it — blank, or from a library email — the broadcast gets a new row of its own, added to your library. That's what keeps a sent broadcast honest: what it said stays what it said, however you later edit the email you started from.

Splitting a shared email off later

If an email is shared and you realise this one place should go its own way, you don't have to start over. Open the email from inside that broadcast or step, go to Used in, and choose Make a separate copy for this broadcast (or step). Everything written so far comes with it, including edits you haven't finished typing.

Confirm it and three things change, all of them only for this one place: edits stop reaching everywhere else, the copy's opens and clicks start from zero, and anyone who already received the original counts as not having received this one.

Finding what's reusable

Because every broadcast mints an email, the library fills up with rows that exist for a single send. That's expected. Use the Used in filter above the list to sort them out: pick any of Broadcasts, Sequences, Flows, or Flows (one-offs only), and match emails used in any of them, in all of them, or in none of them. "None of them" is how you find emails nothing points at any more.

The library's own Duplicate row action still exists for making a spare copy that isn't attached to anything; it prefixes the subject with "Copy of" so the two are tellable apart in the list. A copy made for a specific broadcast or step keeps the original subject, since that subject is what recipients see.

Writing: markdown plus Liquid

The editor takes markdown. Headings, lists, links, bold, and emphasis all work the way you expect, and the template turns them into styled HTML at send time.

Person variables

Variable Resolves to
{{ person.email }} Their email address
{{ person.first_name }} First name
{{ person.last_name }} Last name
{{ person.name }} Full name
{{ person.fields.<key> }} Any custom field, by the key you declared under Settings → Fields

Defaults

Real lists have blanks. Always give personalized text a fallback with the default filter:

Hi {{ person.first_name | default: "there" }},

Without it, the people missing a first name get "Hi ," — which reads as exactly the kind of automation you're trying not to look like.

Conditionals

{% if person.fields.plan == "pro" %}
You're on Pro, so this is already included in your plan.
{% else %}
Pro subscribers get this included — here's what's in it.
{% endif %}

{% if %}, {% else %}, and {% endif %} are supported. Keep the logic shallow: an email that needs deeply nested branches is usually two emails.

Snippets

A snippet pulls in a reusable component you've defined once — a signature, a promo block, a standard footer note:

{% component "signature" %}

The key matches a component in your templates. Edit the component and every email using it updates.

Buttons

Buttons are a tag rather than hand-written HTML, so they render correctly across mail clients:

{% button label:"Start your trial" url:"https://example.com/signup" style:"primary" %}

style refers to a saved button style by name, defined alongside your templates. That's what keeps buttons consistent across every email instead of drifting one message at a time.

Images

Three options, all valid:

Templates

Templates are full HTML and CSS — this is deliberately not a drag-and-drop builder. There are two kinds.

Layouts

A layout is the shell around your content: header, branding, typography, footer. Two rules:

One layout is marked default and is used by emails that don't specify another.

Components

Components are the reusable fragments that {% component %} pulls in. Same full HTML and CSS control as layouts, scoped to a piece rather than the whole message.

Colors and Buttons

Colors is your brand palette: named colors saved once and offered anywhere a color is picked, so you're choosing "Ocean" rather than remembering #0e7490.

Buttons defines the named styles {% button %} refers to — background, text color, corner radius. Editing a style recompiles every email that uses it, so buttons stay consistent everywhere without touching a single email.

Where an email is used

An email can be shared by more than one place, so the Used in tab lists everywhere it is: the flows that send it, the sequences that contain it, and the broadcasts it has gone out as — each with a count, and each the same listing you'd see on that section's own page. Opened from inside a broadcast or a step, this tab also says how many places share the email, and is where you split this one off into its own copy.

A flow counts as using an email two ways: a send step that names it, or a step that starts a sequence containing it. Both are listed, and a flow that does both appears once with both routes noted.

Report beside it goes straight to this email's numbers in Reporting.

Preview

Preview renders the real thing against real data. You can:

Toggle mobile and desktop widths and light and dark appearance. Dark mode is where email designs break most often — a logo that's black-on-transparent disappears entirely.

Send test to me

Sends the compiled email to your own address through your real provider. It's the last check before a real send, and the only one that proves the whole chain works: compile, provider handoff, delivery, tracking.

Reset sent-status for everyone

Each email tracks who has already received it, so nobody gets the same message twice. Reset sent-status for everyone clears that, restoring eligibility so the email can go out again to people who already got it.

The send log is not touched. Your history of what was actually sent stays complete and accurate — this only affects future eligibility, not the record of the past.

This library is what automation sends. Sequences and flows and broadcasts all send emails from here rather than holding private copies somewhere you can't see them. Whether an edit reaches one send or all of them is the shared versus copied choice you made when you attached it.