Amazon SES is the most cost-effective sending API for AcelleMail at any scale above hobby — but every account starts in sandbox mode with painful restrictions, and even after sandbox-out the sending limits are tier-based and need to be requested upward as you grow. This cookbook is the operational playbook for SES limits: how to request each step, what AcelleMail config matches each tier, and how to debug the rate-limit errors that surface in AcelleMail's bounce log when you exceed them.
SES sandbox — the starting state#
Every new SES account is in sandbox mode. Restrictions:
- You can only send to verified email addresses (you must pre-verify each recipient).
- Daily sending quota: 200 emails/day
- Per-second sending rate: 1 email/second
The sandbox is mostly useful for "verify SES is configured correctly" — it's not viable for production. Plan to exit sandbox before integrating SES with AcelleMail's customer-facing campaigns.
Exiting the sandbox#
Open the SES console → Account Dashboard → Request production access. The form asks:
-
Mail type — pick "Marketing" or "Transactional" or "Both."
-
Website URL — your website. Must be a real site reachable on HTTP/HTTPS.
-
Use case — describe what you'll send. AWS reads these. Be specific:
Good: "Marketing newsletters to subscribers who opt-in via our website signup form (12k current subscribers, 4 sends per month). All campaigns include unsubscribe link, comply with CAN-SPAM and GDPR. We honor unsubscribes immediately and remove hard-bounced addresses via AcelleMail's bounce-handling."
Bad: "Email marketing"
-
Compliance — confirm you understand the AWS AUP, CAN-SPAM, etc.
Approval is typically 24-48 hours for legitimate use cases. Common rejections:
- "Cannot determine your use case" — your description was too vague.
- "Mailing list source not described" — you didn't say where addresses came from.
- "No website" — your URL doesn't resolve, or it's a parking page.
Re-submit with more detail; second-attempt approvals are common.
Tier 1 — sandbox-out defaults#
Right after exiting sandbox:
- Daily quota: 50,000 emails/day
- Per-second rate: 14 emails/second
These limits are scoped to the SES region. AcelleMail-side configuration:
Admin → Sending Servers → <SES Server> → Edit
Sending quota: 50,000
Quota period: 1 day
Throttle (per second): 14
50k/day is fine for hobby + small-business senders. To go beyond, request limit increase.
Requesting limit increases#
In the SES console, on the same Account Dashboard, click Request increase. The form is short — one prompt: "Why do you need this?"
Specify:
- New daily quota (e.g. 500,000)
- New per-second rate (e.g. 100)
- Reason (the same shape as the sandbox-out form: who's the audience, where do addresses come from, frequency of sending, compliance practices)
Approval timeline: 24-72 hours. Increases tend to come through in factor-of-10 jumps until ~5M/day, then incremental from there.
Recommended progression:
| Stage |
Daily quota |
Per-second rate |
When to request next |
| Sandbox-out |
50k |
14 |
After 14 days of clean sending |
| Tier 2 |
200k |
50 |
When approaching 70 % daily quota usage |
| Tier 3 |
1M |
100 |
Same |
| Tier 4 |
5M |
250 |
Same |
| Tier 5 |
10M+ |
500+ |
Working with AWS Solutions Architect |
Don't try to skip tiers — AWS rate-checks against your historical usage, and a "I want 1M/day starting tomorrow" request from a 50k/day sender is usually denied.
Dedicated IPs#
Default SES uses shared IPs — your messages go through Amazon's pool of warmed sending IPs alongside other AWS customers. Reputation is centrally managed by AWS.
For high-volume senders (typically > 500k/month), dedicated IPs are worth $24.95/month per IP. Benefits:
- Isolated reputation (your sending behavior, your reputation alone)
- Enables per-IP warmup tracking (works with WarmupStrategy)
- Per-IP FBL routing
- Required for some compliance regimes (HIPAA-relevant audit trails)
Two flavors:
- Standard dedicated IP — $24.95/month per IP. Self-managed warmup (you control ramp).
- Managed dedicated IP — $24.95/month + $24.95/month management fee. AWS handles warmup automatically (about 6 weeks).
Allocate via SES console → Dedicated IPs → Buy IPs. They appear in your account within minutes; configure AcelleMail to route through them by setting up a sending-server with the IP-pool name.
Configuration assignments (multi-IP)#
If you have multiple dedicated IPs, AcelleMail can route different traffic to different IPs:
Admin → IP Pools (SES) → Configure 3 pools:
"transactional" (1 IP) — for password resets, receipts
"marketing-warm" (2 IPs) — for engaged-segment campaigns
"marketing-cold" (1 IP) — for re-engagement, low-engagement segments
Admin → Sending Servers → 3 servers, one per pool
Customers → assigns lists to specific servers based on intent
This pattern isolates reputation per intent. A bad re-engagement campaign won't drag down transactional inbox placement.
Decoding SES rate-limit errors#
When AcelleMail exceeds SES's per-second or daily rate, the SES API returns a structured error. AcelleMail's bounce log captures it as a soft bounce with these signatures:
| SES error |
Meaning |
Action |
Throttling.Send |
Per-second rate exceeded |
Reduce AcelleMail per-second throttle |
Throttling.MaxSendingRateExceeded |
Same; verbose form |
Same |
MessageRejected (sometimes) |
Hit daily limit |
Request quota increase or distribute load |
MailFromDomainNotVerified |
Sending domain not verified in SES |
Configure DKIM in AcelleMail; add SES DNS records |
ConfigurationSetDoesNotExist |
Misconfigured SES setup |
Check AcelleMail SES driver settings |
Throttling errors auto-retry on Laravel's queue (5/15/60 min backoff). For sustained throttling, the fix is application-side rate reduction, not retry — AcelleMail can't get faster than SES will accept.
SES + per-AcelleMail-customer isolation#
Multi-tenant AcelleMail with multiple customers sharing one SES account: track per-customer SES usage to prevent one customer from exhausting the daily quota. Use AcelleMail's per-customer sending limits in addition to per-server:
Customers → <customer> → Edit → "Sending Limits"
Max emails per day: 100,000 (their share of the SES daily quota)
Max emails per hour: 5,000
When the customer hits their per-customer limit, AcelleMail queues; when SES rejects, AcelleMail also queues. Both layers protect deliverability.
Related reading#
FAQ#
What's the difference between SES and SES v2?#
API differences mostly transparent to AcelleMail — the SES driver speaks both. SES v2 has additional features (suppression list management, configuration-set-level metrics) but the limits + pricing are the same.
Can I use SES from outside AWS?#
Yes. SES is a public API; you can send from any host (local laptop, DigitalOcean, on-prem). AcelleMail's SES driver works the same way regardless of host.
What if my SES account is suspended?#
Sustained complaint rate > 0.10 % or bounce rate > 5 % triggers automated suspension. Recovery: file a support ticket explaining the corrective actions. Typical suspension lasts 7-14 days.
Should I use SES SMTP or SES API?#
API is faster + has better error semantics. Use SMTP only if you need it for legacy reasons or specific clients that don't speak the AWS SDK. AcelleMail's SES driver uses the API by default.
SES Configuration Sets — the under-used feature#
A SES "Configuration Set" is a named bundle of sending rules. Creating one for each AcelleMail sending server enables:
- Per-config CloudWatch metrics — see send / bounce / complaint by configuration set, not just account-wide.
- Custom event destinations — route bounces and complaints to SNS, Kinesis Firehose, or Pinpoint.
- Reputation tracking pause — auto-pause sends from a configuration set when complaint rate exceeds your threshold (separate from account-wide pause).
Configure in the SES console: Configuration → Configuration sets → Create. Then in AcelleMail's SES driver, fill in the Configuration Set Name field. The relationship is many-to-one — multiple AcelleMail sending servers can share one configuration set, or each can have their own.
For multi-tenant AcelleMail with multiple customers using SES, always create per-customer configuration sets. The reputation tracking is then per-customer, and you can pause one customer's sends without affecting others.
SES suppression list — the overlooked layer#
SES maintains its own internal suppression list — addresses that SES auto-suppresses based on hard bounces or complaints from any account. When AcelleMail tries to send to a SES-suppressed address, the API returns success but SES drops the message. AcelleMail's bounce log won't see this — the message looks delivered but never arrives.
The mitigation: enable Account-level suppression list in SES, which surfaces these as actual bounces with the MessageRejected: Address is on the suppression list for your account error. AcelleMail's bounce log then captures it.
Configure: SES Console → Account dashboard → Suppression list → Account-level → On.
Pricing math for high-volume scenarios#
At 5M sends/month from SES with 2 dedicated IPs:
| Line item |
$/month |
| Sends (5M × $0.10/1k) |
500 |
| Dedicated IPs (2 × $24.95) |
49.90 |
| Inbound (FBL processing, ~10k/month) |
1 |
| Configuration sets, suppression list |
0 |
| Total |
~$551 |
Compare to SendGrid Pro at the same scale ($900/month) or Mailgun Foundation+ ($700/month). SES is the cheapest of the major providers at this tier; the trade-off is that you operate it yourself (limit increase requests, dedicated IP warmup, suppression list management).