Suppressions
Mailbox providers judge a sender by how often its mail bounces and how often recipients mark it as spam. Sending again to an address that already bounced or complained hurts every email you send after it, so SendHawk.Online keeps a suppression list for each workspace and checks it before every send.
What gets suppressed
| Reason | How an address gets there | How long |
|---|---|---|
| Hard bounce | Amazon SES reports a Permanent bounce: the address does not exist or the server refuses it for good. | Until you remove it |
| Soft bounce | Amazon SES reports a Transient or Undetermined bounce, which it does only after it has stopped retrying the delivery. Mailbox full is the classic case. | Listed with an expiry 24 hours after the bounce |
| Complaint | The recipient marked your email as spam and their mailbox provider reported it back. | Until you remove it |
| Unsubscribe | The recipient confirmed on the page behind an unsubscribe link. | Until you remove it, or the recipient undoes it on the same page |
Bounces and complaints are added automatically as the events arrive, and each one also reaches your webhooks as a bounced or complained event. Addresses match case-insensitively: Ada@Example.com and ada@example.com are the same entry.
Unsubscribe links
Put {{unsubscribe_url}} anywhere in the HTML or text of a message, raw content or template alike:
<p>Don't want these emails? <a href="{{unsubscribe_url}}">Unsubscribe</a>.</p>
Each send replaces it with a link signed for your workspace and the first to recipient, so it can only ever unsubscribe that one address - editing the URL does not work. The link leads to a SendHawk.Online page where the recipient confirms (nothing happens on opening it, because mail filters open links on their own). After confirming, the address is on your Unsubscribes list and every later send to it answers 422 like any other suppression. The same page lets the recipient undo a click made by mistake, which removes only that unsubscribe, never a bounce or complaint.
The link is never rewritten by click tracking, and it does not expire, so it keeps working in old emails. If you pass your own unsubscribe_url in variables, yours is used instead.
Sending to a suppressed address
The send is refused before anything goes out, and no email is created:
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
"error": true,
"url": "/api/emails",
"statusCode": 422,
"statusMessage": "Suppressed after a bounce, complaint or unsubscribe, so not sent: ada@example.com",
"message": "Suppressed after a bounce, complaint or unsubscribe, so not sent: ada@example.com"
}
Do not retry it: the same request gets the same answer until the address leaves the list. Treat it as a signal to stop sending to that address, for example by flagging the user to update their email.
Review and remove
The lists are in Settings > Suppressions, under Bounces, Complaints and Unsubscribes, with the date, the bounce type and what the provider reported (the SES diagnostic code for a bounce, the feedback type for a complaint). The Suppressions guide shows each list.
Owners and admins can remove an address. Do it only when you know the cause is gone: the recipient fixed their mailbox, gave you a corrected address, or asked to hear from you again. Removing an entry does not erase history, and the next bounce or complaint puts the address straight back on the list.