Subscriber Management
Import, export, segment
Campaign Builder
Create & send campaigns
Engagement Analytics
Opens, clicks, unsubscribes
GDPR Compliance
Double opt-in, consent
Subscribe Users
Add subscribers to your newsletter list:
import { platform } from '@/lib/platform'
// Subscribe with double opt-in (recommended)
await platform.newsletter.subscribe({
email: 'user@example.com',
preferences: ['product_updates', 'promotions'],
source: 'website',
metadata: {
signupPage: '/pricing',
referrer: req.headers.referer,
},
})
// Subscriber receives confirmation email
// Clicks link to verify → status becomes 'verified'| Property | Type | Description |
|---|---|---|
email | string | Subscriber email address |
preferences | string[] | Topics they want to receive |
source | string | Signup source (website, api, import) |
metadata | object | Custom metadata for segmentation |
doubleOptIn | boolean | Require email verification (default: true) |
Double Opt-In
Manage Preferences
Let subscribers control what they receive:
// Get current preferences
const { preferences, subscribedAt } = await platform.newsletter.getPreferences({
email: 'user@example.com',
})
// Update preferences
await platform.newsletter.updatePreferences({
email: 'user@example.com',
preferences: {
product_updates: true,
promotions: false,
weekly_digest: true,
},
})
// Unsubscribe completely
await platform.newsletter.unsubscribe({
email: 'user@example.com',
reason: 'Too many emails', // Optional feedback
})Send Campaigns
Create and send email campaigns to your subscribers:
// Send to all subscribers
await platform.newsletter.sendCampaign({
subject: 'New Feature Launch! 🚀',
html: '<h1>Introducing Dark Mode</h1><p>...</p>',
from: 'Updates <updates@myapp.com>',
})
// Send to specific segment
await platform.newsletter.sendCampaign({
subject: 'Special Offer for Power Users',
html: offerHtml,
segment: {
preferences: ['promotions'],
metadata: { plan: 'pro' },
},
})
// Schedule for later
await platform.newsletter.sendCampaign({
subject: 'Weekly Digest',
html: digestHtml,
scheduledAt: nextMonday,
})| Property | Type | Description |
|---|---|---|
subject | string | Email subject line |
html | string | HTML email content |
text | string | Plain text fallback |
segment | object | Target specific subscribers |
scheduledAt | Date | Schedule for later (optional) |
from | string | Sender name and email |
Segmentation
Target specific subscribers based on preferences and metadata:
// Segment by preference
const productUsers = await platform.newsletter.getSubscribers({
segment: {
preferences: { includes: 'product_updates' },
},
})
// Segment by metadata
const proUsers = await platform.newsletter.getSubscribers({
segment: {
metadata: { plan: 'pro' },
},
})
// Complex segment
const targetedUsers = await platform.newsletter.getSubscribers({
segment: {
preferences: { includes: 'promotions' },
metadata: { country: 'US' },
subscribedAfter: '2024-01-01',
},
})Campaign Analytics
Track engagement for each campaign:
const stats = await platform.newsletter.getCampaignStats(campaignId)
// {
// id: 'campaign_abc123',
// subject: 'New Feature Launch!',
// sentAt: '2024-01-15T10:00:00Z',
// recipients: 5420,
// delivered: 5380,
// bounced: 40,
// opened: 2150,
// clicked: 890,
// unsubscribed: 12,
// openRate: 40.0,
// clickRate: 16.4,
// unsubscribeRate: 0.2,
// }Open Rate
Unique opens / delivered
Click Rate
Unique clicks / delivered
Bounce Rate
Bounces / sent
Unsubscribe
Unsubs / delivered
Webhooks
React to newsletter events in real-time:
import { platform } from '@/lib/platform'
import { NextRequest } from 'next/server'
export async function POST(req: NextRequest) {
const isValid = await platform.webhooks.verify(req)
if (!isValid) {
return new Response('Unauthorized', { status: 401 })
}
const event = await req.json()
switch (event.type) {
case 'newsletter.subscribed':
console.log('New subscriber:', event.data.email)
break
case 'newsletter.verified':
// Double opt-in completed
await welcomeNewSubscriber(event.data.email)
break
case 'newsletter.unsubscribed':
// Handle unsubscribe
await updateCRM(event.data.email, { newsletter: false })
break
case 'newsletter.bounced':
// Handle bounce
await markEmailInvalid(event.data.email)
break
}
return new Response('OK')
}| Property | Type | Description |
|---|---|---|
newsletter.subscribed | event | New subscriber added |
newsletter.verified | event | Double opt-in completed |
newsletter.unsubscribed | event | Subscriber opted out |
newsletter.bounced | event | Email bounced (hard/soft) |
newsletter.complained | event | Marked as spam |
newsletter.campaign.sent | event | Campaign finished sending |
Best Practices
Use Double Opt-In
GDPR compliant, better deliverability
Segment Your List
Send relevant content to each group
Monitor Bounces
Clean invalid emails regularly
Respect Unsubscribes
Process immediately, no delays