wraps-team/wraps/aws-ses-best-practices
Claude Code and agent skill by wraps-team/wraps
- community
Checking that the SKILL.md file is still in the repository.
Email deliverability, warming, compliance, and operational guidelines for AWS Simple Email Service.
Install
npx vskill@latest install wraps-team/wraps/aws-ses-best-practicesSKILL.md
AWS SES Best Practices
Email deliverability, warming, compliance, and operational guidelines for AWS Simple Email Service.
Email Authentication
SPF (Sender Policy Framework)
Add to your domain's DNS:
For custom MAIL FROM domain:
DKIM (DomainKeys Identified Mail)
SES provides three CNAME records for DKIM. Add all three:
DMARC (Domain-based Message Authentication)
Add TXT record to your domain:
Custom MAIL FROM Domain
Improves deliverability by using your domain instead of amazonses.com:
IP Warming
New SES accounts have limited sending reputation. Warm up gradually.
Warming Schedule
| Day | Daily Volume | Notes | |
|---|---|---|---|
| 1-2 | 200 | Start small, monitor bounces | |
| 3-4 | 500 | Check complaint rate | |
| 5-7 | 1,000 | Monitor reputation dashboard | |
| 8-14 | 5,000 | Steady increase | |
| 15-21 | 10,000 | ||
| 22-30 | 25,000 | ||
| 30+ | 50,000+ | Scale as needed |
Warming Best Practices
- Start with engaged users — Send to users who recently opened/clicked
- Prioritize transactional — Welcome emails, password resets have high engagement
- Avoid cold lists — Don't send to addresses that haven't engaged in 6+ months
- Monitor daily — Check bounce/complaint rates in SES dashboard
- Slow down if issues — If bounces > 5% or complaints > 0.1%, reduce volume
Bounce Handling
Types of Bounces
Hard Bounces (Permanent):
- Invalid/non-existent email address
- Domain doesn't exist
- Action: Remove immediately, never send again
Soft Bounces (Temporary):
- Mailbox full
- Server temporarily unavailable
- Action: Retry with exponential backoff, remove after 3-5 attempts
Transient Bounces:
- Auto-responders
- Challenge-response systems
- Action: Generally ignore, don't count against reputation
Bounce Rate Thresholds
| Rate | Status | Action | |
|---|---|---|---|
| < 2% | Healthy | Continue normally | |
| 2-5% | Warning | Investigate, clean list | |
| 5-10% | Critical | Stop sends, clean list aggressively | |
| > 10% | Danger | SES may suspend account |
Handling Bounces with Wraps
Complaint Handling
Complaint Rate Thresholds
| Rate | Status | Action | |
|---|---|---|---|
| < 0.1% | Healthy | Continue normally | |
| 0.1-0.3% | Warning | Review content, add unsubscribe | |
| 0.3-0.5% | Critical | Pause marketing emails | |
| > 0.5% | Danger | SES may suspend account |
Reducing Complaints
- Clear unsubscribe — One-click unsubscribe in every email
- Set expectations — Tell users what/when you'll email during signup
- Honor preferences — Let users choose email types/frequency
- Clean lists — Remove unengaged users proactively
- Relevant content — Only send what users signed up for
List-Unsubscribe Header
Add to all marketing emails:
List Hygiene
Email Validation
Validate emails at signup:
Engagement-Based Cleanup
Remove or suppress addresses based on engagement:
| Last Engagement | Action | |
|---|---|---|
| < 30 days | Active, send normally | |
| 30-90 days | Reduce frequency | |
| 90-180 days | Re-engagement campaign | |
| 180+ days | Suppress from regular sends | |
| 365+ days | Remove from list |
Suppression Lists
Maintain lists of addresses to never email:
Content Best Practices
Subject Lines
- Keep it short — Under 50 characters
- Be specific — Tell them what's inside
- Avoid spam triggers — No ALL CAPS, excessive punctuation, "FREE!!!"
- Personalize — Include name or relevant detail
Email Body
- Text version — Always include plain text alternative
- Image-to-text ratio — Keep images < 40% of content
- Hosted images — Use absolute URLs, not embedded images
- Alt text — Every image needs alt text
- Mobile-friendly — Single column, 600px max width
- Clear CTA — One primary call-to-action
Avoid Spam Triggers
Words to avoid:
- FREE, WINNER, CONGRATULATIONS
- Act now, Limited time, Urgent
- $$, Make money, Cash bonus
- Click here, Buy now
Formatting to avoid:
- ALL CAPS
- Excessive punctuation!!!
- Red text
- Large fonts
- Invisible text (white on white)
Sending Patterns
Consistent Schedule
- Send at consistent times (users learn to expect your emails)
- Avoid sudden volume spikes (looks like spam)
- Spread large sends over time (don't blast all at once)
Time Zone Awareness
Throttling for Large Lists
Monitoring & Alerts
Key Metrics to Track
| Metric | Target | Alert Threshold | |
|---|---|---|---|
| Bounce Rate | < 2% | > 5% | |
| Complaint Rate | < 0.1% | > 0.3% | |
| Delivery Rate | > 95% | < 90% | |
| Open Rate | > 20% | < 10% | |
| Click Rate | > 2% | < 1% |
CloudWatch Alarms
Wraps CLI sets up basic alarms. Add custom ones:
SES Reputation Dashboard
Check regularly in AWS Console → SES → Reputation Metrics:
- Account status (Healthy, Under review, Paused)
- Bounce rate trend
- Complaint rate trend
Compliance
CAN-SPAM (US)
- Accurate headers — From/reply-to must be accurate
- No deceptive subjects — Subject must reflect content
- Physical address — Include valid postal address
- Unsubscribe — Clear, working unsubscribe mechanism
- Honor opt-outs — Process within 10 business days
GDPR (EU)
- Consent — Clear, explicit opt-in for marketing
- Right to access — Provide data on request
- Right to erasure — Delete data on request
- Data portability — Export data in common format
- Lawful basis — Document why you're processing data
CASL (Canada)
- Express consent — Written/verbal permission required
- Implied consent — Limited (existing relationship, published email)
- Unsubscribe — Honor within 10 days
- Identification — Sender identity and contact info
Footer Template
SES Limits & Quotas
Default Limits (Sandbox)
- 200 emails/24 hours
- 1 email/second
- Can only send to verified addresses
Production Limits
- Varies based on account history
- Start at 50,000/day, 14/second
- Request increases as needed
Requesting Limit Increase
- AWS Console → SES → Account Dashboard
- Click "Request Production Access" or "Request Limit Increase"
- Provide:
- Use case description
- Expected volume
- Bounce/complaint handling process
- List collection method
Troubleshooting
"Email not delivered"
- Check SES console for bounces/complaints
- Verify recipient didn't unsubscribe
- Check spam folder
- Test with mail-tester.com
"High bounce rate"
- Validate email addresses at signup
- Remove old addresses (180+ days inactive)
- Use double opt-in
- Check for typos in bulk imports
"High complaint rate"
- Add clear unsubscribe link
- Review email content
- Reduce frequency
- Segment engaged vs unengaged users
"Emails going to spam"
- Verify SPF, DKIM, DMARC are set up
- Check content for spam triggers
- Warm up sending volume gradually
- Build engagement (opens/clicks improve reputation)
AWS CLI Diagnostics
Account Status
Identity Verification
DKIM Status
MAIL FROM Configuration
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingapps/website/public/.well-known/skills/aws-ses-best-practices/SKILL.md
Popularity
- Repository stars
- 48
- Repository forks
- 7
- 7-day trend score
- 19
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/wraps-team/wraps/aws-ses-best-practices)