Skip to main content

Storage limitation, made enforceable.

GDPR Art. 5(1)(e) requires data be kept no longer than necessary — this page shows the live retention windows and cron status that enforce it.

Per-table retention

Live values
TableWindowPolicyWhy this number
analytics.events60 days (~2 months)Hard DELETE on cronIndividual page views and journey transitions. Past this window, only the daily aggregate row survives.
analytics.sessions60 days (~2 months)Hard DELETE on cronPer-visit metadata: started_at, last_seen, consent_tier. Same window as events to keep the join clean.
analytics.user_events180 days (~6 months)Hard DELETE on cronThe signed-in lane. Kept longer than the anonymous lane because it answers how an account is used over time — and erased immediately, regardless of age, when the account is deleted.
analytics.consent_events395 days (~1.1 years)Hard DELETE on cronProof of consent, or of its withdrawal. Thirteen months satisfies Art. 7(1) demonstrability without overshooting.
analytics.bot_hits180 days (~6 months)Hard DELETE on cronCrawler and agent traffic. Holds no identifier of any kind — no IP, no hash, no session — so the window is set by what makes crawl cadence legible, not by minimisation.
analytics.daily_page_stats365 days (~1 years)Hard DELETE on cronPre-aggregated rollups (path / day / count). No individual visitor data, so they outlive the events they summarise.
ai.turn30 days (~1 months)Columns nulled on cronThe prompt as assembled, the history outline, the tool definitions and each tool result are blanked first; what the turn considered, included and cited stays as ids and sizes.
ai.turn180 days (~6 months)Hard DELETE on cronThe turn record itself — outcome, timings, provider attempts, citations. The conversations and messages are untouched by this sweep.
ai.model_call180 days (~6 months)Hard DELETE on cronPer-request model, token and duration telemetry behind the cost views.
ai.tool_call180 days (~6 months)Hard DELETE on cronWhich tools each turn ran, with their arguments and outcome (the results themselves leave with the bodies).
admin.audit_log365 days (~1 years)Hard DELETE on cronAppend-only record of administrative actions. A long window on purpose — an audit trail that expires quickly is not much of an audit trail.
mcp.call_log30 days (~1 months)Columns nulled on cronCaller-supplied query text and trace id are blanked first, while the dimensional signal stays. Minimising by column before by row is what keeps the longer row window unremarkable.
mcp.call_log90 days (~3 months)Hard DELETE on cronThe call row itself. By this point it carries no free text and no identifier at all — only tool, outcome, latency and registry version.
desk.file30 days (~1 months)Hard DELETE on cronFiles you have already deleted. A live file is never touched by this sweep; only the trash empties, and only after the window.
desk.file_revision90 days (~3 months)Hard DELETE on cronUndo and version history for desk documents, pruned by age independently of the files themselves.
notifications.notifications30 days (~1 months)Archived on cronRead notifications leave your active list at this point. They are not deleted yet.
notifications.notifications90 days (~3 months)Hard DELETE on cronArchived notifications are removed entirely.
jobs.job_execution90 days (~3 months)Hard DELETE on cronRun history for the scheduled jobs — start time, status, row count. Operational only; it holds no personal data.
feedback.feedbackManual deletion onlyUser-authored content. We have no automatic expiry; you can request removal at any time and the operator deletes the row.
auth.sessionBetter Auth session expirySessions expire on their own per Better Auth config. Logout invalidates immediately.

Cron status

Live

Loading…

Think this pattern could be better? Tell us how.

Leave feedback