Resend vs SendGrid vs Postmark: Which Email Service for Your SaaS?
An honest comparison of the three transactional email providers for a Next.js SaaS: DX, deliverability, pricing, and the choice HeartCo actually made.
Pricing below was checked in September 2026. It changes over time: confirm current rates on each vendor's own site before deciding.
Why the email provider choice actually matters
Transactional emails are your SaaS's invisible plumbing: signup confirmation, password reset, invoices, notifications. When they don't work, it's silent: users never receive anything, don't complain, and churn.
The wrong provider means 5-15% of your emails land in spam. With 10,000 active users, that's 500 to 1,500 people who never got their verification link. You paid for the acquisition, you lost the conversion.
Overview
| Criterion | Resend | SendGrid | Postmark |
|---|---|---|---|
| Entry price | Free up to 3k/month | $19/mo (50k) | $15/mo (10k) |
| Price at 100k emails/month | $20 | $90 | $75 |
| React Email templates | ✅ native | ❌ | ❌ |
| Average deliverability | 98% | 95% | 99% |
| DKIM/SPF setup | 3 clicks | 8 steps | 5 steps |
| Webhooks | ✅ | ✅ | ✅ |
| Plain-text logs | 90 days | 7 days | 45 days |
| TypeScript SDK | First class | Good | Decent |
Resend: the challenger winning in 2026
Resend was built by the founders of React Email. It's a modern service, optimized for Next.js SaaS products, with a DX unlike anything before it.
Setup in 30 seconds
// src/lib/email/resend.ts
import { Resend } from "resend";
import { env } from "~/env";
export const resend = new Resend(env.RESEND_API_KEY);Templates with React Email
// src/emails/welcome.tsx
import {
Button,
Container,
Head,
Html,
Preview,
Section,
Text,
} from "@react-email/components";
interface WelcomeEmailProps {
userName: string;
loginUrl: string;
}
export default function WelcomeEmail({
userName,
loginUrl,
}: WelcomeEmailProps) {
return (
<Html>
<Head />
<Preview>Welcome to HeartCo, {userName}</Preview>
<Container style={{ padding: "32px", fontFamily: "system-ui" }}>
<Section>
<Text>Hi {userName},</Text>
<Text>Your HeartCo account is ready. Log in to get started.</Text>
<Button
href={loginUrl}
style={{
background: "#6366f1",
color: "white",
padding: "12px 24px",
borderRadius: "8px",
}}
>
Go to dashboard
</Button>
</Section>
</Container>
</Html>
);
}Sending from tRPC
import WelcomeEmail from "~/emails/welcome";
sendWelcome: protectedProcedure
.input(z.object({ userId: z.string() }))
.mutation(async ({ ctx, input }) => {
const user = await ctx.db.user.findFirstOrThrow({
where: { id: input.userId },
});
await resend.emails.send({
from: "HeartCo <hello@heartco.fr>",
to: user.email,
subject: `Welcome ${user.name}`,
react: WelcomeEmail({
userName: user.name,
loginUrl: `${env.NEXT_PUBLIC_URL}/dashboard`,
}),
});
}),The benefit: an email is a typed React component. You test it locally in the browser via react-email dev. No more inline HTML templates or a Mailchimp WYSIWYG editor.
Resend's limits
- No native scheduling (yet) → use Inngest or Vercel Cron
- Logs capped at 90 days on the paid plan
- No phone support (Discord only)
SendGrid: the veteran
SendGrid (Twilio) has been the industry standard since 2015. Robust, but overkill for a SaaS just getting started.
Setup
import sgMail from "@sendgrid/mail";
sgMail.setApiKey(env.SENDGRID_API_KEY);
await sgMail.send({
to: user.email,
from: { email: "hello@yoursaas.com", name: "Your SaaS" },
subject: "Welcome",
templateId: "d-abc123", // SendGrid drag-and-drop template
dynamicTemplateData: {
userName: user.name,
loginUrl: `${env.URL}/dashboard`,
},
});Why we dropped it
- Templates live in a drag-and-drop UI → no versioning, no Git diff
- Tortuous DKIM/SPF setup (8 DNS records)
- Slow, clunky console UI
- $90/month at 100k emails: 4.5x more expensive than Resend
- Average deliverability on new domains has been declining since 2024
SendGrid still makes sense if you're sending >5M emails/month (proven capacity) or your stack is already built on Twilio.
Postmark: the deliverability specialist
Postmark does ONE thing and does it better than anyone: transactional email. No marketing emails, no campaigns, just emails that arrive.
Setup
import { ServerClient } from "postmark";
const postmark = new ServerClient(env.POSTMARK_API_KEY);
await postmark.sendEmailWithTemplate({
From: "hello@yoursaas.com",
To: user.email,
TemplateAlias: "welcome",
TemplateModel: {
user_name: user.name,
login_url: `${env.URL}/dashboard`,
},
});Why you'd consider it
- 99% measured deliverability: the best on the market
- Dedicated IPs for transactional only (no marketing pollution)
- Strict DMARC support
- Plain-text logs for 45 days
Why we didn't pick it
- No native React Email support (you compile templates to MJML instead)
- Heavier template setup
- $75/month at 100k vs $20 for Resend
- Smaller community, fewer Next.js examples
The criterion that changes everything: deliverability
Resend claims 98%, Postmark 99%, SendGrid 95%. On 100,000 emails a month, that's:
- Postmark: 1,000 emails in spam
- Resend: 2,000 emails in spam
- SendGrid: 5,000 emails in spam
If your emails are critical (invoices, security alerts), a 4,000-email-a-month gap can get expensive in support tickets.
How to maximize deliverability regardless of provider:
- Set up DKIM + SPF + DMARC on your sending domain
- Use a dedicated subdomain (
mail.yoursaas.com, not the apex) - Warm up your domain gradually (100 → 1k → 10k emails/day)
- Monitor your bounce rate and clean your list
- NEVER mix marketing and transactional traffic on the same IP
Our choice for HeartCo: Resend
The real setup is queue-based rather than fire-and-forget: emails go through a EmailQueue table (retries, scheduling, lifecycle sequences like onboarding drips and re-engagement emails all reuse the same pipeline), and the Resend client itself is built lazily behind a proxy so importing an email helper never throws just because an API key isn't set in a given environment:
// src/lib/email/resend-client.ts (simplified)
let client: Resend | null = null;
export function getResend(): Resend {
return (client ??= new Resend(process.env.RESEND_API_KEY));
}
export const resend: Resend = new Proxy({} as Resend, {
get(_target, prop) {
return Reflect.get(getResend(), prop) as unknown;
},
});The reasons behind the choice itself:
- Unbeatable DX: React Email + native TypeScript
- Cost: $20/month for 100k emails covers 95% of growing SaaS products
- Domain verification: 3 DNS records, automatic verification
- Useful webhooks:
email.delivered,email.bounced,email.complainedwire easily into tRPC
When to switch to Postmark
If you're in a vertical that's extremely sensitive to delivery delay (banking, healthcare, security), switch to Postmark from 10k emails/month on. The extra 1% of deliverability is worth every dollar.
For every other typical B2B SaaS, Resend remains the best choice in 2026.
Decision summary
| If you are... | Choose |
|---|---|
| An indie hacker / early-stage SaaS | Resend |
| A Next.js SaaS that wants React templates | Resend |
| In a critical vertical (health, banking, security) | Postmark |
| Already on the Twilio stack | SendGrid |
| Sending >5M emails/month | SendGrid (proven capacity) |
Email isn't glamorous, but it's one of the decisions that most affects retention. Spend 1 hour getting it right, and forget about it for 2 years.
Go further
Related articles
ShipFast vs HeartCo: Which SaaS Boilerplate Should You Choose in 2026?
A direct, honest comparison of ShipFast and HeartCo: stack, pricing, features, and which kind of project each one actually fits.
ReadWhich Next.js SaaS Boilerplate Should You Pick in 2026? (Full Comparison)
ShipFast, MakerKit, SupaStarter, HeartCo: how to pick a Next.js SaaS boilerplate for your project, stack, and budget.
ReadReady to launch your SaaS?
HeartCo Starter includes everything you need: auth, payments, AI, mobile, audited security. Starting at $219.