Email repository

Draft transactional emails before they hit production.

A per-brand spec-and-approval workspace for the emails your product sends. Draft, version, preview, send-as-test. Link each email to the analytics events that should trigger it. NOT a campaign blast tool — that's a different category of product.

Email repository interface
The problem this solves

Transactional email copy lives nowhere.

Where does your product's "welcome email" actually live? Probably scattered across a Google Doc the founder drafted six months ago, a Mailchimp template someone pasted it into, a string constant in the auth controller, and the test inbox of whoever shipped it. By the time someone wants to update the copy, finding the canonical version takes longer than rewriting it.

m18t's email repository gives every transactional email a home. Slug + locale + version. Status workflow (planning → in-production). Preview that renders the HTML. Send-as-test so you can see it in your inbox before approval. Link to the analytics events that should fire it.

The canonical copy lives here. Your sender (Resend, Postmark, Mailchimp, your codebase) consumes it.

Important — what this isn't

m18t does not send your emails.

m18t is a spec-and-approval workspace. It drafts, versions, previews, test-sends — then you wire the approved copy into your transactional sender (Resend / Postmark / Brevo / SendGrid / Mailchimp) or your codebase, where it gets sent at runtime to actual users. No bulk send. No drip campaigns. No subscriber-list management. Those are different products.

What you get

Capabilities

Dotted-slug naming convention

Emails are identified by slug like auth.user.confirm or billing.invoice.sent. Consistent across the platform and across your codebase.

Locale-grouped translation siblings

A welcome email in Arabic and English are linked siblings via locale_group. Edit both side-by-side; they share metadata.

Status workflow

Planning → To Do → Doing → Testing → Production. The same opinionated status set as everything else in m18t, with per-type aliases.

HTML preview with merge fields

Preview the email with sample data filled in. Catches broken markup, missing variables, and copy issues before approval.

Send-as-test

Send the rendered email to a test inbox so you can see it in real email clients (Gmail, Outlook, mobile). Catches what previews miss.

Linked to analytics events

Each email links to the events that should trigger it (welcome.email triggered by user.signup event). When team features ship, ownership lives here too.

In context

Emails tie to events tie to controllers.

Pair with Analytics events →

Each email links to the events that should fire it. When a developer adds the instrumentation, they read both the event registry and the email together.

Pair with Product Development →

Events tie back to PD controllers. So "welcome email fires from the user.signup event, which is emitted by the AuthController.create method" is one connected chain.

Pair with Multi-brand workspace →

Each brand has its own email repository. Different brands can have completely different transactional email flows.

Frequently Asked Questions

Stop hunting for your welcome email.