Data Privacy & Compliance
How Grade My Investments protects, encrypts, and exports user data — honestly separating what is built today from what is still on the roadmap.
flowchart LR
U([User requests export]):::app
REQ[RequestAccountExportAsync<br/>queues async job]:::svc
Q[(Export job queue)]:::data
BUILD[BuildAccountExportZipAsync]:::svc
subgraph GATHER[Gather data - redacted]
direction TB
P[Profile - account]:::data
N[Notifications]:::data
C[Content]:::data
A[Activity capped 10k]:::data
B[Billing - card last4 and brand only<br/>full numbers and Stripe IDs excluded]:::sec
L[Login history capped 5k<br/>IP geo browser OS]:::data
F[User files]:::data
end
ZIP[(ZIP in Blob Storage)]:::data
SAS[24h SAS URL<br/>POST api-downloads-export-account]:::sec
DL([User downloads ZIP]):::app
U --> REQ --> Q --> BUILD
BUILD --> P
BUILD --> N
BUILD --> C
BUILD --> A
BUILD --> B
BUILD --> L
BUILD --> F
P --> ZIP
N --> ZIP
C --> ZIP
A --> ZIP
B --> ZIP
L --> ZIP
F --> ZIP
ZIP --> SAS --> DL
ENC[Encryption<br/>AES-256 at rest - MySQL and Blob<br/>TLS 1.2+ in transit]:::sec
ENC -.->|protects| ZIP
classDef app fill:#1f2630,stroke:#C0894E,color:#F3EFE8;
classDef svc fill:#241c14,stroke:#E2B583,color:#F3EFE8;
classDef data fill:#22201a,stroke:#C0894E,color:#EBD3AE;
classDef ext fill:#1b1f27,stroke:#5A616B,color:#C4C0B8;
classDef sec fill:#1d2733,stroke:#5cc8e0,color:#eafaff;
This page distinguishes implemented privacy capabilities from forward-looking roadmap items. We do not claim compliance features that do not exist: full account erasure, a cookie-consent banner, and a documented retention schedule are not yet built.
Implemented Today
GDPR Data Export (Articles 15 & 20)
The Right of Access (Article 15) and Right to Data Portability (Article 20) are fully built. A user request runs through an async pipeline:
RequestAccountExportAsyncQueues an asynchronous export jobBuildAccountExportZipAsyncProduces a ZIP of structured JSON plus the user's filesPOST /api/downloads/export-accountDelivers the ZIP via a 24-hour SAS URL
What the export ZIP contains:
| Section | Contents | Cap |
|---|---|---|
| Account | Profile / account record | — |
| Notifications | User notifications | — |
| Content | User-generated content | — |
| Activity | Activity history | 10,000 |
| Billing | Card last4 and brand only | — |
| Login history | IP, geo, browser, OS | 5,000 |
| User files | The user's stored files | — |
Explicitly excluded from exports
- Full card numbers
- Stripe identifiers
Encryption
- At rest AES-256 (Azure-managed)
- Applies to both MySQL and Blob Storage
- In transit TLS 1.2+
- MAUI app Certificate pinning
PCI Posture
- Card numbers are never stored
- All cards are Stripe-tokenized
- Only card last4 and brand retained for display
Login History
Login events are captured with geolocation, IP address, browser, and operating system, giving users visibility into account access.
Per-Field Deletion & Soft-Delete
- Per-field deletion of email addresses
- Per-field deletion of SMS numbers
IsDeletedsoft-delete across entities
Application Security Controls
- OWASP Top 10 coverage
- Rate limiting
- HTML sanitization
- Security headers
Roadmap — Not Yet Implemented
The following privacy items are forward-looking and are not in place today.
Account Erasure (Article 17)
A full right-to-be-forgotten erasure endpoint does not exist yet. Today, complete account erasure requires manual admin processing.
RoadmapCookie-Consent Banner
There is no consent UI today — Google Analytics currently runs without a consent banner. A cookie-consent experience is planned.
RoadmapData-Retention Schedule
A formally documented, time-based data-retention schedule for logs is not yet published.
Roadmap