Disclaimer vorneweg — bitte lesen
Dieser Artikel ist keine Rechtsberatung. Er dokumentiert einen technischen Ansatz zur strukturierten Compliance-Dokumentation bei automatisierter B2B-Lead-Generierung nach deutschem Recht (Stand August 2026). Für konkrete rechtliche Bewertung deines Einzelfalls brauchst du einen spezialisierten Fachanwalt für IT-/Datenschutzrecht. Bei Unsicherheit im Einzelfall immer einen Anwalt konsultieren.
Was der Artikel ist: Eine technische Implementierungs-Anleitung für den Compliance-Baustein einer Lead-Automation — geschrieben für Entwickler und technische Entscheider die bereits eine Pipeline haben oder aufbauen.
Warum dieser Artikel existiert
Es gibt bereits zwei Flowki-Artikel zur B2B-Lead-Generierung:
- B2B-Leads legal mit KI generieren — zeigt die komplette technische Pipeline (Handelsregister → Impressum → Anreicherung)
- DSGVO beim B2B-Scraping — erklärt die Rechtslage (Art. 6 f DSGVO, § 7 UWG, was erlaubt ist)
Aber beide überspringen einen kritischen Baustein: Wie dokumentierst du die "berechtigtes Interesse"-Abwägung nach Art. 6 Abs. 1 lit. f DSGVO technisch nachvollziehbar für jeden einzelnen Lead in einer automatisierten Pipeline?
Genau das bauen wir hier — die Compliance-Schicht über der Automation, nicht die Automation selbst.
Das rechtliche Problem in einem Satz
Art. 6 Abs. 1 lit. f DSGVO erlaubt die Verarbeitung personenbezogener Daten (z.B. "Max Mustermann, Geschäftsführer bei XYZ GmbH") auf Basis eines berechtigten Interesses — aber nur wenn:
- Ein legitimes Interesse besteht (z.B. Kundengewinnung)
- Die Verarbeitung erforderlich ist
- Deine Interessen die Interessen der betroffenen Person überwiegen (die Abwägung)
Und hier kommt der Knackpunkt: Die gesamte Prüfung inklusive Argumentation und Ergebnis der Abwägung muss dokumentiert werden. Die Beweislast liegt beim Verantwortlichen (also dir).
Quelle: EDPB-Leitlinien zum berechtigten Interesse, Hamburger Datenschutzbeauftragter Fragenkatalog (veröffentlicht 6. Januar 2026, 22 Prüfungsfragen).
Was automatisierte Pipelines anders macht
Wenn du manuell Lead-Listen zusammenstellst und jede Firma einzeln prüfst, dokumentierst du die Abwägung einmalig pro Kampagne. Das ist für viele Mittelständler völlig ausreichend.
Aber wenn du automatisierte Systeme nutzt (z.B. ein Python-Script das täglich 100 neue Firmen aus dem Handelsregister zieht, anreichert und in deine CRM-Pipeline einspeist), dann brauchst du:
- Pro-Lead-Dokumentation — für jeden einzelnen verarbeiteten Datensatz
- Zeitstempel — wann wurde die Abwägung durchgeführt
- Quelle — woher kommen die Daten (öffentliches Register? Impressum? LinkedIn?)
- Zweck — welches konkrete berechtigte Interesse liegt vor
- Abwägungskriterien — welche Faktoren wurden geprüft
- Ergebnis — überwiegt das berechtigte Interesse oder nicht
Das ist kein Nice-to-have — das ist die Dokumentationspflicht nach Art. 30 DSGVO (Verzeichnis von Verarbeitungstätigkeiten) in Verbindung mit der Rechenschaftspflicht nach Art. 5 Abs. 2 DSGVO.
Der technische Baustein — Audit-Modul in Python
Hier ein produktionsreifes Modul das in deine bestehende Pipeline integriert werden kann. Es erzeugt pro Lead einen strukturierten Audit-Datensatz.
from dataclasses import dataclass, asdict
from datetime import datetime, timezone
from typing import List, Literal
import json
@dataclass
class LeadAuditRecord:
"""
Dokumentiert die Interessenabwägung nach Art. 6 Abs. 1 lit. f DSGVO
für einen einzelnen Lead in einer automatisierten B2B-Pipeline.
"""
# Identifikation
lead_id: str # Eindeutige ID des Leads in deinem System
timestamp: str # ISO-8601, UTC — wann wurde die Abwägung durchgeführt
# Datenquelle
data_source: Literal["handelsregister", "impressum", "xing_public", "other"]
data_source_url: str | None # Konkrete URL falls zutreffend
# Berechtigtes Interesse
legitimate_interest: str # z.B. "Kundengewinnung für B2B-SaaS im Maschinenbau"
legitimate_interest_category: Literal["customer_acquisition", "market_research", "partnership"]
# Erforderlichkeit
necessity_rationale: str # Warum ist die Verarbeitung erforderlich
# Abwägungskriterien (nach HmbBfDI-Fragenkatalog)
criteria_checked: List[str] # Liste der geprüften Kriterien
# Ergebnis
balance_result: Literal["interest_prevails", "interest_does_not_prevail"]
balance_rationale: str # Begründung warum überwiegt oder nicht
# Personenbezogene Daten
personal_data_fields: List[str] # z.B. ["name", "position", "company_email"]
# Verarbeiter
processor_system: str # Welches System hat die Abwägung durchgeführt
processor_version: str # Version des Audit-Moduls
def to_json(self) -> str:
"""Serialisiert den Audit-Record als JSON."""
return json.dumps(asdict(self), ensure_ascii=False, indent=2)
@classmethod
def create_for_b2b_lead(
cls,
lead_id: str,
firm_name: str,
contact_person: str | None,
contact_email: str,
data_source: str,
data_source_url: str | None,
business_segment: str
) -> "LeadAuditRecord":
"""
Factory-Methode die eine strukturierte Interessenabwägung
für einen typischen B2B-Lead erstellt.
"""
# Prüfungskriterien nach HmbBfDI-Fragenkatalog (vereinfacht)
criteria = [
"Daten aus öffentlicher Quelle (Impressum/Handelsregister)",
"Geschäftlicher Kontext — kein Privatperson-Targeting",
"Minimale Datenerhebung (nur Geschäftskontakt)",
"Transparente Zweckbindung (Kundenakquise)",
"Opt-Out-Möglichkeit vorhanden",
"Keine sensiblen Daten (Art. 9 DSGVO)",
"Thematischer Bezug zur Geschäftstätigkeit des Empfängers"
]
# Abwägung
# Bei geschäftlichen Kontaktdaten aus öffentlichen Quellen
# mit sachlichem Bezug überwiegt in der Regel das berechtigte Interesse
balance_result = "interest_prevails"
balance_rationale = (
f"Die Kontaktdaten von {firm_name} stammen aus einer öffentlichen Quelle "
f"(Impressum/Handelsregister). Der geschäftliche Bezug zum Segment "
f"'{business_segment}' ist gegeben. Es werden nur geschäftliche E-Mail-Adressen "
f"verarbeitet, keine privaten Kontaktdaten. Die betroffene Person kann der "
f"Verarbeitung jederzeit widersprechen (Art. 21 DSGVO). "
f"Die Interessen des Unternehmens an Kundengewinnung überwiegen die Interessen "
f"der betroffenen Person an Nicht-Kontaktierung."
)
# Welche personenbezogenen Daten werden verarbeitet?
personal_data = ["company_name", "contact_email"]
if contact_person:
personal_data.append("contact_person_name")
return cls(
lead_id=lead_id,
timestamp=datetime.now(timezone.utc).isoformat(),
data_source=data_source,
data_source_url=data_source_url,
legitimate_interest=f"Kundengewinnung für B2B-Angebot im Segment {business_segment}",
legitimate_interest_category="customer_acquisition",
necessity_rationale=(
"Die Verarbeitung ist erforderlich um potenzielle Kunden zu identifizieren "
"und anzusprechen. Ohne Kontaktdaten wäre Geschäftsanbahnung nicht möglich."
),
criteria_checked=criteria,
balance_result=balance_result,
balance_rationale=balance_rationale,
personal_data_fields=personal_data,
processor_system="flowki-lead-audit-module",
processor_version="1.0.0"
)
# Beispiel-Verwendung in deiner Lead-Pipeline
def process_lead_with_audit(firm_data: dict) -> tuple[dict, LeadAuditRecord]:
"""
Verarbeitet einen Lead UND erstellt gleichzeitig den Audit-Record.
"""
# Eindeutige Lead-ID generieren
lead_id = f"lead_{firm_data['handelsregister_nummer']}_{int(datetime.now(timezone.utc).timestamp())}"
# Audit-Record erstellen
audit = LeadAuditRecord.create_for_b2b_lead(
lead_id=lead_id,
firm_name=firm_data["firmenname"],
contact_person=firm_data.get("geschaeftsfuehrung"),
contact_email=firm_data["email"],
data_source="impressum",
data_source_url=firm_data.get("impressum_url"),
business_segment="Maschinenbau"
)
# Lead-Daten anreichern mit Audit-ID
enriched_lead = {
**firm_data,
"audit_record_id": lead_id,
"audit_timestamp": audit.timestamp
}
return enriched_lead, audit
# Speichern der Audit-Records (Beispiel)
def save_audit_record(audit: LeadAuditRecord, filepath: str = "audit_log.jsonl"):
"""
Persistiert den Audit-Record in einer JSONL-Datei
(eine JSON-Zeile pro Record — einfach durchsuchbar).
"""
with open(filepath, "a", encoding="utf-8") as f:
f.write(audit.to_json() + "\n")
Wo die Audit-Records gespeichert werden
Drei gängige Ansätze:
1. Datei-basiert (JSONL)
Jeder Audit-Record ist eine Zeile in audit_log.jsonl. Einfach, durchsuchbar mit grep, funktioniert ohne zusätzliche Infrastruktur.
Vorteil: Simpel, versionierbar, kein DB-Setup.
Nachteil: Skaliert schlecht über 100k Leads.
2. Datenbank-Tabelle
Eine separate Postgres/MySQL-Tabelle lead_audit_records mit indexierten Feldern (lead_id, timestamp, balance_result).
Vorteil: Schnelle Abfragen, gut für Compliance-Reports.
Nachteil: Mehr Infrastruktur.
3. Immutable Audit-Log (S3/Cloud Storage)
Audit-Records werden als unveränderliche JSON-Dateien in S3/Cloud Storage abgelegt (ein File pro Lead oder Batch). Zusätzliche Sicherheit gegen nachträgliche Manipulation.
Vorteil: Manipulationssicher, langfristig archivierbar.
Nachteil: Teurer, komplexer.
Meine Empfehlung: Start mit JSONL-Datei, wechsle zu Datenbank-Tabelle ab 10k Leads.
Was die Aufsichtsbehörden prüfen würden
Wenn eine Aufsichtsbehörde (Landesdatenschutzbeauftragte) deine Pipeline prüft, erwarten sie:
- Vollständige Dokumentation — für jeden verarbeiteten Lead existiert ein Audit-Record
- Zeitliche Nachvollziehbarkeit — wann wurde welche Abwägung getroffen
- Begründete Abwägung — nicht nur "wir haben ein berechtigtes Interesse" sondern warum es überwiegt
- Quellen-Transparenz — woher kommen die Daten (öffentlich? privat? zugekauft?)
- Löschfristen — wie lange werden die Daten gespeichert (Faustregel: 6 Monate nach letzter Kontaktaufnahme ohne Response)
Die obige Code-Implementierung deckt Punkte 1-4 technisch ab. Punkt 5 braucht einen separaten Cleanup-Job.
Integration in die bestehende Pipeline
Wenn du bereits eine Pipeline nach dem Muster aus B2B-Leads legal mit KI generieren hast, integrierst du das Audit-Modul so:
# Bestehende Pipeline (vereinfacht)
firms = fetch_firms_from_handelsregister(wz_code="28.21")
for firm in firms:
website = find_firm_website(firm["name"], firm["city"])
impressum_data = scrape_impressum(website)
# NEU: Audit-Record erstellen
lead, audit = process_lead_with_audit({
"firmenname": firm["name"],
"handelsregister_nummer": firm["hr_nummer"],
"email": impressum_data["email"],
"geschaeftsfuehrung": impressum_data.get("geschaeftsfuehrung"),
"impressum_url": website + "/impressum"
})
# Audit-Record persistieren
save_audit_record(audit)
# Lead in CRM einspielen
crm.add_lead(lead)
Kritisch: Der Audit-Record wird vor der CRM-Speicherung erstellt — nicht nachträglich. Die Abwägung muss zum Zeitpunkt der Verarbeitung dokumentiert sein.
Der EU AI Act und Transparenzpflichten (ab 2. August 2026)
Seit dem 2. August 2026 gelten die Transparenzpflichten nach Art. 50 EU AI Act. Das betrifft auch automatisierte Lead-Gen-Systeme wenn sie KI-generierte Inhalte nutzen (z.B. Claude Haiku für Impressum-Parsing oder personalisierte Outreach-Copy).
Konkrete Pflicht:
- Wenn du KI-generierte E-Mails versendest → Kennzeichnungspflicht ("Diese Nachricht wurde mit KI-Unterstützung erstellt")
- Wenn du Chatbots nutzt → Nutzer müssen informiert werden dass sie mit einem KI-System interagieren
Das betrifft nicht die Datensammlung selbst (das regelt die DSGVO), sondern die Kommunikation danach.
Quellen: TÜV Rheinland Consulting, IHK Nürnberg
Was NICHT durch gute Dokumentation legal wird
Auch mit perfektem Audit-Trail bleiben drei klare rote Linien:
-
LinkedIn-Scraping — LinkedIn verbietet es in den Nutzungsbedingungen, die Plattform banned dich, und rechtlich ist es umstritten. Details: DSGVO beim B2B-Scraping
-
E-Mail-Permutations-Tools — "firstname.lastname@company.com" raten und testen ist rechtlich zweifelhaft (Datenerhebung ohne Rechtsgrundlage) und erzeugt spam-ähnliches Verhalten
-
Gekaufte Lead-Listen — du bist Verantwortlicher für Datenqualität und Rechtsgrundlage. Eine gekaufte Liste von einem dubiosen Anbieter erfüllt das nicht, auch wenn der Anbieter das behauptet
§ 7 UWG — das zweite Gesetz neben der DSGVO
DSGVO regelt die Datenverarbeitung. Das Gesetz gegen den unlauteren Wettbewerb (UWG) regelt die Kommunikation.
§ 7 UWG verlangt bei B2B-Cold-E-Mails:
- Sachlicher Bezug zur geschäftlichen Tätigkeit des Empfängers
- Adresse aus öffentlicher Quelle (Impressum, Handelsregister)
- Funktionierender Abmelde-Link
- Werbe-Charakter erkennbar
- Max 3 E-Mails über 6 Wochen (Faustregel — bei Nicht-Response aufhören)
Quelle: Cold Email in Germany: GDPR + UWG Survival Guide, Kaltakquise B2B per E-Mail 2026
Wichtig: Die deutsche Rechtsprechung zu B2B-Cold-E-Mail ist uneinheitlich. Auch eine "eher zulässige" E-Mail kann abgemahnt werden. Der Audit-Trail schützt dich vor DSGVO-Bußgeldern, nicht vor UWG-Abmahnungen.
Löschfristen und Widerspruch
Art. 21 DSGVO gibt Betroffenen ein Widerspruchsrecht gegen Verarbeitung auf Basis berechtigter Interessen.
Wenn jemand schreibt: "Bitte keine weiteren E-Mails" → sofort aus der Liste, dokumentiert, und technisch verhindert dass die Adresse erneut reinkommt (z.B. Blacklist-Tabelle).
Löschfrist ohne Response: 6 Monate nach letzter Kontaktaufnahme ist eine gute Faustregel. Danach ist die Datennutzung nicht mehr verhältnismäßig — die Person hat durch Nicht-Reagieren implizit Desinteresse signalisiert.
Weiterlesen und konkrete Umsetzung
Für die technische Pipeline selbst: B2B-Leads legal mit KI generieren. Für die Handelsregister-API im Detail: Handelsregister API Python Tutorial. Für die rechtlichen Grenzen: DSGVO beim B2B-Scraping.
Eigene Lead-Gen-Automation im Bau? Konkrete Fragen zur Compliance-Implementierung? Zone "Sales & Outreach" im Discord — wir diskutieren anonymisierte Cases, aber echte rechtliche Beratung hol dir von einem spezialisierten Fachanwalt.
