Skip to main content
All articles
6 min read

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

CriterionResendSendGridPostmark
Entry priceFree up to 3k/month$19/mo (50k)$15/mo (10k)
Price at 100k emails/month$20$90$75
React Email templates✅ native❌❌
Average deliverability98%95%99%
DKIM/SPF setup3 clicks8 steps5 steps
Webhooks✅✅✅
Plain-text logs90 days7 days45 days
TypeScript SDKFirst classGoodDecent

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:

  1. Set up DKIM + SPF + DMARC on your sending domain
  2. Use a dedicated subdomain (mail.yoursaas.com, not the apex)
  3. Warm up your domain gradually (100 → 1k → 10k emails/day)
  4. Monitor your bounce rate and clean your list
  5. 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.complained wire 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 SaaSResend
A Next.js SaaS that wants React templatesResend
In a critical vertical (health, banking, security)Postmark
Already on the Twilio stackSendGrid
Sending >5M emails/monthSendGrid (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

Share

Ready to launch your SaaS?

HeartCo Starter includes everything you need: auth, payments, AI, mobile, audited security. Starting at $219.

30-day money-back guarantee