EMZETT.
Login

DSGVO-Datenexport (Art. 15/20)

Kurz: Das Recht, von einem Unternehmen alle über einen selbst gespeicherten personenbezogenen Daten strukturiert ausgehändigt zu bekommen — Auskunftsrecht (Art. 15 DSGVO) und Recht auf Datenübertragbarkeit (Art. 20 DSGVO).

Genauer: In der Praxis meist als “Daten exportieren”-Knopf im eigenen Account umgesetzt, der serverseitig alle mit dem eingeloggten User verknüpften Datensätze zusammenträgt und z. B. als JSON-Datei zum Download anbietet. Wichtig ist eine bewusste Abgrenzung, WAS in den Export gehört: rein technische/sicherheitsrelevante Felder (Passwort-Hash, Push-Subscription) und personenbezogene Daten DRITTER Personen (z. B. wer sonst noch an einem gemeinsamen Support-Ticket beteiligt war) gehören nicht hinein.

Kontext bei uns: app/utils/gdprExport.ts (exportUserData) bei Emzett sammelt Account-Daten, Bestellungen, Punkte-Historie, Support-Tickets, Chat-Nachrichten etc. für den eingeloggten User — bewusst OHNE passwordHash und pushSubscription. Läuft über die allgemeine Rate-Limit-Prüfung, da ein vollständiger Datenexport eine vergleichsweise teure Operation ist.

Im Detail

Art. 15 DSGVO (Auskunftsrecht) und Art. 20 DSGVO (Recht auf Datenübertragbarkeit) werden in der Praxis oft zusammen als “Datenexport” umgesetzt, sind rechtlich aber unterschiedlich weit gefasst: Art. 15 verpflichtet zur Auskunft über alle verarbeiteten personenbezogenen Daten inklusive Verarbeitungszwecken, Empfängern und Speicherdauer — unabhängig davon, wie die Daten erhoben wurden. Art. 20 ist enger: Er gilt nur für Daten, die die betroffene Person dem Unternehmen selbst bereitgestellt hat (z. B. Profildaten, hochgeladene Inhalte) und deren Verarbeitung auf Einwilligung oder Vertrag beruht — nicht aber für Daten, die das Unternehmen selbst abgeleitet oder berechnet hat (z. B. ein intern berechneter Kundenwert-Score).

Eine häufige rechtliche Anforderung ist die Reaktionsfrist: Auf eine Auskunftsanfrage muss “unverzüglich, in jedem Fall aber innerhalb eines Monats” reagiert werden (Art. 12 Abs. 3 DSGVO), mit der Möglichkeit einer Verlängerung um zwei weitere Monate bei komplexen Anfragen. Ein automatisierter Self-Service-Export im Account-Bereich unterläuft diese Frist von vornherein, weil der Nutzer die Daten sofort selbst abrufen kann, statt eine manuelle Anfrage stellen und auf Bearbeitung warten zu müssen — das reduziert gleichzeitig den Support-Aufwand auf Unternehmensseite erheblich.

Technisch besonders heikel ist die Behandlung verknüpfter Daten, die auch andere Personen betreffen. Ein Chat-Verlauf oder ein gemeinsames Support-Ticket enthält typischerweise Nachrichten mehrerer Beteiligter — ein naiver Export “alle Datensätze, in denen meine User-ID vorkommt” würde ungewollt auch personenbezogene Daten Dritter offenlegen, was selbst wieder einen DSGVO-Verstoß darstellen kann. Übliche Lösungsansätze sind, entweder nur die eigenen Nachrichten innerhalb eines Threads zu exportieren, fremde Beiträge zu anonymisieren (z. B. “Anderer Nutzer” statt echtem Namen), oder komplette Threads nur dann einzuschließen, wenn die anfragende Person der alleinige oder hauptverantwortliche Teilnehmer ist.

// Vereinfachtes Muster für einen DSGVO-Datenexport
async function exportUserData(userId: string) {
  const [account, orders, tickets] = await Promise.all([
    db.query.users.findFirst({ where: eq(users.id, userId) }),
    db.query.orders.findMany({ where: eq(orders.userId, userId) }),
    db.query.tickets.findMany({ where: eq(tickets.userId, userId) }),
  ]);
 
  // Sicherheitsrelevante Felder bewusst ausschließen
  const { passwordHash, pushSubscription, ...safeAccount } = account;
 
  return { account: safeAccount, orders, tickets };
}

Siehe auch: Kleinunternehmerregelung (§19 UStG), Widerrufsrecht bei digitalen Inhalten (§ 356 Abs. 5 BGB), Account-Löschung mit Einwandsfrist (Soft Delete + Anonymisierung), DSGVO, Audit-Log