Newsletter
Configure newsletter providers for managing subscriptions
LaunchSaaS provides newsletter support via a split-package design. The core @launchsaas/newsletter package defines the interface; each provider is a separate package that you install only when needed. Register the provider in capabilities.ts — set it to null to disable newsletter features.
Updated: 2026-03-22 - Clarified that broadcast emails are generic and can be triggered from any server-side workflow.
Architecture
@launchsaas/newsletter ← interface + Newsletter class (always needed)
@launchsaas/newsletter-resend ← Resend AudiencesYou only add the provider package you actually use.
Newsletter is disabled by default (newsletter: null in
capabilities.ts). Install @launchsaas/newsletter-resend and configure
the provider to enable it.
Setting Up Newsletter
1. Install the provider package
In your app directory, install the provider:
pnpm add @launchsaas/newsletter @launchsaas/newsletter-resend2. Configure environment variables
Add to your .env file:
RESEND_API_KEY="re_..."
RESEND_FROM_EMAIL="[email protected]"
RESEND_AUDIENCE_NEWSLETTER="audience-id-for-newsletter"
# Optional – waitlist audience
RESEND_AUDIENCE_WAITLIST="audience-id-for-waitlist"RESEND_API_KEY is shared with the email provider. If you already set it up
for transactional email, you don't need to set it again.
3. Register in capabilities.ts
Open your app's src/capabilities.ts and configure the newsletter provider:
// src/capabilities.ts (your app — apps/launchsaas/src/capabilities.ts)
import { ResendNewsletterProvider } from "@launchsaas/newsletter-resend";
export const capabilities = {
// set to null to disable newsletter
newsletter: ResendNewsletterProvider.create(),
// ...other capabilities
};4. Create a Resend Audience
- Go to Audiences in the Resend Dashboard
- Create an audience for newsletter subscriptions
- Copy the Audience ID into
RESEND_AUDIENCE_NEWSLETTER
If you are setting up the environment for the first time, return to the Environment Setup guide after completing this step.
Using the Newsletter Service
import { capabilities } from "@/capabilities";
const { newsletter } = capabilities;
// Guard: only use if configured
if (newsletter) {
await newsletter.addContact("[email protected]");
}
// Add a contact to a specific audience
await newsletter?.addContact("[email protected]", "optional-audience-id");
// Remove a contact
await newsletter?.removeContact("[email protected]");
// Send a broadcast to all subscribers
await newsletter?.broadcast({
subject: "What's New in LaunchSaaS",
react: MyEmailTemplate({ ... }),
audienceId: "optional-audience-id", // uses default if omitted
});Newsletter is server-only. Use it in Server Components, Server Actions, or
Route Handlers — never in client components.
Broadcast Emails
The newsletter provider supports broadcast emails delivered to all subscribers in an audience at once. This is more efficient than sending individual emails and can be triggered from Server Actions, Route Handlers, or custom Scheduled Jobs.
Resend's Broadcast API handles large subscriber lists without timeout issues.
Disabling Newsletter
Set newsletter: null in capabilities.ts. When null, all newsletter actions throw NEWSLETTER_NOT_CONFIGURED.
Custom Newsletter Provider
Implement the NewsletterProvider interface and register it:
// packages/newsletter-custom/src/provider.ts
import type {
BroadcastOptions,
NewsletterProvider,
} from "@launchsaas/newsletter";
export class CustomNewsletterProvider implements NewsletterProvider {
readonly name = "custom";
async addContact(email: string, audienceId?: string): Promise<void> {
// your implementation
}
async removeContact(email: string, audienceId?: string): Promise<void> {
// your implementation
}
async broadcast(options: BroadcastOptions): Promise<void> {
// your implementation
}
static create(): CustomNewsletterProvider {
return new CustomNewsletterProvider();
}
}Register it in capabilities.ts:
// src/capabilities.ts (apps/launchsaas/src/capabilities.ts)
import { CustomNewsletterProvider } from "@launchsaas/newsletter-custom";
export const capabilities = {
newsletter: CustomNewsletterProvider.create(),
// ...other capabilities
};