← Alle Artikel
Zuletzt aktualisiert: 2026-03-30

Ist Ihre Website DSGVO-konform? Praktische Checkliste

Praktische DSGVO-Checkliste für Websites. Cookie-Audit, Consent-Banner, Datenschutzerklärung, Google Analytics.

Kurzfassung (TL;DR)

DSGVO-Konformität für Websites erfordert eine informierte Einwilligung vor dem Setzen nicht-essenzieller Cookies, eine transparente Datenschutzerklärung, korrekt konfigurierte Analyse-Tools und eine sichere Verarbeitung personenbezogener Daten über Kontaktformulare. Diese Checkliste führt Sie durch das Auditieren Ihrer Cookies, die Einrichtung eines rechtskonformen Consent-Banners, die Konfiguration von Google Analytics 4 mit Consent Mode v2 und die Behebung der häufigsten Verstöße, die zu Bußgeldern führen. Dieser Artikel stellt eine technische Orientierungshilfe dar und keine Rechtsberatung. Für verbindliche rechtliche Einschätzungen konsultieren Sie bitte einen qualifizierten Rechtsanwalt.

Voraussetzungen

Schritt 1: Was die DSGVO von Websites verlangt

Die Datenschutz-Grundverordnung (DSGVO) gilt für jede Website, die personenbezogene Daten von Personen im Europäischen Wirtschaftsraum (EWR) verarbeitet. Bei einer typischen Website findet die Verarbeitung personenbezogener Daten häufiger statt, als man vermuten würde: Bereits der Aufruf einer Seite überträgt die IP-Adresse des Besuchers.

Grundsätze mit Auswirkung auf Websites

Die ePrivacy-Richtlinie (Cookie-Richtlinie)

Während die DSGVO personenbezogene Daten allgemein regelt, betrifft die ePrivacy-Richtlinie (2002/58/EG) speziell Cookies und ähnliche Tracking-Technologien. In Kombination ergeben sich folgende Anforderungen:

Schritt 2: Cookie-Audit durchführen

Bevor Sie Einwilligungen korrekt verwalten können, müssen Sie genau wissen, welche Cookies und Tracker Ihre Website verwendet. Viele Website-Betreiber sind überrascht, was sie dabei entdecken.

Manuelles Browser-Audit

Öffnen Sie Ihre Website in einem Inkognito-/Privatmodus-Fenster mit deaktivierten Erweiterungen. Öffnen Sie dann die Entwicklertools:

// Chrome / Edge: F12 → Anwendung → Cookies
// Firefox: F12 → Web-Speicher → Cookies

// Vorgehensweise:
// 1. Alle Cookies für Ihre Domain löschen
// 2. Startseite laden, OHNE mit dem Consent-Banner zu interagieren
// 3. Jeden erscheinenden Cookie dokumentieren
// 4. Wichtige Unterseiten besuchen (Kontakt, Blog, Shop)
// 5. Neue Cookies auf jeder Seite dokumentieren

Für jeden Cookie erfassen Sie:

Automatisiertes Scannen

Verwenden Sie einen spezialisierten Scanner für ein gründliches Audit. Es gibt verschiedene kostenlose und kommerzielle Tools:

# Cookiebot-Scanner verwenden (kostenlos für bis zu 1 Seite)
https://www.cookiebot.com/de/cookie-scanner/

# Open-Source-Tool "cookie-scanner" über npm
npm install -g @nicedoc/cookie-scanner
cookie-scanner https://ihredomain.de

# Netzwerk-Anfragen auf Drittanbieter-Aufrufe prüfen
# Chrome DevTools → Netzwerk-Tab → nach Drittanbieter filtern
# Achten Sie auf Anfragen an: google-analytics.com, doubleclick.net,
# facebook.com, hotjar.com, fonts.googleapis.com, etc.

Häufig gefundene Cookies

