---
title: "Test unsubscribe links and one-click unsubscribe · Proxy Mail QA"
description: "Check the List-Unsubscribe headers and link, unsubscribe the way a person would, then catch any marketing that still arrives while receipts keep coming."
url: https://proxymail.qa/solve/unsubscribe-testing
---

1. [Home](https://proxymail.qa/)
2. [What we solve](https://proxymail.qa/solve)

# Test that unsubscribing actually stops the email

An unsubscribe that doesn't stick turns into spam reports, and Gmail and Yahoo now expect one-click unsubscribe from bulk senders. Check the headers and link on every marketing email, unsubscribe like a person would, and Proxy Mail QA flags any marketing that still arrives, however late.

Updated 21 October 2026

## Two ways to unsubscribe

- **The link in the email**, usually in the footer, which opens a page on your site.
- **The inbox’s own button**, which uses the `List-Unsubscribe` header. With `List-Unsubscribe-Post: List-Unsubscribe=One-Click` and an https address, Gmail and Yahoo unsubscribe in one step by sending a POST, without opening your site ([RFC 8058](https://www.rfc-editor.org/rfc/rfc8058)). Both headers must be covered by the email’s DKIM signature, or inboxes won’t offer the one-click button. Gmail requires one-click unsubscribe of senders of 5,000 or more emails a day ([Gmail’s sender guidelines](https://support.google.com/a/answer/81126)).

## What Proxy Mail QA checks on every marketing email

| Check                   | Fails or warns when                                                                                                                                                                              |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| list\_unsubscribe       | There’s no List-Unsubscribe header (it fails), or it has only an email address or a plain http one (it warns)                                                                                    |
| one\_click\_unsubscribe | No List-Unsubscribe-Post header with an https address, or the email’s DKIM signature doesn’t cover both List-Unsubscribe headers, so an inbox’s button can’t unsubscribe in one step (a warning) |
| unsubscribe\_link       | The email itself has no unsubscribe or email-preferences link                                                                                                                                    |
| after\_unsubscribe      | It came after the address unsubscribed from its sender                                                                                                                                           |

The inbox shows both kinds of unsubscribe link for each email, with **Open link** and **Copy**.

## Test it

1. **Sign up and opt in** with a new address, then trigger a marketing email such as a newsletter.
2. **Check the email**: the checks above show in the inbox.
3. **Unsubscribe** with the link, in your own browser.
4. **Choose Mark as unsubscribed** on that email, with a grace period if marketing already queued may still come (an hour, a day). The inbox says it’s watching for marketing from that sender, with **Stop watching**.
5. **Trigger more email**: another newsletter should never come, while a receipt or a password reset should.

Any marketing email after that shows a warning in the inbox and on the Accounts page, with **Open email**, and Reports lists it.

## In a test

unsubscribe.spec.ts

```ts
const link = await qa.waitForLink(address, { type: 'unsubscribe', since: signedUp });
await page.goto(link);
await page.getByRole('button', { name: 'Unsubscribe' }).click();
await qa.markUnsubscribed(address, { service: 'acme.com' });

// Trigger the next campaign, then: no marketing for 10 minutes, receipts allowed.
await qa.expectNoEmail(address, { since: new Date(), category: 'marketing', timeout: 600 });

```

`type: 'list_unsubscribe'` returns the header’s one-click address instead: POST `List-Unsubscribe=One-Click` to it, as an inbox’s button does. Later, in another test or after the next real campaign, `checkUnsubscribe(address)` lists any marketing that came after. Agents use `wait_for_link` with kind `unsubscribe`, `mark_unsubscribed` and `check_unsubscribe`, and the `test_unsubscribe` prompt walks through it.

## Automating this?

Make it a test: waitForLink with type unsubscribe returns the email's own link to open in your browser, markUnsubscribed starts the watch, and expectNoEmail with category marketing checks nothing more comes while receipts can.

[Node.js client](https://proxymail.qa/docs/node) [Python](https://proxymail.qa/docs/python) [Set up your coding agent](https://proxymail.qa/docs/api#agent-setup)

## Try it on your next sign-up test

Free plan, no credit card. Create an address and watch the code or link arrive.

[Create a free account](https://app.proxymail.qa/?mode=signup&from=site-solve-unsubscribe-testing)

## Questions

### Do I need to switch anything on?

Yes, for now. Marketing and offer emails is in Labs: switch it on in the app under **Account settings → Labs**. It applies to your API keys and agents too; until then their marketing tools answer with an error that says so.

### Does Proxy Mail QA click the unsubscribe link?

No, never. It shows the link with Open link and Copy and gives tests and agents the link, so the unsubscribe happens the way a person's would. Marking the address as unsubscribed only starts the watch.

### How long does the watch last?

As long as the address does. Any marketing email from that sender after the time you marked counts, a minute or three weeks later, until you stop watching or mark the address as subscribed again.

### Will receipts be flagged too?

No. Every email is typed as sign-in, transactional or marketing, and only marketing breaks the watch. Receipts, password resets and security notices should keep arriving after an unsubscribe.

### How quickly must marketing stop?

It depends on where the person lives: 10 business days in the US and Canada, 5 in Australia, and promptly in the EU and UK. Give the account a country and the deadline is checked too. See [marketing rules by country](https://proxymail.qa/use-cases/marketing-rules-by-country).

## Related guides

- [Test sign-up and email verificationA fresh, private address for every sign-up test, with the verification link or code ready the moment it lands.](https://proxymail.qa/solve/email-verification-testing)
- [Test OTP and one-time login codesCodes pulled out of the email with a Copy button and a countdown when the email says how long they last.](https://proxymail.qa/solve/otp-code-testing)
- [Test magic links and passwordless sign-inSingle-use links that are never opened or prefetched on our side, so they still work when you click them.](https://proxymail.qa/solve/magic-link-testing)
- [Test password reset emailsRequest, receive and use reset links, and keep the new password saved next to the test account.](https://proxymail.qa/solve/password-reset-testing)
- [Stop sharing one Gmail inbox for QAPrivate, disposable addresses for every tester instead of one shared mailbox and a pile of plus-addresses.](https://proxymail.qa/solve/shared-test-inbox)
- [Take QA notes by voice with Wispr FlowDictate what each test account is for, its state and what you found, straight into its notes, in seconds.](https://proxymail.qa/solve/voice-notes-wispr-flow)
- [Verification link points to localhost:3000Why emails from staging link to localhost, how to fix it in Supabase, Firebase and other stacks, and how we flag it.](https://proxymail.qa/solve/localhost-links)
- [Common Supabase sign-up and login problemsEmails that never arrive, links that expire or sign nobody in, and sign-ups that fail, with the fix for each.](https://proxymail.qa/solve/supabase-auth-problems)
- [Common Firebase sign-up and login problemsMissing verification and reset emails, verified users who still look unverified, failing links and sign-up limits, with the fix for each.](https://proxymail.qa/solve/firebase-auth-problems)
- [Sign-up and login problems in vibe-coded appsThe login bugs AI-built apps usually ship with: emails only you receive, links to the preview, missing pages, and what to ask the builder.](https://proxymail.qa/solve/vibe-coded-login-problems)
- [Test sign-up emails in PlaywrightA complete Playwright test for sign-up codes and links, from a fresh inbox to the report on the pull request.](https://proxymail.qa/solve/playwright-email-tests)
- [Test sign-up emails in CypressA complete Cypress test for sign-up links and codes, with the email waits running as Cypress tasks.](https://proxymail.qa/solve/cypress-email-tests)
- [Test sign-up emails with pytestA complete pytest test for sign-up codes and links, with Playwright for Python or Selenium and a one-file helper.](https://proxymail.qa/solve/pytest-email-tests)
- [Test coupon codes and welcome offersThe coupon with its discount, end date and arrival time, what checkout did with it, and a failure when an expired or reused one is accepted.](https://proxymail.qa/solve/coupon-code-testing)
- [Test that a welcome offer can't be claimed twiceVersions of one address that reach the same inbox, and a check that fails when the same person got the offer more than once.](https://proxymail.qa/solve/welcome-offer-abuse)

[Built your app with an AI tool? Pick yours](https://proxymail.qa/built-with)
