2.4 KiB
2.4 KiB
Transactional Email Best Practices
Clear, actionable emails that users expect and need—password resets, confirmations, OTPs.
Core Principles
- Clarity over creativity - Users need to understand and act quickly
- Action-oriented - Clear purpose, obvious primary action
- Time-sensitive - Send immediately (within seconds)
Subject Lines
Be specific and include context:
| ✅ Good | ❌ Bad |
|---|---|
| Reset your password for [App] | Action required |
| Your order #12345 has shipped | Update on your order |
| Your 2FA code: 123456 | Security code |
| Verify your email for [App] | Verify your email |
Include identifiers when helpful: order numbers, account names, expiration times.
Pre-Header
The text snippet after subject line. Use it to:
- Reinforce subject ("This link expires in 1 hour")
- Add urgency or context
- Call-to-action preview
Keep under 90-100 characters.
Content Structure
Above the fold (first screen):
- Clear purpose
- Primary action button
- Time-sensitive details (expiration)
Hierarchy: Header → Primary message → Details → Action button → Secondary info
Format: Short paragraphs (2-3 sentences), bullet points, bold for emphasis, white space.
Mobile-First Design
60%+ emails opened on mobile.
- Layout: Single column, stack vertically
- Buttons: 44x44px minimum, full-width on mobile
- Text: 16px minimum body, 20-24px headings
- OTP codes: 24-32px, monospace font
Sender Configuration
| Field | Best Practice | Example |
|---|---|---|
| From Name | App/company name, consistent | [App Name] |
| From Email | Subdomain, real address | hello@mail.yourdomain.com |
| Reply-To | Monitored inbox | support@yourdomain.com |
Avoid noreply@ - users reply to transactional emails.
Code and Link Display
OTP/Verification codes:
- Large (24-32px), monospace font
- Centered, clear label
- Include expiration nearby
- Make copyable
Buttons:
- Large, tappable (44x44px+)
- Contrasting colors
- Clear action text ("Reset Password", "Verify Email")
- HTTPS links only
Error Handling
Resend functionality:
- Allow after 60 seconds
- Limit attempts (3 per hour)
- Show countdown timer
Expired links:
- Clear "expired" message
- Offer to send new link
- Provide support contact
"I didn't request this":
- Include in password resets, OTPs, security alerts
- Link to security contact
- Log clicks for monitoring