Skip to content

The publication for web craftspeople Monday, 28 September 2026

Email & deliverability

List-Unsubscribe: The Header That Protects Deliverability Under Gmail and Yahoo’s Rules

Since 2024, Gmail and Yahoo have required one-click unsubscribing from any sender pushing more than 5,000 messages a day to their domains, through the List-Unsubscribe header defined by RFC 8058. This guide covers how it works, how to implement it across sending…

The List-Unsubscribe header has been around since the 2000s, but it turned into an unavoidable technical requirement once Gmail and Yahoo started enforcing it, in 2024, for every high-volume sender. Without it, a commercial sending domain can get routed straight to the spam folder regardless of how solid its SPF, DKIM, and DMARC authentication looks.

Why the header became mandatory

A sender becomes a “bulk sender” in Gmail’s eyes once it pushes roughly 5,000 messages or more to personal Gmail accounts within a 24-hour window. That status, once triggered, doesn’t go away if volume drops afterward. Yahoo applies a comparable threshold. Both providers then require, for promotional and marketing messages, an unsubscribe mechanism that genuinely works in one click, with no confirmation page, no form, and no login required.

This mechanism is separate from the authentication covered in the guide on SPF, DKIM, and DMARC: an address that’s perfectly authenticated but missing a compliant unsubscribe path is still exposed to a high complaint rate, one of the documented causes of spam placement.

How RFC 8058 works

RFC 8058 defines two complementary headers. List-Unsubscribe carries the unsubscribe URI, ideally over HTTPS. List-Unsubscribe-Post tells the mail client it can trigger the action with a plain POST request, without opening a page:

List-Unsubscribe: <https://example.com/unsubscribe?token=abc123>, <mailto:[email protected]>
List-Unsubscribe-Post: List-Unsubscribe=One-Click

When a mail client sees both headers together, it shows a native “Unsubscribe” button next to the sender and, on click, sends a POST request straight to the server, without ever loading a page in a browser. That automation is what separates true one-click unsubscribing from a plain unsubscribe link tucked into the footer.

Implementing the header server-side

Most transactional sending libraries expose a way to add custom headers. Here’s an example with Symfony Mailer, common among teams that run their own sending infrastructure rather than handing it entirely to a third-party provider:

use Symfony\Component\Mime\Email;

$email = (new Email())
    ->from('[email protected]')
    ->to($recipient)
    ->subject('This month's newsletter')
    ->html($htmlBody);

$headers = $email->getHeaders();
$headers->addTextHeader(
    'List-Unsubscribe',
    ', '
);
$headers->addTextHeader('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click');

$mailer->send($email);

The most commonly missed technical detail: the URL referenced by List-Unsubscribe must treat the POST request as an immediate, final unsubscribe, with no redirect to a confirmation page. A route that shows “Are you sure you want to unsubscribe?” breaks one-click compliance, even if the header itself is present and syntactically correct.

What sending platforms offer

PlatformNative RFC 8058 supportClient-side configuration
SendGridYes, via unsubscribe groupsEnabled in suppression settings, headers added automatically
MailgunYesEnabled per domain in the dashboard or API
PostmarkYes, on the Broadcast streamLink and POST header generated automatically
BrevoYesNative unsubscribe link, header added by default on campaigns
Self-hosted sending (Symfony Mailer, PHPMailer)Not by defaultMust be coded manually, as shown above

Thresholds to know, provider by provider

RequirementGmailYahoo
Volume threshold triggering the rules~5,000 messages/24h to personal accountsComparable threshold
AuthenticationSPF and DKIM required, DMARC at minimum p=none with alignmentEquivalent requirements
One-click unsubscribeRFC 8058 requiredList-Unsubscribe header required, RFC 8058 strongly recommended
Processing deadline48 hours maximum48 hours maximum
Spam complaint rateTarget under 0.1%, critical threshold at 0.3%Similar threshold monitored
The one-click unsubscribe requirement only applies to promotional and marketing messages. Transactional emails (order confirmations, password resets, invoices) are exempt, as long as they don’t carry additional marketing content.

Since 2024, Gmail and Yahoo have required one-click unsubscribing from any sender exceeding 5,000 messages a day to their domains, with a processing deadline capped at 48 hours.

Frequent mistakes that break one-click compliance

The specification fits in a few lines, yet its implementation concentrates a disproportionate number of recurring mistakes, often invisible until a provider explicitly penalizes them.

The first involves the route itself: some frameworks apply CSRF protection by default to every POST endpoint, including the unsubscribe one. The mail client has neither a session cookie nor a CSRF token to present, so the request silently fails and the user stays subscribed without anyone on the sending side noticing. The unsubscribe route needs to be explicitly excluded from that check, relying instead on the URL’s own token to authenticate the request.

The second mistake is responding with an unexpected status code. Some mail clients treat anything other than 200 or 202 as a failure and either retry the operation or give up on it. A route that redirects with a 302 to a thank-you page, however harmless it looks to a human visitor, falls outside the behavior the RFC expects.

The third, more subtle, involves internal propagation delay: the header may point to a perfectly functional route, but if the unsubscribe only reaches the sending database after a delayed batch job running hours later, a campaign scheduled in between still goes out to an address that believed itself unsubscribed. The 48 hours Gmail and Yahoo grant to honor the request cover processing time, not a parallel queue that ignores it.

Finally, the address in the From header needs to stay consistent with both the authentication domain and the unsubscribe route’s domain. Sending through a third-party platform with a tracking domain that differs from the one used for DMARC alignment can, in some cases, weaken how the mail client reads the header, particularly when several subdomains coexist without consistent configuration.

Verifying the implementation before sending at scale

A single test send is enough to confirm the headers are syntactically present: most webmail clients show the native unsubscribe option as soon as they detect it correctly formed. Free deliverability testing tools, like mail-tester, also run a specific check on the presence and validity of List-Unsubscribe. What’s still needed is testing the unsubscribe route itself: a manually sent POST request to the declared URL should unsubscribe the address with no redirect or intermediate page, exactly as a mail client would do it.

This technical check usefully complements the rendering checks already covered in the guide on how HTML behaves across mail clients, where inconsistency between test senders explains a good share of production surprises.

Key takeaways

The List-Unsubscribe header is no longer a nice-to-have; it’s a condition of entry into the inbox once sending volume passes a few thousand messages a day. Its technical implementation is simple, two header lines and one server route, but the most common mistake is still routing it through a confirmation form that invalidates the one-click promise.

This kind of technical detail, two headers and a route with no redirect, eats up a disproportionate amount of time for teams convinced they have a content or IP-reputation problem, when in fact their unsubscribe link has been silently redirecting to a confirmation page for months. Before suspecting domain reputation, it’s always worth checking those two header lines first — Simon Janvier.

Going further

Source: Google, “Email sender guidelines FAQ”, official Gmail documentation for senders.

Read next