# Bounces and complaints

> How Emailit handles hard and soft bounces, retries temporary failures, processes late bounces and spam complaints, and suppresses addresses automatically.

When a message can't be delivered, or a recipient marks it as spam, Emailit records what happened, updates the email's status and, in most cases, stops you from mailing that address again. This page explains each kind of failure, the retry schedule and the automatic suppression rules.

## Hard and soft bounces

Emailit sorts each failed delivery attempt by the receiving server's reply.

| Type | Typical replies | What Emailit does | Status |
| --- | --- | --- | --- |
| **Hard bounce** (permanent) | `550` mailbox unavailable, `551` user not local, `553` mailbox name not allowed, `554` transaction failed | Stops trying. | `bounced` |
| **Soft bounce** (temporary) | `421` service not available, `450` mailbox busy, `451` local error, `452` insufficient storage, timeouts, connection errors | Retries later. | `attempted` |

Some temporary `4xx` replies describe a mailbox that won't accept mail, such as "mailbox full", "over quota" or "account disabled". Emailit recognizes common wording like this and treats it as a hard bounce. Unknown errors are treated as temporary and retried.

For what each code means, see [SMTP reply codes](/docs/dictionary/smtp-reply-codes/) and [Bounce categories](/docs/dictionary/bounce-categories/). The full reply for each attempt is on the email's **Deliveries** tab in **Email API → Emails**.

## Retries

After a temporary failure, Emailit retries with a growing delay. A message gets up to 7 attempts over about 21 hours:

| After attempt | Next try in |
| --- | --- |
| 1 | 10 minutes |
| 2 | 20 minutes |
| 3 | 40 minutes |
| 4 | 80 minutes |
| 5 | 160 minutes |
| 6 | 320 minutes |
| 7 | 640 minutes, then Emailit stops and bounces the message |

While it's retrying, the email's status is `attempted` and each failed try fires an `email.attempted` event with the receiver's reply. If the last attempt also fails, the email becomes `bounced` with the note "Maximum number of delivery attempts (7) has been reached" and the address is suppressed.

### Back-off when receivers push back

If a provider rate-limits one of Emailit's sending IPs (a `451` reply about too many messages), Emailit pauses delivery from that IP to that provider for 5 minutes. If the provider blocks the IP (`550 5.7.1`), it pauses for an hour. Affected messages stay `attempted` and go out when the pause ends, so you don't need to do anything.

## Late bounces

Some servers accept a message and only report later that they couldn't deliver it. They send a delivery status notification (DSN) to the message's return path, `emailit.<domain>`, which is why that MX record is required. Emailit matches the report to the original message, changes its status to `bounced`, fires `email.bounced` and suppresses the address.

## Complaints

When a recipient selects **Report spam**, many mailbox providers send a report back to the sender through a feedback loop. Emailit receives these reports in the standard ARF format and in Outlook's JMRP format, matches them to the original message, then:

- sets the email's status to `complained`,
- fires `email.complained`,
- adds the address to your suppression list with type `complaint`.

Gmail doesn't send individual complaint reports to senders. To see your Gmail spam rate, use [Google Postmaster Tools](https://postmaster.google.com). Keep your complaint rate under 0.1%, and never let it reach 0.3%.

## Statuses and events

| Status | Event | Meaning |
| --- | --- | --- |
| `attempted` | [`email.attempted`](/docs/webhooks/events/email/attempted/) | A temporary failure. Emailit will retry. |
| `bounced` | [`email.bounced`](/docs/webhooks/events/email/bounced/) | A permanent failure, a late bounce, or all retries used. |
| `complained` | [`email.complained`](/docs/webhooks/events/email/complained/) | The recipient reported the message as spam. |
| `suppressed` | [`email.suppressed`](/docs/webhooks/events/email/suppressed/) | Not sent, because the address is on your suppression list. |

`bounced`, `complained` and `suppressed` are final: a later event doesn't change them. See [Email statuses](/docs/logs/email-statuses/) for the full list.

## Automatic suppression

Emailit adds an address to your suppression list in these cases:

| Trigger | Suppression type | Reason |
| --- | --- | --- |
| A late bounce report (DSN) arrives | `recipient` | `bounce` |
| All 7 delivery attempts fail | `recipient` | `too many soft fails` |
| A second hard bounce to the same address within 24 hours | `recipient` | `too many bounces` |
| A spam complaint arrives | `complaint` | `complaint` |

A single immediate hard bounce doesn't suppress the address on its own. A second one within 24 hours does.

What each type blocks:

- **`recipient`** blocks every send to the address: API, SMTP, campaigns and automations. The email gets the status `suppressed` instead of being sent.
- **`complaint`** stops campaigns from sending to the address. Transactional email through the API and SMTP still goes out, so receipts and password resets keep working.

When a message to an address is delivered successfully, Emailit removes that address's `recipient` suppression. See [Suppressions](/docs/suppressions/) for how suppressions work and how to remove one.

### Choose what gets suppressed

On Pro and Business, workspace admins can change automatic suppression in **Workspace → Settings** on the **Suppressions** tab:

| Setting | Options |
| --- | --- |
| **Enable automatic suppression** | On (default) or off. |
| **Suppress on** | **Bounces and Complaints** (default), **Bounces only** or **Complaints only**. |

On other plans, automatic suppression is always on for bounces and complaints. The controls are visible but locked.

| | Pay as you go | Pro | Business | Custom |
| --- | --- | --- | --- | --- |
| Configurable automatic suppression | — | Included | Included | — |

> **Turning automatic suppression off can hurt your reputation:** If you turn it off, Emailit keeps sending to addresses that bounced or complained. Your bounce rate rises, which lowers your [sending health](/docs/deliverability/sending-health/). Only do this if your own system suppresses those addresses, for example by listening to `email.bounced` and `email.complained` webhooks.

## Bounce-rate thresholds

Bounces feed into your sending health score. Emailit measures the share of unique recipients that bounced over the last 7, 30 and 90 days:

| Bounce rate | Effect |
| --- | --- |
| Under 2% | Healthy. Pro and Business can get automatic limit raises. |
| 2% to 4% | Healthy, but no automatic limit raises. |
| Above 4% | At risk. |
| Above 5% on a domain | The domain is paused. |
| 6% or more on the workspace | The workspace is suspended. |

See [Sending health](/docs/deliverability/sending-health/) for how the score is calculated and how to recover.

## Related

  - [Manage suppressions](/docs/suppressions/manage/): View, add, import and remove suppressions.
  - [Email verification](/docs/email-verification/): Catch bad addresses before you send.
  - [SMTP reply codes](/docs/dictionary/smtp-reply-codes/): What each reply code means.
  - [Bounce categories](/docs/dictionary/bounce-categories/): How bounces are grouped.

---
Source: https://emailit.com/docs/deliverability/bounces-and-complaints/
