Aus der Maschine: Der Newsletter, der seine eigenen Links prüft
← ZUR STARTSEITE ROCKSTRATEGE.COM
ROCKSTRATEGE · EGEKID · AUS DER MASCHINE
AUSGABE VOM 04.09.2026
Der Newsletter, der seine eigenen Links prüft.
Am vergangenen Dienstag um sechs Uhr früh ging dieser Newsletter mit „Grün ist kein Beweis“ raus. Unter dem Block ein Button, der die Geschichte versprach — und auf meinem Projektanfrage-Formular landete. Um 07:03 hatte ich es selbst im Postfach. Mein erster Satz: „Das geht gar nicht.“
Die Ursache: eine Lücke, kein Tippfehler. Meinen Newsletter baut jeden Werktag ein Generator — Recherche, Bausteine, Qualitäts-Gate, Versand. Für Dossier und Prompt des Tages legt er eigene Seiten an, für diese Rubrik hatte ich das nie vorgesehen. Also zeigte der Button aufs nächstbeste Formular — gegen meine eigene Hausregel: Was ein Button verspricht, muss hinter dem Klick liegen.
Um 07:12 war die Geschichte als eigene Seite online, plus ein Hinweis auf dem Formular für alle, die schon dort waren. Aber ein Fix repariert nur den Dienstag. Seitdem sitzt ein Wächter im Generator: Jeder Link des Rubrik-Blocks wird vor dem Versand gegen eine kurze Liste erlaubter Ziele geprüft — meine Story-Seiten, meine PDF-Handouts, mein Podcast. Ein Verstoß blockt nicht den Block, sondern den gesamten Versand, mit roter Warnung. Bewusst hart. Vorher musste er neun Gift-Tests bestehen, absichtlich kaputte Fälle: Formular geblockt, E-Mail-Link geblockt, PDF und Story durchgelassen. Neun von neun — und die eingebaute Fassung byteidentisch mit der getesteten.
Und dann der Teil, der mich mehr ärgerte als der Fehler: Zwei ältere Ausgaben hatten bewusst auf ein Formular gezeigt — ehrlich angekündigt, von mir freigegeben. Der neue Wächter hätte beide geblockt, er kannte meinen eigenen Bestand nicht. Den Einwand musste ich bringen; der Lösungsansatz hätte von der Technik kommen müssen. Seitdem gilt: Erst die legitimen Bestandsfälle inventarisieren, dann die Regel bauen — Ausnahmen als ausdrückliche Flags einplanen. Wächter v2: zwölf von zwölf Gift-Tests, wieder byteverifiziert.
ZUM NACHBAUEN · FÜNF SCHRITTE
So sitzt der Link-Wächter in deinem Generator.
Generisch für n8n, Zapier oder Make. Domains, Feldnamen und Muster sind Platzhalter — ersetz sie durch deine eigenen.
- Bestand inventarisieren — zuerst, nicht zuletzt. Alle bisher verschickten Buttons und Links deiner Rubrik auflisten: Wohin zeigten sie, und war das jeweils gewollt? Was legitim war, ist keine Ausnahme, sondern eine Anforderung an die Regel. Ergebnis: eine Liste erlaubter Zielmuster plus die bewussten Sonderfälle mit Begründung.
- Allowlist statt Verbotsliste. Erlaubte Ziele als Muster hinterlegen — eigene Story-Seiten, eigene PDF-Uploads, die Podcast-Seite. Alles, was auf kein Muster passt, ist verboten; das schließt E-Mail-Links (
mailto:) und fremde Domains automatisch ein. Für die Sonderfälle aus Schritt 1 ein Flag pro Baustein (z. B.formularOk: true), das nur bei der Freigabe gesetzt wird: Mit Flag sind Ziele auf eigenen Domains erlaubt, E-Mail-Links und Fremdziele bleiben auch dann tabu. - Prüfschritt direkt vor dem Versand. Ein Code-Schritt (n8n: Code-Node · Zapier: „Code by Zapier“ · Make: Text-Parser + Router) zieht alle
hrefaus dem Block, prüft sie gegen die Muster und schreibt bei Verstoß einen Fehler in die Daten. Der Versand-Schritt läuft nur, wenn das Fehlerfeld leer ist (IF/Filter davor). Wichtig: bei Verstoß den ganzen Versand stoppen, nicht nur den Block weglassen — sonst merkst du es nie.// n8n Code-Node („Run Once for All Items"), unmittelbar vor dem Versand-Schritt const ALLOW = [ /^https:\/\/deine-domain\.de\/story-[a-z0-9-]+\/?$/i, // eigene Story-Seiten /^https:\/\/deine-domain\.de\/wp-content\/uploads\/\S+\.pdf$/i, // eigene PDF-Handouts /^https:\/\/deine-domain\.de\/podcast\/?$/i, // Podcast-Seite ]; const OWN = /^https:\/\/deine-domain\.de\/\S*$/i; // greift NUR bei deklarierter Ausnahme const block = $input.first().json; // { html: "<tr>…</tr>", formularOk: false } const hrefs = [...block.html.matchAll(/href="([^"]+)"/g)].map(m => m[1]); const bad = hrefs.filter(u => block.formularOk === true ? !OWN.test(u) : !ALLOW.some(re => re.test(u)) ); if (bad.length) { // Versand stoppen: Fehler nach vorn reichen, Block NICHT einbauen return [{ json: { ...block, qaError: 'Link-Wächter: Ziel nicht erlaubt: ' + bad.join(', ') } }]; } return [{ json: block }];Danach ein IF-Node:
{{ $json.qaError }}leer → Versand; sonst → Alarm an dich (und kein Versand). - Gift-Tests, bevor es live geht. Den Prüf-Code lokal (z. B. mit Node.js) gegen absichtlich kaputte Fälle laufen lassen — jeder Fall ein eigener Test: Formular-Link → muss rot werden · E-Mail-Link → rot · PDF und Story-Seite → grün · Tag ohne Rubrik → nichts passiert · Flag gesetzt + Formular → grün · Flag gesetzt + fremde Domain → rot. Erst wenn du Rot gesehen hast, ist der Wächter abgenommen. Null Befunde auf gesunden Daten beweisen nichts.
- Eingebaute Fassung gegen die getestete prüfen. Nach dem Einbau den Code aus der Plattform wieder exportieren und mit der lokal getesteten Datei vergleichen (
diffoder Prüfsumme). Was du getestet hast, muss exakt das sein, was läuft — sonst hast du etwas anderes abgenommen, als du betreibst.
Du willst Automatisierungen, die sich selbst prüfen, bevor etwas rausgeht — in deinem eigenen Betrieb? Erzähl mir von deinem Projekt →