Transactional Email
Send reliable, deliverable emails triggered by product events — verification, password reset, receipts, invitations, and system alerts.
Options
Delivery Provider*
Deliverability Setup*
Templating Approach*
Decision Points
Will you ever send marketing email (newsletters, promotions) from the same brand?
If yes
Plan separate transactional and marketing streams from the start.
If no
A single stream is simpler; split later if you add marketing email.
Do you expect to send >100k emails/month in year one?
If yes
Evaluate SES or Postmark pricing carefully; negotiate volume discounts.
If no
Pick the best developer experience (Resend / Postmark) — the price delta is rounding at low volume.
Should you use a managed provider (SendGrid, Postmark, SES) or self-host?
If yes
Use a managed provider — Postmark for deliverability, Resend for DX, SES for cost at volume. Self-hosting is never worth it for transactional.
If no
Only self-host for regulated environments with egress constraints; expect months of reputation work.
Is a dedicated IP justified for your volume?
If yes
Above ~100k emails/month, request a dedicated IP and budget a 2–4 week warm-up. Below that, shared pools from Postmark/SendGrid are cleaner.
If no
Stay on the shared pool — reputation is managed for you.
Should mail send from an isolated subdomain (mail.yourdomain.com)?
If yes
Standard practice — protects root-domain reputation from email mistakes and makes DNS records easier to manage.
If no
Only sending from root if you have no other choice; keep SPF/DKIM alignment tight.
Is DMARC enforcement (p=reject or p=quarantine) required?
If yes
Start with p=none for reporting, then ramp to quarantine and reject once SPF+DKIM alignment is verified across all senders.
If no
Inbox providers increasingly require DMARC — plan to enforce within 6 months anyway.
Do user replies to transactional email need to drive app actions (reply-to-comment)?
If yes
Use a provider with inbound reply parsing (Postmark, SendGrid Inbound Parse) and a dedicated Reply-To subdomain with MX records.
If no
Set Reply-To to a monitored support inbox or no-reply address.
Does marketing/CX need to edit templates without a code deploy?
If yes
Use provider-hosted templates (SendGrid Dynamic Templates, Postmark) or a notification platform (Knock, Courier). Keep security emails in code.
If no
Code-owned templates (React Email, MJML) are reviewable and version-controlled.
Do templates need per-recipient personalization beyond name / link?
If yes
Use a templating engine with merge fields (Handlebars, Liquid). Provider templates handle this well; React Email makes it trivial in code.
If no
Static templates with a few variables are fine — don't over-engineer.
Do you need template versioning with rollback?
If yes
Code templates get this from git for free. For provider templates, pick one with built-in versioning (Postmark) or snapshot before edits.
If no
Direct edits are fine for low-stakes messages.
Do you need to send localized email content per recipient?
If yes
Either one template per locale (simple, duplicated) or a single template with i18n key lookups. Store recipient locale on the user record.
If no
English-only ships faster; add locales when revenue justifies it.
Do you need open and click tracking for product email?
If yes
All major providers offer it as a toggle. Useful for onboarding email analytics — but disclose tracking in your privacy policy.
If no
Disable trackers on security-sensitive email (password resets) regardless — tracking pixels in those emails look phishy.
Are bounce and complaint webhooks processed to suppress bad addresses?
If yes
Non-negotiable at any real volume. Subscribe to provider webhooks and maintain a suppression table checked before every send.
If no
You will tank your sender reputation within weeks — this is not optional.
Do you need to schedule sends for a future time?
If yes
Most managed providers support scheduled sends natively; otherwise enqueue to a delayed job queue (BullMQ, SQS with delay).
If no
Send immediately from the triggering event — simpler.
Do you send high-fan-out batches (announcement to all users at once)?
If yes
Use the provider's batch send API (SendGrid v3, Postmark batch). Chunk to stay under per-call limits and spread over minutes to avoid throttling.
If no
One-at-a-time calls via your background queue are simpler.
Can end-users (white-label customers) customize email content?
If yes
Sandbox the template language (no arbitrary code), validate on save, and preview before activating. Use a notification platform if this is core.
If no
Keep templates locked down — far fewer support tickets.
Do you need an internal preview / test-send surface for QA?
If yes
Build an admin route that lists all templates with sample data. Pair with Mailpit/Mailhog in dev to catch rendering bugs before prod.
If no
You'll hear about broken templates from customers — not recommended.
Do you need a single unsubscribe list shared across product surfaces?
If yes
Centralize in your user record or a notification platform — users unsubscribing from any email should stop all non-critical mail.
If no
Per-stream unsubscribes create support tickets; avoid if at all possible.
Tradeoffs
Vendor cost scales with volume; deliverability expertise comes included
Low per-email cost but you own deliverability operations (reputation, bounces, suppression)
Two sending configurations and domains to maintain — worth it for deliverability isolation
Go Deeper
Reliability — not losing emails
Dropped password resets and verification emails are a top-tier customer issue.
Testing email in development
Real email clients render HTML in wildly different ways; local preview is essential.