Guide
Unsubscribe requirements: one-click, List-Unsubscribe and two days
Last reviewed 18 September 2026
A commercial email now needs two exits. In the headers, List-Unsubscribe with an https URI plus List-Unsubscribe-Post declaring One-Click, which the mail client turns into a POST with no confirmation page and no login; and in the body, a visible unsubscribe link in plain text. Google and Yahoo have required both since February 2024, along with honouring any request within two days.
An unsubscribe used to be a link at the bottom of a message. Since February 2024 it is two things: a machine-readable exit the mail client can operate on the reader’s behalf, in the form RFC 8058 defines, and a human-readable one in the body. The first is the one people get wrong, usually in the same way, and the way it fails is silent.
What one-click actually means
One-click unsubscribe is not a link that takes one click. It is a mail client operating the unsubscribe on the reader’s behalf without ever opening a browser. The reader presses the unsubscribe control the client shows beside your From name, the client sends an HTTP POST to a URL you put in the headers, and the reader stays where they are. RFC 8058 is the specification, and the requirement it states is that the action be taken with no further interaction from the user.
So there is no confirmation page, because nothing is looking at a page. There is no "are you sure", no preferences screen to choose from, no cookie, no session, and no login. Whatever your endpoint returns is thrown away. The correct response is a bare 200 with an empty or trivial body, and no redirect at all.
That last point is the one worth stating twice, because the reflexive thing to do in any web framework is to redirect to a friendly confirmation page, and a redirect here fails the specification while looking completely healthy in every test a developer is likely to run by hand. A browser follows the redirect and shows a nice page; the mail client that posted the request does not care, and the provider that checked your compliance has already moved on.
The URI has to be https and the endpoint has to accept the POST unauthenticated, so the token in the URL is the only thing identifying the subscriber. Make it long, random and single-purpose, and make the endpoint idempotent, because scanners will post to it more than once.
The headers, and what each one does
Two headers do the work, and a one-click unsubscribe requires both. List-Unsubscribe on its own predates RFC 8058 and offers exits a client may present; List-Unsubscribe-Post is the header that declares the https URI safe to POST to without asking the reader anything further. A message with the first and not the second does not have one-click unsubscribe, whatever the sending dashboard says.
| Header or element | Example value | Purpose |
|---|---|---|
| List-Unsubscribe | <https://send.example.com/u/[opaque token]>, <mailto:[email protected]?subject=[opaque token]> | Offers the machine-readable exits. The https URI is the one one-click uses; the mailto is the fallback for clients that prefer it |
| List-Unsubscribe-Post | List-Unsubscribe=One-Click | Declares that the https URI accepts a POST and that the unsubscribe happens with no further interaction. Without this header, one-click is not in effect |
| The request the mail client sends | POST to the https URI, Content-Type application/x-www-form-urlencoded, body List-Unsubscribe=One-Click | The whole of the unsubscribe. No GET, no query string, no browser, no cookie |
| The response your endpoint returns | HTTP 200, empty body | Acknowledgement and nothing else. A redirect to a confirmation page fails the specification silently, because nothing is reading the response |
The two-day rule
Google and Yahoo both require that an unsubscribe request be honoured within two days. That is a much shorter clock than the 10 business days the United States CAN-SPAM Act allows, and since the providers enforce theirs by filtering your mail rather than by writing to you, theirs is the one that decides whether you have a problem.
Two days is the outer limit and there is no reason to use it. An unsubscribe is a single row and the send is asynchronous, so the honest implementation removes the address before it answers the request, which makes the window irrelevant. The senders who need the two days are the ones running an export to a spreadsheet and an import back, and that arrangement is also how somebody gets mailed after they left.
What the clock really protects against is the worst complaint there is. A message that arrives after somebody asked to leave does not produce another unsubscribe; it produces a spam button press, from a reader who now believes you ignored them. Those are the complaints that move a complaint rate fastest.
A visible link in the body as well
The headers are not a replacement for the link. Not every client renders an unsubscribe control, a forwarded message loses the client-side affordance entirely, and CAN-SPAM requires a clear and conspicuous explanation in the message of how to opt out. So every commercial email carries both: the headers for the clients that support them and a visible link in the footer for everybody else.
Write the link as plain text rather than as part of an image, keep the word "unsubscribe" in it because that is the word people search a message for, and put it where a thumb lands rather than in six-point grey. A hidden unsubscribe does not reduce unsubscribes. It converts them into spam complaints, which cost roughly a hundred times more, because the threshold you are measured against is 0.3% of delivered mail with 0.1% as the target.
And the link must never require a login. An unsubscribe behind a sign-in is an unsubscribe that half the people who want it cannot complete: the address was signed up in one session on a phone, there is no password, and the person pressing the button does not want an account, they want the mail to stop. The token in the URL is the authentication, and the only thing it should authorise is leaving.
Offer pause beside leaving, not instead of it
The one thing worth adding to an unsubscribe page is an alternative that is not leaving. A pause for a month, a switch to one email a week, or a way to finish a course later are all cheaper for the reader than going, and a share of people who clicked unsubscribe out of momentary irritation will take one of them.
The rule is that these sit beside the exit rather than in front of it. The unsubscribe has to have already happened, or be one obvious button on the same screen, with the alternatives offered underneath. A page that presents choices and no exit is the dark pattern that produces spam complaints, and it is also the shape that fails both the CAN-SPAM requirement and the providers’ own.
The reason picker is the earliest warning you get
If you offer one optional question on the unsubscribe page, make it the reason, and make sure one of the options is "I never signed up for this". That option is the single most valuable line of feedback in the whole system, because it is the only place a sender ever learns about a consent failure before the mailbox providers learn about it.
Read it as an early spam-complaint signal rather than as a comment. One selection in a month is somebody who forgot. A cluster of them in a week means addresses are entering your list without their owners asking: a form being filled in by bots, an import somebody did not mention, a partner sending you addresses that were collected for something else. Every one of those people who does not find the unsubscribe will press the spam button instead, and that arrives with no explanation attached.
Keep the question optional and never make an answer a condition of leaving. The requirement is that the unsubscribe take no further interaction, and a compulsory survey is further interaction.
Common questions
What is one-click unsubscribe?
It is the mail client operating your unsubscribe on the reader’s behalf. The client sends an HTTP POST to a URL in the List-Unsubscribe header, with List-Unsubscribe-Post declaring One-Click, and RFC 8058 requires that the unsubscribe then happen with no further interaction from the user: no confirmation page, no preferences screen, no login.
Should a one-click unsubscribe endpoint redirect to a confirmation page?
No. Return a bare 200 with an empty body. The request comes from a mail client rather than a browser, so nothing reads the response, and a redirect fails RFC 8058 while looking perfectly healthy when a developer tests the URL by hand. The friendly page belongs to the visible link in the body, not to the header endpoint.
How fast do unsubscribes have to be honoured?
Google and Yahoo have required two days since February 2024. CAN-SPAM allows 10 business days, but the providers enforce their window by filtering your mail, so theirs is the one that matters. Removing the address before answering the request makes the question moot, which is the implementation to aim at.
Do I still need an unsubscribe link in the email body?
Yes. Not every client renders an unsubscribe control, a forwarded message loses it entirely, and CAN-SPAM requires a clear and conspicuous explanation of how to opt out in the message itself. Keep it as plain text rather than inside an image, use the word unsubscribe, and never put it behind a login.
Two exits, then. In the headers, List-Unsubscribe with an https URI and List-Unsubscribe-Post declaring one-click, answered by a bare 200 with no redirect and no login. In the body, a visible link in plain text, honoured immediately. Offer a pause beside it, and ask the reason: one of the answers is a consent failure nothing else will report.
Sources
Read next
This page is part of Email deliverability for small senders: authentication and reputation, which is the complete guide to the subject.
- Email deliverability for small senders: authentication and reputation
What deliverability is, how SPF, DKIM and DMARC fit together, and what the Google and Yahoo bulk sender rules require of a small sender.
- Confirmed opt-in (double opt-in): what it costs, and what it buys
What double opt-in (confirmed opt-in) is, what it costs you in list size, and why the mailbox providers have settled the argument.
- Confirmation email template for double opt-in
Three confirmation emails written out in full: plain, warm, and re-permission for an imported list, with the reasoning for every line.
- How to set up SPF, DKIM and DMARC for a sending domain
The order to do it in: a dedicated sending subdomain, SPF, DKIM, DMARC at p=none, two weeks of reports, then quarantine and reject.
- GDPR and email courses: consent, records, and erasure
What the GDPR text actually requires for an email list: consent under Art. 4(11), the burden of proof in Art. 7(1), erasure under Art. 17.
- CAN-SPAM for course senders: the footer checklist
The seven CAN-SPAM requirements from the FTC compliance guide, what they mean for an email course, and how the law differs from GDPR and CASL.
These guides are about the format rather than about any particular tool. What this site itself does is on the home page, and the rest of the set is on the guides index .
Elsewhere on this site
The rest of this site comes at the same subject from other directions: guides on the format itself, a tool for one job each, a page for each kind of work, and what to check when choosing software.
Free tool
DMARC, SPF and DKIM checkerFree tool
Email HTML size checker
Thinking of writing one of these?
5dayemail hosts a five-to-ten day email course: you write it once, and everyone who joins your list gets one email a day, in order, starting from the day they confirm.
Accounts are opened a few at a time rather than by signing up. Leave your address and you will be written to when the next ones open.
One message, when there is room. No course emails, no newsletter, and the address is not passed on. Ask and it is deleted; what is kept, and for how long, is in the privacy policy.