Choice 16. By Nicolas Dao

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.

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 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 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 (or EventBridge), an SQS queue, and a small Lambda 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, 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, 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 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, Skip. It's SMS and voice, not email. I use Twilio 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, SES pricing, leaving the SES sandbox, SES reputation metrics, SES account-level suppression list, Postmark pricing, Amazon Pinpoint end of support, SNS pricing.

More choices

  1. 01 Lambda, Web Functions or Workers? Where should this piece of logic run?
  2. 02 Lambda, Fargate or EC2? My Lambda is busy all day, or its reserved concurrency keeps going up. When is it time to move to a container, and where is the line?
  3. 03 SQS, EventBridge or SNS? Something happens in my app and other code must act on it. Do I put it in a queue, on an event bus, or on a topic?
  4. 04 SQS retries or Durable Functions? A job calls something flaky (a third-party API, an LLM, a slow Postgres). How do I retry it reliably, and when do I reach for Lambda durable functions instead of tuning SQS?
  5. 05 pgvector or S3 Vectors? Where should my embeddings live?
  6. 06 Pulumi or Terraform? We're putting our infrastructure in code. Pulumi or Terraform, and what if we already run one of them?
  7. 07 Cloudflare or S3 and CloudFront for a website? Where should a website, SPA or PWA live, Cloudflare static hosting or S3 behind CloudFront, and where do its heavy files go?
  8. 08 CloudWatch and Firehose, side by side How do I keep chatty logs without a CloudWatch-sized bill?
  9. 09 Athena or DuckDB? How should I query my data lake, and what changed when AWS bought DuckDB's company?
  10. 10 Neon or Aurora? I need Postgres for an app on AWS. When is Neon the right call, and when does it have to be Aurora?
  11. 11 Better Auth or Cognito? Which sign-in should my app use, and what do I actually get for free?
  12. 12 Why I ended up on AWS Which cloud should my company run on, and is AWS just the one you know?
  13. 13 Better Auth, run yourself or managed by Neon? My app is on Neon. Should I run Better Auth myself, or switch on Neon Auth, which is Better Auth managed by Neon?
  14. 14 Stripe or PayPal Should we take payments with Stripe or PayPal, and when is PayPal worth the pain?
  15. 15 Tailscale or Cloudflare Tunnel? I need to reach a private box or VPC, or put a service from it online. Is that Tailscale or Cloudflare Tunnel?
  16. 17 WhatsApp or Telegram Our bot should reach users in a messaging app. WhatsApp or Telegram, and why did yours get blocked?
  17. 18 Which model, at what price Claude, GPT or an open model? Which is the cheapest model that's good enough, tier by tier?
  18. 19 Function URL or API Gateway? My Lambda needs an HTTPS endpoint. When is a function URL enough, and when do I start on API Gateway from day one?

Want this stack in your AWS account?

Cloudless Labs is a Sydney consultancy. We migrate on-premises systems to AWS, build serverless apps on this stack, and coach teams to ship with Claude Code and Codex.

Contact Us

For general inquiries, please contact us at:

For e-learning capabilities, please contact: