How to send 100k emails consistently using SES
Email is how HireFT talks to job seekers: application updates, job matches, referrals. Our Amazon SES account can send well over 100,000 emails a day. Getting the quota was the easy part. Sending that much, every day, without landing in spam or getting the account paused, took a year of mistakes. Here is what I learned.
1. The quota is not the limit. Reputation is.
SES will happily give you a large daily quota. What it watches is how recipients react. AWS may put your account under review when your complaint rate reaches 0.1% or your bounce rate reaches 5%, and it can pause sending at 0.5% complaints or 10% bounces. A pause stops everything, including the emails your users depend on. Treat those two numbers as the real limits on how much you can send.
2. Reputation belongs to the whole AWS account
This one cost me. SES tracks complaints and bounces per account, not per domain. Running outreach from a different domain in the same account does not protect your main domain: every spam click still counts against the account that sends your product email. Anything experimental or high-risk now goes out from a separate AWS account and a separate domain, so a bad week there can never pause the emails users rely on.
3. Authenticate everything, then check the headers
Set up SPF, DKIM and DMARC before you send a single email, and make sure DKIM signs with your own domain, not only amazonses.com. Then send yourself a message and read the raw headers. You want dkim=pass, spf=pass and dmarc=pass for your domain. Start DMARC at p=none, watch the reports, and tighten it once everything passes.
4. Warm up like you mean it
A new domain or account has no reputation, and mailbox providers are suspicious of sudden volume. I ramp over four weeks: about 20 a day for the first few days, then 40, 75, 150 and 250, and only then the full daily volume. The sender enforces the ramp in code, so a busy day cannot skip ahead.
5. Tracking can push you into Promotions
If your SES configuration set records opens and clicks, SES rewrites every link through its tracking domain and adds an invisible image. Both are strong signals that an email is marketing. For emails that should feel personal, I use a configuration set with open and click tracking turned off, and measure clicks with UTM parameters on the landing page instead.
6. One header decides the Primary tab
Our emails to signed-up users kept landing in Gmail's Promotions tab. I removed the logo, the big button, the emoji and the tracking, and they still went to Promotions. Then I sent the exact same email twice, changing only one thing: the List-Unsubscribe header. Without it, the email landed in Primary. With it, Promotions. Gmail requires one-click unsubscribe for marketing from anyone sending more than 5,000 emails a day to Gmail users, so keep it on anything promotional. For genuinely personal notifications, it is worth testing without it, while watching your spam rate closely.
7. Watch the numbers SES cannot see
Gmail does not report most spam clicks back to SES, so your SES complaint rate says little about Gmail, which is where most of your users are. Set up Google Postmaster Tools for your domain. It shows the spam rate Gmail users report, and Gmail wants it below 0.3%, ideally under 0.1%. I check it after every change to how we send.
8. Make the system stop itself
I do not trust myself to watch dashboards every day. CloudWatch alarms email me when the complaint rate gets close to AWS's pause threshold. The outreach sender goes further: before each run it reads the account's recent send statistics and refuses to send if complaints or bounces have climbed. A sender that halts on its own is worth more than any amount of vigilance.
9. Boring engineering keeps volume consistent
- Respect the send rate. SES caps emails per second. Pace sends below the cap and retry throttling errors with exponential backoff.
- Claim before you send. Mark each recipient as claimed before sending, so a crash or a rerun never emails someone twice.
- Do not let slow dependencies drop emails. A tight timeout on the API that builds each email once silently cost some users their email every day. Measure the tail, set timeouts above it, and retry.
- Keep your list clean. Remove hard bounces and complaints immediately, honour unsubscribes everywhere, and never email an address twice after it bounced.
- Log why you did not send. A run summary that groups skips by reason turns a mystery drop into an obvious fix.
10. Measure your measurements
For months our open rates were undercounted by more than half, because Gmail's image proxy was filtered out as a bot. Every decision built on that number was quietly wrong. Before trusting an email metric, check it against something you can verify by hand.
The short version
Authenticate properly, warm up slowly, keep risky sending in its own account, turn tracking off where it hurts, watch Postmaster Tools, and build a sender that stops itself when things go wrong. Do that, and 100k emails a day becomes routine instead of a gamble.