This document describes how long Task Ember retains each category of data stored in our application database (Azure Cosmos DB, UK South region) and the process by which personal data is erased following an account deletion request.
Last updated: April 2026
Cosmos DB's per-item ttl field drives automatic deletion where it is set.
Values below are the defaults configured on each container.
| Container | Contents | Retention |
|---|---|---|
activity-logs | Webhook alert activity and ingestion events | 90 days |
integration-logs | Start / stop / pause / activate actions on resources | 90 days (TTL inherited from container default) |
user-logs | Sign-in, sign-out, role changes, invitations | 90 days (short audit retention; extend to 365 days if SOC2 attestation requires it) |
processed-stripe-events | Stripe webhook idempotency records | 180 days |
rate-limits | Rate-limit counters | 5 minutes (sliding window) |
group-invitations | Pending / accepted / declined workspace invites | 30 days (TTL set on create) |
billing-logs | Subscription events, balance top-ups, payments | 12 months (Cosmos TTL; retained for financial record-keeping and chargeback evidence, subject to applicable law) |
user-memberships | Workspace and webhook membership join records | Indefinite (required for audit integrity; removed only when the membership itself is revoked) |
users | User profile records | Retained while the user is active; deleted on self-serve delete or admin remove |
integrations | User-configured cloud resources | Deleted when the owning user is deleted |
integration-groups | Workspaces (collections of resources) | Deleted when the owning user is deleted |
integration-bundles | Resource bundles | Deleted when the owning user is deleted |
user-bundles | Member (user) bundles | Deleted when the owning user is deleted |
credential-ownership | Key Vault credential ownership records | Deleted when the owning user is deleted |
custom-app-registrations | BYOAR (Bring Your Own App Registration) metadata | Deleted when the owning user is deleted |
webhook-configs | Webhook ingestion configs | Deleted when the owning user is deleted |
pending-tenants | Pending subdomain reservations during Stripe checkout | 15 minutes (auto-expires) |
Note: containers marked "Deleted when the owning user is deleted" rely on
the cascade path in lib/admin/delete-user-core.ts. They do not carry a
per-item TTL; they are removed as part of the self-serve or admin delete
flow.
When a user initiates self-delete from /profile/delete-account:
DELETE. Both must match exactly.user-logs entry is written BEFORE deletion runs so the audit trail
survives partial failures.deleteUserCore cascades:
users container./account-deleted.For personal data stored in user-scoped containers (per the "Deleted when the owning user is deleted" rows above), the self-serve delete purges synchronously. We treat this as the "30-day" horizon under GDPR because third-party subprocessors (Azure Backup, Sentry) retain incremental backups for up to 30 days before rolling off.
After 30 days, no personal data remains in any system, except for:
billing-logs (retained for 12 months for legal record-keeping)user-logs entries that refer to the user as performedBy or
targetUser (kept for the container TTL above for audit-trail integrity)processed-stripe-events idempotency records (retained for 180 days;
these store Stripe event IDs, not personal data, but may reference the
user's Stripe customer ID)/profile/export-data/profile/delete-account