---
title: "Kontaktformulare in WordPress datenschutzfreundlich betreiben: Einwilligung, Speicherung, Löschung"
date: 2026-09-30T21:58:33+02:00
modified: 2026-11-10T14:30:18+01:00
category: wordpress
type: how_to
author: Marcel Schönfelder
canonical: https://s-edv.com/anleitungen/wordpress-kontaktformular-dsgvo-einwilligung-speicherung-loeschung
keywords:
  - WordPress
  - DSGVO
  - Contact Form 7
  - Flamingo
  - Datenschutz
reading_time: 10
---

# Kontaktformulare in WordPress datenschutzfreundlich betreiben: Einwilligung, Speicherung, Löschung

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.

**Kurzfassung:** Nur die Felder abfragen, die Sie für die Antwort brauchen, und am Formular auf die Datenschutzerklärung verweisen. Die Speicherung in der Datenbank ist eine eigene Entscheidung: Mit Flamingo lassen sich Anfragen dauerhaft speichern, per `consent_for:storage` nur nach Zustimmung oder mit `do_not_store: true` gar nicht. Gespeicherte Anfragen löschen Sie nach festgelegter Frist per WP-CLI oder unter „Flamingo > Nachrichten-Eingang“. Löschanfragen einzelner Personen bearbeiten Sie unter „Werkzeuge > Personenbezogene Daten löschen“.

## Voraussetzungen

- [ ] **WordPress:** Contact Form 7 verlangt laut readme.txt ab Version 6.2 mindestens WordPress 7.1, Flamingo 2.6.4 mindestens WordPress 6.7. Geprüft mit WordPress 7.1.2 und Contact Form 7 6.1.7.
- [ ] **PHP:** Contact Form 7 verlangt ab Version 6.2 PHP 8.3, Flamingo PHP 7.4. 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](https://s-edv.com/anleitungen/wordpress-https-umstellen-ssl-mixed-content-beheben).
- [ ] **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.

> **Prüfen:** 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. Das getestete Formular sah so aus:

```plaintext
<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](https://s-edv.com/anleitungen/wordpress-formulare-absichern-validierung-uploads-datenschutz).

> **Prüfen:** 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:

```plaintext
[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.

> **Prüfen:** 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: true` eintragen. 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:

```bash
$ 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.

> **Prüfen:** 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](https://s-edv.com/anleitungen/dsgvo-loeschkonzept-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:

```bash
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 Beispiel wurde ein 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](https://wordpressupdate.de/?utm_source=s-edv.com&utm_medium=artikel&utm_campaign=66) übernimmt Updates von WordPress, Plugins und Themes mit Kompatibilitätsprüfung sowie wöchentliche Backups auf externen Speicher.

> **Prüfen:** 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.

1. Öffnen Sie **Werkzeuge > Personenbezogene Daten löschen**.
2. 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.
3. 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 Test 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.

> **Prüfen:** 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.

## 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](https://wordpressupdate.de/?utm_source=s-edv.com&utm_medium=fazit&utm_campaign=66) von Marcel Schönfelder überlassen.

## Weiterführende Anleitungen und Quellen

- [Formulare in WordPress absichern: Eingaben prüfen, Uploads begrenzen](https://s-edv.com/anleitungen/wordpress-formulare-absichern-validierung-uploads-datenschutz)
- [Spam in Kommentaren und Formularen abwehren](https://s-edv.com/anleitungen/wordpress-spam-kommentare-formulare-abwehren-datenschutz)
- [Löschkonzept nach DSGVO erstellen](https://s-edv.com/anleitungen/dsgvo-loeschkonzept-erstellen)
- [Contact Form 7 auf wordpress.org](https://wordpress.org/plugins/contact-form-7/) und [Flamingo auf wordpress.org](https://wordpress.org/plugins/flamingo/)
- [WordPress-Dokumentation: Personenbezogene Daten löschen](https://wordpress.org/documentation/article/tools-erase-personal-data-screen/)
- [DSGVO im Volltext (EUR-Lex)](https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX:32016R0679)
