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.

The one-click unsubscribe exchange, header by header, as RFC 8058 defines it
Header or elementExample valuePurpose
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-PostList-Unsubscribe=One-ClickDeclares 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 sendsPOST to the https URI, Content-Type application/x-www-form-urlencoded, body List-Unsubscribe=One-ClickThe whole of the unsubscribe. No GET, no query string, no browser, no cookie
The response your endpoint returnsHTTP 200, empty bodyAcknowledgement 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.

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

  1. RFC 8058: signalling one-click functionality with the List-Unsubscribe header
  2. Google’s email sender guidelines
  3. Yahoo’s sender best practices
  4. FTC: CAN-SPAM Act compliance guide for business

Read next

This page is part of Email deliverability for small senders: authentication and reputation, which is the complete guide to the subject.

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.

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.