Suppression & Suspension
Understanding how SendFleet handles email bounces, spam complaints, suppressed addresses, and automatic account suspension is essential for maintaining healthy deliverability on Shared SES plans.
Suppression list
SendFleet maintains a global suppression list for Shared SES sends. When an email address triggers a hard bounce or a spam complaint, it is automatically added to the suppression list. All subsequent send attempts to that address are rejected before they ever reach SES, returning a 422 error.
Why suppression exists
Re-sending to bounced addresses wastes your monthly quota, harms your sender reputation, and - because all Growth/Pro accounts share our SES infrastructure - can affect every other sender on the platform. The suppression list protects everyone.
What gets suppressed
| Event | Suppression added? | Notes |
|---|---|---|
| Hard bounce (Permanent) | Yes - immediately | Address does not exist or mailbox is full permanently. Never retry. |
| Soft bounce (Transient) | No | Temporary issue (full inbox, server unavailable). SES may retry automatically. |
| Spam complaint | Yes - immediately | Recipient marked your email as spam. Continuing to send is a deliverability risk. |
| Manual addition | Admin only | Support can manually add addresses when appropriate. |
Suppression error response
When you attempt to send to a suppressed address, the API returns immediately without queuing:
{
"success": false,
"error": "recipient_suppressed",
"detail": "'user@example.com' is on the suppression list due to a previous hard bounce or spam complaint."
}Handling suppressed recipients in your code
Check for "error": "recipient_suppressed" in your response handling. When you receive this, mark the address as undeliverable in your own database and stop attempting to send to it. Do not retry suppressed addresses automatically.
response = requests.post("https://sendfleet.net/api/send/", ...)
data = response.json()
if response.status_code == 422 and data.get("error") == "recipient_suppressed":
# Mark undeliverable in your own database
db.mark_undeliverable(recipient_email)
# Do NOT retry - the address is permanently suppressedSuppression cache
Suppression lookups are cached for up to 10 minutes to reduce database load. A newly suppressed address will be enforced within 10 minutes across all sends. This is intentional - new suppressions propagate quickly enough to protect reputation without impacting hot-path latency.
Bounce & complaint processing
On Shared SES plans, SendFleet receives bounce and complaint notifications from AWS SES via SNS webhooks. These are processed automatically in the background after each delivery.
| Event type | What happens |
|---|---|
| Permanent hard bounce | 1. Address added to suppression list 2. EmailLog status set to failed3. email.bounced webhook fired (if configured)4. Bounce rate counter updated for abuse detection |
| Spam complaint | 1. Address added to suppression list 2. email.complained webhook fired (if configured)3. Complaint rate counter updated for abuse detection |
| Successful delivery | 1. EmailLog status set to sent, delivered_at recorded2. email.delivered webhook fired (if configured) |
| SES rendering failure | 1. EmailLog status set to failed2. email.failed webhook fired with reason |
Automatic account suspension
To protect the shared sending pool, SendFleet automatically suspends Shared SES accounts that exceed bounce or complaint rate thresholds. The check runs after every bounce or complaint event is processed.
Thresholds
| Metric | Threshold | Window | Min. sample |
|---|---|---|---|
| Bounce rate | Per AWS SES guidelines (industry standard thresholds) | Rolling 7 days | 50 sends |
| Complaint rate | Per AWS SES guidelines (industry standard thresholds) | Rolling 7 days | 50 sends |
The minimum sample size prevents accounts with very low volume from being suspended on noise. An account that has sent fewer than 50 emails in the past 7 days is not evaluated, regardless of rate.
What suspension does
When an account is suspended:
- ✕ All
POST /api/send/calls return403 Forbiddenwith"error": "sending_suspended" - ✓ Dashboard access is preserved - you can still log in, view email history, and contact support
- ✓ Your API keys remain valid - they will work again once reinstated
Suspension error response
{
"success": false,
"error": "sending_suspended",
"detail": "Your account sending has been suspended. Reason: bounce rate 5.23% exceeds our threshold. Contact support to reinstate."
}Requesting reinstatement
Reinstatement is a manual process - it is never automatic. This is intentional: an account that breached thresholds and is immediately reinstated will often breach them again within hours.
To request reinstatement, email support@sendfleet.net with:
| What to include | Why it matters |
|---|---|
| Your account email | So we can locate your account and suspension event. |
| Root cause analysis | What caused the high bounce/complaint rate? Stale list? Misconfigured suppression? Purchased addresses? |
| Corrective action taken | What have you changed to prevent recurrence? List cleaning, double opt-in, unsubscribe handling, etc. |
| Expected future volume | Helps us assess risk and set appropriate expectations. |
We aim to respond to reinstatement requests within 2 business days. Accounts that have been suspended multiple times, or that cannot demonstrate corrective action, may not be reinstated on Shared SES and will instead be directed to the BYOC path.
Preventing bounce & complaint issues
| Practice | Impact |
|---|---|
| Use double opt-in for all marketing or newsletter sends | Eliminates typos and invalid addresses at source. Dramatically lowers bounces. |
| Never send to purchased or scraped lists | Purchased lists are full of invalid addresses and spam traps. Instant reputation damage. |
| Honour unsubscribes within 10 business days (legally required in many jurisdictions) | Unsubscribers who keep receiving mail become complainers. |
| Implement list hygiene - remove hard bounces immediately | Our suppression list handles this for SendFleet sends, but your own CRM should mirror it. |
| Monitor your dashboard's bounce and complaint events via webhooks | Catch rising rates before they hit the threshold. |
| Send only transactional email through SendFleet | Bulk marketing email has higher complaint rates. SendFleet is designed for transactional sends only. |
Manual suspension by admin
In addition to automatic suspension, SendFleet support can manually suspend accounts for policy violations including spam, abuse, or Terms of Service breaches. Manual suspensions behave identically to automatic ones from your application's perspective - the same sending_suspended error code is returned.
All suspension and reinstatement events are recorded in an append-only audit log with the trigger reason, bounce/complaint rates at the time, and whether the action was automatic or manual. This log cannot be modified or deleted.