Import/Export
CSV, JSON support
Segmentation
Target by attributes
Double Opt-In
GDPR compliance
Engagement Tracking
Activity & health
Add Subscribers
Add subscribers programmatically:
import { platform } from '@/lib/platform'
// Subscribe with verification email (double opt-in)
const subscriber = await platform.newsletter.subscribe({
email: '[email protected]',
preferences: ['product_updates', 'weekly_digest'],
source: 'signup_form',
metadata: {
name: 'John Doe',
company: 'Acme Inc',
plan: 'pro',
},
})
// subscriber.status = 'pending' until verified// Import multiple subscribers at once
const result = await platform.newsletter.bulkSubscribe({
subscribers: [
{ email: '[email protected]', preferences: ['all'] },
{ email: '[email protected]', preferences: ['product_updates'] },
{ email: '[email protected]', preferences: ['promotions'] },
],
source: 'import',
sendVerification: true, // Send double opt-in emails
})
// result.added = 3
// result.duplicates = 0
// result.invalid = 0Double Opt-In Flow
The recommended subscription flow for GDPR compliance:
User Submits Email
User enters email in your signup form. Call newsletter.subscribe().
Verification Email Sent
Subscriber receives email with verification link. Status is pending.
User Clicks Link
Clicking the link verifies their email. Status becomes verified.
Ready to Receive
Subscriber can now receive campaigns. Webhook newsletter.verified fires.
// Only use for trusted sources (admin import, migrating lists)
await platform.newsletter.subscribe({
email: '[email protected]',
preferences: ['all'],
doubleOptIn: false, // Skip verification
source: 'admin_import',
})Legal Compliance
Import Subscribers
Import existing subscribers from CSV or JSON:
// Import from CSV file
const result = await platform.newsletter.import({
format: 'csv',
data: csvFileContent,
mapping: {
email: 'Email Address', // CSV column name
name: 'Full Name',
preferences: 'Topics', // Comma-separated in CSV
},
options: {
sendVerification: true,
skipDuplicates: true,
source: 'mailchimp_migration',
},
})
// {
// total: 5000,
// added: 4850,
// duplicates: 120,
// invalid: 30,
// errors: [...]
// }// Import from JSON array
await platform.newsletter.import({
format: 'json',
data: [
{
email: '[email protected]',
preferences: ['product_updates'],
metadata: { source: 'website' },
},
{
email: '[email protected]',
preferences: ['all'],
metadata: { source: 'api' },
},
],
})Export Subscribers
Export your subscriber list:
// Export all subscribers
const { data, count } = await platform.newsletter.export({
format: 'csv', // or 'json'
fields: ['email', 'preferences', 'subscribedAt', 'status'],
})
// Export specific segment
const { data } = await platform.newsletter.export({
format: 'json',
segment: {
status: 'verified',
preferences: { includes: 'product_updates' },
},
fields: ['email', 'metadata.name', 'metadata.company'],
})Segmentation
Create segments to target specific subscribers:
// Get subscribers by preference
const productUsers = await platform.newsletter.getSubscribers({
segment: {
preferences: { includes: 'product_updates' },
},
})
// Multiple conditions
const targetedSegment = await platform.newsletter.getSubscribers({
segment: {
status: 'verified',
preferences: { includes: 'promotions' },
metadata: {
plan: { in: ['pro', 'enterprise'] },
country: 'US',
},
subscribedAfter: '2024-01-01',
lastEngaged: { within: '30d' }, // Active in last 30 days
},
limit: 1000,
})
// Count segment size
const count = await platform.newsletter.countSubscribers({
segment: { preferences: { includes: 'weekly_digest' } },
})Segment Operators
| Property | Type | Description |
|---|---|---|
includes | string | Array contains value (for preferences) |
eq | any | Equals exact value |
in | array | Value is in array |
gt / gte | number | Date | Greater than (or equal) |
lt / lte | number | Date | Less than (or equal) |
within | string | Within time period (e.g., "30d") |
exists | boolean | Field exists / not null |
Subscriber Status
Track subscriber status throughout lifecycle:
pendingAwaiting email verification
verifiedCan receive campaigns
unsubscribedOpted out of all emails
bouncedEmail delivery failed
complainedMarked as spam
// Get subscriber details
const subscriber = await platform.newsletter.getSubscriber({
email: '[email protected]',
})
// {
// email: '[email protected]',
// status: 'verified',
// preferences: ['product_updates', 'weekly_digest'],
// metadata: { name: 'John', plan: 'pro' },
// subscribedAt: '2024-01-15T10:00:00Z',
// verifiedAt: '2024-01-15T10:05:00Z',
// lastEngaged: '2024-01-20T14:30:00Z',
// engagement: {
// opens: 12,
// clicks: 5,
// campaigns: 8,
// }
// }Update & Unsubscribe
Manage subscriber preferences and status:
// Update preferences
await platform.newsletter.updateSubscriber({
email: '[email protected]',
preferences: {
product_updates: true,
promotions: false,
weekly_digest: true,
},
metadata: {
plan: 'enterprise', // Update metadata
},
})
// Unsubscribe
await platform.newsletter.unsubscribe({
email: '[email protected]',
reason: 'Too many emails', // Optional feedback
})
// Resubscribe (sends new verification)
await platform.newsletter.resubscribe({
email: '[email protected]',
})List Health
Monitor your subscriber list health:
const health = await platform.newsletter.getListHealth()
// {
// total: 10000,
// verified: 8500,
// pending: 500,
// unsubscribed: 800,
// bounced: 150,
// complained: 50,
// activeRate: 75.2, // Engaged in last 90 days
// bounceRate: 1.5,
// unsubscribeRate: 0.8,
// growthRate: 5.2, // Month over month
// }