Claude Code Boilerplate
FeaturesPricingBlogDocs
Get started →

Product

  • Features
  • Pricing
  • Skills

Compare

  • vs ShipFast
  • vs MakerKit
  • vs supastarter

Resources

  • Docs
  • Blog
  • Discord

Legal

  • License
  • Privacy Policy
  • Terms of Service
Claude Code Boilerplate

© 2026 Claude Code Boilerplate. All rights reserved.

← All posts

SaaS Email Marketing With Resend -- Broadcast Campaigns and Lifecycle Emails Without Mailchimp

July 19, 2026
nextjsresendsaasemailstartup

Most founders wiring up their first SaaS hit the same wall about two weeks after launch: they have 200 signups, a new feature just shipped, and no way to tell anyone about it.

Their app sends password resets and welcome emails just fine. But emailing 200 people at once? That is a different problem -- and most advice points to adding Mailchimp or Brevo on top of your existing email setup, at $100+ per month.

You do not need a second tool. If your SaaS runs on Resend for transactional email, you already have what you need to send broadcast campaigns.

What you are actually choosing between

Transactional emails go to one person in response to an action: a welcome email when someone signs up, a password reset link, an invoice receipt. They are triggered by code and sent immediately.

Broadcast emails go to a segment of users at a time you choose: a feature announcement, a re-engagement campaign, a monthly digest. You write them once and send them to a list.

Most SaaS products need both. The mistake is paying two separate platforms to get them.

What Resend already gives you

The Next.js SaaS boilerplate comes with Resend wired in through lib/email.ts. Your transactional emails -- welcome, verify, password reset -- already work. The same API key and sender domain handles broadcast campaigns too.

Resend's broadcast feature lets you upload a list of contacts, write or reuse an email template, and send via API. No second monthly bill. No contact sync to a third-party platform.

Store marketing consent first

Before you email anyone a broadcast, you need their opt-in. GDPR and CAN-SPAM both require it.

Add a column to your users table in your Drizzle schema:

marketingOptIn: boolean('marketing_opt_in').notNull().default(false),

Add an opt-in checkbox to your signup form -- unchecked by default -- and store it on account creation. Then query opted-in users whenever you need to send:

const recipients = await db
  .select({ email: userTable.email, name: userTable.name })
  .from(userTable)
  .where(eq(userTable.marketingOptIn, true));

This is code you own. You are not uploading your user list to a third party or hoping a sync job ran on time.

Send your first broadcast

Resend's API accepts a to array. For a feature announcement:

await resend.emails.send({
  from: 'Your SaaS <hello@yoursaas.com>',
  to: recipients.map(r => r.email),
  subject: 'New feature: you asked, we built it',
  react: FeatureAnnouncementEmail({ featureName: 'CSV Export' }),
});

For larger lists, send in batches of 50-100 to avoid rate limits. Trigger this from an admin-only route or a scheduled Vercel cron job.

Your FeatureAnnouncementEmail template goes in the emails/ folder alongside your existing react-email components. It gets the same styling and layout as your welcome email, because it is the same codebase.

Three automated emails worth setting up early

Not every email should be a one-off blast. Three automated sequences directly move the needle for an early-stage SaaS:

Trial-end reminder. If you offer a free trial, send an email 3 days before it expires. Show the user what they have done inside the product. Make the upgrade path one click.

Activation nudge. When a user signs up but never completes a key action -- creating their first project, inviting a teammate -- send a single nudge at the 48-hour mark. You are not spamming them; you are helping them get to the moment they signed up for.

Win-back. When a paid user cancels, wait 30 days and send one re-engagement email. Mention what changed since they left. Give them a one-click way to restart.

All three run as Vercel cron jobs querying your Drizzle ORM tables. The background jobs guide covers the cron setup. The email templates use the same react-email components already in your emails/ folder -- no new dependencies needed.

Wire in an unsubscribe link

Add an unsubscribe link to every broadcast. Resend supports a one-click unsubscribe header that most email clients surface automatically. Store the preference in your marketingOptIn column and honor it immediately.

This is not optional -- it is required by law in most countries, and ignoring it will damage your sender reputation and get your domain flagged. If you built your own email verification flow, you already have the pattern for a token-based unsubscribe link.

What you skip paying for

Mailchimp's Standard plan runs over $100 per month for a meaningful contact list. Klaviyo is similar. Both require syncing your user database to a third-party platform and managing two separate email systems.

With Resend, you pay per email sent. Your user data stays in your own Neon database. Your templates stay in your codebase. Your opt-in and unsubscribe logic is code you own and can audit -- not a setting hidden behind a vendor's dashboard.

For an early-stage SaaS with a few hundred to a few thousand users, the math is straightforward: the tools you already have are enough.


If your product is running on the Next.js SaaS boilerplate, Resend is already configured. Adding broadcast email is one schema column, a template, and a cron job away. Get started at boilerplate.iteam-company.com and ship your first broadcast this week.