Wraps Logo
Throughput and quotaLimitExceededExceptionSMTP 454

Amazon SES "Daily message quota exceeded": Causes and Fix

Why SES stops accepting mail once the 24-hour sending quota is spent, how it differs from per-second throttling, and how to get the quota raised.

The error

Daily message quota exceeded

AWS exception LimitExceededException. The Wraps CLI reports it as AWS_LIMIT_EXCEEDED.

Why this happens

SES caps how many messages an account may send in any rolling 24-hour window. Once that budget is spent, further sends are refused until the window rolls forward. The AWS SDK surfaces the quota family of failures as LimitExceededException or ServiceQuotaExceededException depending on the API, and both mean you have hit a service quota rather than done anything wrong.

  • The account spent its 24-hour SES sending quota.
  • A quota on another AWS API in the same path was reached, not the send quota itself.
  • A backfill, migration or retry storm consumed the day's budget in minutes.

How to fix it

  1. 1. Confirm which quota you hit

    Read the account's sent count against its 24-hour maximum before assuming it is the send quota. The same exception family covers quotas on other SES APIs.

    aws sesv2 get-account --query 'SendQuota'
  2. 2. Request an increase in Service Quotas

    Go to Service Quotas in the AWS console, pick the service, and raise the specific limit. AWS also raises SES quotas on its own as consistent, healthy sending builds reputation.

  3. 3. Spread scheduled work across the window

    A quota is a rate over 24 hours, not a nightly allowance. Pacing a large broadcast across the window keeps transactional mail from being starved by a campaign.

  4. 4. Give transactional mail its own headroom

    If password resets and receipts share an account with bulk sending, reserve capacity for them explicitly. Otherwise the campaign decides whether your users can log in.

How to stop it recurring

Watch the burn rate, not the ceiling

Hitting the quota is the last event in a sequence you could have seen coming. Alert on the fraction of the daily budget spent by a given hour.

Keep retries from spending the budget

A retry loop with no cap can consume a day's quota against addresses that were never going to accept the mail. Cap attempts and suppress hard bounces.

Common questions

How do I raise the SES daily sending quota?

Request an increase through Service Quotas in the AWS console. AWS also raises SES quotas over time when sending stays consistent and bounce and complaint rates stay low.

Does the SES daily quota reset at midnight?

No. It is a rolling 24-hour window, so capacity comes back gradually as older sends age out rather than all at once at a fixed hour.

What is the difference between the daily quota and the sending rate?

The daily quota is the total number of messages allowed in 24 hours. The sending rate is how many are allowed per second. You can be well inside the daily quota and still be throttled on rate.

Which exception does the AWS SDK throw for a quota?

Either LimitExceededException or ServiceQuotaExceededException, depending on the API. Both mean a service quota, not a credential or permission problem.

What Wraps does about this

The Wraps CLI maps LimitExceededException and ServiceQuotaExceededException to AWS_LIMIT_EXCEEDED and points at Service Quotas rather than guessing. Wraps cannot increase an AWS quota on your behalf. What it can do is show your current limits and sending volume in one place, so the ceiling is visible before you reach it.