✒️ Becky Isjwara

Email · Guide

Resend — email that just works

Send transactional email without becoming a deliverability expert.

Difficulty

Easy

Setup time

20 min

Cost

Free up to 3k/mo

Why Resend?

If your app needs to send email — magic links, sign-up confirmations, receipts, notifications — you have three options: roll your own with Postmark/SendGrid (painful), use your provider's built-in email (often terrible deliverability), or use Resend (modern, easy, cheap).

Resend was built by the folks who made react-email. The DX is noticeably better than the alternatives. I use it for every project.

What you'll use it for

  • Magic-link and password-reset emails (if you're using Supabase or similar, those send via Resend)
  • Transactional: receipts, confirmations, "your export is ready"
  • Onboarding drip sequences (via Resend's Audiences + Broadcasts)
  • Contact form submissions forwarded to your inbox

What Resend is not for: marketing newsletters at scale (use Substack, Buttondown, or ConvertKit). For that, Resend is fine but you'll want a proper newsletter tool.

Pair it with ImprovMX for inbound mailResend only sends. If you want hello@yourdomain.com to actually receive replies and forward to your real inbox, add ImprovMX — free, 10-minute DNS setup. Heads up: you'll need to merge the SPF records so both services share one (detailed in the ImprovMX guide).

Setup, step by step

  1. Sign up at resend.com
  2. Add your domain under Domains
  3. Copy the 3 DNS records (MX, SPF, DKIM) into your domain registrar
  4. Wait ~5 min for DNS to propagate, click Verify
  5. Generate an API key under API Keys → store in .env as RESEND_API_KEY
GotchaIf you use Cloudflare for DNS, set each record's proxy status to "DNS only" (grey cloud, not orange). Proxied records break email.

Sending an email (Next.js)

Install the SDK:

npm install resend

Create an API route like src/app/api/send/route.ts:

import { Resend } from 'resend';

const resend = new Resend(process.env.RESEND_API_KEY);

export async function POST(req: Request) {
  const { to, subject, html } = await req.json();

  const { data, error } = await resend.emails.send({
    from: 'You <hello@yourdomain.com>',
    to,
    subject,
    html,
  });

  if (error) return Response.json({ error }, { status: 500 });
  return Response.json({ data });
}

The from address must be on your verified domain. hello@, no-reply@, anything works — you don't need to create mailboxes, Resend handles routing.

React Email for templates

Don't write HTML emails by hand. Use react-email (same company) — you write JSX, they render to inline-styled HTML that works in every client.

npm install @react-email/components

Pricing

  • Free: 3,000 emails/month, 100/day — enough for most side projects
  • Pro ($20/mo): 50,000/month, priority support, dedicated IP option

For comparison, SendGrid's free tier is 100/day (same), but their $20/month tier is 40k emails — Resend wins on both simplicity and price once you're paying.

Common gotchas

  • First email goes to spam. Send yourself a test email, mark it as "not spam" in Gmail. After that, deliverability improves.
  • DMARC. Resend warns you to add a DMARC record. For a small project, v=DMARC1; p=none; rua=mailto:you@domain.com is fine.
  • Your dev email. In development, send to delivered@resend.dev — the Resend dashboard shows it without actually sending.

Related skills

The /landing skill doesn't set up email, but if you use /seo, the generated llms.txt and contact pages assume you'll wire up a contact form. Resend is the quickest way to make that form actually send.

Rather skip the DIY?

Hire me for your quest.