DSGVO — Datenfluss-Map (v2.1 pre-license)
Status: Operativ-gültiges Dokument für Phase A. Stand 2026-05-19. ROPA-ready. Owner: Antonios. Update bei jedem Processor-Wechsel.
1. Controller / Joint Controllers / Processors
| Akteur | Rolle | Sitz |
|---|---|---|
| Stratify (wait, what.) | Controller (B2C-Subscriber-Daten, Pilot-Daten, Partner-Daten, Audit-Log) | Schweiz (Zürich) |
| Supabase | Processor (DB + Auth + Storage + Realtime) | EU (eu-central-1) |
| Vercel | Processor (Hosting, Logs, Observability) | EU (fra1) |
| Resend | Processor (Transactional + Broadcast Email) | EU + US (Email-Routing) |
| Stripe Payments Europe Ltd | Joint Controller (Zahlungsdaten) | Irland |
| PostHog | Processor (Analytics) | EU (eu.i.posthog.com) |
| Sentry | Processor (Error-Telemetrie) | EU |
| Apple Push Notification Service | Processor (Push-Routing iOS) | US |
| Google Firebase / FCM | Processor (Push-Routing Android) | US/EU |
| Expo Push API | Sub-Processor (Push-Tokens) | US |
2. Datenkategorien
| Kategorie | Quelle | Speicherort | Retention |
|---|---|---|---|
| Account (email, user_id, Sprache) | Sign-up (Magic Link) | Supabase EU subscribers | Bis Account-Löschung; +30 Tage Backup |
| Aktives Mandat | Self-select B2C | Supabase EU user_active_mandate | Wie Account |
| Subscription-Status | Stripe Webhook | Supabase EU subscribers.status | Wie Account |
| Stripe-Customer-ID | Stripe Checkout | Supabase EU subscribers.stripe_customer_id | Wie Account |
| Zahlungsdaten (Karten, IBAN) | Stripe Checkout | Stripe Ireland (Stratify hat keinen Zugang) | Stripe-eigene Retention |
| Web-Push-Subscription (Endpoint, Schlüssel) | Browser API | Supabase EU web_push_subscriptions | Bis Revoke oder Endpoint-410 |
| Expo Push Token | OS API | Supabase EU expo_push_tokens | Bis Revoke oder DeviceNotRegistered |
| Waitlist-Email + Source | Form | Supabase EU waitlist | 24 Monate ab Eintrag |
| Referral-Code-Cookie | Browser Cookie | Browser (90 Tage) + ggf. subscribers.referred_by | 90 Tage / Account-Lebensdauer |
| Signal-Delivery-Log | App | Supabase EU signal_deliveries | 24 Monate (Phase A); flippable auf 7 Jahre bei FMA-Lizenz |
| Audit-Log (chain-hashed) | App | Supabase EU audit_log | 24 Monate (Phase A); flippable auf 7 Jahre bei FMA-Lizenz |
| PostHog-Events | Web/Mobile | PostHog EU | 12 Monate Default-Retention |
| Sentry-Errors | Web/Mobile | Sentry EU | 30 Tage Default; 90 Tage auf Paid-Plan |
| Email-Inhalt (Signal-Broadcast) | App → Resend | Resend Logs | 7 Tage in Resend; permanent im Stratify-Audit-Log |
| Partner-User-Antrag (legal name, applicant name) | /partners/sandbox | Supabase EU partner_users | Wie Account |
| API-Request-Log (Rate-Limit) | B2B-API Calls | Supabase EU api_request_log | 24h rolling (daily purge geplant) |
3. Rechtsgrundlagen (Art. 6 DSGVO)
| Verarbeitung | Grundlage |
|---|---|
| Subscriber-Account + Mandat-Wahl | Art. 6(1)(b) Vertragsdurchführung |
| Email-Signal-Broadcast (Paid Subs) | Art. 6(1)(b) |
| Email-Signal-Broadcast (Free Subs / Newsletter) | Art. 6(1)(a) Einwilligung beim Sign-up |
| Stripe-Zahlung | Art. 6(1)(b) |
| Audit-Log + Signal-Delivery-Log | Art. 6(1)(c) Compliance / berechtigtes Interesse Art. 6(1)(f) |
| PostHog / Sentry | Art. 6(1)(f) berechtigtes Interesse + Opt-out im UI |
| Referral-Cookie | Art. 6(1)(f) + DSGVO/ePrivacy: nur funktionaler Cookie, kein Tracking-Pixel |
| Partner-User-Antrag | Art. 6(1)(b) Vertragsanbahnung |
4. Datenflüsse — Signal-Lebenszyklus
Pilot (User mit role=pilot)
→ /pilot/strategy/new → publishSignalAction
→ publishSignal() ← packages/shared/src/signal.schema.ts
writes:
signals (Supabase)
signal_deliveries × N (Supabase)
audit_log (Supabase, chain-hashed)
Cron drainers (every 2 min)
→ drain-email → Resend (EU+US) → Empfänger-Inbox
→ drain-push → web-push lib → Browser-VAPID-Endpoint
→ drain-expo-push → Expo Push API (US) → APNs / FCM → Gerät
→ drain-webhooks → Partner-URL (HTTPS HMAC-SHA256-signed)Alle Steps schreiben Status zurück in signal_deliveries. Audit-Eintrag pro Step.
5. Datenflüsse — Subscriber-Lebenszyklus
Sign-up
→ Supabase Auth (Magic Link via Resend)
→ auth.user_created webhook → POST /api/webhooks/supabase
→ subscribers row + audit_log
Upgrade
→ /upgrade → Stripe Checkout (Ireland)
→ checkout.completed → POST /api/webhooks/stripe
→ subscribers.status='paid' + subscribers.stripe_customer_id + audit_log
Unsubscribe
→ /account/unsubscribe → subscribers.status='cancelled'
→ user opens Stripe Portal → cancels → customer.subscription.deleted → audit_log
→ bei period_end: drainer hört auf, dem User Email-Signale zu senden6. Drittlandsübermittlungen
- Resend (Email): Routing via US-Provider möglich. Verarbeitung primär EU, Übermittlung in Drittland für Zustellung an US-Empfänger gestützt auf SCC + EU-US Data Privacy Framework.
- APNs (Apple) / FCM (Google) / Expo Push API: notwendig zur App-Funktion. SCC + DPF.
- Stripe Ireland (EU); Stripe-eigene Subprocessors (US) via SCC.
7. Subjects-Rechte (Art. 15–22 DSGVO)
| Recht | Implementation |
|---|---|
| Auskunft (Art. 15) | Manuelle Auskunftserteilung via DPO-Mailbox ([email protected]). Mid-term: Export-Endpoint auf /account. |
| Berichtigung (Art. 16) | /account/* Self-Service. |
| Löschung (Art. 17) | Manuell durch DPO-Anfrage; Supabase Auth Cascade-Delete entfernt alle FK-Rows. Audit-Log behält Hash, anonymisiert Payload (subscriber.id → tombstone). |
| Einschränkung (Art. 18) | Manuell. |
| Datenübertragbarkeit (Art. 20) | NDJSON-Export geplant für Phase B. |
| Widerspruch (Art. 21) | /account/unsubscribe + Email-Unsub-Link. |
| Automatisierte Entscheidungen (Art. 22) | Keine. Signale sind 1:N redaktionell. |
8. Datenschutzfolgenabschätzung (DSFA) — Aufschiebung
- Phase A erfordert keine DSFA (Art. 35), da:
- keine systematische Profilbildung (1:N-Signale)
- keine sensiblen Datenkategorien (Art. 9)
- kein automatisches Entscheidungssystem (Art. 22)
- DSFA wird re-evaluiert bei Phase C (Suitability-Engine, KYC, Stripe Connect Pilot-Payouts).
9. Sicherheits-Maßnahmen (Art. 32)
- TLS 1.3 für alle Endpoints (Vercel + Supabase).
- Bcrypt-equivalent (SHA-256 + secret prefix) für Partner-API-Keys.
- Web-Push-Subs sind self-RLS (User darf nur eigene sehen).
- Audit-Log append-only via Postgres-Trigger + chain-hashed (
apps/web/lib/audit/chain.ts). - Sentry: PII Sanitization aktiviert.
- PostHog: kein Autocapture; expliziter
identify()nur post-Sign-up. - Backups: Supabase PITR (siehe
docs/runbooks/db-recovery.md).
10. Auftragsverarbeitungsverträge (AVV / DPA)
| Processor | DPA-Link | Stand |
|---|---|---|
| Supabase | https://supabase.com/legal/dpa | beizog |
| Vercel | https://vercel.com/legal/dpa | beizog |
| Resend | https://resend.com/legal/dpa | beizog |
| Stripe | https://stripe.com/legal/dpa | beizog |
| PostHog | https://posthog.com/legal/dpa | beizog |
| Sentry | https://sentry.io/legal/dpa | beizog |
(Alle Links Stand 2026-05-19; Antonios reviewed quartalsweise.)
11. Decision Log
| Datum | Entscheidung | Aktor |
|---|---|---|
| 2026-05-19 | v2.1 Processor-Map etabliert (Supabase ersetzt Clerk + Neon + S3) | Toby |
| 2026-05-19 | Audit-Log-Retention 2y in Phase A, 7y bei FMA-Grant | Toby |
| TBD | Counsel-Review v2.1 | Antonios |
v2.1 — 2026-05-19. ROPA-ready.