CookieQuelleKategorieEinwilligung erforderlich
PHPSESSIDIhr ServerTechnisch notwendigNein
wordpress_logged_in_*WordPressTechnisch notwendigNein
_ga, _gidGoogle AnalyticsAnalyseJa
_fbpFacebook PixelMarketingJa
frFacebookMarketingJa
_hjidHotjarAnalyseJa

Schritt 3: Einen rechtskonformen Consent-Banner implementieren

Ein DSGVO-konformer Consent-Banner ist nicht nur eine Benachrichtigung. Es handelt sich um eine funktionale Schnittstelle, die Einwilligungen einholt, protokolliert und durchsetzt.

Anforderungen an einen gültigen Consent-Banner

Implementierungsbeispiel mit eigenem Skript

Falls Sie keine Consent Management Platform (CMP) eines Drittanbieters einsetzen möchten, hier ein minimales Einwilligungslogik-Muster:

<!-- Consent-Banner HTML -->
<div id="consent-banner" role="dialog" aria-label="Cookie-Einwilligung" style="display:none;">
  <p>Wir verwenden Cookies, um den Website-Traffic zu analysieren und Ihr
     Nutzungserlebnis zu optimieren. Sie können wählen, welche Kategorien
     Sie zulassen möchten.</p>
  <div class="consent-options">
    <label>
      <input type="checkbox" checked disabled> Technisch notwendig (immer aktiv)
    </label>
    <label>
      <input type="checkbox" id="consent-analytics"> Analyse
    </label>
    <label>
      <input type="checkbox" id="consent-marketing"> Marketing
    </label>
  </div>
  <button id="consent-accept-all">Alle akzeptieren</button>
  <button id="consent-save">Auswahl speichern</button>
  <button id="consent-reject-all">Alle ablehnen</button>
</div>

<script>
(function() {
  var stored = localStorage.getItem('cookie_consent');
  if (!stored) {
    document.getElementById('consent-banner').style.display = 'block';
  } else {
    applyConsent(JSON.parse(stored));
  }

  document.getElementById('consent-accept-all').addEventListener('click', function() {
    saveConsent({ analytics: true, marketing: true });
  });

  document.getElementById('consent-reject-all').addEventListener('click', function() {
    saveConsent({ analytics: false, marketing: false });
  });

  document.getElementById('consent-save').addEventListener('click', function() {
    saveConsent({
      analytics: document.getElementById('consent-analytics').checked,
      marketing: document.getElementById('consent-marketing').checked
    });
  });

  function saveConsent(choices) {
    choices.timestamp = new Date().toISOString();
    localStorage.setItem('cookie_consent', JSON.stringify(choices));
    document.getElementById('consent-banner').style.display = 'none';
    applyConsent(choices);
  }

  function applyConsent(choices) {
    if (choices.analytics) { loadAnalytics(); }
    if (choices.marketing) { loadMarketing(); }
  }

  function loadAnalytics() {
    var s = document.createElement('script');
    s.src = 'https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX';
    document.head.appendChild(s);
  }

  function loadMarketing() {
    // Marketing-Skripte erst nach Einwilligung laden
  }
})();
</script>

Empfohlene Consent Management Platforms

Für Produktiv-Websites empfiehlt sich eine dedizierte CMP, die Randfälle, Einwilligungsprotokollierung und die Integration mit dem IAB TCF abdeckt:

Schritt 4: Eine vollständige Datenschutzerklärung erstellen

Jede Website, die personenbezogene Daten verarbeitet, muss eine umfassende Datenschutzerklärung bereitstellen, die von jeder Seite aus erreichbar ist (typischerweise im Footer verlinkt).

Pflichtangaben gemäß Art. 13 DSGVO

Technische Umsetzung

<!-- Jede Seite muss zur Datenschutzerklärung verlinken -->
<footer>
  <a href="/datenschutz">Datenschutzerklärung</a>
  <a href="/impressum">Impressum</a> <!-- Pflicht in DE/AT gemäß TMG/DDG -->
