Skip to content

AWS SES

The AWS SES webhook receives email delivery notifications from Amazon Simple Email Service (SES) via Amazon Simple Notification Service (SNS). It handles SNS subscription confirmation and processes delivery, bounce, complaint, open, and click events.

POST /api/rpc/webhooks/aws/ses

AWS SES publishes notifications to an SNS topic, which forwards them to this webhook endpoint. The platform handles two types of SNS messages:

  1. SubscriptionConfirmation — sent when you first subscribe the endpoint to the SNS topic. The platform automatically confirms by calling the SubscribeURL.
  2. Notification — ongoing delivery events from SES, wrapped in the SNS message envelope.

AWS SNS messages are signed using RSA (SHA1 or SHA256, depending on the SignatureVersion). The platform validates signatures by:

  1. Verifying the SigningCertURL points to an *.amazonaws.com domain.
  2. Fetching the certificate and verifying the signature against the constructed string-to-sign.
SES Notification TypePlatform EventDescription
Deliveryemail_deliveredEmail delivered (one event per recipient)
Bounceemail_bounceEmail bounced (one event per bounced recipient)
Complaintemail_spam_reportRecipient filed a complaint
Openemail_openRecipient opened the email
Clickemail_clickRecipient clicked a link
SES Bounce TypePlatform TypeDescription
PermanentHard bounceAddress doesn’t exist or is permanently unreachable
TransientSoft bounceTemporary issue (mailbox full, server down, etc.)
UndeterminedSoft bounceCould not determine bounce type
{
"success": true,
"processed": 2,
"duplicates": 0,
"errors": 0,
"subscriptionConfirmed": false
}

The subscriptionConfirmed field is true when the request was an SNS subscription confirmation.

  1. In the AWS console, create an SNS topic for SES notifications.
  2. Configure SES to publish notifications (Delivery, Bounce, Complaint, Open, Click) to the SNS topic.
  3. Create an HTTPS subscription on the SNS topic pointing to your platform’s AWS SES webhook endpoint.
  4. The platform automatically confirms the SNS subscription when it receives the confirmation request.

No environment variables are required — signature validation uses the certificate URL from the SNS message.