Amazon SES Email Deliverability Best Practices Avoiding Spam Folders
Learn how to maximize email deliverability with Amazon SES SPF, DKIM, DMARC, bounce handling, sender reputation, and content best practices.
Amazon SES Email Deliverability Best Practices
Even with SES configured correctly, your emails might end up in spam. This guide covers how to maximize deliverability.
1. Complete DNS Authentication
SPF (Sender Policy Framework):
Type: TXT
Name: @
Value: v=spf1 include:amazonses.com ~all
DKIM (DomainKeys Identified Mail): Add the 3 CNAME records that SES provides. This adds a digital signature to each email.
DMARC:
Type: TXT
Name: _dmarc
Value: v=DMARC1; p=quarantine; rua=mailto:[email protected]
Without these three, most email providers will send your emails to spam.
2. Warm Up Your Domain
Don't send 10,000 emails on day one. Start small and increase gradually:
- Week 1: 50 emails/day
- Week 2: 200 emails/day
- Week 3: 500 emails/day
- Week 4: 1,000 emails/day
- Week 5+: Continue increasing
This builds sender reputation gradually. Sudden spikes trigger spam filters.
3. Handle Bounces and Complaints
// Set up SNS notification for bounces // SES → Configuration Sets → Event Publishing → SNS // When you get a bounce notification: const handleBounce = async (email) => { await User.findOneAndUpdate( { email }, { emailBounced: true, emailBouncedAt: new Date(), // Never send to this email again } ); }; // When you get a complaint (user marked as spam): const handleComplaint = async (email) => { await User.findOneAndUpdate( { email }, { emailComplained: true, emailComplainedAt: new Date(), // Never send to this email again } ); }; // Before sending, check: const canSendEmail = (user) => { return !user.emailBounced && !user.emailComplained; };
Bounce rate should be < 5%. Complaint rate should be < 0.1%.
4. Use a Consistent From Address
// Good: consistent from address from: "DevTinder <[email protected]>" // Bad: changing from addresses from: "[email protected]" // one day from: "[email protected]" // another day
Consistent from addresses build sender reputation. Use sub-addresses for different purposes:
[email protected]Transactional (no replies expected)[email protected]Support[email protected]Marketing
5. Clean Email Content
Do:
- Personalize the email (use the recipient's name)
- Keep a good text-to-HTML ratio
- Use clear, descriptive subject lines
- Include a plain text version
- Use a reputable domain
Don't:
- Use ALL CAPS in subject lines
- Use spam trigger words (FREE, GUARANTEE, ACT NOW)
- Use red text on white background
- Include too many images
- Use tiny font sizes
- Include attachments (link instead)
6. Include Unsubscribe Links
For notification emails (not pure transactional):
<p style="font-size:12px;color:#999;"> You're receiving this because you have a DevTinder account. <a href="https://app.yourdomain.com/settings/notifications">Manage notification preferences</a> </p>
7. Monitor with SES Metrics
SES provides dashboards for:
- Send volume Emails sent per day
- Bounce rate Percentage of bounced emails
- Complaint rate Percentage of spam complaints
- Delivery rate Percentage successfully delivered
- Open rate Percentage opened (with tracking)
- Click rate Percentage of links clicked
Set up CloudWatch alarms for high bounce or complaint rates.
8. Use Dedicated IPs for High Volume
SES shared IPs are fine for most apps. For very high volume (>100k/month), consider a dedicated IP:
- Dedicated IP $24.95/month per IP
- Better control over sender reputation
- No impact from other SES users
9. Test Before Sending
# Use mail-tester.com # Send an email to the address they give you # Get a score out of 10 # Aim for 9-10 # Also test with: # GlockApps Spam filter testing across providers # SenderScore Check your IP reputation
The Takeaway
Email deliverability requires: complete DNS authentication (SPF, DKIM, DMARC), warming up your domain gradually, handling bounces and complaints (never send to bounced/complained addresses), using a consistent from address, clean email content (no spam triggers), unsubscribe links for notifications, monitoring SES metrics, and testing with mail-tester.com before sending to users.
Common causes: missing SPF/DKIM/DMARC records, high bounce or complaint rate, new domain without warmup, spam trigger words in content, no plain text version, inconsistent from address, or bad sender reputation. Use mail-tester.com to diagnose.
Start with 50 emails/day in week 1, 200/day in week 2, 500/day in week 3, 1000/day in week 4, and continue increasing. This builds sender reputation gradually. Sudden spikes of thousands of emails trigger spam filters on new domains.
Bounce rate should be below 5%. Complaint rate (users marking as spam) should be below 0.1%. If rates exceed these, email providers may block or throttle your domain. Set up SNS notifications to track bounces and complaints, and never send to bounced addresses.
Shared IPs (free) are fine for most apps. Consider a dedicated IP ($24.95/month) if you send more than 100,000 emails per month, want full control over sender reputation, or are not affected by other SES users' sending behavior.
ALL CAPS in subject lines, spam trigger words (FREE, GUARANTEE, ACT NOW), red text, too many images, tiny fonts, attachments, no plain text version, and low text-to-image ratio. Use clear subjects, personalize with the recipient's name, include plain text, and link to content instead of attaching.
Ready to master Node.js completely?
Want to upskill yourself, crack your next interview, and get your dream job? Join our comprehensive course to dive deeper with high-quality video tutorials, solve interview questions, and a premium community.
Master Node.js
Want to upskill yourself, crack your next interview, and get your dream job? Join our comprehensive course.

