Skip to main content

Email Bounces

Learn how to handle bounced emails and maintain list hygiene.

Types of Bounces

Hard Bounces

Permanent delivery failures:
  • Invalid email address
  • Domain doesn’t exist
  • Recipient mailbox doesn’t exist
{
  "type": "email.bounced",
  "data": {
    "emailId": "email_123",
    "to": "invalid@nonexistent.com",
    "bounceType": "hard",
    "bounceCategory": "invalid_address",
    "message": "550 5.1.1 The email account does not exist"
  }
}

Soft Bounces

Temporary delivery failures:
  • Mailbox full
  • Server temporarily unavailable
  • Message too large
{
  "type": "email.bounced",
  "data": {
    "emailId": "email_456",
    "to": "full@example.com",
    "bounceType": "soft",
    "bounceCategory": "mailbox_full",
    "message": "452 4.2.2 Mailbox full"
  }
}

Bounce Categories

CategoryTypeDescription
invalid_addressHardEmail address doesn’t exist
domain_not_foundHardDomain doesn’t exist
mailbox_fullSoftRecipient’s mailbox is full
server_errorSoftReceiving server error
content_rejectedHardContent blocked by filters
policy_relatedHardBlocked by recipient’s policy

Automatic Handling

Lettr automatically:
1

Tracks Bounces

All bounces are logged and tracked in your dashboard.
2

Suppresses Hard Bounces

Hard-bounced addresses are added to your suppression list.
3

Retries Soft Bounces

Soft bounces are automatically retried up to 3 times.
4

Sends Webhooks

Bounce events are sent to your configured webhook endpoints.

Handling Bounces in Your App

// Webhook handler
app.post('/webhooks/lettr', (req, res) => {
  const event = req.body;
  
  if (event.type === 'email.bounced') {
    const { to, bounceType, bounceCategory } = event.data;
    
    if (bounceType === 'hard') {
      // Remove from your mailing list
      await removeFromMailingList(to);
      
      // Notify the user if needed
      await notifyUser(to, bounceCategory);
    }
  }
  
  res.sendStatus(200);
});

Viewing Bounces

// List all bounces
const bounces = await lettr.bounces.list({
  startDate: '2024-01-01',
  endDate: '2024-01-31'
});

// Get bounce rate statistics
const stats = await lettr.stats.get({
  startDate: '2024-01-01',
  endDate: '2024-01-31'
});

console.log(`Bounce rate: ${stats.bounceRate}%`);

Best Practices

Confirm email addresses before adding to your list.
Remove inactive and invalid addresses periodically.
High bounce rates (>5%) can hurt deliverability.
Process bounce notifications to keep lists clean.