Self-hosted suppression list management

Your suppression list belongs on your own servers.

OptOutManager collects unsubscribes from every source, stores them hashed in your own database, and hands them to the mailers and partners who need them. You install it in your own cloud account and pay for it once.

Opt-outs in

  • ESP webhooks
  • One-click unsubscribe
  • CSV import
  • API

Your infrastructure

OptOutManager Web application and worker
MySQL Hashes, logs, settings
S3 bucket Published list files

Hashed lists out

  • Partner API
  • SFTP push
  • Signed downloads
  • Scrub API
Nothing crosses the boundary unless you send it. We have no access to your installation.
License
One payment. No subscription.
Database
MySQL that you operate.
File storage
Your S3 bucket, or any S3-compatible store.
Addresses
Hashed on arrival. Raw storage is off by default.

01 Why self-host

A suppression list is a record of everyone who asked you to stop.

It holds the addresses of people who unsubscribed, complained or bounced, across every brand you send for. You are expected to keep it accurate for years, and to share it with every partner who mails on your behalf.

Put that list in a hosted service and another company holds a copy, another set of staff can reach it, and another contract decides what happens to it. OptOutManager takes the third party out. The software runs where your other systems run, under the access rules you already have.

Custody

Every hash, log entry and export is written to infrastructure in your own account. There is no shared tenant and no vendor copy.

Cost

You pay once for the license. After that, the only bills are the ones from your own cloud provider.

Control

You choose the region, the retention period, the network rules and the backup schedule. Access goes to the people you grant it to.

02 What it does

From the unsubscribe click to the partner’s scrubbed file.

  1. Collect

    Opt-outs arrive from ESP webhooks, one-click unsubscribe headers, hosted opt-out pages, CSV uploads and the API. Each one is normalised and recorded once per list.

    Mailchimp, Klaviyo, ActiveCampaign, SendGrid, Zapier, or any signed webhook

  2. Hash

    Addresses are hashed on arrival in three formats, so each partner gets the one their platform accepts. Keeping the raw address is a per-list choice and is off unless you turn it on.

    MD5, SHA-256, SHA-512

  3. Publish

    Every change produces a new numbered version of the list. Partners pull the full file, or only what was added since the version they already hold.

    Full and delta snapshots with checksums

  4. Deliver

    Partners fetch lists through the API, receive them over SFTP on a schedule, or send their own addresses to the scrub endpoint and get back the ones to drop.

    REST API, SFTP push, partner portal

  5. Audit

    Every download, sign-in and change is logged with who did it and from where. Seed addresses planted in each download show when a suppression file has been mailed.

    Audit log, download reports, alerts

See every feature

03 API

One question before every send: which of these do I remove?

Partners post the addresses they plan to mail and get an answer in the same request. Larger files go through as an asynchronous job. Nobody has to download the whole list to check a handful of records.

  • Bearer keys issued per partner and scoped to the campaigns you grant
  • Optional IP allow-list on every key
  • Rate limits you set in configuration
  • Versioned endpoints under /api/v1
Request
POST /api/v1/campaigns/42/scrub
Authorization: Bearer <partner-key>
Content-Type: application/json

{
  "emails": [
    "[email protected]",
    "[email protected]"
  ]
}
Response200 OK
{
  "results": [
    { "email": "[email protected]", "suppressed": true },
    { "email": "[email protected]",   "suppressed": false }
  ],
  "summary": { "total": 2, "suppressed": 1, "clean": 1 }
}

04 Hosted or self-hosted

What changes when the software runs on your side.

A hosted suppression service OptOutManager
Where records are stored The vendor’s cloud account Your database and your bucket
Who can reach them You, the vendor’s staff and their sub-processors Only the people you grant access
Data residency Whichever regions the vendor offers Any region or data centre you choose
How you pay Monthly, usually by record count or volume Once, for the license
If the vendor changes course You migrate on their timeline Your installation keeps running
Vendor review Another data processor to assess and contract with Software inside your own environment

05 Requirements

It runs on infrastructure most teams already have.

A Linux server, a MySQL database and an S3 bucket are enough. If you already run workloads on AWS, every part has a managed equivalent.

Architecture and install steps

Runtime
Docker, or PHP 8.2 with Apache
Database
MySQL 8, self-managed or a managed service such as Amazon RDS
Object storage
Amazon S3, MinIO or another S3-compatible store
Background work
One worker process and a few scheduled jobs
System email
Amazon SES in your own account, for sign-in links and alerts

06 Questions

Asked before most purchases.

Do you ever receive our data?

No. The application runs in your environment and writes to your database and your storage bucket. We have no login to your installation and it does not report back to us.

How is it licensed?

As a one-time purchase. There is no monthly fee and no charge per record. Pricing depends on the shape of your deployment, so ask us for a quote.

Can partners keep getting lists the way they do today?

Almost certainly. Partners can pull files through the API, have them pushed to their SFTP server on a schedule, download them from a portal, or scrub their own lists against yours without ever holding your file.

Does it cover the Gmail and Yahoo one-click unsubscribe rules?

Yes. The API issues a signed unsubscribe URL for each recipient, ready for the List-Unsubscribe and List-Unsubscribe-Post headers described in RFC 8058. A click in the mailbox is recorded without a confirmation page.

We send for several brands. Can each have its own list?

Yes. Lists belong to brands, and each brand can share different lists with different partners. A global opt-out list and a suppressed-domains list apply across all of them.

Who looks after the installation?

You do, as with any software you host. It needs the same care as a small internal web application: backups of the database and bucket, and updates applied when you choose to apply them.

One license. No meter running.

Tell us roughly how many records, brands and partners you manage, and where you plan to host. We will reply with a quote.

Request pricing