</footer>

<!-- Datenschutzerklärung darf nicht durch Cookie-Banner blockiert werden -->
<!-- Datenschutzerklärung sollte indexierbar sein (kein noindex) -->
<!-- Datenschutzerklärung sollte ohne JavaScript ladbar sein -->

Schritt 5: Google Analytics DSGVO-konform konfigurieren

Google Analytics 4 (GA4) erfordert eine spezifische Konfiguration, um im EWR rechtmäßig eingesetzt werden zu können.

Google Consent Mode v2 aktivieren

Der Consent Mode v2 kommuniziert den Einwilligungsstatus des Nutzers an Google-Tags und passt deren Verhalten entsprechend an.

<!-- Standard-Einwilligungsstatus setzen, BEVOR gtag.js geladen wird -->
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}

// Standard: Alles ablehnen, bis der Nutzer einwilligt
gtag('consent', 'default', {
  'analytics_storage': 'denied',
  'ad_storage': 'denied',
  'ad_user_data': 'denied',
  'ad_personalization': 'denied',
  'functionality_storage': 'denied',
  'personalization_storage': 'denied',
  'security_storage': 'granted',  // Sicherheits-Cookies sind technisch notwendig
  'wait_for_update': 500          // 500ms auf CMP warten
});
</script>

<!-- gtag.js laden -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX"></script>
<script>
gtag('js', new Date());
gtag('config', 'G-XXXXXXX', {
  'anonymize_ip': true,           // In GA4 redundant, aber explizit gesetzt
  'send_page_view': true
});
</script>

<!-- Bei erteilter Einwilligung den Status aktualisieren -->
<script>
function updateConsentState(analyticsGranted, marketingGranted) {
  gtag('consent', 'update', {
    'analytics_storage': analyticsGranted ? 'granted' : 'denied',
    'ad_storage': marketingGranted ? 'granted' : 'denied',
    'ad_user_data': marketingGranted ? 'granted' : 'denied',
    'ad_personalization': marketingGranted ? 'granted' : 'denied'
  });
}
</script>

GA4-Einstellungen im Admin-Bereich

Serverseitiges Tagging (Fortgeschritten)

Für maximale Kontrolle über die an Google gesendeten Daten empfiehlt sich der serverseitige Google Tag Manager. Dabei werden Analysedaten über Ihren eigenen Server geleitet, wodurch Sie personenbezogene Daten entfernen oder anonymisieren können, bevor sie Google erreichen:

# Übersicht: Serverseitiges GTM-Deployment
# 1. Serverseitigen GTM-Container deployen (App Engine, Cloud Run oder Self-Hosted)
# 2. GA4-Measurement-Endpoint über Ihre eigene Domain routen
# 3. Server-Container so konfigurieren, dass Client-IP und User-Agent entfernt werden
# 4. Bereinigte Daten an GA4 weiterleiten

# Ihre Domain dient als Analytics-Endpoint:
# https://ihredomain.de/g/collect → Ihr Server-Container → GA4

Schritt 6: Kontaktformulare und Datenverarbeitung absichern

Kontaktformulare erheben personenbezogene Daten direkt. Sie erfordern eine sorgfältige Implementierung.

Technische Anforderungen

<!-- Kontaktformular mit erforderlichen DSGVO-Elementen -->
<form action="/kontakt-senden" method="POST">
  <label for="name">Name</label>
  <input type="text" id="name" name="name" required>

  <label for="email">E-Mail</label>
  <input type="email" id="email" name="email" required>

  <label for="message">Nachricht</label>
  <textarea id="message" name="message" required></textarea>

  <!-- DSGVO-Einwilligungs-Checkbox (darf nicht vorangekreuzt sein) -->
  <label>
    <input type="checkbox" id="privacy-consent" name="privacy_consent" required>
    Ich habe die <a href="/datenschutz" target="_blank">Datenschutzerklärung</a>
    gelesen und stimme der Verarbeitung meiner Daten zum Zweck der
    Bearbeitung meiner Anfrage zu. *
  </label>

  <button type="submit">Nachricht senden</button>
