Bounce Types
listmonk tracks three types of bounces defined in the database schema:- Hard bounces - Permanent delivery failures (invalid email address, domain doesn’t exist)
- Soft bounces - Temporary delivery failures (mailbox full, server temporarily unavailable)
- Complaints - Spam complaints or abuse reports from recipients
schema.sql:9:
Bounce Webhook Endpoints
listmonk provides webhook endpoints to receive bounce notifications from various email service providers.Webhook URLs
Bounce webhooks must be enabled in settings with
bounce.webhooks_enabled = true.- Public webhooks:
/webhooks/service/:service - Authenticated webhook:
/webhooks/bounce(requires authentication)
ses, sendgrid, postmark, forwardemail
Amazon SES Bounce Handling
SES uses Amazon SNS (Simple Notification Service) to send bounce notifications.Confirm subscription
listmonk will automatically confirm the SNS subscription when it receives the confirmation request (handled in
cmd/bounce.go:156-163)SES Bounce Processing
SES bounce notifications are processed ininternal/bounce/webhooks/ses.go:107-173:
- Verifies SNS signature for security
- Parses bounce type (Permanent → hard, Transient → soft)
- Extracts campaign UUID from email headers
- Special handling: Invalid domain bounces (status 5.4.4) are treated as hard bounces
- Complaints are classified as
complainttype
SendGrid Webhook Configuration
Enable SendGrid bounces
Set
bounce.sendgrid_enabled = true and configure your SendGrid verification key:SendGrid Bounce Processing
SendGrid bounce handling (internal/bounce/webhooks/sendgrid.go:52-87):
- Verifies webhook signature using ECDSA
- Processes multiple bounces in a single webhook call
- Classifies bounces based on
bounce_classification:technicalorcontent→ soft bounce- Other classifications → hard bounce
- Automatically extracts campaign UUID from custom X-headers
Postmark Webhook Configuration
ForwardEmail Webhook Support
ForwardEmail integration uses webhook signature verification.Managing Bounces via API
listmonk provides comprehensive API endpoints for bounce management (defined incmd/handlers.go:133-137):
Get All Bounces
campaign_id- Filter by campaignsource- Filter by bounce source (ses, sendgrid, postmark, forwardemail)order_by- Sort fieldorder- Sort direction (asc/desc)page,per_page- Pagination
Get Single Bounce
Get Subscriber Bounces
Delete Bounces
Delete Subscriber Bounces
Automatic Blocklisting
listmonk can automatically blocklist subscribers based on bounce thresholds configured in settings.Bounce Actions Configuration
Default bounce actions fromschema.sql:286:
Blocklist All Bounced Subscribers
Blocklist all subscribers who have bounces:cmd/bounce.go:108-114.
POP3 Mailbox Bounce Scanning
listmonk can scan a dedicated bounce mailbox using POP3 protocol.Configuration
Configure in settings (schema.sql:292-293):
How It Works
The bounce manager (internal/bounce/bounce.go:109-135):
- Scans the mailbox at the configured interval
- Parses bounce emails for delivery failure information
- Extracts subscriber email from bounce message
- Records bounce in database
- Deletes processed messages from mailbox
The return_path address should be configured in your SMTP settings to receive bounce messages.
Bounce Database Schema
Bounces are stored in thebounces table (schema.sql:300-314):
idx_bounces_sub_id- Fast subscriber bounce lookupsidx_bounces_camp_id- Campaign bounce analysisidx_bounces_source- Filter by bounce sourceidx_bounces_date- Date-based queries
Best Practices
Configure bounce handling early
Set up bounce webhooks before sending campaigns to maintain good sender reputation