Skip to content
SendOps

AWS SES monitoring: the metrics and alerts that matter

Amazon SES is excellent at sending email and nearly silent about what happens next. This guide covers which SES metrics to monitor, the alert thresholds worth setting, what to do when one fires, and what a monitoring setup on AWS takes to build and keep running.

The Gap

SES sends the email. Seeing what happened is your job.

You call SendEmail, SES returns a message ID, and the call looks like a success. Whether that email was delivered, bounced, landed in spam or was never rendered at all is recorded somewhere — but not anywhere your team looks by default. SES has no built-in alerting on your sending health and no dashboard that flags a bounce rate drifting toward the review threshold.

At low volume, an occasional glance at the SES console is enough. Once email carries password resets, onboarding, receipts or revenue, "occasionally" stops being a strategy. The questions start arriving:

  • Is our bounce rate trending toward the 5% review threshold?
  • Did complaints rise after Tuesday's campaign or template change?
  • Are password reset emails being delivered right now?
  • Which domain, template or configuration set is causing the problem?
  • Can support check a customer's email without AWS console access?

SES exposes the raw ingredients to answer every one of these. Turning them into monitoring means wiring together event publishing, a message bus, processing, storage, dashboards, alarms and IAM — and teams usually start that work after the first incident, not before it. The rest of this guide is about what to watch and how to act on it, whichever way you build it.

Metrics

The AWS SES metrics worth monitoring

SES generates a lot of event data. For monitoring, six signals matter more than the rest — bounces and complaints because SES enforces thresholds on them, the others because they catch problems before those thresholds move.

Metric Why it matters What to track
Bounce rate The first place list-quality problems, bad imports and signup bugs show up. Split hard from soft bounces: hard bounces damage reputation fastest. Rate as a share of sends, hard vs. soft, by configuration set and template
Complaint rate Recipients marking mail as spam. The SES threshold is one complaint per thousand messages, so it moves faster than you expect. Rate per campaign or template, and what changed just before it moved
Delivery rate & volume A drop in deliveries while sends hold steady is often the earliest signal — of mailbox-provider filtering, or of a broken event pipeline. Deliveries vs. sends over a rolling window, and sudden gaps in event volume
Rejects Messages SES refused to send, usually for detected malware or policy reasons. Should sit at zero. Any non-zero count, by sending identity
Rendering failures A template referenced a variable your application didn't supply. There's no retry and often no error in your logs — the email just never exists. Any failure in production, by template
Engagement Opens, clicks and unsubscribes tell you whether delivered mail is wanted. Apple Mail Privacy Protection inflates opens, so watch trends, and lean on clicks. Click and unsubscribe trends per campaign; opens as a relative signal only

Bounces deserve the most detail. A hard bounce is a permanent failure — the address doesn't exist — and every repeat send to it counts against you. A soft bounce is temporary: a full mailbox, a server that's briefly unavailable. Keep them apart in your metrics, and make sure hard-bounced addresses stop receiving mail. Our guide to the SES bounce rate covers how AWS calculates it and how to bring a high rate down.

Complaints need context, not just a number. When the complaint rate moves, the useful question is "what changed right before it?" — a new segment, a new subject line, a template edit, a campaign to an older list. Monitoring that can't connect the metric to the change leaves you guessing.

Watch the health of your monitoring, too. If send volume holds steady but delivery events stop arriving, the problem may be your event pipeline rather than your email. A sudden drop to zero is rarely good news.

Beyond the SES events, two infrastructure checks catch problems early: SPF, DKIM and DMARC records that have drifted (a missing DKIM selector after a key rotation fails authentication silently), and your sending domains or dedicated IPs appearing on blocklists. The Amazon SES deliverability guide goes deeper on both.

Segmentation

Monitor by traffic type, or one stream hides another

Password resets, receipts, invitations, lifecycle emails and marketing campaigns carry different risk and different urgency. An account-wide bounce rate of 1.5% can hide a campaign stream running at 6% behind a large volume of clean transactional mail — and SES reviews the account, not the stream.

Separate your traffic with configuration sets — at minimum one for transactional and one for marketing mail — and break your metrics down by:

Configuration set

The natural boundary between transactional, marketing and notification traffic.

Sending identity or domain

Shows which subdomain or address is building — or losing — reputation.

Template or campaign

Points straight at the content or audience that moved a metric.

Application and environment

Keeps a staging misconfiguration or one service's bug from looking like an account-wide problem.

This is the most common blind spot in homegrown SES monitoring: the events are collected, but not structured in a way that supports diagnosis.

Thresholds

Alert thresholds tied to an action

AWS publishes the rates at which it steps in. Typically, an account is placed under review at a 5% bounce rate or a 0.1% complaint rate, and sending can be paused at around 10% bounces or 0.5% complaints. If your first alert fires at those numbers, you have no room left to react. Set a ladder below them, and attach an action to each rung:

