# Email statuses

> Every email status in Emailit, what it means, whether it can still change, which webhook event it sends, and what to do next.

Every email has one status that shows where it is in its lifecycle. This page lists all 14 statuses, how an email moves between them, and what to do when an email stops somewhere you didn't expect. The status is the latest state only; the full history is on the email's [detail page](/docs/logs/email-details/) and in [events](/docs/logs/events/).

## Status reference

"Final" means Emailit won't change the status on its own any more. A final email can still be retried, which creates a new email with a new ID.

| Status | Dashboard tooltip | Final | Webhook event | Meaning and what to do |
| --- | --- | --- | --- | --- |
| `accepted` | Accepted for delivery | No | `email.accepted` | Stored and queued for delivery. Usually moves on within seconds. Emails sent over SMTP don't emit `email.accepted`. |
| `scheduled` | Scheduled for delivery in the future | No | `email.scheduled` | Waiting for its `scheduled_at` time. You can [change the time](/docs/api-reference/emails/update/) or cancel it up to 3 minutes before it's due. |
| `delivered` | Delivered to the recipient's mail server | No | `email.delivered` | The receiving server accepted the message. It can still become `loaded` or `clicked`, and a later bounce report or complaint can change it to `bounced` or `complained`. |
| `loaded` | Email content was loaded by the recipient | No | `email.loaded` | The tracking image was loaded (an open). Needs load tracking on a verified [tracking domain](/docs/tracking/). |
| `clicked` | A link in the email was clicked | No | `email.clicked` | A tracked link was clicked. Needs click tracking on a verified tracking domain. |
| `attempted` | Delivery attempted but resulted in a temporary failure | No | `email.attempted` | The receiving server answered with a temporary error. Emailit retries automatically; see the [retry schedule](#retry-schedule-for-attempted). |
| `bounced` | Email permanently failed to deliver | Yes | `email.bounced` | The receiving server rejected the message permanently, a bounce report arrived later, or retries ran out. Check the address before sending to it again. See [Bounces and complaints](/docs/deliverability/bounces-and-complaints/) for when the address is suppressed automatically. |
| `failed` | Failed to deliver due to a specific error | Yes | `email.failed` | A processing error rather than an answer from the recipient's server. Rare. Retry it with the API. |
| `rejected` | Accepted for delivery but rejected after | Yes | `email.rejected` | Emailit refused to send it after accepting it, because an [unverified workspace](#why-an-email-is-rejected) can only send to members. |
| `suppressed` | Recipient is on the suppression list | Yes | `email.suppressed` | Not sent because the address is on your [suppression list](/docs/suppressions/). Remove the suppression only if you're sure, then retry. |
| `received` | Incoming email was accepted | Yes | `email.received` | An [inbound](/docs/inbound/) message was received on your inbound subdomain. |
| `complained` | A complaint was registered for this email | Yes | `email.complained` | The recipient marked it as spam and their provider reported it. The address is added to suppressions unless your automatic suppression settings exclude complaints. Don't email it again. |
| `canceled` | Canceled: pulled from the send queue when possible | Yes | `email.canceled` | You canceled it in the dashboard or with the API. Cancellation is best effort. |
| `held` | Email is being held | Yes | `email.held` | Emailit didn't send it. See [why an email is held](#why-an-email-is-held), fix the cause, then retry. |

Webhooks receive `email.canceled` and `email.held` when they're subscribed to all events, or when you add them to the webhook's event list with the API. See [Event types](/docs/webhooks/event-types/).

## Lifecycle

Most emails move along this path:

1. **Created.** An API send creates the email as `accepted`, or `scheduled` when `scheduled_at` is in the future. SMTP sends start as `accepted` too. Inbound mail is created as `received` and never changes.
2. **Checked.** Before each delivery attempt, Emailit checks the workspace, domain, API key, credits, suppression list and spam score. A failed check ends the email as `held`, `rejected` or `suppressed` without sending it.
3. **Delivered or deferred.** The delivery attempt either succeeds (`delivered`), fails temporarily (`attempted`, then retried), or fails permanently (`bounced`).
4. **Engagement.** If tracking is on, opens and clicks move a delivered email to `loaded` and then `clicked`.
5. **Late reports.** A bounce report that arrives after delivery changes the status to `bounced`. A spam complaint changes it to `complained`.

At any point before delivery, a `scheduled`, `accepted` or `attempted` email can be `canceled`.

### The engagement ladder

Delivery and engagement statuses only move forward:

`accepted`, `scheduled` or `attempted` → `delivered` → `loaded` → `clicked`

A later event never moves an email back down the ladder. If a click is recorded, the email stays `clicked` even when more opens arrive. An open or click can skip ahead of `delivered`, because it proves the message arrived. Statuses that end delivery (`bounced`, `failed`, `rejected`, `suppressed`, `complained` and `canceled`) are never overwritten by opens or clicks.

## Retry schedule for attempted

When a receiving server answers with a temporary error (a `4xx` reply such as `421` or `451`, a timeout or a connection error), the email becomes `attempted` and Emailit tries again. Each wait is twice as long as the previous one:

| After failed attempt | Next step |
| --- | --- |
| 1 | Try again after 10 minutes |
| 2 | Try again after 20 minutes |
| 3 | Try again after 40 minutes |
| 4 | Try again after 80 minutes |
| 5 | Try again after 160 minutes |
| 6 | Try again after 320 minutes |
| 7 | Wait 640 minutes, then mark the email `bounced` |

That's 7 delivery attempts over about 21 hours. When they run out, the email is marked `bounced` with "Maximum number of delivery attempts (7) has been reached", and the recipient is added to suppressions with the reason `too many soft fails`, unless your [automatic suppression](/docs/suppressions/manage/) settings exclude bounces.

Each attempt is listed on the email's **Deliveries** tab with the server's reply, and each one sends an `email.attempted` event that includes `smtp_code`, `smtp_enhanced_code` and `smtp_response`. Some temporary replies that clearly mean a permanent problem, such as a disabled mailbox, are treated as bounces straight away. When a provider is throttling, Emailit can also pause delivery to it briefly; those rows say "Delivery delayed due to…".

## Why an email is held

A held email was taken out of the send queue without being sent. The **Deliveries** tab on the email shows which reason applied:

| Reason | Message on the Deliveries tab | What to do |
| --- | --- | --- |
| Workspace suspended | Mail server has been suspended. No e-mails can be processed at present. Contact support for assistance. | Check [Sending health](/docs/deliverability/sending-health/) and contact support. |
| Sending domain paused | Sending from this domain is paused. Contact support for assistance. | The domain's bounce rate was too high. See [Sending health](/docs/deliverability/sending-health/). |
| Not enough credits | Workspace has not enough email credits to send this email. | [Buy credits](/docs/billing/credits/) or turn on [auto-refill](/docs/billing/auto-refill/). |
| Spam score too high | Held because Rspamd scored this message 8.4, which is at or above the threshold of 7. | Read the [spam checks](/docs/logs/email-details/#spam-checks) for the email, fix the content, then retry. |
| API key set to hold | Credential is configured to hold all messages authenticated by it. | Messages sent with this key are held on purpose. Contact support. |

Held emails aren't released automatically. After fixing the cause, select **Retry** on the email, or call [Retry an email](/docs/api-reference/emails/retry/). Retrying creates a new email with the same content and charges credits again.

## Why an email is rejected

Until your workspace has [production access](/docs/workspaces/production-access/), you can only send to workspace members' account emails. The API returns `403` and SMTP returns `550` for other recipients at send time, so most of the time you see the error instead of an email. The `rejected` status appears when the same check fails later, at delivery time, for example for an email that was scheduled earlier. The **Deliveries** tab shows "Unverified workspaces can only send to workspace members' account emails" and the blocked address.

## Retry rules

| | Dashboard **Retry** button | [Retry an email](/docs/api-reference/emails/retry/) API |
| --- | --- | --- |
| Statuses | `held`, `suppressed` | `bounced`, `failed`, `suppressed`, `held` |
| Age | Less than 30 days old | Less than 30 days old |
| Content | Must not be purged by [data retention](/docs/data-retention/) | Must not be purged |
| Result | A new email with a new ID; the original is unchanged | Same, the response includes `original_id` |

For a suppressed email, remove the address from your [suppression list](/docs/suppressions/manage/) first, otherwise the retry is suppressed again.

## Related

  - [Email details](/docs/logs/email-details/)
  - [Bounces and complaints](/docs/deliverability/bounces-and-complaints/)
  - [Retry and forward](/docs/email-api/retry-and-forward/)
  - [Webhook event types](/docs/webhooks/event-types/)

---
Source: https://emailit.com/docs/logs/email-statuses/
