Kontaktformulare in WordPress datenschutzfreundlich betreiben: Einwilligung, Speicherung, Löschung
Kontaktformulare mit Contact Form 7 und Flamingo datensparsam aufbauen: Einwilligung nur wo nötig, Speicherung in der Datenbank steuern, Anfragen nach Frist per WP-CLI löschen und Löschanfragen nach Art. 17 DSGVO bearbeiten.
Mit KI erstellt – redaktionelle Prüfung ausstehend
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

Ein Kontaktformular sammelt personenbezogene Daten: Name, E-Mail-Adresse, oft Telefonnummer und eine Nachricht, die weitere persönliche Angaben enthalten kann. Für kleine Unternehmen ist das Formular meist der wichtigste Weg zu neuen Anfragen, und zugleich eine Stelle, an der sich Datenschutzpflichten konkret technisch umsetzen lassen. Diese Anleitung zeigt am Beispiel der verbreiteten Plugins Contact Form 7 und Flamingo, wie Sie Formulare datensparsam aufbauen, informieren und Einwilligungen sauber abfragen, die Speicherung in der Datenbank steuern und gespeicherte Anfragen fristgerecht löschen oder auf Anfrage einer betroffenen Person entfernen. Sie ersetzt keine Rechtsberatung: Welche Rechtsgrundlage und welche Fristen für Ihr Unternehmen gelten, klären Sie mit Ihrem Datenschutzbeauftragten.
Voraussetzungen
- WordPress: Contact Form 7 6.1.7 und Flamingo 2.6.4 verlangen laut wordpress.org mindestens WordPress 6.7 und sind bis 7.1.2 getestet. Geprüft mit WordPress 7.1.2.
- PHP: mindestens 7.4 laut Plugin-Seiten, im Test PHP 8.4.
- Zugriff: Benutzer mit der Rolle Administrator. Für die automatische Löschung in Schritt 5 zusätzlich SSH mit WP-CLI und die Möglichkeit, einen Cronjob anzulegen.
- HTTPS: Die Website muss vollständig verschlüsselt ausgeliefert werden, sonst gehen Formulardaten im Klartext durchs Netz. Anleitung: WordPress auf HTTPS umstellen.
- Datenschutzerklärung: eine veröffentlichte Seite, die unter „Einstellungen > Datenschutz“ als Datenschutzerklärung hinterlegt ist.
- Backup: eine aktuelle Sicherung der Datenbank, bevor Sie Formulare ändern oder Nachrichten massenhaft löschen.
Mit anderen Formular-Plugins funktionieren die Schritte sinngemäß; Menüpunkte und Schalter heißen dort anders.
Schritt 1: Datenfluss aufschreiben
Bevor Sie etwas einstellen, halten Sie fest, wohin die Daten einer Anfrage fließen. Nur so können Sie später Auskunft geben, löschen und die Datenschutzerklärung korrekt formulieren. Bei Contact Form 7 sind das typischerweise drei Orte:
| Ort | Was dort liegt | Wer löscht |
|---|---|---|
| E-Mail-Postfach | Benachrichtigung mit allen Feldinhalten | Sie im Mailprogramm, nicht WordPress |
| Datenbank (nur mit Flamingo) | Feldinhalte, IP-Adresse, Browserkennung, Zeitpunkt, Zustimmungstext | Schritt 5 und 6 |
| Upload-Ordner (nur mit Dateifeld) | Anhänge, vorübergehend in wpcf7_uploads | Contact Form 7 nach dem Versand |
Contact Form 7 allein speichert Anfragen nicht in der Datenbank, sondern verschickt sie per E-Mail. Erst Flamingo, ein Zusatz-Plugin vom selben Autor, legt jede Anfrage als Eintrag unter „Flamingo > Nachrichten-Eingang“ ab. Im Test speicherte Flamingo die Anfrage auch dann, wenn der Mailversand fehlschlug. Das ist praktisch, weil keine Anfrage verloren geht, schafft aber einen zweiten Datenbestand mit eigenen Löschpflichten. Den Grundsatz der Speicherbegrenzung formuliert Art. 5 Abs. 1 lit. e DSGVO.
Verifizieren: Sie haben für jedes Formular notiert, welche Felder es gibt, an welche Adresse die E-Mail geht, ob Flamingo aktiv ist und ob Dateien hochgeladen werden.
Schritt 2: Formular auf das Nötige reduzieren
Öffnen Sie Formulare > Kontaktformulare und bearbeiten Sie das Formular im Reiter „Formular“. Jedes Feld, das Sie nicht abfragen, müssen Sie nicht schützen, beschreiben und löschen. Für eine Kontaktanfrage genügen in vielen Fällen Name, E-Mail und Nachricht; eine Telefonnummer als freiwilliges Feld ohne Sternchen. Ein Beispiel, wie es im Labor lief:
<label> Name
[text* your-name maxlength:80 autocomplete:name] </label>
<label> E-Mail
[email* your-email autocomplete:email] </label>
<label> Nachricht
[textarea* your-message maxlength:2000] </label>
<p>Hinweise zur Verarbeitung Ihrer Angaben finden Sie in unserer
<a href="/datenschutz/">Datenschutzerklärung</a>.</p>
[submit "Senden"]
Der Hinweis auf die Datenschutzerklärung erfüllt die Informationspflicht nach Art. 13 DSGVO nicht allein, macht die Informationen aber zum Zeitpunkt der Erhebung auffindbar. In der Datenschutzerklärung selbst beschreiben Sie Zweck, Rechtsgrundlage, Empfänger und Speicherdauer der Formulardaten. Hilfe beim Aufbau gibt der Leitfaden unter „Einstellungen > Datenschutz“. Pflichtfelder und Längenbegrenzungen prüft Contact Form 7 auch auf dem Server; Details dazu stehen in Formulare in WordPress absichern.
Verifizieren: Das Formular zeigt nur die notwendigen Felder, freiwillige Felder sind ohne Sternchen, und der Link zur Datenschutzerklärung öffnet die richtige Seite.
Schritt 3: Einwilligung nur dort abfragen, wo sie nötig ist
Eine Checkbox „Ich stimme der Datenschutzerklärung zu“ unter jedem Formular ist verbreitet, aber oft nicht das richtige Werkzeug. Die DSGVO kennt in Art. 6 Abs. 1 neben der Einwilligung (lit. a) weitere Rechtsgrundlagen, etwa die Durchführung vorvertraglicher Maßnahmen auf Anfrage der betroffenen Person (lit. b). Eine Einwilligung kann nach Art. 7 Abs. 3 DSGVO jederzeit widerrufen werden, und der Widerruf muss so einfach sein wie die Erteilung. Stützen Sie die Beantwortung einer Anfrage auf eine Einwilligung, müssen Sie mit diesem Widerruf technisch umgehen können. Welche Rechtsgrundlage für Ihr Formular passt, ist eine rechtliche Entscheidung.
Technisch sinnvoll ist eine Einwilligung für Zwecke, die über die Beantwortung hinausgehen, zum Beispiel die längere Speicherung in der Datenbank oder die Aufnahme in einen Newsletter. Contact Form 7 bietet dafür das Feld acceptance. Mit der Option optional ist die Checkbox freiwillig, das Formular lässt sich auch ohne Haken absenden:
[acceptance zustimmung-speichern optional consent_for:storage] Ich bin einverstanden,
dass meine Anfrage zusätzlich in der Datenbank gespeichert wird. [/acceptance]
Die Option consent_for:storage verknüpft die Checkbox mit der Speicherung: Bleibt sie leer, setzt Contact Form 7 intern das Merkmal do_not_store, und Flamingo legt die Anfrage nicht ab. Setzt die Person den Haken, speichert Flamingo zusätzlich den Wortlaut der Einwilligung im Feld _consent. Im Test stand dort genau der Text der Checkbox. Damit können Sie später nachweisen, wozu die Person zugestimmt hat.
Verifizieren: Senden Sie eine Testanfrage ohne Haken und eine mit Haken. Unter „Flamingo > Nachrichten-Eingang“ erscheint nur die zweite.
Schritt 4: Speicherung bewusst festlegen
Entscheiden Sie je Formular, ob Anfragen überhaupt in der Datenbank landen sollen. Es gibt drei Varianten:
- Keine Speicherung: Flamingo nicht installieren oder im Reiter „Zusätzliche Einstellungen“ des Formulars die Zeile
do_not_store: trueeintragen. Im Test legte Flamingo mit dieser Zeile auch bei gesetztem Haken keinen Eintrag an. Die Anfrage existiert dann nur im Postfach. - Speicherung nach Zustimmung: wie in Schritt 3 mit
consent_for:storage. - Speicherung immer: Flamingo aktiv, ohne weitere Einstellung. Sinnvoll, wenn Sie Anfragen nicht verlieren dürfen, etwa weil das Postfach unzuverlässig ist. Dann brauchen Sie zwingend eine Löschfrist.
Flamingo speichert neben den Feldinhalten weitere Angaben. Im Test enthielt das Metafeld _meta unter anderem die IP-Adresse (remote_ip), die Browserkennung (user_agent), die Adresse der Seite und den Zeitpunkt. Prüfen Sie mit einem eigenen Testeintrag, was genau gespeichert wird:
wp post list --post_type=flamingo_inbound --post_status=any --fields=ID,post_date
wp post meta list ID --fields=meta_key,meta_value
Beschreiben Sie diese Angaben in der Datenschutzerklärung. Wie Sie das Speichern der IP-Adresse unterbinden, zeigt die Anleitung zu Formularen aus Schritt 2.
Verifizieren: Für jedes Formular ist eine der drei Varianten eingestellt und in der Datenschutzerklärung beschrieben.
Schritt 5: Gespeicherte Anfragen fristgerecht löschen
Legen Sie eine Frist fest, wie lange Anfragen in der Datenbank bleiben. Welche Frist angemessen ist, hängt vom Zweck ab: Eine beantwortete allgemeine Anfrage braucht selten lange aufbewahrt zu werden, eine Anfrage, aus der ein Auftrag wird, fällt womöglich unter Aufbewahrungspflichten und gehört dann in Ihr Kundensystem. Die Grundlagen beschreibt die Anleitung Löschkonzept nach DSGVO erstellen.
Flamingo selbst löscht Nachrichten nicht nach Alter. Das Plugin verschiebt stündlich nur als Spam markierte Einträge nach 30 Tagen in den Papierkorb; die Frist steuert die Konstante FLAMINGO_MOVE_TRASH_DAYS. Für normale Anfragen bauen Sie die Löschung selbst. Mit WP-CLI geht das in einem Befehl, hier für Einträge, die älter als 180 Tage sind:
cd /pfad/zu/wordpress
IDS=$(wp post list --post_type=flamingo_inbound --post_status=any \
--date_query='[{"before":"180 days ago"}]' --format=ids)
[ -n "$IDS" ] && wp post delete $IDS --force
Im Labor haben wir einen Eintrag auf ein Datum vor 200 Tagen zurückdatiert: Die Abfrage fand genau diesen, wp post delete meldete „Success: Deleted post 8.“, der aktuelle Eintrag blieb erhalten. --force umgeht den Papierkorb, sonst lägen die Daten dort weitere 30 Tage. Die Prüfung auf eine leere Liste verhindert, dass wp post delete ohne IDs mit einem Fehler mit der Meldung usage: wp post delete <id>... [--force] [--defer-term-counting] abbricht. Führen Sie den Befehl zunächst ohne die letzte Zeile aus und kontrollieren Sie die IDs. Danach tragen Sie ihn als nächtlichen Cronjob des Benutzers ein, dem die WordPress-Dateien gehören.
Ohne SSH löschen Sie unter Flamingo > Nachrichten-Eingang manuell: Einträge markieren, „In den Papierkorb verschieben“, danach den Papierkorb leeren. Tragen Sie sich dafür einen festen Termin ein.
Löschfristen, Plugin-Updates und Kontrollen sind wiederkehrende Aufgaben. Gerade Formular-Plugins sollten Sie aktuell halten, weil sie Eingaben von Fremden verarbeiten. Wer diese Pflege nicht selbst im Kalender halten möchte, kann sie abgeben: Die WordPress-Wartung von wordpressupdate.de übernimmt Updates von WordPress, Plugins und Themes mit Kompatibilitätsprüfung sowie wöchentliche Backups auf externen Speicher.
Verifizieren: Nach dem ersten Lauf zeigt wp post list --post_type=flamingo_inbound --post_status=any keine Einträge, die älter als Ihre Frist sind.
Schritt 6: Löschanfragen einzelner Personen bearbeiten
Verlangt eine Person nach Art. 17 DSGVO die Löschung ihrer Daten, nutzen Sie das in WordPress eingebaute Werkzeug. Flamingo meldet sich dort als Löschfunktion an; im Test waren neben „WordPress-Kommentare“ die Einträge „Flamingo Address Book“ und „Flamingo Inbound Messages“ registriert.
- Öffnen Sie Werkzeuge > Personenbezogene Daten löschen.
- Tragen Sie unter „Benutzername oder E-Mail-Adresse“ die Adresse ein. Mit der Option „Eine Bestätigungs-E-Mail zur Löschung personenbezogener Daten senden.“ bestätigt die Person die Anfrage per Link; das schützt vor Löschungen durch Dritte.
- Nach der Bestätigung führen Sie in der Liste der Anfragen die Löschung aus. Ohne Bestätigung steht die Aktion „Löschen personenbezogener Daten erzwingen“ zur Verfügung; nutzen Sie sie nur, wenn Sie die Identität auf anderem Weg geprüft haben.
Im Labor entfernte die Flamingo-Löschfunktion die Nachricht mit der passenden Absenderadresse vollständig (items_removed: 1). Beachten Sie zwei Grenzen: Die Benachrichtigungs-E-Mails in Ihrem Postfach erreicht WordPress nicht, die löschen Sie dort selbst. Außerdem registriert Flamingo 2.6.4 im Test keine Exportfunktion; bei einer Auskunft nach Art. 15 DSGVO müssen Sie die gespeicherten Anfragen daher manuell unter „Flamingo > Nachrichten-Eingang“ heraussuchen. Nach Art. 12 Abs. 3 DSGVO haben Sie für die Antwort grundsätzlich einen Monat Zeit.
Verifizieren: Nach der Löschung findet die Suche unter „Flamingo > Nachrichten-Eingang“ keinen Eintrag mit der Adresse mehr, und das Postfach ist ebenfalls bereinigt.
Typische Fehler
| Beobachtung | Ursache | Lösung |
|---|---|---|
| Anfragen landen in Flamingo, obwohl der Haken fehlte | consent_for:storage fehlt an der Checkbox | Option ergänzen, Testanfrage ohne Haken senden |
| Formular lässt sich ohne Haken nicht absenden | Checkbox ohne optional | optional ergänzen, wenn die Zustimmung freiwillig sein soll |
| Löschung in WordPress erledigt, Daten trotzdem vorhanden | E-Mail-Kopien im Postfach | Postfach in die Löschroutine aufnehmen |
| Cronjob löscht nichts | Falsches Verzeichnis oder falscher Benutzer | Befehl mit cd ins WordPress-Verzeichnis und als Dateibesitzer ausführen |
| Gelöschte Anfragen liegen noch im Papierkorb | Löschen ohne --force | --force verwenden oder Papierkorb leeren |
Häufige Fragen
Brauche ich unter jedem Kontaktformular eine Einwilligungs-Checkbox?
Nicht zwingend. Die DSGVO kennt neben der Einwilligung weitere Rechtsgrundlagen. Eine pauschale Pflicht-Checkbox kann sogar widersprüchlich sein, wenn die Person ohne Haken gar keine Anfrage stellen kann. Klären Sie die Rechtsgrundlage mit Ihrem Datenschutzbeauftragten.
Reicht es, Flamingo zu deinstallieren?
Prüfen Sie danach, ob die Einträge wirklich entfernt sind: wp post list --post_type=flamingo_inbound --post_status=any. Verbleibende Einträge löschen Sie vor der Deinstallation im Nachrichten-Eingang.
Was passiert mit hochgeladenen Dateien?
Contact Form 7 legt sie vorübergehend in wp-content/uploads/wpcf7_uploads ab und entfernt sie nach dem Versand. Der Anhang bleibt aber in der E-Mail und damit in Ihrem Postfach.
Muss ich den Einwilligungstext aufbewahren?
Nach Art. 7 Abs. 1 DSGVO müssen Sie eine Einwilligung nachweisen können. Flamingo speichert den Wortlaut der Checkbox mit der Anfrage; ändern Sie den Text, dokumentieren Sie die alte Fassung.
Testumfang
Wir haben in einer Testumgebung mit WordPress 7.1.2 den Formularversand und die Speicherung in Flamingo mit und ohne Einwilligung geprüft. Auch die Löschung nach Alter haben wir getestet, dafür haben wir eigens einen Eintrag zurückdatiert. Echten Mailversand und die Bestätigungs-E-Mail zur Löschanfrage haben wir nicht getestet, weil der Mailversand im Labor gesperrt war. Prüfen Sie beides deshalb vorher auf einer Kopie Ihrer Seite.
Fazit
Ein datenschutzfreundliches Kontaktformular entsteht vor allem durch Entscheidungen: wenige Felder, klare Information, Speicherung nur mit Grund und eine Löschfrist, die technisch durchgesetzt wird. Contact Form 7 und Flamingo bringen die nötigen Schalter mit, die Löschung nach Alter ergänzen Sie mit einem kurzen WP-CLI-Befehl. Die laufende Pflege der Plugins können Sie der WordPress-Wartung von Marcel Schönfelder überlassen.