Signal Warning Critical Action
Bounce rate 2% 3.5% Check recent imports and audience changes; pause the affected stream before it reaches 5%
Complaint rate 0.05% 0.08% Review targeting and content; pause marketing sends at critical
Delivery rate A clear drop from your baseline Sustained over the window Check recent template, routing and DNS changes, and the affected providers
Rendering failures Any failure in production Find the template and the missing variable; roll back if widespread
Rejects Any non-zero count Check the sending identity, its policies and authorization

Warning and critical levels are suggestions — tune them to your volume and baseline. The SES review and pause rates are set by AWS.

The thresholds are half of an alerting system. The other half is how the alert behaves:

Fast enough to matter

Aim for minutes, not hours. CloudWatch aggregation and a backed-up processing pipeline both add delay, and at a 0.08% complaint rate, an active campaign can cross 0.1% before lunch.

Routed to the owner

Bounce warnings go to whoever owns list quality, rendering failures to whoever ships templates, complaint spikes to the people running campaigns. One shared channel for everything eventually gets muted.

Carrying context

"Bounce rate is 3.2%, up from 0.8% two hours ago, 847 hard bounces, mostly one domain" is actionable. "Bounce rate exceeded threshold" sends someone to three dashboards.

Quiet when nothing changed

Evaluate rolling windows rather than single data points, and add cooldowns so an ongoing incident doesn't page the same person every five minutes.

Runbook

What to do when an alert fires

An alert is only as useful as the response behind it. Write the first steps down before you need them, so whoever is on call doesn't have to improvise.

Bounce rate rising

  1. Find the configuration set, identity and send batch the bounces are concentrated in.
  2. Check recently added addresses: an import, a sync job, a signup form accepting typos.
  3. Confirm you aren't re-sending to addresses that already hard-bounced.
  4. Pause non-critical sends to the affected audience until the source is fixed.

Complaint spike

  1. Identify the campaign or template the complaints came from.
  2. Review the subject line, sender name and content for anything that reads as unexpected.
  3. Check the unsubscribe link and one-click unsubscribe actually work.
  4. Check whether the send reached an older or less engaged segment; pause marketing sends at critical.

Rendering failures

  1. Identify the failing template from the event details.
  2. Compare it with the last version that rendered cleanly.
  3. Check which variable the application stopped supplying.
  4. If failures are widespread, roll the template back and redeploy the known-good version.

Delivery drop

  1. Check whether the drop is real or an event-pipeline gap: compare sends with events received.
  2. Break deliveries down by mailbox provider to see if one is filtering.
  3. Review recent DNS, authentication and template changes.
  4. Check your domains and IPs against the major blocklists.

If AWS has already placed your account under review, the response shifts to fixing the cause and explaining it to AWS — see how to bring a high SES bounce rate down and the sending limits guide for how reputation and quota interact.

Architecture

A baseline monitoring setup on AWS

CloudWatch on its own gets you part of the way. SES publishes account-level reputation metrics — Reputation.BounceRate and Reputation.ComplaintRate — and an alarm on each is the least every production account should have. What it won't give you is a breakdown by configuration set or template, message-level history for support questions, or a view non-engineers can use. For that, most teams end up building the same pipeline:

  1. 1 Publish events from configuration sets. Turn on event publishing for sends, deliveries, bounces, complaints, rejects, delivery delays and rendering failures — plus opens and clicks if you track them.
  2. 2 Route them to a bus. Amazon EventBridge or SNS as the event destination. Kinesis Data Firehose if you need high-volume delivery to storage.
  3. 3 Normalize and enrich. A Lambda function (or stream processor) parses each event type and tags it with configuration set, template and application.
  4. 4 Store raw and aggregated data. Raw events in S3 for audit and message-level lookups; aggregates in a database or as custom CloudWatch metrics.
  5. 5 Build dashboards. Account-wide and per-segment views of the metrics above, with trends rather than snapshots.
  6. 6 Add alarms and routing. Threshold alarms to Slack, PagerDuty or email, routed by stream and owner.
  7. 7 Write the runbooks. So the person on call knows what to check first.

This works, and plenty of teams run it well. Budget for what you then own: event schema changes, retention and storage costs, alert tuning, IAM policies, Lambda runtime upgrades, and failure handling in the monitoring pipeline itself. Rename a configuration set and the pipeline can break silently — so the system that tells you whether email works needs its own monitoring. Your email infrastructure now has infrastructure.

Keep it isolated from your sending path, too. If the same Lambda or deployment pipeline handles both sending and event processing, one bad deploy can take out email and your view of it at the same time.

Templates

Template changes are part of monitoring

A complaint spike after a template edit isn't a deliverability mystery; it's a change-management problem. A broken variable reference causes rendering failures for every recipient of a send. New copy can move complaints and engagement within hours.

