The Email Repository
What you'll learn
- What the Email Manager is — a per-brand workspace for specifying transactional and system emails.
- What it is not: it is not Mailchimp, not a bulk-send tool, not a campaign blaster.
- How status, version, locale, and the dotted-slug naming convention keep email copy organized before it ships.
Why m18t has an email repository at all
Every product sends emails it didn't really design. The "confirm your address" email, the "your invoice is ready" email, the "someone invited you" email — they get written in a rush, hardcoded into the codebase or pasted into a sending service, and then nobody can find or review them again. The copy drifts. Nobody knows which version is live.
The Email Manager fixes that by being the place where email copy is shaped, versioned, and approved before it gets wired into code or handed to your sending provider. It's a specification workspace, not a sending engine.
This is the single most important thing to understand: m18t does not send bulk or campaign email. There is no audience list, no segment builder, no drip-campaign scheduler, no open-rate dashboard. If you want Mailchimp, Resend, or Postmark, m18t doesn't replace them — it feeds them. You write and approve the email here; your provider (or your application code) actually delivers it. There's one exception for testing: you can send a single live test of one email to one address, which is covered below.
Like everything else in m18t, the repository is per-brand. Switch brands in the sidebar and the Email Manager re-shards to that brand's emails — same UI, different set.
The shape of an email record
Each email in the repository carries:
- Slug in a dotted, namespaced convention —
auth.user.confirm,billing.invoice.ready. The dots read like a path, so emails sort and group sensibly. The slug plus locale plus brand must be unique. - Locale and a locale group that ties translated variants of the same email together (the Arabic and English versions of one confirmation email share a group). This is the same locale-group idea used in content translation.
- Status from the shared status set —
planning,testing,production, and so on — so you can see at a glance which emails are still being written and which are approved. - Version — a plain semantic string like
1.0you bump when you revise the copy. - Category (Auth, Billing, Notifications, etc.), class (Transactional / Marketing / Lifecycle), and agent — the system expected to actually send it (your email/SMTP provider, application code, a payment gateway, or manual).
- Sender envelope: from-name, from-email, reply-to, subject.
- Body: HTML (uploaded as a template file stored in your brand bucket), plain text, or rich.
- Linked events — the analytics events that should trigger this email. This is the chain explained in Tying Events to Emails & Code.
How to add an email
- Open Email Manager (
/studio/email-manager). - Click Add Email.
- Pick the brand the email belongs to, then its language (Arabic or English). These gate the form so an email is always scoped before you start writing.
- Fill in the slug (dotted convention), display name, subject, and classification fields.
- For an HTML email, save first, then upload an
.htmltemplate file — it's stored in your brand bucket. For text, type the body directly. - Set the status as you progress:
planningwhile drafting, up through toproductiononce approved.
How to preview and send a test
- In the email list, click the preview (eye) icon on a row that has a template, or open the email and use Preview. The HTML renders in a sandboxed frame exactly as it will look.
- To verify delivery, click Send Test. Enter a recipient address and pick an SMTP Gateway — these come from your brand's active email-SMTP integrations. If none are configured, the dialog tells you so.
- Dispatch Test sends one message to that one address. This is the only sending m18t does — there is no "send to a list."
Variations
- Translated variants. Use the duplicate (copy-plus) action on a row to spin up the opposite-locale variant, pre-linked into the same locale group. The list flags an email as "paired" or "orphan" so you can see which ones still need a translation.
- Where the body lives. HTML templates are stored as files in your workspace media hub under the
emailsnamespace; the preview resolves them through the storage bridge.
FAQ
Can I send a newsletter or campaign to my mailing list from m18t? No. m18t specifies and approves emails; it does not send bulk or campaign email. There's no audience list or segment tool. Use your provider (Mailchimp, Resend, etc.) for delivery — m18t is where you author and version the copy first. Drip campaigns are roadmap-only.
Then what does Send Test actually do? It sends a single message of one email to one address you type in, via a brand SMTP integration, so you can confirm the template renders and delivers. That's the only sending in the product.
Why are email slugs written with dots?
The dotted convention (auth.user.confirm) reads like a path and groups related emails when sorted. Slug + locale + brand is the uniqueness key.
How do I keep Arabic and English versions of one email in sync? Give them the same locale group. The list shows a "paired" check when both locales exist and an "orphan" warning when one is missing. The duplicate action sets the group up for you.
Where do I see which event triggers an email? On the email's row, the Events column shows the linked events. You wire the link on the email (Triggering Events) or on the event (Linked Emails) — see Tying Events to Emails & Code.
What's next
- The Analytics Event Registry — the events that trigger your emails.
- Tying Events to Emails & Code — wire the feature → event → email chain.
- Per-Brand Integrations — set up the SMTP gateway that test-sends use.
- Locale Groups & Translation — the same pairing idea applied to content.
- The Status Set — the status vocabulary emails share.