Suppression Lists
Manage bounced and unsubscribed addresses to protect your sender reputation.
What is a Suppression List?
A suppression list contains email addresses that should not receive emails. This includes:
- Hard bounces - Invalid or non-existent addresses
- Spam complaints - Recipients who marked your email as spam
- Unsubscribes - Recipients who opted out
Why Suppressions Matter
Protect Your Reputation
Sending to invalid addresses damages your sender reputation:
- ISPs track bounce rates
- High bounce rates = spam folder
- Spam complaints can get you blacklisted
Save Money
Don't pay to send emails that will never be delivered.
Legal Compliance
Many regulations require honoring unsubscribe requests:
- CAN-SPAM (US)
- GDPR (EU)
- CASL (Canada)
Suppression Types
Hard Bounces
Permanent delivery failures:
- Email address doesn't exist
- Domain doesn't exist
- Mailbox is disabled
Hard bounces are automatically added to the suppression list.
Soft Bounces
Temporary delivery failures:
- Mailbox full
- Server temporarily unavailable
- Message too large
Soft bounces are retried automatically and only suppressed after multiple failures.
Spam Complaints
When recipients click "Report Spam":
- ISPs send feedback loop reports
- Address is immediately suppressed
- Reduces future complaints
Manual Unsubscribes
When recipients unsubscribe:
- Via unsubscribe link in email
- Via preference center
- Via direct request
Managing Suppressions
View Suppression List
- Go to Email > Servers > [Server] > Suppressions
- Filter by type: Bounces, Complaints, Unsubscribes
- Search for specific addresses
Add Suppression
await client.suppressions.create({
serverId: 'srv_123',
email: 'user@example.com',
reason: 'manual',
comment: 'User requested removal',
});Remove Suppression
Only remove suppressions if you're confident the address is valid:
await client.suppressions.delete({
serverId: 'srv_123',
email: 'user@example.com',
});Bulk Import
Import suppressions from a CSV file:
email,reason,comment
user1@example.com,bounce,Hard bounce
user2@example.com,complaint,Spam complaint
user3@example.com,unsubscribe,User requestedAutomatic Suppression
Enable Auto-Suppression
Configure in server settings:
- Go to Email > Servers > [Server] > Settings
- Enable Auto-suppress hard bounces
- Enable Auto-suppress spam complaints
Suppression at Send Time
When you send an email, we check the suppression list:
const result = await client.emails.send({
from: 'hello@yourapp.com',
to: 'suppressed@example.com',
subject: 'Hello',
html: '<p>Content</p>',
});
// result.status = 'suppressed'
// result.reason = 'bounce'Server-Level vs Stream-Level
Server-Level Suppressions
Apply to all streams in the server. Use for:
- Hard bounces (address is invalid everywhere)
- Spam complaints (don't email this person again)
- Global unsubscribes
Stream-Level Suppressions
Apply only to specific streams. Use for:
- Unsubscribes from specific email types
- Preferences (unsubscribe from marketing but keep transactional)
Handling Bounces
Hard Bounce Workflow
- Email bounces with permanent error
- Address added to suppression list
- Future sends to this address are blocked
- Webhook notification sent (if configured)
Soft Bounce Workflow
- Email bounces with temporary error
- Retry with exponential backoff
- After 3 failed attempts, treat as hard bounce
- Add to suppression list
Best Practices
Clean Your Lists
- Import existing bounce lists when migrating
- Regularly review and clean old addresses
- Remove inactive subscribers
Handle Bounces Promptly
// Webhook handler for bounces
app.post('/webhooks/email', (req, res) => {
const event = req.body;
if (event.event === 'bounced' && event.bounceType === 'hard') {
// Update your database
await db.users.update({
where: { email: event.to },
data: { emailStatus: 'invalid' },
});
}
res.status(200).send('OK');
});Provide Unsubscribe Options
Always include an unsubscribe link:
<a href="{{unsubscribe_url}}">Unsubscribe</a>Don't Remove Suppressions Blindly
Only remove suppressions when:
- User confirms their address is valid
- You've verified the domain exists
- Sufficient time has passed (for soft bounces)
Suppression Export
Export your suppression list for backup or migration:
- Go to Suppressions
- Click Export
- Download CSV file
API Reference
// List suppressions
const suppressions = await client.suppressions.list({
serverId: 'srv_123',
type: 'bounce', // optional filter
limit: 100,
});
// Check if email is suppressed
const status = await client.suppressions.check({
serverId: 'srv_123',
email: 'user@example.com',
});
if (status.suppressed) {
console.log(`Suppressed: ${status.reason}`);
}Next Steps
- Bounces - Understanding bounce types
- Best Practices - Improve deliverability
- Webhooks - Handle bounce events
On This Page
- What is a Suppression List?
- Why Suppressions Matter
- Protect Your Reputation
- Save Money
- Legal Compliance
- Suppression Types
- Hard Bounces
- Soft Bounces
- Spam Complaints
- Manual Unsubscribes
- Managing Suppressions
- View Suppression List
- Add Suppression
- Remove Suppression
- Bulk Import
- Automatic Suppression
- Enable Auto-Suppression
- Suppression at Send Time
- Server-Level vs Stream-Level
- Server-Level Suppressions
- Stream-Level Suppressions
- Handling Bounces
- Hard Bounce Workflow
- Soft Bounce Workflow
- Best Practices
- Clean Your Lists
- Handle Bounces Promptly
- Provide Unsubscribe Options
- Don't Remove Suppressions Blindly
- Suppression Export
- API Reference
- Next Steps