All posts

I priced transactional email at 10k, 50k and 200k a month. The recommended plan is often the wrong one

Every transactional email provider has a pricing page with a slider. You drag it to your volume, the page highlights a plan, and most people pick that plan. I did the same for years.

This week I went through the pricing pages of Resend, Postmark, Mailgun and Amazon SES and did the math by hand for three volumes: 10,000, 50,000 and 200,000 emails a month. Two things surprised me. The plan a page recommends is not always the cheapest way to send that volume, and the cheapest provider changed its default price for new accounts this summer.

Everything below is monthly billing, transactional plans only, in USD, read from each pricing page on 9 November 2026. If you read this later, prices have probably moved. The script at the end makes it easy to rerun.

The short version

Provider10k / month50k / month200k / month
Amazon SES (à la carte)$1$5$20
Amazon SES (Essentials, new account default)$1.60$8$32
Mailgun$15$35$200
Resend$20$20$125
Postmark$15$55$245

Each number is the cheapest way to send that volume: either the plan that covers it, or a smaller plan plus overage. That second option is where the interesting part is.

The recommended plan overpays at 200k

On Resend, if you drag the slider to 200,000, the page recommends Scale at $160. But Pro with 100,000 emails costs $35, and every extra 1,000 is $0.90. So 200,000 emails on Pro is $35 + 100 × $0.90 = $125. That's $35 a month less than the recommended plan, or $420 a year.

To be fair to Resend, Scale gives you more than volume: 1,000 domains instead of 10, more webhook endpoints, a Slack channel and the option of a dedicated IP. If you need those, Scale is the right plan. If you only need the volume, it isn't. One catch: overage on Resend works through pay-as-you-go, which you have to enable on a paid plan. Without it, sending stops at the quota.

Mailgun has the same pattern. At 200,000, the next step on the slider is Scale with 250,000 for $215. Scale with 100,000 for $90 plus 100 × $1.10 overage is $200. Mailgun prints overage as "from $1.10 / 1,000", so treat $200 as the page's own lower bound, not a quote.

Postmark is the exception. At 200,000 the 300k step ($245) is slightly cheaper than 125k plus overage ($115 + 75 × $1.80 = $250), so the slider is right.

Between the steps it's even bigger

The gaps get wide when your volume sits just above a step. Say you send 130,000 a month on Postmark Basic. The next step is 300,000 for $245. Staying on 125,000 and paying overage for 5,000 extra emails costs $115 + 5 × $1.80 = $124. Half the price, for the same emails.

Same on Resend at 60,000: Pro 100k is $35, but Pro 50k plus 10 × $0.90 is $29.

The rule I use now: before upgrading, multiply the overage rate by how far over you are, and compare it to the next plan.

SES is 6 to 12 times cheaper, with a new asterisk

At 200,000 emails SES costs $20 at the classic rate of $0.10 per 1,000. That's 6 times cheaper than Resend and 12 times cheaper than Postmark at the same volume.

The asterisk is new. Since 21 July 2026, new SES accounts (and accounts with no activity since June 2025) start on a plan called Essentials at $0.16 per 1,000. You can switch to à la carte at any time, but you have to know to do it. If you opened an SES account this autumn and never touched the plan settings, you're likely paying 60% more than the number everyone quotes.

And SES is cheap for a reason. You get a sending API, an SMTP endpoint and a template API. You don't get a template editor, a searchable log of sent messages out of the box, or a dashboard most people would call friendly. Bounces and complaints come as events you route yourself (SNS or EventBridge), and a new account starts in the sandbox until AWS approves production access. The price difference is real, and so is the time you'll spend building what the others ship.

What the price doesn't include

The headline price is per email. These are the other lines that matter once you're in production.