</form>

Backend-Anforderungen

# Beispiel: Serverseitige Einwilligungsprotokollierung (Pseudocode)
def handle_contact_form(request):
    if not request.POST.get('privacy_consent'):
        return error('Einwilligung erforderlich')

    submission = {
        'name': request.POST['name'],
        'email': request.POST['email'],
        'message': request.POST['message'],
        'consent_given': True,
        'consent_timestamp': datetime.utcnow().isoformat(),
        'consent_ip': request.META['REMOTE_ADDR'],
        'privacy_policy_version': '2024-01-15',
        'retention_delete_after': datetime.utcnow() + timedelta(days=180)
    }
    db.contact_submissions.insert(submission)
    return success('Nachricht gesendet')

Schritt 7: Häufige Verstöße beheben

Verstoß 1: Cookies werden vor der Einwilligung gesetzt

Der häufigste Verstoß. Analyse- oder Marketing-Skripte werden sofort beim Laden der Seite ausgeführt.

Lösung: Kapseln Sie alle nicht-essenziellen Skripte in Ihre Einwilligungslogik. Im Google Tag Manager verwenden Sie die Consent-Übersicht, um sicherzustellen, dass Tags erst bei erteilter Einwilligung der entsprechenden Kategorie ausgelöst werden.

Verstoß 2: Keine Ablehnungsoption (oder versteckte Ablehnung)

Viele Banner zeigen einen prominenten "Alle akzeptieren"-Button, verstecken die Ablehnung aber hinter "Einstellungen verwalten" → "Speichern" mit allem deaktiviert.

Lösung: Stellen Sie einen "Alle ablehnen"-Button auf derselben Ebene und mit gleichwertiger visueller Gewichtung wie "Alle akzeptieren" bereit.

Verstoß 3: Drittanbieter-Schriften ohne Einwilligung geladen

Google Fonts, die von fonts.googleapis.com geladen werden, übermitteln die IP-Adresse des Besuchers an Google-Server. Das Landgericht München hat dies im Januar 2022 als DSGVO-Verstoß gewertet (LG München I, Az. 3 O 17493/20).

# Lösung: Schriften selbst hosten
# 1. Schriften herunterladen von https://gwfh.mranftl.com/fonts
# 2. Schriftdateien im /fonts/-Verzeichnis ablegen
# 3. Lokal in Ihrem CSS referenzieren:

@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/fonts/open-sans-v34-latin-regular.woff2') format('woff2');
}

# 4. Alle <link>-Tags entfernen, die auf fonts.googleapis.com verweisen

Verstoß 4: Eingebettete Inhalte ohne Einwilligung

YouTube-Videos, Google Maps und Social-Media-Widgets laden beim Seitenaufruf Drittanbieter-Cookies und übermitteln Besucherdaten.

Lösung: Verwenden Sie eine Zwei-Klick-Lösung. Zeigen Sie einen Platzhalter mit einem Einwilligungshinweis an. Laden Sie die eigentliche Einbettung erst, nachdem der Nutzer aktiv zustimmt.

Verstoß 5: Fehlende oder unvollständige Datenschutzerklärung

Lösung: Prüfen Sie Ihre Datenschutzerklärung anhand der in Schritt 4 aufgeführten Pflichtangaben. Nutzen Sie einen Generator als Ausgangspunkt und passen Sie ihn dann an Ihre tatsächlichen Verarbeitungstätigkeiten an.

Verstoß 6: Kein Auftragsverarbeitungsvertrag (AVV)

Sie müssen mit jedem Auftragsverarbeiter einen Auftragsverarbeitungsvertrag gemäß Art. 28 DSGVO abschließen: Hosting-Anbieter, E-Mail-Dienst, Analyse-Anbieter, CRM usw.

