This page explains the full lifecycle of an email — from the moment your application sends it through AWS SES to the point where SendOps captures delivery and engagement events. Understanding this flow is essential for developers integrating with SES and using SendOps for observability.

## The key principle

**Your sending code does not change.** SendOps is purely observational on the sending path. Your application sends email exactly the way it does today — through the AWS SES API or SMTP interface using your existing AWS SDK. SendOps never sits in the sending path and never touches the email content.


  Whether you send email with the AWS SDK for Node.js, Python (boto3), Go, Java, .NET, or any other language — nothing changes. You do not need to install a SendOps SDK, modify your sending code, or route email through a different endpoint.


## The email flow

Here is the complete path an email takes, from send to analytics:

### 1. Your application sends the email

Your application calls the SES `SendEmail`, `SendRawEmail`, or `SendTemplatedEmail` API (or uses the SMTP interface) to send an email. This happens entirely within your infrastructure and the AWS SES service — SendOps is not involved at this stage.

Each email should include a configuration set name so that SES knows where to publish events. In SendOps, every channel maps to its own SES configuration set. You can find the exact header value on the channel detail page in SendOps — it looks like `X-SES-CONFIGURATION-SET: sesmail-<workspace>--transactional`, where the name is namespaced to your workspace (so copy it from the channel page rather than typing it by hand). If you do not specify a configuration set, SES will still deliver the email, but SendOps will not be able to associate the event with a specific channel.

For details on sending email with the AWS SDK, see the [AWS SES Developer Guide — Sending email](https://docs.aws.amazon.com/ses/latest/dg/send-email.html).

### 2. SES processes and delivers the email

SES validates the request, checks your sending quotas and suppression list, and delivers the email to the recipient's mail server. This is standard SES behavior — no changes here.

### 3. SES generates events

As the email progresses, SES generates events for each stage of the lifecycle:

| Event | When it fires |
|---|---|
| **Send** | SES accepted the API call and will attempt delivery |
| **Delivery** | The recipient's mail server accepted the email |
| **Bounce** | The email could not be delivered (hard or soft bounce) |
| **Complaint** | The recipient marked the email as spam |
| **Reject** | SES rejected the email before attempting delivery |
| **Open** | The recipient opened the email (requires open tracking) |
| **Click** | The recipient clicked a link (requires click tracking) |
| **Delivery Delay** | Delivery is being temporarily delayed (e.g., recipient server throttling) |
| **Rendering Failure** | A template rendering error occurred |
| **Subscription** | A recipient's subscription preferences changed |

### 4. Events route through the Configuration Set to EventBridge

Each channel's SES configuration set has an EventBridge event destination that publishes events to the default event bus in your AWS account. This is configured automatically when SendOps creates the channel's configuration set.

The CloudFormation stack also creates a base configuration set called `sendops-events` with its own EventBridge destination. This serves as a fallback for identities that have not been assigned to a specific channel.

### 5. EventBridge forwards events to SendOps

The CloudFormation stack sets up an **EventBridge rule** that matches all SES events (source: `aws.ses`) and forwards them to an **API Destination** — a managed HTTPS endpoint pointing at the SendOps ingest webhook. The connection authenticates with an API key passed in the `x-api-key` header on every request.

This is a secure, server-to-server integration running entirely within your AWS account. EventBridge handles retries automatically if the endpoint is temporarily unreachable.

### 6. SendOps processes the events

Once SendOps receives an event, SendOps processing runs these steps:

1. **Authenticates the request** using the API key to identify your organization and AWS account
2. **Parses the EventBridge envelope** and extracts the SES event detail
3. **Filters by managed identities** — events from domains or email addresses that are not managed in SendOps are dropped
4. **Resolves the channel** by matching the configuration set name in the event to a channel in your organization
5. **Deduplicates** to prevent the same event from being processed twice
6. **Buffers and batch-writes** events into the analytics engine (ClickHouse) for querying

From there, SendOps:

- **Aggregates metrics** into deliverability and engagement dashboards
- **Evaluates notification rules** and triggers alerts when thresholds are crossed
- **Builds message traces** so you can follow a single email through every stage of its lifecycle

## Visualizing the flow



## What SendOps does NOT do

To avoid any confusion, here is what SendOps is **not** involved in:

- **Sending email** — your application sends directly through SES. SendOps never touches outbound email.
- **Modifying email content** — SendOps does not alter headers, body, or attachments.
- **Replacing SES** — SES is and remains your email sending infrastructure. SendOps is a layer on top.
- **Providing a sending API** — there is no SendOps API for sending email. You use the AWS SES SDK.

## Latency and reliability

Events typically arrive in SendOps within **a few seconds** of SES generating them. The EventBridge-to-API Destination pipeline is designed for near-real-time delivery. Open and click events depend on recipient behavior and may arrive minutes, hours, or days after the original send.

If the SendOps ingest endpoint is temporarily unreachable, EventBridge retries delivery automatically with exponential backoff, so no events are lost during brief outages.

## What's next?

- If you are on a new AWS account, read [SES Sandbox & Production](/sending-email/ses-sandbox) to understand sending restrictions and how to request production access.
- To learn how identities are organized, see [Understanding Channels](/channels/understanding-channels).
- For details on the AWS infrastructure setup, see [AWS Integration](/aws-setup/connecting-aws).