# Resend or SES?

> Our app sends email, and maybe a newsletter. Resend, or Amazon SES in our own AWS account? Resend by default: transactional and marketing on one platform, no sandbox, and the plumbing already built. SES when email data must stay in Australia, or at very high volume, and you accept a few weeks of plumbing. Both when an app on AWS keeps its system mail and inbound mail in SES and sends everything else through Resend.

- A choice between tools from The Stack by Nicolas Dao (Cloudless Labs, Sydney): when to pick each, and when to run both
- Web page: https://cloudlesslabs.com/stack/guides/resend-or-ses/. The whole stack in one file: https://cloudlesslabs.com/stack/brief.md
- Tools: [Resend](https://cloudlesslabs.com/stack/resend/index.md) (My default), [Amazon SES](https://cloudlesslabs.com/stack/aws-ses/index.md) (Use when it fits), [Postmark](https://cloudlesslabs.com/stack/postmark/index.md) (Skip), [Amazon SNS](https://cloudlesslabs.com/stack/aws-sns/index.md) (Use when it fits), [Amazon Pinpoint](https://cloudlesslabs.com/stack/aws-pinpoint/index.md) (Never), [AWS End User Messaging](https://cloudlesslabs.com/stack/aws-end-user-messaging/index.md) (Skip)

## When to pick which

Pick Resend when:

- By default: sign-up, receipts and alerts from any app, with idempotency keys, scheduled sending and signed webhooks out of the box.
- You also send newsletters and announcements: contact lists on the same account, one vendor, one bill.
- Agents send or manage email: there's an official MCP server and CLI.

Pick SES when:

- Email data must stay in Australia: SES sends from Sydney; Resend stores data in the US.
- Volume is very high and price dominates.
- System mail from an app already in AWS: Cognito emails, alerts, receipts, under IAM and CloudTrail, on one bill.
- The app receives email (replies, inbound addresses): SES receives in Sydney and hands mail to S3, SNS or Lambda.

Both, when:

- An app on AWS can keep Cognito's emails and inbound mail on SES, inside the account, and send the product's email and newsletters through Resend.
- Across clients: Resend for most, SES for the ones whose data must stay in Australia.
- Both doesn't solve residency: if the data must stay in Australia, all of it goes through SES, not just part.

Questions that change the answer:

- Must email data stay in Australia? Then it's SES in Sydney; Resend and Postmark store data in the US.
- Do you also send newsletters? Resend does both on one platform; on SES you add your own list tool.
- Who builds templates, the sent-mail log, bounce handling and unsubscribe pages? On SES, you do.
- Will the app receive email? SES can receive in Sydney and pass it to S3, SNS or Lambda.

## The short version

| | Resend | Amazon SES |
|---|---|---|
| Verdict | My default | Use when it fits |
| What you get | An email product: transactional and marketing | A sending engine: API, SMTP, DKIM, suppression list, events, inbound |
| Where data lives | US | Your AWS region, Sydney included |
| 100k emails a month | $35 | $10 à la carte, $16 on the default Essentials plan |
| 1M emails a month | $650 | $100 à la carte, $160 on Essentials |
| Newsletters | Contact lists on the same account: $40 a month for 5k contacts | Your own list tool |
| Getting started | No sandbox | Sandbox per region: verified recipients, 200 a day, 1 a second |
| Leaving the sandbox | Not needed | A case to AWS support; about 96 hours for a first response |
| Bounces and complaints | Signed webhooks | Events to SNS, then SQS and a Lambda you write |
| Pulumi | Community Terraform provider, pinned; templates and lists not in IaC | Official @pulumi/aws; production access and pricing plan are CLI calls |

Price decides this only at very high volume. Below that, the difference buys you the plumbing.

## Why Resend is my default

I picked Resend and I'm not switching. Idempotency keys, scheduled sending and signed webhooks come built in, there's no sandbox to argue my way out of, and marketing email lives on the same platform. One vendor, one API, one bill. When [Better Auth](https://cloudlesslabs.com/stack/better-auth/index.md) needs reset and magic-link emails, Resend sends them.

Its risks are small and known. It's a young company, founded in 2023, so I keep sending behind one small module of my own: a switch would be a day's work, not a rewrite. Its Terraform provider is community-maintained, so I pin its version and keep templates in code.

## When SES earns its place

[SES](https://cloudlesslabs.com/stack/aws-ses/index.md) is cheap and solid once you're out of the sandbox, and it's the only one here that keeps email data in Sydney. That's why I keep it for clients with residency rules. It's also the natural sender for mail that belongs to AWS itself, like Cognito's, and the way to receive mail into an app.

The trade is plumbing. You build templates worth looking at, a log of what went to whom, bounce and complaint handling, unsubscribe pages, and contact lists for anything marketing. This is how I wire it: a verified domain with DKIM and a custom MAIL FROM, a configuration set that publishes bounces, complaints and deliveries to [SNS](https://cloudlesslabs.com/stack/aws-sns/index.md) (or EventBridge), an [SQS](https://cloudlesslabs.com/stack/aws-sqs/index.md) queue, and a small [Lambda](https://cloudlesslabs.com/stack/aws-lambda/index.md) that marks addresses in Postgres. The account-level suppression list stays on. Transactional and marketing mail go in separate accounts, so a campaign can't take down sign-in.

## The traps on SES

- **The default plan costs 60% more.** New accounts default to Essentials at $0.16 per 1,000 since 21 July 2026, and so does an existing account in a region where it hasn't used SES since 1 June 2025. Run `aws sesv2 put-account-pricing-attributes --plan NONE` in each region if you don't need it.
- **The sandbox is per region.** Request production access on day one, in every region you'll send from.
- **Reputation is shared.** At 5% bounces or 0.1% complaints the account goes under review; at 10% or 0.5% AWS can pause sending. One bad list import can pause the password resets of every app in the account. Alarm on `Reputation.BounceRate` and `Reputation.ComplaintRate`.
- **Gmail doesn't report complaints to SES.** Add a one-click `List-Unsubscribe` header to anything bulk, and drop addresses that never open or click.

## What's not in the race

- **[Postmark](https://cloudlesslabs.com/stack/postmark/index.md), Skip.** The best deliverability reputation, but no marketing platform, no idempotency keys, unsigned webhooks, and about three times Resend's price from 50k to 100k emails. If inbox placement of a sign-in code is the whole business, it's defensible.
- **[Amazon Pinpoint](https://cloudlesslabs.com/stack/aws-pinpoint/index.md), Never.** End of support on 30 October 2026. Move campaigns to Resend, or to SES with a self-hosted list tool such as listmonk, and export first.
- **[Amazon SNS](https://cloudlesslabs.com/stack/aws-sns/index.md) isn't customer email.** Its email is plain text for alerts, capped at 10 messages a second per subscription. Its job here is carrying SES's bounce and complaint events.
- **[AWS End User Messaging](https://cloudlesslabs.com/stack/aws-end-user-messaging/index.md), Skip.** It's SMS and voice, not email. I use [Twilio](https://cloudlesslabs.com/stack/twilio/index.md) instead.
- **Email doesn't wake anyone.** An alert that must reach someone at 2 am needs a call first; the email is the record afterwards.

Sources, checked on 25 October 2026: [Resend pricing](https://resend.com/pricing), [SES pricing](https://aws.amazon.com/ses/pricing/), [leaving the SES sandbox](https://docs.aws.amazon.com/ses/latest/dg/request-production-access.html), [SES reputation metrics](https://docs.aws.amazon.com/ses/latest/dg/reputationdashboardmessages.html), [SES account-level suppression list](https://docs.aws.amazon.com/ses/latest/dg/sending-email-suppression-list.html), [Postmark pricing](https://postmarkapp.com/pricing), [Amazon Pinpoint end of support](https://docs.aws.amazon.com/pinpoint/latest/userguide/migrate.html), [SNS pricing](https://aws.amazon.com/sns/pricing/).

## Related

- [Resend](https://cloudlesslabs.com/stack/resend/index.md): the full entry (verdict, pricing, gotchas)
- [Amazon SES](https://cloudlesslabs.com/stack/aws-ses/index.md): the full entry (verdict, pricing, gotchas)
- [Postmark](https://cloudlesslabs.com/stack/postmark/index.md): the full entry (verdict, pricing, gotchas)
- [Amazon SNS](https://cloudlesslabs.com/stack/aws-sns/index.md): the full entry (verdict, pricing, gotchas)
- [Amazon Pinpoint](https://cloudlesslabs.com/stack/aws-pinpoint/index.md): the full entry (verdict, pricing, gotchas)
- [AWS End User Messaging](https://cloudlesslabs.com/stack/aws-end-user-messaging/index.md): the full entry (verdict, pricing, gotchas)
- [Every choice between tools](https://cloudlesslabs.com/stack/choices/index.md)
- [Map of every Markdown file on cloudlesslabs.com, with what each one answers](https://ask.cloudlesslabs.com)
