Unsubscribe and suppression

How Hermeticor decides who may receive marketing, how to record consent, and how unsubscribes and suppressions work.

Embed
Preview of the card
<a href="https://hermeticor.com/guides/consent"><img src="https://hermeticor.com/guides/_api/public/orgs/5fcd8b3c-a27c-4688-972f-de710125592f/spaces/9a3da731-ded5-4536-b84f-8c9a61420ff4/pages/aa349867-4818-489b-8049-1395513ccb0b/social-card.svg?v=3e7ae33eec8b" alt="Unsubscribe and suppression" width="600" height="315"></a>

Every marketing and prospecting message is checked twice before it leaves:

  • Consent. The person has consent on record for that channel and purpose. Each record keeps where it came from.

  • Suppression. The address or number is not suppressed.

A message that fails either check is recorded as blocked with a reason. It is not sent. No setting or API call turns this off.

The person must exist first (POST /v1/profiles, an event, or an import).

curl -s -X POST "$BASE/v1/consent/batch/write" \
  -H "Authorization: Bearer $HERMETICA_API_KEY" -H "Content-Type: application/json" \
  -d '{"items":[{"target":{"email":"ada@example.com"},
       "consent":{"channel":"email","purpose":"marketing","status":"granted","source":"form",
                  "sourceRef":"newsletter form","disclosureText":"Yes, email me product news."}}]}'

A suppressed address is refused here with "Address is suppressed". Consent never overrides a suppression.

Look someone up

curl -s "$BASE/v1/consent/lookup?email=ada@example.com" -H "Authorization: Bearer $HERMETICA_API_KEY"

You get their consent states and any active suppressions. To see why one send would be blocked:

curl -s -X POST "$BASE/v1/eligibility/check" \
  -H "Authorization: Bearer $HERMETICA_API_KEY" -H "Content-Type: application/json" \
  -d '{"profileId":"<profileId>","channel":"email","purpose":"marketing","destination":"ada@example.com"}'

Put {{ unsubscribe_url }} in every marketing email. Hermeticor also adds the one-click List-Unsubscribe header.

  • Opening the link shows a confirm page. Link scanners cannot unsubscribe anyone.

  • Confirming (or a one-click request from the mail app) revokes consent and adds an unsubscribe suppression.

  • The page offers Resubscribe, which undoes that unsubscribe only. It never grants consent to someone who had none.

  • The page links the preference centre, where people pick topics, frequency or a pause.

  • {{ preferences_url }} is the same signed link as {{ unsubscribe_url }}: both open that page, and the preference centre is one click from it.

SMS honours STOP replies.

Suppress someone yourself

curl -s -X POST "$BASE/v1/suppressions" \
  -H "Authorization: Bearer $HERMETICA_API_KEY" -H "Content-Type: application/json" \
  -d '{"channel":"email","value":"someone@example.com","reason":"manual","sourceRef":"Support ticket 123"}'

Suppressions ignore case and +tag variants: suppressing someone@example.com also blocks Someone+news@example.com.

Other ways:

  • A whole profile: POST /v1/profiles/<id>/suppress {}. Nothing at all is sent to them until you lift it.

  • Stop all marketing for people: POST /v1/consent/batch/unsubscribe-all {"items":[{"email":"..."}],"source":"Support ticket"} (targets still works but is deprecated).

  • A file: POST /v1/suppressions/import with -F file=@list.csv -F mode=preview, then again with mode=commit.

  • A whole domain, for every kind of message: POST /v1/blocklist {"domain":"competitor.example","reason":"..."}.

What blocks what

Suppression reason

Blocks

Hard bounce, spam complaint

Every message, transactional too

Manual, do-not-contact, a blocked domain

Every message, transactional too

Unsubscribe

Marketing and prospecting

Hard bounces and complaints are added automatically from your provider's reports.

Transactional messages

Receipts, password resets and other messages a person asked for are transactional. They do not need marketing consent and ignore quiet hours. They still stop at hard bounces, complaints, manual and do-not-contact suppressions, and blocked domains. Use transactional only for those messages. Sending marketing as transactional breaks the law in most countries and your provider's terms.

Lifting a suppression

POST /v1/suppressions/<id>/lift {"reason":"..."}. Lifting a hard bounce needs an admin signed in to the web app; an API key cannot do it.

Data requests from your contacts

  • Copy of their data: POST /v1/profiles/<id>/dsar/export {}.

  • Erase them: POST /v1/profiles/<id>/dsar/erase {}. Hermeticor keeps a do-not-contact suppression, so they are never marketed to again by mistake.

Updated