Data retention
How long each thing is kept
Windows are enforced by a nightly job, and each row names the code. Last checked against the code on 2026-09-18.
| Data | Kept | Deleted by | Code |
|---|---|---|---|
| Your subscription rows, reminder address and account hashes | Until you revoke | The Revoke button, one call | worker/src/db.ts deleteUserRows |
| Encrypted refresh token | Until you revoke | The same call; also revoked at Google | worker/src/google.ts revoke |
| Short-lived access token | Under one hour | Expires on its own in KV | worker/src/google.ts accessTokenFor, expirationTtl |
| Sign-in state during consent | 10 minutes | Expires in KV | worker/src/google.ts beginAuth |
| Reminder records, once sent | 90 days | Nightly purge | worker/src/retention.ts |
| Outgoing mail queue, once sent | 90 days | Nightly purge | worker/src/retention.ts |
| Model audit lines (only when the model pass is on) | 90 days | Nightly purge | worker/src/retention.ts |
| Visit counts (path, human or bot) | 90 days | Nightly purge | worker/src/retention.ts |
| Uptime checks | 30 days | Nightly purge | worker/src/retention.ts |
| Your account and list after you stop using nobill | 365 days idle | Nightly purge, counted from your last import | worker/src/retention.ts RETENTION_DAYS.idle_account |
| The aggregate count the landing page shows | Until you revoke | The same Revoke call; it is deleted with your rows | worker/src/db.ts deleteUserRows, table import_snapshots |
| Waitlist address and confirmation | Until you ask | Email howard@nobill.app | worker/migrations/0001_init.sql waitlist |
| Nightly backup of every table | 30 days | Bucket lifecycle rule | worker/src/backup.ts; R2 bucket nobill-backups, rule expire-30d |
A backup taken before you revoked can hold your rows for up to 30 days after. Nothing reads backups except a restore drill, and the drill writes to a scratch database that is deleted afterwards. scripts/restore-from-r2.sh
Questions: howard@nobill.app, answered within two working days.