Outbound Wiki

Opt-out compliance testing

Testing whether opt-out requests reliably stop future sends and remain effective after list and system changes.

An opt-out test should follow the request through the send decision. Use two checks: confirm that the recipient preference changed, then verify that a later send is stopped. A suppression list is a set of email addresses the workspace does not deliver to.1 An unsubscribe records the recipient's stated preference and lives on the Preferences tab.2 Keep those states separate in the test case. A confirmation page shows that the request was accepted, but it does not prove that the send path will honor it.

Run the test

  1. Prepare
  2. Trigger
  3. Inspect
  4. Gate
  5. Recheck

Give each checkpoint a different question. Move on only after you can see the expected state change.

Stage What you are trying to learn Example question
Prepare whether the test uses a live marketing message and an inbox with easy unsubscribe support, such as Gmail or Yahoo3 Does this message expose the recipient-facing unsubscribe route?
Trigger whether the request travels from the email link through database fulfillment4 What record changes after I submit the request?
Inspect whether the record has the right reason, applies_to policy, and category scope56 Which message category should this address leave?
Gate whether the suppressed address is stopped before the send leaves the platform7 What happens when I include this address in the next send?
Recheck whether contact changes leave the suppression state intact8 Did changing the contact record alter the send result?

Test the request path

Use the same path as a recipient. Skipping the live message can hide a broken link, an incomplete header, or a request that never reaches the database.

Send a live marketing message to an inbox that supports easy unsubscribe, such as Gmail or Yahoo.3 Use the unsubscribe link in the message, or the easy unsubscribe control when it appears. Follow the request from that entry point through database fulfillment.4

After sending the test message, inspect its Unsubscription section to confirm that the list-unsubscribe header was injected.9 This checks the mailbox-level route separately. Continue only after exercising both the recipient-facing route and the header route, then record what changed in the underlying contact state.

Before the next send, verify that the test contact is suppressed.10 Keep the test address and its expected outcome visible during the next check so a successful click is not mistaken for a successful send block.

Read the resulting state

Check the record's scope before testing delivery. Decide what the opt-out should block, then compare the stored state with that expectation.

Each suppression record has a reason and an applies_to policy that controls which categories it blocks.5 Subscriptions are managed per Message Category.6 An unsubscribe from one category has no impact on subscriptions to other categories.11 Ask which category the request should affect and which categories should remain eligible.

For a full suppression test, expect the contact to receive no email from the account.12 For a category-level opt-out, test one send in the affected category and another in an unaffected category. Write the expected scope before triggering the request, because the pass condition differs between the two cases.

Prove the send gate

A correct preference record still has to control the path that creates a send. Test the address in the same kind of send operation that could otherwise reach it.

The platform stops sends to suppressed addresses before they leave the platform.7 Put the test address into a controlled send and inspect the result. Look for a blocked send, not only a changed preference record.

If the send is accepted, stop the test and trace the address through the suppression lookup, category policy, and final send decision. Do not continue sending to the address while you investigate. This check proves that the stored state reaches the enforcement point.

Re-test after changes

Run the same test after changes that could create a second copy of the contact or alter how a send is assembled. A working unsubscribe can lose coverage at this stage.

Suppression lists and contact records are separate stores.13 Changing or deleting a contact record leaves addresses on suppression lists in place.8 After a contact or list change, inspect the suppression state again and repeat the send-gate check. A contact that appears eligible in a list view has not necessarily cleared the suppression result.

Editing suppression lists requires specific steps to avoid emailing previously suppressed recipients and damaging sender reputation.14 Treat every removal, import, merge, and list rebuild as a reason to rerun the test path. If your workflow updates the contact preference through a later integration sync, test the request before the sync and the send gate after it completes. A documented flow updates the email Contact Preference during an overnight sync.15

Keep a record of the address, expected scope, observed preference state, and send result. This gives you a comparison point after system changes instead of relying on the status shown in a single interface.

What not to do

These shortcuts can produce false passes or create a route back to previously suppressed recipients.

  • Treat a successful confirmation page as proof that database fulfillment worked. Follow the request through that stage.4
  • Place an unsubscribe on the suppression list. An unsubscribe is kept as a preference record outside that list.16
  • Change or delete a contact record and assume the suppression address has been removed.8
  • Edit a suppression list without a controlled procedure for protecting previously suppressed recipients.14
  • Keep mailing addresses that bounce or report spam during a test, because repeated mailings can get the domain blocked by mailbox providers.17

Sources

  1. 1
    “Your workspace owns a suppression list: a set of email addresses we do not deliver to.”
  2. 2
    “It records the recipient's own stated preference rather than a deliverability fact, so it lives on the Preferences tab instead.”
  3. 3
    “To test your easy unsubscribe setup, you must send a live marketing message to an inbox that supports easy unsubscribe, like Gmail or Yahoo.”
  4. 4
    “This starts with the unsub link in your email and goes all the way through to make sure the unsub or preference-change request is honored in your database.”
  5. 5
    “Each record has a reason saying why the address is listed, and an applies_to policy controlling which categories it blocks:”
  6. 6
    “Subscriptions are per Message Category.”
  7. 7
    “so we stop those sends before they leave the platform.”
  8. 8
    “Deleting or changing contacts under Marketing > Contacts will not have any affects or remove any addresses from any lists under the Suppressions tab in the account.”
  9. 9
    “Once you send your test email, check the 'Unsubscription' section, and you'll see the confirmation that we are indeed injecting the list-unsubscribe.”
  10. 10
    “Test it yourself by clicking the link on a test email and verifying the contact is suppressed before your next send.”
  11. 11
    “Unsubscribing from one Message Category has no impact on other Message Category subscriptions.”
  12. 12
    “Suppressing a contact means they'll no longer receive any email messages from your account. You can think of it as a "do not email" setting.”
  13. 13
    “It is important to note that the Suppression lists in a SendGrid account are not the same as contacts stored in Marketing Campaigns > Contacts.”
  14. 14
    “Instead, Suppression lists require specific steps to edit safely in order to avoid sending emails to previously suppressed recipients and damaging sender reputation.”
  15. 15
    “The Customer’s email Contact Preference is then updated in Spektrix during an overnight sync.”
  16. 16
    “An unsubscribe is not on this list.”
  17. 17
    “Repeatedly mailing addresses that bounce or report spam can get your domain blocked by mailbox providers”