How to Configure Amazon SES for Transactional Email (Step-by-Step)
Amazon SES is the cheapest transactional email option at high volume, but the setup is complex. This guide walks you through every step — from sandbox exit to production monitoring.
⚠️ Before you start
Amazon SES requires an AWS account (credit card required), a sandbox exit request that can take 1–2 weeks, and manual setup of bounce/complaint handling via SNS. If you need to be sending emails today, consider Emitlo — setup takes under 10 minutes with no sandbox.
1. Prerequisites
- →AWS account with billing enabled (credit card required)
- →Access to your domain's DNS settings
- →A sending domain (e.g., mail.yourdomain.com)
- →AWS CLI installed (optional but recommended)
2. Verify your sending domain
In the AWS Console, navigate to Amazon SES → Verified identities → Create identity. Select "Domain" and enter your sending domain.
AWS will provide DNS records to add to your domain. Add these TXT records to your DNS provider. Verification typically completes within 72 hours.
3. Set up DKIM and SPF
During domain verification, AWS provides DKIM CNAME records. Add these to your DNS. SES uses Easy DKIM (3 CNAME records) by default.
SPF record for SES
v=spf1 include:amazonses.com ~all DMARC record
_dmarc.yourdomain.com TXT "v=DMARC1; p=none; rua=mailto:[email protected]" 4. Request sandbox exit
New SES accounts are in sandbox mode — you can only send to verified email addresses. To send to real users, you must request production access.
Go to SES → Account dashboard → Request production access. You'll need to provide:
- →Your use case (transactional email, marketing, etc.)
- →Expected daily sending volume
- →How you handle bounces and complaints
- →How recipients opted in to receive your emails
- →Your website URL
Timeline: AWS Support reviews requests manually. Expect 1–5 business days, potentially up to 2 weeks. If denied, address their concerns and resubmit.
5. Configure bounce and complaint handling (SNS)
SES does not handle bounces and complaints automatically. You must set up SNS notifications and process them yourself.
- 1.Create an SNS topic for bounces: SES → Configuration sets → Notifications → Bounces
- 2.Create an SNS topic for complaints: SES → Configuration sets → Notifications → Complaints
- 3.Create an SQS queue or Lambda function to process SNS messages
- 4.Parse bounce/complaint notifications and update your suppression list
- 5.Never email hard-bounced addresses again
6. Set up CloudWatch monitoring
SES publishes metrics to CloudWatch. Create dashboards and alarms for:
- →Bounce rate (alert if > 2%)
- →Complaint rate (alert if > 0.1%)
- →Delivery rate
- →Send volume
7. Send your first email
Using the AWS SDK (Node.js example):
const { SESClient, SendEmailCommand } = require("@aws-sdk/client-ses");
const client = new SESClient({ region: "eu-west-1" });
const command = new SendEmailCommand({
Source: "[email protected]",
Destination: { ToAddresses: ["[email protected]"] },
Message: {
Subject: { Data: "Hello from SES" },
Body: { Html: { Data: "<h1>Hello, world</h1>" } }
}
});
await client.send(command); 8. Production checklist
- ☐Domain verified with DKIM and SPF
- ☐DMARC record published
- ☐Sandbox exit approved
- ☐SNS bounce notifications configured and processed
- ☐SNS complaint notifications configured and processed
- ☐CloudWatch alarms set for bounce rate and complaint rate
- ☐Suppression list management implemented
- ☐Sending limits reviewed and increased if needed
Skip the SES complexity — start in 10 minutes
12,000 emails/month free (400/day) · Full deliverability dashboard · No sandbox · Human support