---
title: "Keep unsubscribe links working and never · Agent Wranglers"
url: https://agentwranglers.se/playbook/email/unsubscribe-and-bounces/unsubscribe-lifetime
updated: 2026-10-21
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Keep unsubscribe links working and never pass on who left

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Unsubscribe and bounces](https://agentwranglers.se/playbook/email/unsubscribe-and-bounces.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

- Level: Required
- Chapter: [Unsubscribe and bounces](https://agentwranglers.se/playbook/email/unsubscribe-and-bounces)
- Rule: Keep every unsubscribe link and address working for at least 30 days after each send. Never sell, share or transfer the address of someone who unsubscribed.
- Risk: A law broken
- Applies when: The project sends email.
- How: US law (CAN-SPAM) requires the opt-out to keep working for 30 days after the message is sent. It also bans selling or transferring the address of anyone who opted out, except to comply with the law. Make unsubscribe tokens last at least that long, or never expire. When you change sending services, import the old suppression list into the new one before the first send. A company you hire to send for you does not take over your legal duty. CAN-SPAM also asks marketing mail to say clearly that it is an ad, unless the person agreed to it beforehand. The FTC sets the fine at up to $53,088 for each breaching message. Never add a suppressed address back, as [Keep the list clean](https://agentwranglers.se/playbook/email/deliverability/list-hygiene) says.
- Check: A test that moves the clock 31 days past a send shows the unsubscribe link still suppresses the address. After a change of sending service, every address on the old suppression list is on the new one.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
async function suppressByToken(token) {
  const { email, list } = await db.unsubscribeTokens.find(token);
  await db.suppressions.upsert({ email, list, reason: 'unsubscribed' });
}
```

### Python example

```python
def suppress_by_token(token: str) -> None:
    entry = db.unsubscribe_tokens.find(token)
    db.suppressions.upsert(email=entry.email, list=entry.list, reason="unsubscribed")
```

## Sources

- [CAN-SPAM Act, 15 U.S.C. 7704](https://www.govinfo.gov/content/pkg/USCODE-2023-title15/html/USCODE-2023-title15-chap103-sec7704.htm)
- [FTC CAN-SPAM Act compliance guide for business](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business)

## Related rules

- [Keep the list clean](https://agentwranglers.se/playbook/email/deliverability/list-hygiene) in Email

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/email/unsubscribe-and-bounces/unsubscribe-lifetime">Agent Wranglers email playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Accept mail at postmaster and abuse](https://agentwranglers.se/playbook/email/unsubscribe-and-bounces/postmaster-abuse)
- [Unsubscribe and bounces](https://agentwranglers.se/playbook/email/unsubscribe-and-bounces)
