EverJoy Data Retention Policy
Effective Date: July 1, 2026
Last Updated: July 2026
Version: 2026-07
Policy Version (Database): 2026-07
Entity: EverJoy Memory LLC d/b/a EverJoy
This Data Retention Policy ("Policy") defines how long EverJoy retains personal information and the procedures for deletion, export, and portability. It applies to all data processed through The AI-Powered Student Growth Cloud, including:
This Policy implements the retention periods seeded in data_retention_policies (migration 00023_consent_and_retention.sql) and erasure workflows in yearbox/src/lib/erasure/service.ts.
EverJoy retains personal information only as long as necessary to:
We minimize retention wherever possible and delete data upon verified request subject to legal exceptions.
| Data Category | Database Key | Retention Period | Notes |
|---|---|---|---|
| Child Profile | child_profile | 2,555 days (~7 years) | While account active; deleted on account closure |
| Memory Artifacts | memory_artifact | 2,555 days (~7 years) | Photos, PDFs, capture artifacts, AI metadata |
| Consent Records | consent_record | 2,555 days (~7 years) | Never hard-deleted; revoked_at recorded on revocation |
| Audit Logs | audit_log | 1,095 days (~3 years) | Append-only; security/compliance |
| Inactive Account | inactive_account | 365 days | Grace period after deletion request |
Policy version: 2026-07 (stored in DATA_RETENTION_POLICY_VERSION)
| Data Category | Retention Period | Notes |
|---|---|---|
| Parent account data | Duration of account + 365 days | Deleted after cooling-off |
| Billing records | 7 years | Tax and accounting requirements |
| Stripe transaction data | Per Stripe retention | EverJoy stores metadata only |
| School roster data | Duration of School Agreement + 90 days | Deleted on agreement termination |
| Partner earnings records | 7 years | Financial/tax requirements |
| Support correspondence | 3 years | Customer service |
| Analytics data (PostHog) | Per PostHog settings | No child content in events |
While a parent account is active, child profiles and memories are retained indefinitely (subject to the 7-year maximum from creation). Parents may delete individual items at any time.
Upon verified account deletion:
revoked_at timestamp (not hard-deleted)profile_id may be anonymizedTrigger: Parent deletes memory from inbox, timeline, or bulk deletion.
Process:
owns_student() / family membershipmemories.storage_path and thumbnail_pathmemories — primary filecapture-artifacts — if ingestion_source = school_scanmemories row (cascades to AI jobs, reactions)action: delete, table_name: memoriesImplementation: eraseMemoryArtifact() in yearbox/src/lib/erasure/service.ts
Trigger: Parent requests child removal from Settings → Children → Delete.
Process:
action: delete, table_name: studentsmemories where student_id = ?parent_student_links where student_id = ?student_label_preferences, roster claim if applicablestudents rowrevoked_at = now())Implementation: eraseChildProfile() in yearbox/src/lib/erasure/service.ts
Trigger: Parent requests account deletion via Settings or support@myeverjoy.com.
Process:
account_deletion_requests with requested_at, profile_id, statusprofiles and auth.users via Supabase Admin APIaccepted_by_profile_id in consent records if requiredImplementation: requestAccountDeletion() and executeAccountDeletion() in yearbox/src/lib/erasure/service.ts
Note: Parent-facing account deletion UI is planned; beta users may contact support for deletion requests.
Trigger: School Agreement termination or District request.
Process:
roster_sharing_authorized = falsestudent_roster rows for school within 90 daysScheduled job (weekly):
memories, capture-artifacts, student-photos older than 7 daysStatus: Spec documented; automation planned (scripts/cleanup-orphan-storage.ts).
Parents may request export of personal information and Child Profile content in a commonly used, machine-readable format.
| Data Type | Format | Included |
|---|---|---|
| Account information | JSON | Name, email, account settings |
| Child profiles | JSON | Profile fields, metadata |
| Memories | ZIP + JSON | Original files, metadata, AI summaries |
| Consent records | JSON | Consent history |
| Timeline | JSON | Timeline items, milestones |
Note: Self-service export API/UI is planned; current process is support-assisted.
Exported data is provided in formats suitable for transfer to another service:
Consent records are retained for 2,555 days (~7 years) for compliance demonstration.
Consent records are never hard-deleted. Upon revocation:
revoked_at timestamp recordedUpon account deletion, accepted_by_profile_id may be anonymized (replaced with hash or null) while retaining consent event record.
Audit logs retained for 1,095 days (~3 years).
Audit logs are append-only:
Automated purge of audit logs older than 3 years (planned cron job).
EverJoy may retain data beyond standard periods when:
Users will be notified of legal holds where permitted.
Roster data uploaded by schools is retained:
Capture artifacts are parent-controlled data, not school data. Retention follows child profile retention (§3.1), not school agreement termination.
Aggregated, de-identified participation metrics may be retained indefinitely for business analytics.
Deleted data may persist in backups until backup rotation. Backups are not restored except for disaster recovery.
| Right | How to Exercise | Timeline |
|---|---|---|
| Access | Email privacy@myeverjoy.com | 45 days |
| Correction | Settings or email | Immediate |
| Deletion (memory) | In-app delete | Immediate |
| Deletion (child) | Settings or email | Immediate |
| Deletion (account) | Settings or email | 30-day cooling-off |
| Export | Email privacy@myeverjoy.com | 45 days |
| Revoke consent | Settings or email | Immediate |
| Feature | Status | Reference |
|---|---|---|
| Retention policy schema | ✅ Implemented | Migration 00023 |
| Memory deletion | ✅ Implemented | eraseMemoryArtifact() |
| Child profile deletion | ✅ Implemented | eraseChildProfile() |
| Account deletion API | ✅ Implemented | requestAccountDeletion() |
| Account deletion UI | 🔄 Planned | Settings page |
| Email confirmation | 🔄 Planned | Deletion flow |
| Stripe cancel on purge | 🔄 Planned | Account deletion |
| Orphan storage cleanup | 🔄 Planned | Cron job |
| Audit log purge | 🔄 Planned | Cron job |
| Self-service export | 🔄 Planned | API/UI |
When retention periods change:
data_retention_policies tablepolicy_version and DATA_RETENTION_POLICY_VERSIONCurrent version: 2026-07
| Regulation | Requirement | Implementation |
|---|---|---|
| COPPA | Parent can review/delete child data | §4.2, §11 |
| FERPA | Limit retention of education records | §9.1 |
| SOPIPA | Delete upon request | §4, §11 |
| CCPA/CPRA | Right to delete, right to know | §4, §5, §11 |
| GDPR | Right to erasure, data portability | §4, §5 |
| Purpose | Contact |
|---|---|
| Deletion requests | support@myeverjoy.com |
| Export requests | privacy@myeverjoy.com |
| Privacy inquiries | privacy@myeverjoy.com |
| Data Protection Officer | privacy@myeverjoy.com |
| Table/Data | Category | Retention | Deletion Trigger | Method |
|---|---|---|---|---|
profiles | Account | Account + 365 days | Account deletion | Hard delete |
students | Child profile | ~7 years | Child/account deletion | Hard delete |
memories | Memory artifact | ~7 years | Memory/child deletion | Hard delete + storage |
consent_records | Consent | ~7 years | Never hard delete | Set revoked_at |
audit_logs | Audit | ~3 years | Automated purge | Hard delete |
student_roster | School data | Agreement + 90 days | Agreement termination | Hard delete |
artifacts | Capture | ~7 years | Child deletion | Hard delete + storage |
subscriptions | Billing | 7 years | Account deletion | Metadata retained |
payments | Billing | 7 years | N/A | Retained |
account_deletion_requests | Operational | 3 years | Post-completion | Hard delete |
school_agreements | Contract | Agreement + 7 years | Termination | Archive |
capture_partners | Partner | Partnership + 3 years | Termination | Anonymize |
partner_earnings | Financial | 7 years | N/A | Retained |
| Endpoint/Function | Purpose | Auth |
|---|---|---|
eraseMemoryArtifact() | Delete single memory | Parent ownership |
eraseChildProfile() | Delete child + all data | Parent ownership |
requestAccountDeletion() | Initiate account deletion | Account owner |
executeAccountDeletion() | Execute after cooling-off | System/admin |
DELETE /api/students/[id] | API child deletion | Parent (planned) |
POST /api/account/deletion-request | API account deletion | Account owner |
{
"export_version": "2026-07",
"exported_at": "ISO8601 timestamp",
"account": { "name", "email", "created_at" },
"children": [{
"profile": { "name", "grade", "school", ... },
"memories": [{
"id", "title", "description", "created_at",
"files": ["original paths"],
"ai_metadata": { "summary", "classification", ... }
}],
"yearbooks": [...],
"consents": [...]
}]
}
Data Retention Policy version 2026-07. Aligned with yearbox/docs/data-retention-erasure-plan.md and yearbox/src/lib/erasure/service.ts.