Skip to main content

Email Campaigns

Send bulk emails to multiple recipients with tracking and analytics.

Create a Campaign

const campaign = await lettr.campaigns.create({
  name: 'Summer Sale 2024',
  from: 'marketing@example.com',
  subject: 'Summer Sale - Up to 50% Off!',
  html: '<p>Check out our summer deals!</p>',
  audienceId: 'aud_123'
});

Send a Campaign

// Send immediately
await lettr.campaigns.send(campaign.id);

// Or schedule for later
await lettr.campaigns.schedule(campaign.id, {
  scheduledAt: '2024-06-01T09:00:00Z'
});

Campaign with Segments

Target specific audience segments:
const campaign = await lettr.campaigns.create({
  name: 'Premium User Announcement',
  from: 'team@example.com',
  subject: 'Exclusive Feature for Premium Users',
  html: '<p>As a premium user, you get early access...</p>',
  audienceId: 'aud_123',
  segmentId: 'seg_premium_users'
});

A/B Testing

Test different subject lines or content:
const campaign = await lettr.campaigns.create({
  name: 'Newsletter A/B Test',
  from: 'newsletter@example.com',
  variants: [
    {
      name: 'Variant A',
      subject: 'This Week in Tech',
      html: '<p>Content version A...</p>',
      weight: 50
    },
    {
      name: 'Variant B',
      subject: '🔥 Hot Tech News This Week',
      html: '<p>Content version B...</p>',
      weight: 50
    }
  ],
  audienceId: 'aud_123',
  testSettings: {
    testPercentage: 20,
    winnerCriteria: 'open_rate',
    waitDuration: '4h'
  }
});

Campaign Analytics

const stats = await lettr.campaigns.getStats(campaign.id);

// Returns:
{
  "sent": 10000,
  "delivered": 9850,
  "opened": 2500,
  "clicked": 500,
  "bounced": 150,
  "unsubscribed": 25,
  "openRate": 25.38,
  "clickRate": 5.08,
  "bounceRate": 1.52
}

Campaign Status

StatusDescription
draftCampaign created but not sent
scheduledCampaign scheduled for future delivery
sendingCampaign is currently being sent
sentCampaign has been fully sent
pausedCampaign sending was paused
cancelledCampaign was cancelled

Pause and Resume

// Pause a sending campaign
await lettr.campaigns.pause(campaign.id);

// Resume sending
await lettr.campaigns.resume(campaign.id);

// Cancel completely
await lettr.campaigns.cancel(campaign.id);

Best Practices

Gradually increase volume when starting with a new domain.
High bounce rates can hurt deliverability. Clean your lists regularly.
Always send test emails before launching a campaign.