Bounce Types
| Type | Trigger | Ark Behavior | Suppression |
|---|---|---|---|
| Hard bounce | SMTP 5xx error | Immediate suppression | Automatic |
| Soft bounce | SMTP 4xx error | Retry up to 18 times (~48h) | After all retries fail |
| NDR bounce | Server accepts then sends Non-Delivery Report | Webhook notification | Manual — handle via API |
Hard Bounces
A hard bounce is a permanent delivery failure. The address is invalid and will never be deliverable. Common causes:- Invalid address (
user unknown,no such user) - Invalid domain (no MX records)
- Account disabled or deleted
- Policy rejection (content filtering)
| Code | Meaning |
|---|---|
| 550 | Mailbox unavailable or not found |
| 551 | User not local, forwarding-only |
| 552 | Message rejected by policy |
| 553 | Invalid mailbox name |
| 554 | General permanent failure |
Ark’s Handling
When a hard bounce occurs:- Message status →
HardFail - Recipient immediately added to suppression list (reason:
hard fail) - Future emails to this address are held (status
Held) MessageDeliveryFailedwebhook fires
Soft Bounces
A soft bounce is a temporary failure that may succeed on retry. Common causes: mailbox full, server unavailable, rate limiting, greylisting, connection timeout. Common SMTP codes:| Code | Meaning |
|---|---|
| 421 | Server temporarily unavailable |
| 450 | Mailbox busy |
| 451 | Temporary processing error |
| 452 | Mailbox full |
Ark’s Handling
Ark retries with exponential backoff using the formula(1.3^attempts) x 5 minutes:
| Attempt | Delay | Cumulative |
|---|---|---|
| 1 | 5 min | 5 min |
| 3 | 8.5 min | 20 min |
| 5 | 14 min | 45 min |
| 8 | 32 min | 1.5 hours |
| 10 | 69 min | 3.5 hours |
| 12 | 2.4 hours | 7 hours |
| 15 | 5.6 hours | 18 hours |
| 18 | 14 hours | ~48 hours |
If all 18 retries fail, the message converts to
HardFail and the recipient is suppressed with reason too many soft fails.NDR Bounces
Sometimes a server accepts a message (250 OK) but later determines it can’t deliver. It sends a Non-Delivery Report (NDR) back to the sender. When Ark receives an NDR:- Original message status →
Bounced MessageBouncedwebhook fires
NDR bounces do NOT auto-suppress. You must handle the
MessageBounced webhook and suppress manually via the API if desired. This differs from HardFail, which triggers automatic suppression.Suppression List
The suppression list prevents sending to addresses that have bounced. This protects your sender reputation.| Event | Suppression Reason | Timing |
|---|---|---|
| Hard bounce (5xx) | hard fail | Immediate |
| Soft bounce exhausted | too many soft fails | After ~48 hours |
| NDR bounce | None (manual) | Your decision |
Managing Suppressions
- Python
- Node.js
- cURL
Webhook Handlers
- Python
- Node.js
- Ruby
- Go
Best Practices
Validate emails at signup
Validate emails at signup
Use double opt-in to verify addresses before adding them to your list. Catches typos and fake addresses before they bounce.
Clean your list regularly
Clean your list regularly
Remove subscribers who haven’t engaged in 6+ months. Stale addresses are more likely to bounce.
Sync bounces to your database
Sync bounces to your database
Subscribe to
MessageDeliveryFailed and MessageBounced webhooks to mark addresses as invalid in your user database.Monitor your bounce rate
Monitor your bounce rate
Keep below 2%. Higher rates indicate list quality issues and will harm deliverability.
Warm up new domains
Warm up new domains
Start with small volumes to engaged recipients. Sending large volumes immediately increases bounce risk.
Troubleshooting
High Hard Bounce Rate
- Check list source: Purchased or scraped lists have high invalid rates
- Look for typos: Common mistakes like
gmial.comoryaho.com - Verify at signup: Use double opt-in for new subscribers
- Clean old lists: Remove addresses that haven’t engaged in 6+ months
Soft Bounces Converting to Hard Fails
- Check send volume: You may be hitting rate limits
- Review message size: Large attachments cause rejections
- Spread sends over time: Avoid bursts to single domains
