---
title: "Asking again after a person said no · Agent Wranglers"
url: https://agentwranglers.se/playbook/ux-design/deceptive-design/no-nagging
id: UXD-6
level: Avoid
updated: 2026-10-27
build: a2a6bdfed830
tokens: 794
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Asking again after a person said no

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Deceptive design](https://agentwranglers.se/playbook/ux-design/deceptive-design.md).

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

- ID: UXD-6
- Level: Avoid
- Chapter: [Deceptive design](https://agentwranglers.se/playbook/ux-design/deceptive-design.md)
- Rule: Store each "no" with its time. Show the same prompt to that person again only after 90 days, or when they open the setting themselves.
- Check: A unit test declines a prompt and asks the function on day 1, day 89 and day 91. It returns false, false and true. A browser test declines a prompt, reloads and visits 10 pages, and the prompt does not appear.
- How: A pop-up that returns on every visit until the person gives in is a choice made by fatigue. The Digital Services Act names it in Article 25(3), as [Never design a platform interface that deceives or manipulates](https://agentwranglers.se/playbook/ux-design/deceptive-design/no-manipulative-platform-design.md) explains. Keep the decline on the server for signed-in users, so a new device does not ask again. Count "close" and "not now" as a no. Give every prompt one function that decides whether to show it, and test that function.

## 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
const DAY_MS = 24 * 60 * 60 * 1000
const ASK_AGAIN_AFTER_DAYS = 90

export function mayShowPrompt(lastDeclinedAt, now = new Date()) {
  if (!lastDeclinedAt) return true
  return now.getTime() - lastDeclinedAt.getTime() >= ASK_AGAIN_AFTER_DAYS * DAY_MS
}
```

### Python example

```python
from datetime import datetime, timedelta, timezone

ASK_AGAIN_AFTER = timedelta(days=90)

def may_show_prompt(last_declined_at: datetime | None, now: datetime | None = None) -> bool:
    if last_declined_at is None:
        return True
    now = now or datetime.now(timezone.utc)
    return now - last_declined_at >= ASK_AGAIN_AFTER
```

## Related rules

- UXD-4 [Never design a platform interface that deceives or manipulates](https://agentwranglers.se/playbook/ux-design/deceptive-design/no-manipulative-platform-design.md) in UX and deceptive design

**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/ux-design/deceptive-design/no-nagging">Agent Wranglers UX and deceptive design playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Give yes and no the same weight](https://agentwranglers.se/playbook/ux-design/deceptive-design/equal-choices.md)
- Next: [Shaming people who decline](https://agentwranglers.se/playbook/ux-design/deceptive-design/no-confirmshaming.md)
- [Deceptive design](https://agentwranglers.se/playbook/ux-design/deceptive-design.md)
