Transactional email for SaaS products

Updated

A SaaS product sends more transactional email than most teams plan for. The list grows with every feature, so it pays to organise it early.

The emails most SaaS products need

| Category | Emails | |---|---| | Account | Verification, welcome, password reset, email change | | Security | New sign-in, password changed, 2FA changes, API key created | | Billing | Receipt, invoice, failed payment, plan change, trial ending | | Collaboration | Team invitation, role change, mention or comment notification | | System | Export ready, import finished, usage limit reached, scheduled report |

Structure it

  • Two or three senders. security@, billing@, notifications@, each consistent. See the deliverability checklist.
  • Templates for stable emails (receipts, invitations) built in the dashboard and referenced by template_id. Inline HTML for emails that change with your code release.
  • One internal sendEmail() function in your codebase, wrapping the API call, so retry rules, logging and the "already sent" guard live in one place. Pick your language: Node.js, Python, PHP, Django, Laravel, Next.js.
  • A sent log in your own database for anything that must not duplicate (invoices, receipts). The API has no idempotency key.
  • Webhooks for bounced and complained feeding a suppression flag on your user records.

Per-tenant sending

If you send on behalf of customers from their domains, each customer domain must be added and verified in your workspace first, because the API only sends from verified senders. Plan the onboarding step that guides customers through their DNS records.

Keep product and marketing separate

Trial nurture, feature announcements and newsletters go through campaigns and automation in the same workspace, not through the transactional API. That keeps promotional complaint rates away from account mail. See transactional vs marketing.

Limits to design around

Single recipient per call, no attachments, and 120 requests per minute per key. Digest or batch notifications in your own code if a user action can fan out to many recipients.

Frequently asked questions

Should team invitations be transactional?
Yes. An invitation is triggered by one user for a specific recipient and is expected. Keep the wording factual and include who invited them.

Start sending product email

Create a workspace, verify a domain, and make your first API call.

Related