EverJoyBack to home

Data Retention Policy

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


1. Purpose and Scope

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.


2. Retention Principles

EverJoy retains personal information only as long as necessary to:

  1. Provide the Service to users
  2. Comply with legal obligations
  3. Resolve disputes and enforce agreements
  4. Maintain security and audit trails

We minimize retention wherever possible and delete data upon verified request subject to legal exceptions.


3. Retention Schedule

3.1 Primary Retention Periods

Data CategoryDatabase KeyRetention PeriodNotes
Child Profilechild_profile2,555 days (~7 years)While account active; deleted on account closure
Memory Artifactsmemory_artifact2,555 days (~7 years)Photos, PDFs, capture artifacts, AI metadata
Consent Recordsconsent_record2,555 days (~7 years)Never hard-deleted; revoked_at recorded on revocation
Audit Logsaudit_log1,095 days (~3 years)Append-only; security/compliance
Inactive Accountinactive_account365 daysGrace period after deletion request

Policy version: 2026-07 (stored in DATA_RETENTION_POLICY_VERSION)

3.2 Additional Retention Periods

Data CategoryRetention PeriodNotes
Parent account dataDuration of account + 365 daysDeleted after cooling-off
Billing records7 yearsTax and accounting requirements
Stripe transaction dataPer Stripe retentionEverJoy stores metadata only
School roster dataDuration of School Agreement + 90 daysDeleted on agreement termination
Partner earnings records7 yearsFinancial/tax requirements
Support correspondence3 yearsCustomer service
Analytics data (PostHog)Per PostHog settingsNo child content in events

3.3 Retention While Account Active

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.

3.4 Retention After Account Deletion

Upon verified account deletion:

  1. 30-day cooling-off period — Account marked for deletion; user may cancel
  2. After cooling-off — Child profiles, memories, and storage files deleted
  3. Consent records — Retained with revoked_at timestamp (not hard-deleted)
  4. Audit logs — Retained for 3 years; profile_id may be anonymized
  5. Billing records — Retained per tax requirements

4. Deletion Workflows

4.1 Memory Deletion

Trigger: Parent deletes memory from inbox, timeline, or bulk deletion.

Process:

  1. Verify ownership via owns_student() / family membership
  2. Load memories.storage_path and thumbnail_path
  3. Delete storage objects from buckets:
    • memories — primary file
    • capture-artifacts — if ingestion_source = school_scan
  4. Delete memories row (cascades to AI jobs, reactions)
  5. Write audit log: action: delete, table_name: memories

Implementation: eraseMemoryArtifact() in yearbox/src/lib/erasure/service.ts

4.2 Child Profile Deletion

Trigger: Parent requests child removal from Settings → Children → Delete.

Process:

  1. Verify caller owns student
  2. Write audit log: action: delete, table_name: students
  3. Delete dependent rows:
    • memories where student_id = ?
    • parent_student_links where student_id = ?
    • student_label_preferences, roster claim if applicable
    • students row
  4. Delete storage objects (profile photo, all memories)
  5. Revoke student-scoped consent records (revoked_at = now())

Implementation: eraseChildProfile() in yearbox/src/lib/erasure/service.ts

4.3 Account Deletion

Trigger: Parent requests account deletion via Settings or support@myeverjoy.com.

Process:

  1. Insert account_deletion_requests with requested_at, profile_id, status
  2. Send email confirmation link
  3. 30-day cooling-off period
  4. On confirmation:
    • Cancel Stripe subscription
    • For each family student: run child profile deletion (§4.2)
    • Delete profiles and auth.users via Supabase Admin API
    • Retain consent records and audit logs per retention policy
    • Anonymize accepted_by_profile_id in consent records if required

Implementation: 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.

4.4 School Roster Deletion

Trigger: School Agreement termination or District request.

Process:

  1. Set roster_sharing_authorized = false
  2. Delete student_roster rows for school within 90 days
  3. Retain activation records (parent-child links) as parent-controlled data
  4. Write audit log

4.5 Orphan Storage Cleanup

Scheduled job (weekly):

  1. List storage objects in memories, capture-artifacts, student-photos older than 7 days
  2. Compare against database references
  3. Delete orphans after confidence threshold or admin review

Status: Spec documented; automation planned (scripts/cleanup-orphan-storage.ts).


5. Data Export and Portability

5.1 Right to Export

Parents may request export of personal information and Child Profile content in a commonly used, machine-readable format.

5.2 Export Scope

Data TypeFormatIncluded
Account informationJSONName, email, account settings
Child profilesJSONProfile fields, metadata
MemoriesZIP + JSONOriginal files, metadata, AI summaries
Consent recordsJSONConsent history
TimelineJSONTimeline items, milestones

5.3 Export Process

  1. Parent submits request to privacy@myeverjoy.com or via Settings (when available)
  2. EverJoy verifies identity
  3. Export generated within 45 days (CPRA requirement)
  4. Secure download link provided (expires in 7 days)