Log retentionDedicated IPFree tier
Resend30 days on all plans$30/mo add-on, Scale only, over 3,000 emails a day3,000/mo, 100 a day
Postmark45 days, up to 365 as add-on (from $5/mo) on Pro+from $50/mo, 300,000+/mo, Pro+100/mo, test only
Mailgun1 day on Basic, 5 on Foundation, 30 on Scaleone included from Foundation 100k, extra $59/mo100 a day
Amazon SESdepends on what you buildavailable, priced separately—

Log retention is the one I'd look at first. When a customer says "I never got the password reset", you want to see what happened to that email. With one day of logs on Mailgun Basic, you usually can't. Postmark's 45 days by default is a real feature, not marketing.

The suites price by people, not emails

If you're comparing these with an all-in-one tool, the pricing model changes completely.

Customer.io Essentials is $100 a month and includes 1,000,000 emails, but only 5,000 profiles. Each extra profile is $0.009. With 10,000 users that's $145, whether you send them 10,000 emails or 500,000. Loops starts at $49 for 5,000 subscribed contacts and $99 for 10,000, with sends unlimited.

So for a product that sends a lot of transactional email to a modest user base, the suites can be cheaper than they look. For a product with many users who each get a few emails, they get expensive fast. Delivery is included in both, which the provider prices above are not. I put the two models side by side in a calculator, where you can enter your own volume and user count.

When none of this matters

At 10,000 emails a month the difference between the most and least expensive provider is $14. That's not a decision, that's a rounding error. Pick the one whose API and docs you like, whose dashboard you can debug with at 2 a.m., and whose deliverability you trust. Postmark has built its whole brand on that last part, and its price is partly paying for it.

The overage math starts to matter from roughly 100,000 a month, and the SES gap matters when email is a real line in your costs or you already live in AWS.

The script

Here's the logic as a small TypeScript script. It takes each plan step from the pricing page and finds the cheapest combination for a volume. Update the numbers when the pages change.

interface Step {
  plan: string;
  includes: number; // emails a month
  price: number; // USD a month
  per1kOver?: number; // USD per extra 1,000, if the plan allows overage
}
 
function cheapest(emails: number, steps: Step[]) {
  let best: { label: string; monthly: number } | null = null;
  for (const s of steps) {
    const over = Math.max(0, emails - s.includes);
    if (over > 0 && s.per1kOver === undefined) continue;
    const monthly = s.price + Math.ceil(over / 1_000) * (s.per1kOver ?? 0);
    const label =
      over > 0
        ? `${s.plan} ${s.includes / 1000}k + overage`
        : `${s.plan} ${s.includes / 1000}k`;
    if (!best || monthly < best.monthly) best = { label, monthly };
  }
  return best;
}
 
const resend: Step[] = [
  { plan: "Pro", includes: 50_000, price: 20, per1kOver: 0.9 },
  { plan: "Pro", includes: 100_000, price: 35, per1kOver: 0.9 },
  { plan: "Scale", includes: 200_000, price: 160, per1kOver: 0.8 },
];
 
console.log(cheapest(200_000, resend)); // { label: "Pro 100k + overage", monthly: 125 }

The full version with all four providers is in this gist.

Where your templates live is the other cost

The cheapest provider today may not be the cheapest next year, as the SES change shows. Switching is easy if all you do is call a send API. It's hard if your templates live inside the provider, which is what I wrote about in moving email templates off Mandrill.

I'm the author of Senlo, an open-source editor and lifecycle layer that works on top of Resend, Postmark, SES or any SMTP server, so templates and automations stay in one place while the provider stays a setting. It's one way to keep the option to move. Keeping templates in your repo with react-email or MJML is another.


Prices checked on 9 November 2026: resend.com/pricing, postmarkapp.com/pricing, mailgun.com/pricing, aws.amazon.com/ses/pricing, customer.io/pricing, loops.so/pricing.

Senlo is open source (AGPL-3.0): github.com/IgorFilippov3/senlo. Hosted version at senlo.io.

I priced transactional email at 10k, 50k and 200k a month. The recommended plan is often the wrong one — Senlo