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:
- Create a new email from scratch — starts blank, and joins your library as its own email.
- Use an email from your library — start from something you've already written.
If you pick the library, there's a second question, and it's the one that matters later:
- Use the library email directly — one shared source. Editing it here changes it everywhere it's used, and its opens and clicks all count toward the one email. Use this when the content should stay identical everywhere, like a standard welcome.
- Copy it to create a new version — an independent copy with its own stats. Edits stay here, the original is untouched, and people who already received the original are eligible for this one. Use this when you want a variation.
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:
- Built-in local hosting — upload and Mimeo serves it from your instance. Simplest; nothing else to configure.
- Your own bucket — connect R2 or S3 under Settings → Storage and uploads go there. Use this when you want the assets under your own storage account.
- External URLs — paste a URL to an image you already host. Nothing is uploaded.
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:
-
It must contain
{{ content }}, which is where the rendered email body is inserted. -
Its footer should contain
{{ unsubscribe_url }}. That resolves per recipient to a signed link tied to that person and that exact email. Leaving it out means sending mail with no opt-out.
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:
- Render as a saved preview person — a fixed person you keep for consistent checks.
- Render as a random person — good for catching missing fields you'd never hit with your own tidy test record.
- Search for a specific person by email when you're debugging what one particular subscriber saw.
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.