DEV Community

TiltedLunar123
TiltedLunar123

Posted on

You clicked unsubscribe. Nobody checks whether it worked

Every unsubscribe tool works the same way. You click the button, it sends the request, and the row goes grey. That is the end of it. Gmail does this too. The greyed row means the request went out, and it is very easy to read that as the sender having stopped.

Those are not the same thing, and the gap between them is where the mail keeps coming from.

An unsubscribe is a request, not a switch

The Unsubscribe button Gmail shows next to a sender's name works off the List-Unsubscribe header. When that header is present, Gmail can send the opt-out for you without you ever opening the message. That part is genuinely good, and it beats hunting for the link in the footer, which on a sender who is already ignoring the rules mostly just confirms your address is live.

The header only tells Gmail where to send the request, but what the sender does with it is entirely up to the sender. In the US, CAN-SPAM gives them ten business days to honour an opt-out, so even an honest sender has a legitimate window where mail still arrives. A dishonest one has no technical obstacle at all.

The question worth asking two weeks later is therefore whether they stopped, which is a different question from whether you unsubscribed.

Checking it by hand

Write down the sender and the date you unsubscribed. That is the whole apparatus. Two weeks later, run one search:

from:newsletter@example.com after:2026/08/17
Enter fullscreen mode Exit fullscreen mode

Gmail wants after: in YYYY/MM/DD. If that comes back empty, they stopped.

If it comes back with mail, you have learned something. Now you can delete precisely what arrived after the window closed, rather than nuking the sender's entire history.

Three outcomes people miss

They kept mailing, but it landed in Spam. This is the one that quietly breaks the check. A plain Gmail search does not look in Spam or Trash, so from:them returns nothing and you conclude they stopped. They did not. You have to ask:

in:spam from:newsletter@example.com
Enter fullscreen mode Exit fullscreen mode

Worth knowing before you go tidying up in there: deleting from Spam is not the same as deleting from your inbox. Gmail's control in Spam means gone, with no 30 day Trash window behind it.

They stopped, then started again. Four months later the list gets sold, or the sender migrates to a new platform and reimports an old file. Nobody re-checks a sender they already filed as done, which is exactly why this one survives.

They were never going to mail you in that window anyway. A retailer who mails hard in November and goes quiet in July will look perfectly compliant if you check in July. Silence is not proof. If a sender is seasonal, a clean search says nothing at all, and treating it as a pass is how they end up back in your inbox at Christmas.

Make it a ledger, not a feeling

The reason nobody does any of this is that it is bookkeeping, and bookkeeping loses to a greyed-out row every time. It is two columns though, the sender and the date you unsubscribed, with a third you fill in later when you go back and look. A note file is enough. Even a partial ledger beats the current state, which for most people is a vague sense that they unsubscribed from some things once.

The payoff is that you stop re-deleting the same senders every few months. Deleting mail from a sender who is still mailing you is maintenance work you have signed up for forever. Getting them to actually stop is the thing that ends it.

The version I built

I got tired of doing the bookkeeping, so I put it in a Chrome extension: Gmail One-Click Cleaner. Every unsubscribe it runs is dated, and the ledger is free to keep. After a two week grace window it runs one Gmail search per sender and tells you what actually happened: who stopped, who ignored you, who is landing in Spam where an ordinary search cannot see them, and who stopped and later started again.

It will not invent a verdict from silence either. If a search does not resolve, it says so rather than filing the sender as done.

The extension is open source, and the manual version above costs nothing but a text file. Either way, check the ones you unsubscribed from last month. Some of them did not stop.

Top comments (1)

Collapse
 
crdtcto profile image
Kane Lim

Hello, I am Kane Lim from Hong Kong. I have over 10 years of development experience. I am writing this because your post was interesting.

The distinction between unsubscribe intent and unsubscribe verification is excellent. An HTTP 200 response, a greyed UI state, or even successful processing of List Unsubscribe only proves that the request was accepted. It does not prove downstream enforcement.

I would push this concept toward an event driven verification model. Treat every unsubscribe as a state machine: requested, acknowledged, grace period, verified, violated, and reactivated. Store immutable timestamps and sender identifiers so the system can detect regressions rather than relying on a single delayed Gmail query.

For the verification layer, I would also normalize sender identity across envelope sender, From headers, List ID, and relevant authentication metadata. Otherwise a sender can migrate infrastructure or alter headers and appear to be a completely different entity.

The Spam case is particularly important because search scope becomes part of the correctness model. A robust verifier should explicitly query Inbox, Spam, and potentially archived mail, then classify observations separately instead of collapsing everything into a binary stopped or not stopped result.

Your ledger idea could become a privacy preserving compliance monitor with local storage, deterministic Gmail queries, temporal assertions, and zero server side access to message contents. That would make the extension useful not just for cleanup, but for continuously measuring whether unsubscribe promises are actually being honoured.

Very practical problem, and I like that the solution focuses on evidence instead of assumptions.