Transactional email templates for SaaS products

Patterns for every product email your SaaS needs — managed outside your codebase, triggered by events, rendered with your brand.

Why hardcoded or generic templates fail SaaS teams

Generic provider templates are hard to maintain

Inline HTML in SendGrid or Postmark is hard to version, preview or hand off to a designer.

Hardcoded strings miss context

Personalisation — plan name, amount, expiry date — requires custom interpolation code per template.

Locale variants multiply complexity

Supporting multiple languages means duplicating templates and keeping them in sync by hand.

No central template library

Templates spread across services, mailers and background jobs make auditing and updating a chore.

Event-driven template patterns that scale with your SaaS

One template per event type

Map each domain event to a template. Add locale variants and plan-specific versions without duplicating logic.

Variables injected from event payload

Template variables like {{ user.name }} or {{ data.amount }} are resolved from your event JSON at render time.

Managed outside your repo

Templates live in else.events. Update copy without a deployment, preview with test data before going live.

Responsive MJML base

All templates are MJML-based — rendered to responsive HTML that works in Gmail, Outlook and Apple Mail.

Template patterns for every SaaS email type

user.password_reset_requested

Password reset

Single-use link, clear expiry, no marketing noise.

invoice.payment_failed

Payment failed

Personalised dunning with direct link to update payment method.

trial.ending_soon

Trial reminder

Days remaining, current plan, upgrade CTA.

team.invited

Team invitation

Branded invite with role context and accept CTA.

subscription.updated

Subscription update

Confirmation for upgrades, downgrades and cancellations.

Common template variables across SaaS email types

Variables are resolved from your event payload at render time. No contact database required.

  • {{ user.name }} Recipient display name
  • {{ user.email }} Recipient email address
  • {{ app.name }} Your SaaS product name
  • {{ action_url }} CTA deep-link — password reset, billing page, invite acceptance
  • {{ expires_at }} Expiry for links or trial windows, formatted at render time
  • {{ plan.name }} Plan tier — Free, Pro, Enterprise
  • {{ invoice.amount }} Invoice or payment amount with currency

Frequently asked questions

Do I have to use else.events templates or can I use my own HTML?
else.events uses MJML templates that you create and edit in the dashboard. You write the template; else.events renders and delivers it.
How are variables injected into templates?
Variables are resolved from your event payload at render time using Handlebars-style syntax: {{ user.name }}, {{ data.plan }}.
Can I have different templates for free vs paid users?
Yes. Use a rule that matches on the plan field in your event payload to route to different template versions.
Is there a template library I can start from?
else.events provides starter templates for common SaaS email types that you can customise or use as-is.

Start with your first template

Create a template, connect it to an event, see it render in seconds.

  • Free during public beta
  • MJML-based, responsive
  • Preview with test data