SES is available in a limited set of AWS regions. Check the AWS regional services list to confirm availability in your preferred region before proceeding.
Step 1: Move SES out of sandbox mode
New AWS accounts start in SES sandbox mode. In sandbox mode, you can only send email to verified email addresses, which makes it unsuitable for production use. To request production access:Open a support request
Go to the SES console and navigate to Account dashboard. Click Request production access.
Fill in the request form
Describe your use case (transactional emails, not marketing bulk mail), your expected sending volume, and how you handle bounces and complaints. AWS reviews these requests manually.
Step 2: Create an IAM user
Plunk needs an AWS IAM user with permission to send email via SES and manage domain identities.Create the user
Go to the IAM console → Users → Create user.Name the user
plunk-ses (or any name you prefer). Select Attach policies directly.Step 3: Create an SNS topic
SES delivers bounce, complaint, and delivery events to Plunk via Amazon SNS (Simple Notification Service). You need to create an SNS topic and subscribe it to your Plunk API.Create the topic
Go to the SNS console → Topics → Create topic.
- Type: Standard
- Name:
plunk-ses-events
Create an HTTPS subscription
On the topic page, click Create subscription.
- Protocol: HTTPS
- Endpoint:
https://api.yourdomain.com/webhooks/sns
api.yourdomain.com with your actual API domain.Click Create subscription.Confirm the subscription
Plunk automatically confirms the SNS subscription when it receives the confirmation request. Watch your API container logs:You should see a log entry confirming the subscription. If confirmation fails, check that your API is publicly reachable at the endpoint URL you provided.
Step 4: Create SES configuration sets
Configuration sets tell SES which events to capture and where to send them. Plunk requires two configuration sets: one for emails with open and click tracking enabled, and one for emails where tracking is disabled.Tracking configuration set
Create the set
Go to the SES console → Configuration sets → Create set.Name it
plunk-tracking (or any name — you will reference it in your environment variables).No-tracking configuration set
The no-tracking configuration set is optional. If you only set
SES_CONFIGURATION_SET, Plunk will always use tracking and the tracking toggle will be hidden in project settings. Set SES_CONFIGURATION_SET_NO_TRACKING to enable the toggle.Step 5: Configure environment variables
Add your SES credentials and configuration set names to your.env file:
Step 6: Add and verify your domain in Plunk
Once the stack is running and SES is configured, add your sending domain through the Plunk dashboard.Add the DNS records
Plunk will display the DKIM, SPF, and custom MAIL FROM DNS records you need to add. Add these records in your DNS provider’s control panel.
Bounce and complaint handling
SES tracks bounces and complaints and reports them back to Plunk via the SNS topic you created. Plunk processes these events to:- Mark contacts as bounced or complained
- Update per-project bounce and complaint rate metrics
- Optionally suspend projects that exceed rate thresholds (controlled by
AUTO_PROJECT_DISABLE)
https://api.yourdomain.com/webhooks/sns must be confirmed and your API must be publicly reachable.
Sending rate limits
SES enforces a maximum sending rate (emails per second) on your account. By default, Plunk queries the SES API to determine your account’s quota and respects it automatically. If you need to override this — for example, to stay below a lower internal limit — setEMAIL_RATE_LIMIT_PER_SECOND in your environment variables:
Regional considerations
- Choose an SES region geographically close to your server to minimize latency.
- SES region must match the
AWS_SES_REGIONenvironment variable. - The SNS topic must be in the same region as your SES configuration sets.
- SES is not available in all AWS regions. Verify availability before deploying.
Environment variables
Full reference for all SES-related configuration variables.
Docker deployment
How to run the Plunk container stack.