Lösung: Kontaktieren Sie jeden Dienstleister und fordern Sie dessen AVV an. Die meisten großen Anbieter (AWS, Google, Mailchimp, Cloudflare) bieten einen Online-AVV an, den Sie über das Admin-Panel akzeptieren können.

Fehlerbehebung

Consent-Banner blockiert Skripte nicht

Falls trotz Banner weiterhin Cookies vor der Einwilligung erscheinen, prüfen Sie:

# Überprüfen, dass vor der Einwilligung keine Cookies gesetzt werden:
# 1. Inkognito-Fenster öffnen
# 2. DevTools → Anwendung → Cookies → alle löschen
# 3. Website laden, NICHT mit dem Consent-Banner interagieren
# 4. Cookies prüfen — nur technisch notwendige Cookies sollten erscheinen

# Netzwerk-Anfragen prüfen, die blockiert sein sollten:
# DevTools → Netzwerk → Seite ohne Einwilligung neu laden
# Filtern nach: google-analytics | doubleclick | facebook | hotjar
# Falls Anfragen an diese Domains erscheinen, ist die Blockierung unvollständig

Google Analytics zeigt nach der Implementierung keine Daten

WordPress-Plugin-Konflikte

Cookie-Consent-Plugins können mit Caching-Plugins oder anderen Skripten in Konflikt geraten. Typische Lösungsschritte:

Prävention

Laufende Compliance-Checkliste

Automatisiertes Monitoring

# Automatisiertes Cookie-Monitoring per Cron-Job einrichten
# Dieses Skript prüft wöchentlich auf unerwartete Cookies

#!/bin/bash
# cookie-monitor.sh
DOMAIN="ihredomain.de"
EXPECTED_COOKIES="PHPSESSID,cookie_consent,csrf_token"

# Headless-Browser verwenden, um Cookies ohne Interaktion zu erkennen
npx puppeteer-cli screenshot "https://$DOMAIN" \
  --cookie-dump /tmp/cookies.json \
  --no-interaction

# Gefundene Cookies mit der erwarteten Liste vergleichen
python3 - <<PYEOF
import json
expected = set("$EXPECTED_COOKIES".split(','))
with open('/tmp/cookies.json') as f:
    found = set(c['name'] for c in json.load(f))
unexpected = found - expected
if unexpected:
    print(f"WARNUNG: Unerwartete Cookies gefunden: {unexpected}")
    # Benachrichtigung per E-Mail oder Slack senden
PYEOF

Vor jedem Deployment

  1. Prüfen Sie, ob die Änderung neue Drittanbieter-Anfragen oder Cookies einführt.
  2. Falls ja, fügen Sie die neue Ressource zu Ihrer Consent-Konfiguration hinzu.
  3. Aktualisieren Sie die Cookie-Deklaration in Ihrer Datenschutzerklärung bzw. Cookie-Richtlinie.
  4. Testen Sie im Inkognito-Browser: Keine nicht-essenziellen Cookies vor der Einwilligung.
  5. Dokumentieren Sie die Änderung in Ihrem Verzeichnis von Verarbeitungstätigkeiten.

Hinweis: Dieser Artikel stellt eine technische Orientierungshilfe zur Umsetzung DSGVO-relevanter Website-Funktionen dar. Er stellt keine Rechtsberatung dar. Datenschutzanforderungen variieren je nach Rechtsordnung und konkretem Anwendungsfall. Konsultieren Sie einen qualifizierten Datenschutzanwalt oder Ihren Datenschutzbeauftragten für rechtsverbindliche Einschätzungen.

Experten-Hilfe gebraucht?

Professionelles DSGVO/Cookie-Audit mit schriftlichen Fixes? €49.

Jetzt buchen — €49

100% Geld-zurück-Garantie

HR

Harald Roessler

Infrastructure Engineer mit 20+ Jahren Erfahrung. Gründer der DSNCON GmbH.