What it means
The unsubscribe link at the bottom of a marketing email is a convention, not a standard. It is six-point grey text after four paragraphs of footer, and a large share of recipients never find it, so they press the button they can find instead: report spam. That single click is recorded by the mailbox provider against your sending domain and hurts delivery for every other person on your list.
List-Unsubscribe is the standards-based fix. RFC 2369 defined a family of headers for mailing list software, and this is the one that survived. Put a URI in the header, and the mail client can render its own unsubscribe control right next to the sender name, above the message, before the recipient has read a word. RFC 8058 then closed the last gap: with a companion List-Unsubscribe-Post header, the provider can perform the unsubscribe itself with one HTTP POST, so the recipient never leaves the mail client and never sees a landing page.
Since February 2024 this stopped being optional. Gmail and Yahoo both require one-click unsubscribe on bulk marketing mail, along with authentication and a spam complaint rate under 0.3 percent. Sending high volume without it now costs you delivery directly.
The two headers, exactly
Both are single headers on the outgoing message. The URIs go in angle brackets, comma separated, and the https URI goes first:
List-Unsubscribe: one or more URIs. Anhttps:URI is what one-click uses. Amailto:URI is the fallback for older clients, and may carry a?subject=so your inbound parser can match it without reading the body.List-Unsubscribe-Post: the literal valueList-Unsubscribe=One-Click. Nothing else is valid. Its presence is what tells the provider it may POST rather than hand the URL to a browser.
The related RFC 2369 headers, List-Id, List-Help, List-Post, List-Owner and List-Archive, are for discussion lists rather than marketing mail. Adding List-Id to a newsletter is harmless and lets recipients filter on it. Adding List-Post to something nobody can post to is just wrong.
The GET trap, and why it costs you your list
This is the failure that actually happens, and it is worth stating plainly. Corporate mail security products rewrite and then visit every URL in every message to check for malware. Mail clients prefetch links to build previews. Archiving systems crawl. All of them issue GET.
If your unsubscribe endpoint performs the removal on GET, every one of those automated visits unsubscribes a real subscriber who never asked. The symptom is a campaign to a corporate-heavy segment where a large slice of one company domain unsubscribes within minutes of the send, all with no opens. RFC 8058 is explicit that the one-click request is a POST for exactly this reason.
The correct shape is two behaviours on one URL:
GETrenders a page with the recipient address shown and a single confirm button. Idempotent, safe, crawlable without consequence.POSTperforms the unsubscribe and returns 200. This is what the provider calls, and what the confirm button submits.
Signing the URI
The token in the URL is a capability: whoever holds it can unsubscribe that address. Do not use a database id, and do not use the email address in plain text, which leaks the address to every proxy and log along the way. Use an opaque identifier plus an HMAC over the identifier, the stream and an expiry, keyed with a secret only your application holds. Verify the HMAC before you do anything, and treat a bad signature as a 404 rather than an error, so the endpoint cannot be used as an oracle to test whether an address is on your list.
What happens after the POST
An unsubscribe is not a row you delete. It is a durable statement of consent withdrawal, and it belongs in a suppression list that is checked at send time by the worker that talks to SMTP, not just at the moment a campaign audience is built. A campaign compiled on Monday and sent on Thursday will otherwise mail people who left on Tuesday.
Scope matters as much as speed. Unsubscribing from a weekly newsletter should not silence a password reset, and a recipient who unsubscribes from one brand in a multi-brand account has not unsubscribed from the others. Record which stream the request came from, which is why the signed token should carry it.
Related concepts
- Suppression list: where every unsubscribe has to land to mean anything.
- DMARC: the other half of the 2024 bulk sender requirements.
- DKIM: sign the unsubscribe headers so they cannot be rewritten in transit.
- Bounce rate: complaints and bounces are the two numbers a mailbox provider watches.
- Drip campaign: every step of a sequence needs the header, not just the first one.
- Lead magnet: where most of these subscriptions start, and where consent is recorded.
How Pinlyx handles it
Marketing and lifecycle mail sent from Pinlyx carries both headers automatically, with a signed per-recipient token scoped to the stream it came from. The endpoint answers POST for one-click and renders a confirmation page on GET, so a security appliance crawling the link cannot remove a subscriber. Transactional mail deliberately carries no unsubscribe header. Every removal is written to the workspace suppression list with its reason and timestamp, kept as evidence rather than deleted, and re-checked in the sending worker immediately before the message goes out.