Email Deliverability Best Practices for Developers
Technical guide to email deliverability. DNS configuration, authentication, reputation management, and monitoring for transactional email.
Deliverability is the percentage of your emails that actually reach the inbox. It is not the same as delivery rate, which only tells you whether the receiving server accepted the message. An email can be "delivered" but land in spam.
This guide covers the technical practices that improve deliverability for transactional email.
DNS Authentication
Email authentication proves you are authorized to send from your domain. Three protocols work together:
SPF Configuration
SPF (Sender Policy Framework) lists authorized sending servers in a DNS TXT record.
# Check current SPF record
dig TXT example.com +short
# Example SPF record for Sequenzy
example.com. IN TXT "v=spf1 include:_spf.sequenzy.com ~all"
# Multiple providers
example.com. IN TXT "v=spf1 include:_spf.sequenzy.com include:_spf.google.com ~all" Best practices:
- Keep under 10 DNS lookups (SPF has a limit)
- Use
~all(soft fail) initially, then move to-all(hard fail) - Only include services that actually send email
DKIM Configuration
DKIM (DomainKeys Identified Mail) adds cryptographic signatures to prove emails were not modified.
# DKIM DNS record (provided by your email service)
sq1._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCS..."
# Verify DKIM is working
dig TXT sq1._domainkey.example.com +short Best practices:
- Use 2048-bit keys (1024-bit is deprecated)
- Rotate keys periodically
- Keep the private key secure
DMARC Configuration
DMARC (Domain-based Message Authentication) tells receivers what to do when SPF or DKIM fail.
# Start with monitoring mode
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
# Move to quarantine after reviewing reports
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
# Eventually reject failures
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com" Best practices:
- Start with
p=noneand review aggregate reports - Only move to
p=rejectafter confirming all legitimate email passes - Use an aggregate report analyzer (many are free)
Sender Reputation
Email providers track your sending behavior and assign a reputation score. This score affects inbox placement.
Factors That Affect Reputation
- Bounce rate: High hard bounces indicate poor list hygiene
- Complaint rate: Users marking your email as spam
- Spam trap hits: Sending to addresses that should not receive email
- Engagement: Opens, clicks, replies
- Volume patterns: Sudden spikes are suspicious
Maintaining Good Reputation
// Handle bounces immediately
app.post('/webhooks/email', async (req, res) => {
const event = req.body;
if (event.type === 'bounce' && event.bounceType === 'hard') {
// Stop sending to this address permanently
await db.user.update({
where: { email: event.email },
data: { emailValid: false, emailInvalidReason: 'hard_bounce' }
});
}
if (event.type === 'complaint') {
// User marked as spam - respect their preference
await db.user.update({
where: { email: event.email },
data: { emailOptOut: true, optOutReason: 'spam_complaint' }
});
}
res.status(200).send('OK');
}); IP Warming
New IP addresses have no reputation. Sending high volume immediately looks suspicious. Warm up gradually:
| Day | Recommended Volume |
|---|---|
| 1-2 | 50 emails/day |
| 3-4 | 100 emails/day |
| 5-7 | 500 emails/day |
| 8-14 | 1,000 emails/day |
| 15-21 | 5,000 emails/day |
| 22-30 | 10,000+ emails/day |
Most managed services like Sequenzy, Postmark, and Resend handle warming for you using shared IP pools with established reputation.
List Hygiene
// Before sending, verify email is valid
async function canSendEmail(userId: string): Promise<boolean> {
const user = await db.user.findUnique({
where: { id: userId },
select: {
email: true,
emailValid: true,
emailOptOut: true,
lastEmailBounce: true
}
});
if (!user) return false;
if (!user.emailValid) return false;
if (user.emailOptOut) return false;
// Check for recent bounces
if (user.lastEmailBounce) {
const hoursSinceBounce =
(Date.now() - user.lastEmailBounce.getTime()) / (1000 * 60 * 60);
if (hoursSinceBounce < 24) return false;
}
return true;
} Monitoring
Metrics to Track
- Delivery rate: Should be 98%+
- Bounce rate: Keep under 2%
- Complaint rate: Keep under 0.1%
- Time to inbox: Should be seconds for transactional
Tools for Monitoring
- Google Postmaster Tools - Free Gmail-specific data
- Sender Score - IP reputation lookup
- Your email service dashboard - Sequenzy, Postmark, etc.
Common Problems
Emails Going to Spam
- Check SPF, DKIM, DMARC alignment
- Review content for spam triggers
- Check IP reputation
- Verify sending domain is not blacklisted
Slow Delivery
- Receiving server may be throttling you
- Check your service's delivery time metrics
- Consider dedicated IP if using shared infrastructure
High Bounce Rate
- Implement email verification at signup
- Remove invalid addresses immediately
- Use double opt-in for marketing emails
Service Recommendations
Services that handle deliverability well:
Compare email services
Find the right transactional email service for your deliverability needs.
View Full Comparison