Home » Email Broadcast System » Bounces, Complaints, and Unsubscribes

Email Bounces, Complaints, and Unsubscribes: How Automatic Suppression Works

Every list sheds addresses constantly: mailboxes disappear, people lose interest, and a few will always reach for the spam button. What separates a healthy email program from a dying one is whether those signals are handled automatically and immediately. This guide explains what each signal means, what the law requires, and how Email Campaign Engine, the free open source engine behind our Email Broadcast app, handles all of it without you thinking about it.

Hard Bounces: The Address Is Gone

A hard bounce means the receiving server rejected the message permanently, almost always because the address does not exist. There is nothing to retry and nothing to fix. Continuing to send to hard bounces is one of the strongest spam signals an inbox provider can see, because real senders with real lists do not keep mailing dead addresses.

The engine suppresses hard bounces automatically the moment the provider's webhook reports them. The address goes on the suppression list, comes out of every series, and never gets mailed again. Your bounce rate on the next campaign is better because the list cleaned itself after the last one.

Soft Bounces: Temporary, Until They Are Not

A soft bounce is a temporary failure: a full mailbox, a server timeout, a size rejection. One soft bounce means nothing. The same address soft bouncing again and again means the mailbox is effectively dead, and inbox providers expect you to treat it that way. The engine tracks soft bounces per address as webhook reports come in, so repeated failures surface in your contact data instead of hiding in aggregate stats.

Watch the overall bounce rate per campaign in your daily stats. Above 2% on any send is the signal to pause and look at where those addresses came from, usually one bad feed or one stale import explains most of it, and the feed tags on every contact let you find it.

Spam Complaints: The Metric That Can End You

A complaint is a recipient clicking "mark as spam". Inbox providers treat the complaint rate as the truest signal of whether your mail is wanted, and the tolerance is tiny: sustained complaints above 0.1% start dragging your whole domain's placement down, inbox by inbox.

The engine suppresses complaining addresses automatically via the provider webhooks, they never get mailed again, which is both required by the providers and simply correct. But suppression treats the symptom. If a campaign draws a complaint spike, the cause is targeting or frequency: the wrong segment got the message, or too many messages arrived too close together. The fix belongs in your next campaign plan, not in the suppression list.

Make leaving easier than complaining. Most spam complaints come from people who wanted to unsubscribe and could not see how in two seconds. A prominent unsubscribe link and the native unsubscribe button together drain the complaints away, because one easy click beats hunting for the spam button.

Unsubscribes: One Click, Everywhere

The engine gives every message a hosted one-click unsubscribe page through the ##UNSUB## placeholder. The same URL rides in the List-Unsubscribe header, which is what makes Gmail and other clients show their native unsubscribe button at the top of the message. Gmail and Yahoo now require one-click unsubscribe for bulk senders, so this is not optional decoration, it is a delivery requirement.

Unsubscribes arrive from every direction and all end up in the same place: the unsubscribe page, the native mail client button, provider webhook events, the unsub API endpoint, and bulk unsubscribe uploads all land the address on the suppression list. From there the contact is out of broadcasts and out of every drip series, permanently.

The Suppression List: Permanent Memory

Everything above converges on the suppression list, and its defining property is that it survives re-imports. Upload an old contact file a year from now and every address that ever unsubscribed, complained, or hard bounced stays suppressed. This is what makes bulk imports safe: the list remembers even when your spreadsheets do not.

Beyond the automatic entries, you can suppress addresses yourself through the API or bulk uploads, useful when migrating from another platform and carrying its suppression file over, which you should always do first, before the contacts. The endpoint details are in the documentation.

The engine also offers optional pruning of never-engaged contacts, addresses that have received plenty of messages and never opened or clicked one. Removing them is not a loss, an address that never engages is pure reputation drag, and inbox providers score you on the engagement of what you send. A smaller list that opens beats a bigger one that does not, our list cleaning guide makes the full case.

What the Law Requires

CAN-SPAM and its international cousins require a working unsubscribe mechanism in every commercial message, honored promptly, plus your postal address in the message body. The one-click page and List-Unsubscribe header satisfy the mechanism, and honoring is automatic since suppression is immediate. The postal address belongs in your message template, put it in the footer once and it is handled.

Email Campaign Engine handles bounces, complaints, and unsubscribes automatically, and it is free and open source.

Get the Code on GitHub

Prefer it managed? Contact our team about the hosted Email Broadcast app.