Retention periods disclosed for each category of PI
Why it matters
CPRA amended CCPA to require, at § 1798.100(a)(3), that businesses disclose retention periods for each category of personal information — or the criteria used to determine them. A privacy policy that says "we retain your information for as long as necessary" satisfies neither the letter nor the spirit of this requirement. Beyond compliance, undisclosed retention creates a data-breach surface: data that should have been deleted years ago is still in the database when a breach occurs. Disclosed retention periods only close the compliance gap if automated enforcement — cron jobs, database lifecycle rules — actually delete or anonymize the data when periods expire. Policy and code must match.
Severity rationale
Low because retention disclosure violations are unlikely to trigger priority enforcement on their own, but unmatched retention periods between policy and code are a data-minimization failure that amplifies breach impact.
Remediation
Add a Data Retention section to your privacy policy using CCPA-defined category names and specific periods, then implement automated deletion jobs that enforce those periods.
## Data Retention (privacy policy section — use CCPA category names)
| CCPA Category | Retention Period |
|-----------------------------|------------------------------------------------|
| Identifiers (account data) | Until deletion request + 30-day grace period |
| Internet/network activity | 26 months from collection |
| Commercial information | 7 years (US tax requirements) |
| Geolocation data | 90 days |
| Server/access logs | 90 days |
// app/api/cron/retention-cleanup/route.ts
export async function GET() {
const analyticsCutoff = new Date()
analyticsCutoff.setMonth(analyticsCutoff.getMonth() - 26)
await db.analyticsEvent.deleteMany({ where: { createdAt: { lt: analyticsCutoff } } })
const logCutoff = new Date()
logCutoff.setDate(logCutoff.getDate() - 90)
await db.accessLog.deleteMany({ where: { createdAt: { lt: logCutoff } } })
return Response.json({ ok: true })
}
Register this route in vercel.json as a cron job running daily.
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the CCPA/CPRA Readiness Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- ccpa · §1798.100(a)(3) — Retention periods — must disclose how long each category of PI is retained (CPRA addition)
- gdpr · Art. 13(2)(a) — Retention period or criteria for determining retention must be disclosed
- iso-27001:2022 · A.8.10 — Information deletion — defined retention and secure deletion procedures
- nist:rev5 · SI-12 — Information management and retention
Taxons
History
- 2026-04-18·v1.0.0·Initial import from ccpa-readiness·automated