Prompt
I'm building a Next.js app and only need transactional email, not marketing automation.
Latest observation
Oct 1, 2026
Gemini
For Next.js applications requiring strictly transactional emails (password resets, magic links, order confirmations, receipt notifications), Resend is currently the top choice, followed closely by Postmark and Plunk.
Here is a direct comparison of the best light-weight, transactional-focused options:
| Service | Best For | Free Tier | Node / Next.js SDK | Direct SMTP Support |
|---|---|---|---|---|
| Resend | Developer experience & Next.js ecosystem | 3,000 emails/mo | npm i resend (React Email native) | Yes |
| Postmark | Unmatched deliverability & strict transactional focus | 100 emails/mo (trial) | npm i postmark | Yes |
| Plunk | Open-source & budget simplicity | 3,000 emails/mo | npm i @plunk/node | Yes |
| AWS SES | High volume at ultra-low cost | 62,000 emails/mo (if hosted on EC2) or pay-as-you-go | @aws-sdk/client-ses | Yes |
Recommended Setup: Resend + React Email
Resend was specifically built for the React/Next.js stack. Instead of managing complex HTML templates in a dashboard, you write your email templates directly in React using standard components.
1. Install Dependencies
Bash
npm install resend @react-email/components
2. Create your React Email Template
TypeScript
// components/emails/WelcomeEmail.tsx
import { Html, Head, Body, Container, Text, Button } from "@react-email/components";
interface WelcomeEmailProps {
name: string;
}
export const WelcomeEmail = ({ name }: WelcomeEmailProps) => (
<Html>
<Head />
<Body style={{ fontFamily: "sans-serif", backgroundColor: "#f4f4f5" }}>
<Container style={{ padding: "20px", backgroundColor: "#ffffff" }}>
<Text>Hi {name},</Text>
<Text>Welcome to the application! Click below to confirm your account:</Text>
<Button
href="https://yourdomain.com/confirm"
style={{ background: "#000", color: "#fff", padding: "12px 20px", borderRadius: "5px" }}
>
Confirm Account
</Button>
</Container>
</Body>
</Html>
);
3. Send from a Next.js Server Action or Route Handler
TypeScript
// app/actions/send-email.ts
"use server";
import { Resend } from "resend";
import { WelcomeEmail } from "@/components/emails/WelcomeEmail";
const resend = new Resend(process.env.RESEND_API_KEY);
export async function sendWelcomeEmail(userEmail: string, userName: string) {
try {
const data = await resend.emails.send({
from: "Acme <onboarding@yourdomain.com>",
to: [userEmail],
subject: "Welcome aboard!",
react: WelcomeEmail({ name: userName }),
});
return { success: true, data };
} catch (error) {
return { success: false, error };
}
}
Alternative Options
- Postmark: If guaranteed inbox placement for critical transactional alerts (like 2FA codes) is your absolute top priority, Postmark enforces strict separation between marketing and transactional traffic on separate IP pools.
- AWS SES: If you expect to scale to hundreds of thousands of emails per month and want to pay pennies (≈$0.10 per 1,000 emails), AWS SES is the cheapest infrastructure route, though setup requires managing DKIM/SPF manually.