SES stores templates in your account with no version history and no review step: an edit through the console or API replaces the live version. To connect content changes to metric changes, you need to know which version was live when a message went out. Keeping templates in Git — or any system with version history and review — gives you that: instead of asking "why did complaints rise this week?", you can ask "did the onboarding copy shipped on Tuesday cause it?" Our React Email and Amazon SES guide covers one way to version and deploy SES templates.

Team Access

Make the answers available beyond engineering

If checking whether a customer received their invoice requires a CloudWatch Logs Insights query, most of your team won't do it — they'll ask an engineer. Monitoring that only one or two people can read isn't monitoring; it's an interrupt queue.

Different roles need different answers, quickly:

  • Support: was this specific email accepted, delivered or bounced — and why?
  • Marketing: how healthy was this campaign, and which segment caused the complaints?
  • Engineering: is this an event anomaly, a template bug or a provider issue?
  • Operations: are we approaching a threshold, and who needs to act?

That means keeping message-level event history, searchable by recipient, and giving people access to it without handing out AWS console permissions they shouldn't have.

Mistakes

Common SES monitoring mistakes

Monitoring only account-level totals

Too coarse. One unhealthy stream hides inside healthy aggregate traffic until the account-wide rate catches up.

Alerting only at the SES thresholds

By the time you're at 5% bounces or 0.1% complaints, the review has started. Alert early, and on trends as well as levels.

Sending alerts to an inbox nobody reads

The SES notification email and the CloudWatch alarm topic often go to a shared address. Route alerts to where your team works.

Treating template edits as separate from delivery health

Content changes move complaints, engagement and rendering failures. They belong in the same picture.

Restricting all visibility to engineers

Every delivery question becomes a ticket, and the people closest to the problem can't see it.

Underestimating the maintenance

A DIY dashboard isn't a one-time task. It's an internal system with an owner, an on-call rotation and a backlog.

SendOps

Build it, or use SendOps

Building SES monitoring yourself is a legitimate choice, especially with an infrastructure team and an existing CloudWatch investment. Be honest about the full cost: weeks for the first version, then permanent ownership of a system whose only job is to tell you whether another system works. And the risk is highest in the gap while it's still being built.

SendOps is an email workflow and drip campaign platform built on Amazon SES, and monitoring is part of it. It connects to your AWS account through a scoped IAM role and a CloudFormation stack that routes your SES events to SendOps through EventBridge, and gives you:

Delivery reporting

Sends, deliveries, bounces, complaints and provider breakdowns across your connected SES channels, with recipient search and event timelines for support questions.

Threshold alerts

Bounce, complaint and quota alerts with rules you tune per channel, delivered in-app and by email, with Slack and webhooks on supported plans.

Template history

Version history that shows who changed a template and what changed, with restore — so a metric change can be traced to a content change.

Your existing application keeps calling SES directly; nothing in your sending path changes. There's a free plan, and the same events power the workflows and broadcasts you send through SendOps.

FAQ

SES monitoring, answered

What metrics should I monitor in AWS SES?

Start with six: bounce rate (split into hard and soft bounces), complaint rate, delivery rate against send volume, rejects, rendering failures for templated email, and engagement trends such as clicks and unsubscribes. Track each one per configuration set and template, not just for the whole account, so one unhealthy stream can't hide inside healthy totals.

What bounce and complaint rates trigger an SES review?

AWS typically places an account under review when its bounce rate reaches 5% or its complaint rate reaches 0.1%, and can pause sending at around 10% bounces or 0.5% complaints. Both rates are calculated over a window of recent sending, so alert well below them: a bounce warning near 2% and a complaint warning near 0.05% leave time to act.

Can I monitor Amazon SES with CloudWatch alone?

Partly. SES publishes account-level reputation metrics (Reputation.BounceRate and Reputation.ComplaintRate) to CloudWatch, and you can alarm on them without building anything else. Per-configuration-set, per-template and per-message visibility needs event publishing through a configuration set, plus somewhere to store and query the events.

What is the difference between SES event publishing and notifications?

Identity notifications send bounces, complaints and deliveries for a verified identity to an SNS topic. Event publishing is configured on a configuration set and covers more event types, including sends, rejects, rendering failures, delivery delays, opens and clicks, with destinations such as CloudWatch, Amazon EventBridge, Amazon SNS and Kinesis Data Firehose. Monitoring generally needs event publishing.

How quickly should SES alerts fire?

Within minutes for bounce and complaint thresholds. A complaint rate that is approaching the threshold in the morning can cross it by the afternoon of an active campaign. Use rolling windows rather than single data points to avoid noise, and give each alert enough context — the affected configuration set, template and trend — to act on without opening three dashboards.

Are email open rates still worth monitoring?

As a relative signal only. Apple Mail Privacy Protection pre-loads tracking pixels, which inflates opens for a large share of recipients. Compare open trends between campaigns and over time, and rely on clicks and unsubscribes as the more dependable engagement signals.

Get Started

Know about an SES problem before your customers do

Connect your SES account and get delivery reporting and threshold alerts without building the pipeline — free to start.