Note: Self-service export API/UI is planned; current process is support-assisted.

5.4 Portability

Exported data is provided in formats suitable for transfer to another service:


6. Consent Record Handling

6.1 Retention

Consent records are retained for 2,555 days (~7 years) for compliance demonstration.

6.2 No Hard Delete

Consent records are never hard-deleted. Upon revocation:

6.3 Anonymization

Upon account deletion, accepted_by_profile_id may be anonymized (replaced with hash or null) while retaining consent event record.


7. Audit Log Retention

7.1 Retention Period

Audit logs retained for 1,095 days (~3 years).

7.2 Immutability

Audit logs are append-only:

7.3 Purge

Automated purge of audit logs older than 3 years (planned cron job).


8. Legal Holds

EverJoy may retain data beyond standard periods when:

Users will be notified of legal holds where permitted.


9. School and District Data

9.1 Roster Data

Roster data uploaded by schools is retained:

9.2 Capture Artifacts

Capture artifacts are parent-controlled data, not school data. Retention follows child profile retention (§3.1), not school agreement termination.

9.3 Aggregated Reports

Aggregated, de-identified participation metrics may be retained indefinitely for business analytics.


10. Backup Retention

10.1 Database Backups

10.2 Backup Deletion

Deleted data may persist in backups until backup rotation. Backups are not restored except for disaster recovery.


11. User Rights Summary

RightHow to ExerciseTimeline
AccessEmail privacy@myeverjoy.com45 days
CorrectionSettings or emailImmediate
Deletion (memory)In-app deleteImmediate
Deletion (child)Settings or emailImmediate
Deletion (account)Settings or email30-day cooling-off
ExportEmail privacy@myeverjoy.com45 days
Revoke consentSettings or emailImmediate

12. Implementation Status

FeatureStatusReference
Retention policy schema✅ ImplementedMigration 00023
Memory deletion✅ ImplementederaseMemoryArtifact()
Child profile deletion✅ ImplementederaseChildProfile()
Account deletion API✅ ImplementedrequestAccountDeletion()
Account deletion UI🔄 PlannedSettings page
Email confirmation🔄 PlannedDeletion flow
Stripe cancel on purge🔄 PlannedAccount deletion
Orphan storage cleanup🔄 PlannedCron job
Audit log purge🔄 PlannedCron job
Self-service export🔄 PlannedAPI/UI

13. Policy Updates

When retention periods change:

  1. Update data_retention_policies table
  2. Bump policy_version and DATA_RETENTION_POLICY_VERSION
  3. Notify users of material changes
  4. Obtain counsel sign-off before implementation

Current version: 2026-07


14. Compliance Mapping

RegulationRequirementImplementation
COPPAParent can review/delete child data§4.2, §11
FERPALimit retention of education records§9.1
SOPIPADelete upon request§4, §11
CCPA/CPRARight to delete, right to know§4, §5, §11
GDPRRight to erasure, data portability§4, §5

15. Contact

PurposeContact
Deletion requestssupport@myeverjoy.com
Export requestsprivacy@myeverjoy.com
Privacy inquiriesprivacy@myeverjoy.com
Data Protection Officerprivacy@myeverjoy.com


Schedule A: Complete Retention Matrix

Table/DataCategoryRetentionDeletion TriggerMethod
profilesAccountAccount + 365 daysAccount deletionHard delete
studentsChild profile~7 yearsChild/account deletionHard delete
memoriesMemory artifact~7 yearsMemory/child deletionHard delete + storage
consent_recordsConsent~7 yearsNever hard deleteSet revoked_at
audit_logsAudit~3 yearsAutomated purgeHard delete
student_rosterSchool dataAgreement + 90 daysAgreement terminationHard delete
artifactsCapture~7 yearsChild deletionHard delete + storage
subscriptionsBilling7 yearsAccount deletionMetadata retained
paymentsBilling7 yearsN/ARetained
account_deletion_requestsOperational3 yearsPost-completionHard delete
school_agreementsContractAgreement + 7 yearsTerminationArchive
capture_partnersPartnerPartnership + 3 yearsTerminationAnonymize
partner_earningsFinancial7 yearsN/ARetained

Schedule B: Erasure API Reference

Endpoint/FunctionPurposeAuth
eraseMemoryArtifact()Delete single memoryParent ownership
eraseChildProfile()Delete child + all dataParent ownership
requestAccountDeletion()Initiate account deletionAccount owner
executeAccountDeletion()Execute after cooling-offSystem/admin
DELETE /api/students/[id]API child deletionParent (planned)
POST /api/account/deletion-requestAPI account deletionAccount owner

Schedule C: Export Format Specification

C.1 JSON Schema

{
  "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": [...]
  }]
}

C.2 File Delivery


Data Retention Policy version 2026-07. Aligned with yearbox/docs/data-retention-erasure-plan.md and yearbox/src/lib/erasure/service.ts.

Back to home