Technische Bestandsaufnahme · Stichtag 18.08.2026
Einwilligung und Tracking, Pflichtangaben, Preisauszeichnung, Werbeaussagen, Produktkennzeichnung, Rechtstexte, Theme-Code
Geprüft wurden zehn Seiten: Startseite, zwei Produktseiten, Kollektionsübersicht, Warenkorb, Impressum, Datenschutzerklärung, AGB, Widerrufsbelehrung und Versandbedingungen. Gemessen wurde in drei Durchgängen mit einem echten Browser: um 14:12 Uhr ohne Interaktion, unmittelbar danach nach einem Klick auf "Ablehnen", und um 20:41 Uhr als Wiederholung. Jeder Durchgang mit geleerten Cookies, geleertem localStorage und geleertem sessionStorage, sechs Sekunden Wartezeit vor der Messung.
Ich bin kein Anwalt. Das ist eine technische Bestandsaufnahme, keine Rechtsberatung. Ich beschreibe, was der Shop technisch tut und wo das von den geltenden Vorgaben abweicht, jeweils mit Fundstelle und Quelle. Die rechtliche Bewertung im Einzelfall gehört zu einem Anwalt. Die Prüfung erhebt keinen Anspruch auf Vollständigkeit.
Der Shop ist handwerklich ordentlich gebaut. Es gibt ein Einwilligungsbanner beim Erstaufruf, mit "Ablehnen" gleichwertig auf der ersten Ebene. Alle sechs Rechtstexte sind angelegt und erreichbar. Im Checkout ist die Newsletter-Zustimmung nicht vorangekreuzt, im Warenkorb ist keine Zusatzleistung vorausgewählt.
Drei Dinge fallen auf, weil sie mit kleinem Aufwand großen Unterschied machen. Das Analyse-Skript lädt 214 Millisekunden nach dem Seitenaufruf und überträgt ab 1.980 Millisekunden, während die Einwilligungs-Schnittstelle zum selben Zeitpunkt analyticsProcessingAllowed: false meldet. Nach einem Klick auf "Ablehnen" wiederholt sich das. Die Datenschutzerklärung nennt keinen der tatsächlich geladenen Dienste. Und die Produktseite zeigt eine Stückzahl an, die weder im Server-HTML variiert noch aus einem geführten Bestand stammt.
Der zweite Block sind Angaben, die sich an verschiedenen Stellen des Shops widersprechen. Die Versandkosten stehen an fünf Stellen, zwei davon schließen einander aus. Die Lieferzeit steht auf der Produktseite anders als in den Versandbedingungen. Solche Punkte lassen sich ohne Messwerkzeug nachvollziehen, sie stehen auf der Seite.
| Nr | Fund | Status | Aufwand |
|---|---|---|---|
| 01 | Analyse-Dienst lädt und überträgt vor der Einwilligung | Weicht ab | klein |
| 02 | Analyse-Dienst lädt und überträgt auch nach "Ablehnen" | Weicht ab | klein |
| 03 | Schriftarten werden von fremden Servern nachgeladen | Weicht ab | klein |
| 04 | Datenschutzerklärung nennt keinen der geladenen Dienste | Fehlt | mittel |
| 05 | Link "Cookie-Einstellungen" zeigt auf eine 404-Seite | Weicht ab | klein |
| 06 | Newsletter-Popup ohne Hinweis auf die Datenverarbeitung | Fehlt | klein |
| 07 | Kontaktformular ohne Datenschutzhinweis | Fehlt | klein |
| 08 | Umsatzsteuer-Identifikationsnummer im Impressum nicht auffindbar | Klärung nötig | klein |
| 09 | Muster-Widerrufsformular enthält unausgefüllte Platzhalter | Fehlt | klein |
| 10 | Zwei verschiedene Widerrufsfristen im selben Shop | Weicht ab | klein |
| 11 | Widerrufsbelehrung nennt die Adresse der Online-Funktion nicht | Fehlt | klein |
| 12 | Streichpreis ohne Angabe des niedrigsten Preises der letzten 30 Tage | Fehlt | klein |
| 13 | Kollektionsseite ohne Steuer- und Versandkostenhinweis | Fehlt | klein |
| 14 | Versandkostenangaben widersprechen sich an fünf Stellen | Weicht ab | klein |
| 15 | Lieferzeit auf Produktseite und Versandseite weicht voneinander ab | Weicht ab | klein |
| 16 | Rabattangabe ohne den Preis, auf den sie sich bezieht | Weicht ab | klein |
| 17 | Lagerhinweis unabhängig vom tatsächlichen Bestand | Weicht ab | klein |
| 18 | Besucherhinweis ohne veränderlichen Wert | Weicht ab | klein |
| 19 | Garantieaussagen ohne Bedingungen und mit zwei Dauern | Weicht ab | mittel |
| 20 | Kein Hinweis, ob und wie die Echtheit der Bewertungen geprüft wird | Fehlt | klein |
| 21 | Zwei verschiedene Durchschnittsnoten auf derselben Seite | Weicht ab | klein |
| 22 | Kundenzahl im Fließtext ohne Fundstelle | Nachweis nötig | klein |
| 23 | Hersteller- und Kontaktangaben im Angebot nicht auffindbar | Fehlt | mittel |
| 24 | Englische Platzhaltertexte aus der Theme-Vorlage | Weicht ab | klein |
| OK | 14 Punkte in Ordnung, Liste am Ende des Berichts | In Ordnung | entfällt |
Im vollständigen Bericht steht jeder der 24 Funde in dieser Form.
<head> des vom Server ausgelieferten HTML, zwischen den Kommentaren BEGIN app block und END app block.currentVisitorConsent {marketing:"", analytics:""}
shouldShowBanner true
analyticsProcessingAllowed false
marketingAllowed false
| Zeit | Art | Aufruf |
|---|---|---|
| 214 ms | script | analyse-anbieter.example/tag/xxxxx |
| 338 ms | script | scripts.analyse-anbieter.example/0.8.69/lib.js |
| 1.980 ms | xhr | t.analyse-anbieter.example/collect |
| 63.902 ms | xhr | t.analyse-anbieter.example/collect |
Auf dem Endgerät liegen nach dem Erstaufruf ohne Interaktion sechs Schlüssel im localStorage, darunter eine Besucherkennung.
currentVisitorConsent {marketing:"no", analytics:"no"}
analyticsProcessingAllowed false
Auf der neu geladenen Seite: Skript bei 402 ms, Bibliothek bei 610 ms, erste Übertragung bei 1.744 ms. Die sechs localStorage-Schlüssel bleiben gesetzt.| Nr | Messung | Ergebnis |
|---|---|---|
| 1 | Server, vier Abrufe mit cache: no-store | jeweils "8" |
| 2 | Browser, nach 6 Stunden 29 Minuten und zwei geleerten Sitzungen | wieder "8" |
| 3 | Shopdaten, inventory_management | null |
Für das Produkt wird im Shopsystem kein Bestand geführt. Der angezeigte Wert verändert sich über beide Durchgänge nicht.
Suche nach einem Bezugswert im gerenderten Seiteninhalt mit geöffneten Akkordeons, in den eingebetteten Rahmen, in den Shadow Roots und in allen sechs Produktbildern einzeln: Treffer für "niedrigst" 0, "Bestpreis" 0, "letzten 30 Tage" 0, "30 Tagen" 0.
Nachgerechnet: 129,90 minus 79,90 ergibt 50,00. 50,00 geteilt durch 129,90 ergibt 38,49 Prozent, kaufmännisch gerundet die angezeigten 38 Prozent. Die Prozentangabe passt damit zu den beiden angezeigten Preisen.
| Fundstelle | Angabe |
|---|---|
| Ankündigungsleiste, alle Seiten | "Gratis-Versand ab 60 €" |
| Produktseite, Akkordeon | "gratis ab 60 € (sonst 4,90 €)" |
| Vertrauenszeile unter dem Kaufbereich | "Kostenloser Versand" ohne Bedingung |
| Warenkorb | "Versandkosten werden an der Kasse berechnet." |
| Versandbedingungen | "Der Versand innerhalb Deutschlands ist kostenlos." |
Im Warenkorb mit einem Artikel zu 39,90 €, also unterhalb der Schwelle, stehen zwei Aussagen direkt untereinander: "Versandkosten werden an der Kasse berechnet." und "Kostenloser Versand". Damit stehen zwei einander ausschließende Aussagen im Shop.
Das ist kein Füller. Es zeigt, wo der Shop schon steht, und gehört genauso in den Bericht wie die Funde.
| Punkt | Gemessen |
|---|---|
| Einwilligungsbanner beim Erstaufruf | erscheint mit geleerten Cookies, shouldShowBanner: true |
| Ablehnen auf der ersten Ebene | gleiche Größe und Gestaltung wie "Akzeptieren" |
| Keine doppelten oder toten Tracker | kein zweites Pixel desselben Anbieters, keine Hosts ohne Auflösung |
| Newsletter im Checkout nicht vorangekreuzt | Kästchen ist beim Aufruf leer |
| Keine vorausgewählten Zusatzleistungen | Warenkorb ohne vorausgewählte Kästchen, § 312a Abs. 3 Satz 2 BGB |
Sortiert nach Aufwand gegen Sichtbarkeit, nicht nach einer Einschätzung. Was oben steht, ist schnell gemacht und fällt auf jeder Seite auf.
Damit klar ist, wo die Grenzen dieser Bestandsaufnahme liegen. Im vollständigen Bericht steht zu jedem Punkt zusätzlich, was von außen stattdessen belegbar ist.
Ein echter Befund für deinen Shop enthält dasselbe, nur mit deinen Werten: jeder Fund mit Fundstelle, wörtlichem Zitat, Norm, Screenshot und einem konkreten Fix. Dazu ein Beleg-Paket mit den Rohdaten, das du deinem Entwickler oder deiner Kanzlei direkt weiterreichen kannst. Alles schriftlich, ohne Call.
Zu den Paketen