diff --git a/Dashboard/app.js b/Dashboard/app.js index d52a7f7..787d7ec 100644 --- a/Dashboard/app.js +++ b/Dashboard/app.js @@ -11,11 +11,12 @@ import * as roadmap from "./seiten/roadmap.js"; import * as formate from "./seiten/formate.js"; import * as dok from "./seiten/dokumente.js"; import * as webinar from "./seiten/webinar.js"; +import * as aufgaben from "./seiten/aufgaben.js"; -const SEITEN = { start, plan, roadmap, formate, webinar, dok }; +const SEITEN = { start, plan, roadmap, aufgaben, formate, webinar, dok }; export const S = { - plan: null, roadmap: null, kanaele: null, webinar: null, dokumente: [], stand: null, + plan: null, roadmap: null, kanaele: null, webinar: null, aufgaben: null, dokumente: [], stand: null, slots: [], schritte: [], }; @@ -26,15 +27,16 @@ async function holeJson(url) { } export async function laden() { - const [p, r, k, w, d, st] = await Promise.all([ + const [p, r, k, w, a, d, st] = await Promise.all([ holeJson("/daten/redaktionsplan.json"), holeJson("/daten/roadmap.json"), holeJson("/daten/kanaele.json"), holeJson("/daten/webinar.json").catch(() => null), + holeJson("/daten/aufgaben.json").catch(() => null), holeJson("/api/dokumente"), holeJson("/api/stand"), ]); - Object.assign(S, { plan: p, roadmap: r, kanaele: k, webinar: w, dokumente: d, stand: st }); + Object.assign(S, { plan: p, roadmap: r, kanaele: k, webinar: w, aufgaben: a, dokumente: d, stand: st }); // Nach Datum sortiert. Am selben Tag gilt die Reihenfolge in der Datei. S.slots = p.slots.map((s, i) => [s, i]) .sort(([a, i], [b, j]) => a.datum.localeCompare(b.datum) || i - j) diff --git a/Dashboard/index.html b/Dashboard/index.html index 2f79caa..c448120 100644 --- a/Dashboard/index.html +++ b/Dashboard/index.html @@ -16,6 +16,7 @@ Übersicht Redaktionsplan Roadmap + Aufgaben Formate Webinar Dokumente diff --git a/Dashboard/seiten/aufgaben.js b/Dashboard/seiten/aufgaben.js new file mode 100644 index 0000000..3bccb42 --- /dev/null +++ b/Dashboard/seiten/aufgaben.js @@ -0,0 +1,80 @@ +// Aufgaben: Todo-Liste in der richtigen Reihenfolge, mit Zuständigkeit und Frist. +// +// Die Aufgaben und ihr Status stehen in daten/aufgaben.json. Abhaken geht wie +// bei der Roadmap nur lokal über serve.py, in der Freigabe ist es nur zum Lesen. + +import { S, statusSetzen } from "../app.js"; +import { heute, kurzDatum, esc, mdInline, dokLink, zustaendig, pille } from "../hilfen.js"; + +const SPEICHER = "hg-aufgaben"; +const zustand = { person: "alle", status: "alle" }; +try { Object.assign(zustand, JSON.parse(localStorage.getItem(SPEICHER) || "{}")); } catch { /* egal */ } +const merken = () => { try { localStorage.setItem(SPEICHER, JSON.stringify(zustand)); } catch { /* egal */ } }; + +const erledigt = (a) => a.status === "erledigt"; + +function passt(a) { + if (zustand.person !== "alle" && !zustaendig(a, zustand.person)) return false; + if (zustand.status === "offen" && erledigt(a)) return false; + if (zustand.status === "erledigt" && !erledigt(a)) return false; + return true; +} + +function zeile(a, h) { + const ueber = !erledigt(a) && a.faellig < h; + return `
+ +
${esc(a.id)}
+
${mdInline(a.kurz)}
+
Details${a.abhaengig ? `, braucht ${esc(a.abhaengig)}` : ""}
${mdInline(a.text)}
+
${esc(a.wer)}
+
${kurzDatum(a.faellig)}${a.laufend ? `laufend` : ""}
+
${pille(a.status)}
+
`; +} + +function gruppe(g, h) { + const zeilen = g.aufgaben.filter(passt); + if (!zeilen.length) return ""; + const fertig = g.aufgaben.filter(erledigt).length; + const anteil = Math.round((fertig / g.aufgaben.length) * 100); + return `
+

${esc(g.id)}${esc(g.titel)}bis ${kurzDatum(g.bis)}

+
${fertig} von ${g.aufgaben.length} erledigt
+ ${g.text ? `

${mdInline(g.text)}

` : ""} + ${zeilen.map((a) => zeile(a, h)).join("")} +
`; +} + +export function zeichnen(main) { + const A = S.aufgaben; + if (!A) { + main.innerHTML = `

Keine Aufgaben

daten/aufgaben.json fehlt oder ließ sich nicht lesen.

`; + return; + } + const h = heute(); + const alle = A.gruppen.flatMap((g) => g.aufgaben); + const fertig = alle.filter(erledigt).length; + const schalter = (gruppe, wert, text) => + ``; + + main.innerHTML = ` +
+

Aufgaben

+
${esc(A.titel)}. ${fertig} von ${alle.length} erledigt.
+ Planung lesen +
+
+
Wer${["alle", ...A.personen].map((p) => schalter("person", p, p === "alle" ? "Alle" : p)).join("")}
+
Status${[["alle", "Alle"], ["offen", "offen"], ["erledigt", "erledigt"]].map(([w, t]) => schalter("status", w, t)).join("")}
+
+ ${A.gruppen.map((g) => gruppe(g, h)).join("") || `
Keine Aufgaben mit diesem Filter.
`} + `; + + main.querySelectorAll("[data-gruppe]").forEach((b) => { + b.onclick = () => { zustand[b.dataset.gruppe] = b.dataset.wert; merken(); zeichnen(main); }; + }); + main.querySelectorAll("[data-haken]").forEach((box) => { + box.onchange = () => statusSetzen("aufgaben", box.dataset.haken, box.checked ? "erledigt" : "offen"); + }); +} diff --git a/Dashboard/seiten/dokumente.js b/Dashboard/seiten/dokumente.js index 88f095a..7983a2a 100644 --- a/Dashboard/seiten/dokumente.js +++ b/Dashboard/seiten/dokumente.js @@ -9,6 +9,7 @@ const STANDARD = "Brainstorming Kickoff/Strategie/Content-Strategie.md"; const ORDNER = [ ["Brainstorming Kickoff/Strategie", "Strategie"], ["webinar", "Webinar"], + ["webinar/mail-strecke", "Webinar: Mail-Strecke"], ["webinar/01-crm-marketing-vertrieb", "Webinar: CRM"], ["webinar/02-automation", "Webinar: Automation"], ["webinar/03-drumherum", "Webinar: Drumherum"], diff --git a/daten/aufgaben.json b/daten/aufgaben.json new file mode 100644 index 0000000..1ad13fc --- /dev/null +++ b/daten/aufgaben.json @@ -0,0 +1,110 @@ +{ + "stand": "2026-11-12", + "titel": "Mail-Strecke zum Webinar am 8. Dezember", + "planung": "webinar/mail-strecke/README.md", + "personen": ["Philipp", "Dejan", "Noah"], + "gruppen": [ + { + "id": "1", + "titel": "Klären und Zugänge", + "bis": "2026-11-13", + "text": "Entscheidungen mit Noah und alles, was Philipp braucht, um loszulegen.", + "aufgaben": [ + {"id": "1.1", "status": "offen", "kurz": "Kaltmails: Wer darf die Mails bekommen?", "wer": "Dejan, Noah", "faellig": "2026-11-13", "text": "Noah entscheidet: Brief und Heft als Türöffner, nur Kontakte mit Einwilligung, vorher einen Anwalt fragen. Siehe Planung, Abschnitt „Die kalten Mails“. Davon hängen alle K-Mails ab."}, + {"id": "1.2", "status": "offen", "kurz": "Mailjet auf Premium hochstufen", "wer": "Dejan, Noah", "faellig": "2026-11-13", "text": "Premium braucht es für die Automation nach dem Heft und für ein eigenes Login für Philipp. Aktuelle Preise auf mailjet.com/pricing."}, + {"id": "1.3", "status": "offen", "kurz": "Zugänge für Philipp: Mailjet, WebinarGeek, Zapier", "wer": "Dejan", "faellig": "2026-11-13", "abhaengig": "1.2", "text": "Mailjet: als Benutzer einladen, das geht erst nach 1.2. Zapier: Welches Konto nutzen wir, das von Noahs Team?"}, + {"id": "1.4", "status": "offen", "kurz": "Absenderadresse festlegen", "wer": "Dejan, Noah", "faellig": "2026-11-13", "text": "Zum Beispiel `noah@hivegrid.de`. Antworten gehen an Noahs Postfach."}, + {"id": "1.5", "status": "offen", "kurz": "Klären, wer die DNS von hivegrid.de ändern kann", "wer": "Dejan", "faellig": "2026-11-13", "text": "Braucht Philipp für 2.1."}, + {"id": "1.6", "status": "offen", "kurz": "„Google Meet“ in den Texten ersetzen", "wer": "Noah", "faellig": "2026-11-13", "text": "Betrifft K3, K9, K11, B0 bis B3, die Anmeldeseite und die Danke-Seite. Vorschlag: „live im Browser“. Den Zugangslink setzt WebinarGeek ein."}, + {"id": "1.7", "status": "offen", "kurz": "Die drei Zahlen in den Texten geradeziehen", "wer": "Noah", "faellig": "2026-11-16", "text": "In K7 und K11 die drei Zahlen ausschreiben, in K9 oder K10 nach Zahl 3 fragen, den Selbsttest im Heft prüfen. Planung, Punkt 13."}, + {"id": "1.8", "status": "offen", "kurz": "Klären, wer die Antworten auf die Mails beantwortet", "wer": "Noah", "faellig": "2026-11-16", "text": "K1 bittet ausdrücklich um eine Antwort, dazu kommen Abwesenheitsnotizen."} + ] + }, + { + "id": "2", + "titel": "Mailjet einrichten", + "bis": "2026-11-16", + "text": "Die Grundlagen, die alle Mails brauchen. Anleitung in der Planung, Schritt 2 bis 4.", + "aufgaben": [ + {"id": "2.1", "status": "offen", "kurz": "Absenderdomain `hivegrid.de` bestätigen", "wer": "Philipp", "faellig": "2026-11-16", "abhaengig": "1.5", "text": "In Mailjet die Einträge für SPF und DKIM holen und mit dem DNS-Zuständigen eintragen, dazu einen DMARC-Eintrag. Ohne sie landen die Mails im Spam."}, + {"id": "2.2", "status": "offen", "kurz": "Absender „Noah Geerkens“ anlegen und bestätigen", "wer": "Philipp", "faellig": "2026-11-16", "abhaengig": "1.4", "text": "Adresse aus 1.4, Antworten an Noah."}, + {"id": "2.3", "status": "offen", "kurz": "Firmenadresse im Konto eintragen", "wer": "Philipp", "faellig": "2026-11-16", "text": "Sie steht im Fuß jeder Mail: HiveGrid GmbH i. G., Xantener Straße 235a, 47495 Rheinberg."}, + {"id": "2.4", "status": "offen", "kurz": "Kontakteigenschaften anlegen", "wer": "Philipp", "faellig": "2026-11-16", "text": "`vorname`, `betrieb` und `anrede` als Text, `angemeldet` als Ja/Nein, `teilnahme` als Text."}, + {"id": "2.5", "status": "offen", "kurz": "Listen anlegen", "wer": "Philipp", "faellig": "2026-11-16", "text": "„W0812 Verteiler“, „W0812 Angemeldet“ (bleibt leer, Zapier füllt sie) und „W0812 Test“ mit unseren eigenen Adressen."}, + {"id": "2.6", "status": "offen", "kurz": "Segmente anlegen", "wer": "Philipp", "faellig": "2026-11-16", "abhaengig": "2.4, 2.5", "text": "„noch nicht angemeldet“: Verteiler, `angemeldet` ist nicht Ja. „teilgenommen“ und „nicht erschienen“: Angemeldet, nach `teilnahme`."}, + {"id": "2.7", "status": "offen", "kurz": "Vorlage im Brief-Look bauen", "wer": "Philipp", "faellig": "2026-11-16", "text": "Weißer Hintergrund, nur Text, kein Bild oben, keine großen Knöpfe, Links im Text. Im Fuß Abmelde-Link und Impressum."}, + {"id": "2.8", "status": "offen", "kurz": "Heft hochladen und Link festlegen", "wer": "Dejan", "faellig": "2026-11-16", "text": "Der Link kommt in B0, in K2 und unter jede K-Mail ab K3."} + ] + }, + { + "id": "3", + "titel": "WebinarGeek und Anmeldeseite", + "bis": "2026-11-17", + "text": "Alles muss stehen, bevor `webinar.hivegrid.de` live geht. Sonst bekommt, wer sich anmeldet, keine Bestätigung.", + "aufgaben": [ + {"id": "3.1", "status": "offen", "kurz": "Webinar in WebinarGeek anlegen", "wer": "Philipp", "faellig": "2026-11-16", "text": "Dienstag, 08.12., 18 Uhr, eine Stunde. Im Tarif prüfen, wie viele Teilnehmer gehen und ob der Call-to-Action-Knopf drin ist."}, + {"id": "3.2", "status": "offen", "kurz": "B0 als Bestätigung einsetzen", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "1.6, 2.8", "text": "Noahs Text mit dem eigenen Zugangslink und dem Heft-Link."}, + {"id": "3.3", "status": "offen", "kurz": "B1 als Erinnerung 24 Stunden vorher", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "1.6", "text": "Geht am Mo 07.12. um 18 Uhr raus, mit dem eigenen Zugangslink."}, + {"id": "3.4", "status": "offen", "kurz": "B2 als Erinnerung 9 Stunden vorher", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "1.6", "text": "Geht am Di 08.12. um 9 Uhr raus, mit dem eigenen Zugangslink."}, + {"id": "3.5", "status": "offen", "kurz": "B3 als Erinnerung eine Stunde vorher", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "1.6", "text": "Geht am Di 08.12. um 17 Uhr raus, mit dem eigenen Zugangslink."}, + {"id": "3.6", "status": "offen", "kurz": "Absender und Standard-Mails in WebinarGeek", "wer": "Philipp", "faellig": "2026-11-17", "text": "Absendername „Noah Geerkens“ und Antworten an Noah, wenn WebinarGeek das zulässt. Standard-Mails abschalten, die wir nicht wollen, damit niemand doppelt Post bekommt."}, + {"id": "3.7", "status": "offen", "kurz": "Zapier: Anmeldung nach Mailjet", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "1.3, 2.4, 2.5", "text": "Neue Anmeldung in WebinarGeek: Der Kontakt kommt auf „W0812 Verteiler“ und „W0812 Angemeldet“, mit `angemeldet` = Ja, Vorname und Betrieb."}, + {"id": "3.8", "status": "offen", "kurz": "Zapier: Zuschauen nach Mailjet", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "1.3, 2.4", "text": "Webinar angesehen in WebinarGeek: In Mailjet wird `teilnahme` = „teilgenommen“ gesetzt."}, + {"id": "3.9", "status": "offen", "kurz": "Datenschutz", "wer": "Dejan, Noah", "faellig": "2026-11-17", "text": "Mit Mailjet und WebinarGeek je einen Vertrag zur Auftragsverarbeitung schließen und beide in die Datenschutzerklärung aufnehmen. Die Zustimmung nachweisbar speichern und den Zweck der Mobilnummer nennen."}, + {"id": "3.10", "status": "offen", "kurz": "`webinar.hivegrid.de` live schalten", "wer": "Dejan", "faellig": "2026-11-17", "abhaengig": "3.2, 3.7", "text": "Mit dem eingebetteten Formular von WebinarGeek. Erst schalten, wenn 3.2 bis 3.8 stehen."}, + {"id": "3.11", "status": "offen", "kurz": "Test: selbst anmelden", "wer": "Philipp", "faellig": "2026-11-17", "abhaengig": "3.10", "text": "Kommt B0 mit dem eigenen Link und dem Heft? Steht der Kontakt danach in Mailjet auf beiden Listen, mit `angemeldet` = Ja? Wird beim Ansehen eines Test-Webinars `teilnahme` gesetzt?"} + ] + }, + { + "id": "4", + "titel": "K-Mails", + "bis": "2026-12-06", + "text": "Hängt an 1.1. Für jede Kampagne gilt: anlegen, Testmail an „W0812 Test“, Dejan liest gegen, einplanen. Abhaken, wenn sie eingeplant ist. K5 und K6 entfallen.", + "aufgaben": [ + {"id": "4.1", "status": "offen", "kurz": "Kontakte importieren, nur mit Einwilligung", "wer": "Philipp", "faellig": "2026-11-16", "abhaengig": "1.1", "text": "CSV mit `email`, `vorname`, `betrieb`, `anrede` und `angemeldet` = Nein. Doppelte und tote Adressen raus. Die kalte Liste nicht importieren."}, + {"id": "4.2", "status": "offen", "kurz": "Test: Postfächer", "wer": "Philipp", "faellig": "2026-11-16", "abhaengig": "2.1, 2.7", "text": "Testmail an Gmail, Outlook, GMX, web.de und T-Online schicken. Landet sie im Posteingang?"}, + {"id": "4.3", "status": "offen", "kurz": "Test: Anrede ohne Vornamen", "wer": "Philipp", "faellig": "2026-11-16", "text": "Steht dort „Moin,“ und nicht „Moin ,“?"}, + {"id": "4.4", "status": "offen", "kurz": "Test: Abmelden", "wer": "Philipp", "faellig": "2026-11-16", "text": "Aus einer Test-Kampagne abmelden. Bekommt der Kontakt danach noch Mails aus der anderen Liste? Wenn ja, alle Abmeldungen vor jedem Versand in die Ausschlussliste eintragen."}, + {"id": "4.5", "status": "offen", "kurz": "Test: Liste beim Versand", "wer": "Philipp", "faellig": "2026-11-16", "text": "Eine Kampagne an „W0812 Test“ planen und danach eine Adresse hinzufügen. Bekommt sie die Mail? Das ist wichtig für K11 und B4."}, + {"id": "4.6", "status": "offen", "kurz": "K1 „Ich war nicht der Chef“", "wer": "Philipp", "faellig": "2026-11-16", "abhaengig": "1.1", "text": "An den Verteiler, Di 17.11., 7 Uhr. Entfällt, wenn K1 als Brief rausgeht (4.7)."}, + {"id": "4.7", "status": "offen", "kurz": "Nur beim Brief-Weg: K1 als Brief", "wer": "Dejan, Noah", "faellig": "2026-11-20", "abhaengig": "1.1", "text": "Der Text von K1 mit QR-Code und Link zum Heft, Druck und Versand an die 2.816 Betriebe. Vorher rechtlich gegenprüfen."}, + {"id": "4.8", "status": "offen", "kurz": "Nur beim Heft-Weg: Formular „Heft holen“ und K2 als Automation", "wer": "Philipp", "faellig": "2026-11-18", "abhaengig": "1.1, 1.2", "text": "Formular mit dem Häkchen „Schick mir bis zum Webinar Noahs Mails“. Der Kontakt kommt auf „W0812 Verteiler“, eine Automation schickt K2 sofort. Dann entfällt 4.9."}, + {"id": "4.9", "status": "offen", "kurz": "K2 „Jede Frage lief über meinen Tisch“", "wer": "Philipp", "faellig": "2026-11-18", "abhaengig": "1.1", "text": "An den Verteiler, Do 19.11., 7 Uhr."}, + {"id": "4.10", "status": "offen", "kurz": "K3 „Jedes Programm war eine Insel“", "wer": "Philipp", "faellig": "2026-11-23", "text": "An den Verteiler, Di 24.11., 7 Uhr."}, + {"id": "4.11", "status": "offen", "kurz": "K4 „Eine Anfrage, dreimal getippt“", "wer": "Philipp", "faellig": "2026-11-25", "text": "An den Verteiler, Do 26.11., 7 Uhr."}, + {"id": "4.12", "status": "offen", "kurz": "K7 „In zehn Tagen“", "wer": "Philipp", "faellig": "2026-11-27", "text": "An den Verteiler, Sa 28.11., 8 Uhr."}, + {"id": "4.13", "status": "offen", "kurz": "K8 „Lebenslauf einer Wärmepumpe“", "wer": "Philipp", "faellig": "2026-11-30", "text": "An den Verteiler, Di 01.12., 7 Uhr."}, + {"id": "4.14", "status": "offen", "kurz": "K9 „Klingt gut, oder?“", "wer": "Philipp", "faellig": "2026-12-02", "text": "An den Verteiler, Do 03.12., 7 Uhr."}, + {"id": "4.15", "status": "offen", "kurz": "K10 „Trotzdem lief alles über meinen Tisch“", "wer": "Philipp", "faellig": "2026-12-04", "text": "An den Verteiler, Sa 05.12., 8 Uhr."}, + {"id": "4.16", "status": "offen", "kurz": "K11 „Morgen Abend, 18 Uhr“", "wer": "Philipp", "faellig": "2026-12-06", "abhaengig": "2.6", "text": "Nur an das Segment „noch nicht angemeldet“, Mo 07.12., 7 Uhr. Angemeldete bekommen stattdessen B1 von WebinarGeek."} + ] + }, + { + "id": "5", + "titel": "Nachfass-Mails B4 bis B6", + "bis": "2026-12-04", + "text": "Gehen nach dem Webinar an die Angemeldeten, mit dem Link zum Gespräch mit Haris. Für jede Kampagne gilt dasselbe wie bei den K-Mails.", + "aufgaben": [ + {"id": "5.1", "status": "offen", "kurz": "Buchungslink für das Gespräch mit Haris", "wer": "Dejan", "faellig": "2026-11-20", "text": "Für das Erstgespräch gibt es schon Cal (Link in der Seitenleiste). Klären, ob Haris dort einen eigenen Termin über 15 Minuten bekommt. Der Link kommt in B4 bis B6."}, + {"id": "5.2", "status": "offen", "kurz": "Termin am 12. Januar bestätigen, Aufzeichnung ja oder nein", "wer": "Noah", "faellig": "2026-11-20", "text": "B4b und B6 versprechen den Termin. Gibt Noah eine Aufzeichnung frei, kann B4b sie anbieten. Bei WebinarGeek ist der Zugangslink auch der Link zur Aufzeichnung."}, + {"id": "5.3", "status": "offen", "kurz": "B4a „Danke für gestern Abend“", "wer": "Philipp", "faellig": "2026-12-04", "abhaengig": "5.1", "text": "An das Segment „teilgenommen“, Mi 09.12., 9 Uhr."}, + {"id": "5.4", "status": "offen", "kurz": "B4b „Wir haben ohne dich angefangen“", "wer": "Philipp", "faellig": "2026-12-04", "abhaengig": "5.1, 5.2", "text": "An das Segment „nicht erschienen“, Mi 09.12., 9 Uhr."}, + {"id": "5.5", "status": "offen", "kurz": "B4c „Deine drei Zahlen“ als Reserve", "wer": "Philipp", "faellig": "2026-12-04", "abhaengig": "5.1", "text": "Anlegen, aber nicht einplanen. Sie geht nur raus, wenn die Teilnahmedaten fehlen, dann an alle Angemeldeten statt B4a und B4b."}, + {"id": "5.6", "status": "offen", "kurz": "B5 „Du hast zwei Wege“", "wer": "Philipp", "faellig": "2026-12-04", "abhaengig": "5.1", "text": "An „W0812 Angemeldet“, Fr 11.12., 9 Uhr."}, + {"id": "5.7", "status": "offen", "kurz": "B6 „Letzte Mail vor Weihnachten“", "wer": "Philipp", "faellig": "2026-12-04", "abhaengig": "5.1, 5.2", "text": "An „W0812 Angemeldet“, Di 15.12., 9 Uhr."} + ] + }, + { + "id": "6", + "titel": "Während die Mails laufen und nach dem Webinar", + "bis": "2027-01-04", + "text": "", + "aufgaben": [ + {"id": "6.1", "status": "offen", "kurz": "Nach jedem Versand die Statistik prüfen", "wer": "Philipp", "faellig": "2026-12-15", "laufend": true, "text": "Zurückgekommene Mails, Spam-Meldungen, Abmeldungen. Steigen sie stark, die geplanten Kampagnen anhalten und Dejan Bescheid geben. Abhaken nach dem letzten Versand am 15.12."}, + {"id": "6.2", "status": "offen", "kurz": "Vor K11 das Segment „noch nicht angemeldet“ prüfen", "wer": "Philipp", "faellig": "2026-12-07", "text": "Am Mo 07.12. vor 7 Uhr. Kein Angemeldeter darf darin stehen."}, + {"id": "6.3", "status": "offen", "kurz": "Teilnahme in Mailjet prüfen", "wer": "Philipp", "faellig": "2026-12-08", "text": "Am Di 08.12. abends die Zahl im Segment „teilgenommen“ mit der Statistik in WebinarGeek vergleichen. Stimmt sie nicht, B4a und B4b anhalten und B4c an alle Angemeldeten schicken."}, + {"id": "6.4", "status": "offen", "kurz": "Einladung für den 12. Januar verschicken", "wer": "Dejan, Noah", "faellig": "2027-01-04", "abhaengig": "5.2", "text": "Anfang Januar, so wie es B4b und B6 versprechen."} + ] + } + ] +} diff --git a/serve.py b/serve.py index b067d7a..30de1e3 100644 --- a/serve.py +++ b/serve.py @@ -47,6 +47,7 @@ NICHT_DURCHSUCHEN = {"Dashboard", "Übersicht-Marketing-Strategie", "werkzeuge", STATUS = { "redaktionsplan": {"geplant", "fertig", "erschienen", "ausgefallen"}, "roadmap": {"offen", "läuft", "erledigt", "später", "entfällt"}, + "aufgaben": {"offen", "erledigt"}, } SICHERE_ID = re.compile(r"^[A-Za-z0-9.]{1,12}$") @@ -111,7 +112,8 @@ def status_setzen(datei, kennung, status): # Gegenprobe: gültiges JSON, und der Eintrag hat jetzt den neuen Status. daten = json.loads(neuer_text) - eintraege = daten.get("slots", []) + [s for p in daten.get("pakete", []) for s in p["schritte"]] + eintraege = (daten.get("slots", []) + [s for p in daten.get("pakete", []) for s in p["schritte"]] + + [a for g in daten.get("gruppen", []) for a in g["aufgaben"]]) if not any(e.get("id") == kennung and e.get("status") == status for e in eintraege): raise ValueError("Gegenprobe fehlgeschlagen") diff --git a/webinar/README.md b/webinar/README.md index 018bfbd..7405735 100644 --- a/webinar/README.md +++ b/webinar/README.md @@ -104,6 +104,7 @@ Umgesetzt am 16.10.: Slides „Was heute kommt“, „Dein Angebot aus dem Webin - **16.10.:** WebinarGeek recherchiert: Wie kommt der Link live zu den Leuten? Ergebnis und Vorschlag in `04-ueberraschung/README.md`. Slides und Skript sind dafür noch nicht umgestellt. - **16.10.:** Skript und Präsentation fertig (30 Slides, 15 Screenshots aus Staging). Im Dashboard gibt es die Seite **Webinar** mit Stand, Unterlagen, Ablauf und allen Slides. Ihre Daten stehen in `daten/webinar.json`. Das Skript-PDF liegt als `HiveGrid-Webinar-Skript.pdf` in diesem Ordner. - **17.10.:** Werbung fürs Webinar recherchiert, in `Ad-Recherche.md`. Danach der Post in PostGrid gebaut: `posts/post9.html`, ein Bewegtbild von 8 s (`animation/post9-animWebinar.mp4`) und eine Slide zum Anmelden. Datum, Wochentag, Uhrzeit und Dauer sind dort Platzhalter. Beschreibung in `posts/POST-webinar.md`. +- **12.11.:** Mail-Strecke für Mailjet geplant, nach Noahs Texten vom 04.11. Termin: Di 8. Dezember, 18 Uhr, über WebinarGeek. Die Texte nennen noch Google Meet, das wird angepasst. Planung und offene Punkte in `mail-strecke/README.md`. - **Davids Nachname:** Laut Teamseite der Website Bertram (`app/ueber-uns/team.ts`). Im Post steht „David Bertram“. Noch bestätigen. - **Offen:** Termin, Titel, Dauer, was das Angebot ist und bis wann es gilt, der feste Link, ob das Angebot über ein HiveGrid-Formular läuft. diff --git a/webinar/mail-strecke/README.md b/webinar/mail-strecke/README.md new file mode 100644 index 0000000..89c1555 --- /dev/null +++ b/webinar/mail-strecke/README.md @@ -0,0 +1,341 @@ +# Mail-Strecke zum Webinar am 8. Dezember: Planung für Mailjet + +**Stand:** 12.11.2026, zweite Fassung. Dejan richtet die Strecke zusammen mit Philipp in Mailjet ein. Grundlage sind Noahs Texte vom 04.11.: `Texte-Noah-Stand-2026-11-04.pdf` in diesem Ordner. + +**Die Todos:** Alle Aufgaben stehen in der richtigen Reihenfolge im Dashboard auf der Seite **Aufgaben**, mit Zuständigkeit und Frist. Diese Datei erklärt das Warum und das Wie. + +--- + +## Entschieden am 12.11. + +- **Termine:** Wir starten am Di 17.11. K5 und K6 fallen weg. Der Versandplan unten gilt. +- **Webinar über WebinarGeek**, nicht über Google Meet. Die Texte müssen an den Stellen mit „Google Meet“ angepasst werden, siehe Punkt 4 unter „Was fehlt“. +- **Das Webinar wird nach den Mails gebaut.** Was die Mails versprechen, stimmt. Die Slides vom Oktober sind überholt. +- **Links:** Dejan bereitet sie vor. `webinar.hivegrid.de` geht bald live. +- **Tarif:** Dejan stuft Mailjet nach Absprache mit Noah hoch. +- **Uhrzeiten:** Es gilt der Vorschlag im Versandplan. + +**Noch offen und blockierend:** Wer darf die Mails bekommen? Siehe „Die kalten Mails“. + +--- + +## Das Wichtigste vorweg + +- **Jede Mail ist eine eigene Kampagne.** In Mailjet ist eine Kampagne genau ein Versand: eine Mail an eine Liste zu einem Zeitpunkt. Eine Kampagne, die mehrere Mails nacheinander verschickt, gibt es nicht. Ihr legt alle vorher an und plant sie auf Tag und Uhrzeit ein. +- **B0 bis B3 verschickt WebinarGeek, nicht Mailjet.** Bei WebinarGeek bekommt jeder Angemeldete einen eigenen Zugangslink. Den kennt nur WebinarGeek. Deshalb kommen Noahs Texte für Bestätigung und Erinnerungen in die Mails von WebinarGeek. +- **In Mailjet sind es damit 13 Kampagnen:** K1 bis K4, K7 bis K11, B4 in zwei Fassungen, B5 und B6. B4c brauchen wir nur, wenn die Teilnahmedaten fehlen. +- **Zapier verbindet WebinarGeek mit Mailjet.** Wer sich anmeldet und wer zuschaut, landet automatisch in Mailjet. + +--- + +## Die kalten Mails + +### Welche Mails für den Kaltversand geschrieben sind + +**Alle K-Mails, K1 bis K11.** Im PDF steht: „Alle sind kalt, niemand kennt mich. Gruppe K geht an alle 2.816 Betriebe der Liste.“ + +- **K1 ist durch und durch kalt.** Die Mail stellt Noah Fremden vor: „Wir kennen uns nicht, deshalb erst mal das.“ „Warum ich dir schreibe: …“ „Wenn nicht, unten steht, wie du keine mehr bekommst.“ +- **K2** baut auf K1 auf („am Dienstag habe ich dir geschrieben“) und betont: „keine Anmeldung, kein Formular“. +- **K3 bis K11** sind Einladungen mit einer Geschichte. Die funktionieren genauso für Leute, die zugestimmt haben. +- **B0 bis B6 und die Anmeldeseite sind sauber.** Wer sie bekommt, hat sich angemeldet, und auf der Seite steht, welche Mails kommen. + +**Das Problem ist also nicht der Text, sondern wer ihn bekommt.** + +- Mailjet verbietet Mails an Leute, die nicht zugestimmt haben, und gekaufte Listen ausdrücklich. Mailjet droht dafür mit Sperre oder Kündigung des Kontos. Dann wären auch die Nachfass-Mails an die Angemeldeten weg. +- In Deutschland ist Werbung per E-Mail ohne vorherige Einwilligung auch zwischen Firmen nicht erlaubt (§ 7 UWG). Es drohen Abmahnungen. + +### Rechtlich eingeordnet (12.11.) + +Anlass war ein Text, der sagt: Kalte Mails an Firmen sind erlaubt, wenn das Angebot für die berufliche Tätigkeit des Empfängers sehr relevant ist. **Das stimmt für E-Mails nicht.** + +**Für die Mails an die kalte Liste heißt das:** +- Sie wären nicht legal. +- Der Grund ist nicht, dass es Massenmails zum Verkauf sind. **Es fehlt die Einwilligung.** + +**Die Regeln:** +- **E-Mail (§ 7 Abs. 2 Nr. 2 UWG):** Werbung braucht eine vorherige ausdrückliche Einwilligung. Das gilt für jeden Adressaten, also auch für Firmen. +- **Telefon (§ 7 Abs. 2 Nr. 1 UWG):** Nur hier reicht bei Firmen eine „mutmaßliche Einwilligung“. Daher kommt die Idee mit der Relevanz. Selbst hier sind die Gerichte streng. Dass ein Produkt zur Branche passt, reicht meist nicht. +- **Schon eine einzige** unerwünschte Werbemail an eine Firma ist unzulässig (BGH, Beschluss vom 20.05.2009, I ZR 218/07). Ob es eine Mail ist oder 2.816, ob sie passt oder nicht, spielt keine Rolle. +- **Die einzige Ausnahme ist § 7 Abs. 3 UWG, für eigene Bestandskunden.** Alle Bedingungen müssen erfüllt sein: + - Die Adresse stammt aus einem Verkauf an diesen Kunden. + - Beworben werden eigene, ähnliche Produkte. + - Der Kunde hat nicht widersprochen. + - Er wurde beim Erheben der Adresse und in jeder Mail auf sein Widerspruchsrecht hingewiesen. + + Fremde SHK-Betriebe aus einer Liste fallen nicht darunter. +- **UWG und DSGVO müssen beide erfüllt sein.** Bei E-Mail ohne Einwilligung scheitert es schon am UWG. +- **Bei Privatleuten** geht ohne Einwilligung gar nichts. + +**Für uns heißt das:** +- **Auch K1 ist Werbung**, obwohl sie keinen Link hat („Am Ende geht es dabei auch um HiveGrid“). Alles, was den Absatz fördern soll, zählt als Werbung, auch eine Einladung zu einem kostenlosen Webinar. +- **Das Risiko:** + - Eine Abmahnung kann jeder Empfänger schicken, außerdem Wettbewerber oder Verbände. + - Dann folgen Anwaltskosten und eine Unterlassungserklärung mit Vertragsstrafe. + - Nach DSGVO kommen Auskunftsanfragen und im Extremfall ein Bußgeld dazu. + - Bei 2.816 Empfängern und 9 Mails reicht ein Einziger, der sich wehrt. +- **Unabhängig vom Gesetz** verbietet Mailjet es sowieso. +- **Die Wege aus dem Vorschlag unten bleiben richtig:** K1 als Brief, das Heft als Türöffner mit Häkchen, danach die Mails. +- **LinkedIn heißt Posts und Anzeigen.** Massenhaft Direktnachrichten können rechtlich wie E-Mails behandelt werden. + +Das ist keine Rechtsberatung. Bevor Noah entscheidet, lohnt sich eine kurze Prüfung durch einen Anwalt für Wettbewerbsrecht, vor allem für den Brief-Weg. Die Grundregel „E-Mail-Werbung an Firmen nur mit Einwilligung“ ist in Deutschland aber eindeutig. + +### Vorschlag: erst die Zustimmung, dann die Mails + +Die Texte bleiben fast gleich, nur der Weg zu den Leuten ändert sich. + +1. **Das Heft wird der Türöffner.** Auf `webinar.hivegrid.de` kann man das Heft auch ohne Webinar-Anmeldung holen: Vorname, E-Mail und ein Häkchen „Schick mir bis zum Webinar Noahs Mails“. Wer das macht, kommt auf den Verteiler. +2. **K1 geht als Brief an die 2.816 Betriebe.** Werbung per Brief ist an Firmen ohne Einwilligung erlaubt, solange der Betrieb nicht widersprochen hat. Das bitte kurz rechtlich gegenprüfen. Der Text von K1 passt fast unverändert. Statt „Am Donnerstag schicke ich dir ein Heft“ stehen dort ein QR-Code und ein kurzer Link zum Heft. Ein Brief von Inhaber zu Inhaber fällt im Handwerk mehr auf als eine Mail. Kosten: Druck und Porto für 2.816 Briefe. +3. **K2 wird die Mail direkt nach dem Heft**, als Automation in Mailjet. Statt „am Dienstag habe ich dir geschrieben“ steht dort „du hast dir das Heft geholt“. „Keine Anmeldung, kein Formular“ fällt weg. +4. **K3 bis K11 bleiben Kampagnen mit festem Datum** an den Verteiler. Wer später dazukommt, steigt mittendrin ein. Jede Mail steht für sich, das passt. +5. **Weitere Wege auf den Verteiler:** die GET Nord vom 19. bis 21.11. (QR-Code zum Heft), LinkedIn, Anzeigen, Partner mit eigenem Verteiler. +6. **Wer von den 2.816 schon zugestimmt hat**, falls es solche gibt, kommt direkt auf den Verteiler. + +Will Noah nach einer rechtlichen Prüfung trotzdem kalt mailen, ist das seine Entscheidung. Über Mailjet geht es nach dessen eigenen Regeln aber nicht. + +**Noah entscheidet.** Bis dahin gilt im Plan: Der Verteiler sind alle, die Mails von uns bekommen dürfen. Wer das ist, steht nach der Entscheidung fest. + +--- + +## Die Begriffe in Mailjet + +| Begriff | Was es ist | Bei uns | +|---|---|---| +| **Kontakt** | eine E-Mail-Adresse | jeder auf dem Verteiler, jede Anmeldung | +| **Kontakteigenschaft** | ein Feld am Kontakt, zum Beispiel der Vorname | `vorname`, `betrieb`, `anrede`, `angemeldet`, `teilnahme` | +| **Kontaktliste** | eine Sammlung von Kontakten. Jede Kampagne geht an eine Liste. | „W0812 Verteiler“ und „W0812 Angemeldet“ | +| **Segment** | ein Filter auf eine Liste nach Eigenschaften, zum Beispiel „noch nicht angemeldet“ | für K11 und die Fassungen von B4 | +| **Kampagne** | ein Versand an eine Liste oder ein Segment, sofort oder geplant | K1 bis K11, B4 bis B6 | +| **Automation** | Mails, die ein Ereignis auslöst, zum Beispiel „Kontakt kommt auf eine Liste“ | K2, falls das Heft der Türöffner wird | +| **Vorlage** | die Gestaltung, die man für jede Kampagne kopiert | ein schlichter Brief von Noah | +| **Ausschlussliste** | wer hier steht, bekommt keine Kampagne mehr, egal aus welcher Liste | für Leute, die sich abmelden | + +--- + +## So bauen wir es auf + +**Zwei Werkzeuge, eine Verbindung** + +- **WebinarGeek:** Anmeldung, Bestätigung B0, Erinnerungen B1 bis B3, das Webinar selbst. WebinarGeek weiß, wer zugeschaut hat. +- **Mailjet:** die Geschichten K1 bis K11 an den Verteiler, danach die Nachfass-Mails B4 bis B6 mit dem Link zu Haris. +- **Zapier dazwischen.** Noahs Team nutzt Zapier sowieso jeden Tag. Zwei Abläufe: + 1. **Neue Anmeldung in WebinarGeek:** Der Kontakt kommt in Mailjet auf „W0812 Verteiler“ und „W0812 Angemeldet“, mit `angemeldet` = Ja, Vorname und Betrieb. + 2. **Webinar angesehen in WebinarGeek:** In Mailjet wird `teilnahme` = „teilgenommen“ gesetzt. + +**Zwei Listen** + +1. **W0812 Verteiler:** alle, die Mails bekommen dürfen, dazu jede Anmeldung. Diese Liste bekommt K1 bis K10. +2. **W0812 Angemeldet:** alle Anmeldungen aus WebinarGeek. Diese Liste bekommt B4 bis B6. + +Laut PDF bekommen Angemeldete die K-Mails weiter, B0 kündigt das auch an („Bis zum Termin gehen meine Mails weiter“). Deshalb kommt jede Anmeldung auf beide Listen. + +**Kontakteigenschaften** + +| Eigenschaft | Art | Inhalt | +|---|---|---| +| `vorname` | Text | aus der Liste, vom Heft-Formular oder aus WebinarGeek | +| `betrieb` | Text | Name des Betriebs | +| `anrede` | Text | fertige Begrüßung, zum Beispiel „Moin Max“, ohne Vornamen nur „Moin“. Siehe Punkt 8 unter „Was fehlt“. | +| `angemeldet` | Ja/Nein | setzt Zapier bei der Anmeldung auf Ja | +| `teilnahme` | Text | setzt Zapier auf „teilgenommen“. Alle anderen Angemeldeten waren nicht da. | + +**Segmente** + +- **W0812 noch nicht angemeldet:** Liste „Verteiler“, `angemeldet` ist nicht Ja. Für K11, denn Angemeldete bekommen am 07.12. stattdessen die Erinnerung von WebinarGeek. +- **W0812 teilgenommen:** Liste „Angemeldet“, `teilnahme` = „teilgenommen“. Für B4a. +- **W0812 nicht erschienen:** Liste „Angemeldet“, `teilnahme` ist nicht „teilgenommen“. Für B4b. + +**Abmeldungen:** Wer sich aus einer K-Mail abmeldet, darf auch keine B-Mail mehr bekommen, und umgekehrt. Ob der Abmelde-Link in Mailjet nur für eine Liste gilt oder für alle, steht nicht klar in der Hilfe. Das prüfen wir mit Test 5. Gilt er nur für eine Liste, tragen wir alle, die sich abgemeldet haben, vor jedem Versand in die Ausschlussliste ein. + +--- + +## Versandplan + +| # | Betreff | An | Wo | Datum | Uhrzeit | Links | +|---|---|---|---|---|---|---| +| K1 | Ich war nicht der Chef | Verteiler | Mailjet, oder als Brief | Di 17.11. | 07:00 | keiner, nur Antwort | +| K2 | Jede Frage lief über meinen Tisch | Verteiler | Mailjet, oder als Automation nach dem Heft | Do 19.11. | 07:00 | Heft | +| K3 | Jedes Programm war eine Insel | Verteiler | Mailjet | Di 24.11. | 07:00 | Anmeldeseite, Heft | +| K4 | Eine Anfrage, dreimal getippt | Verteiler | Mailjet | Do 26.11. | 07:00 | Anmeldeseite, Heft | +| K5 | Wenn das passiert, mach das | | | **entfällt** | | | +| K6 | 188 Schalter im Büro | | | **entfällt** | | | +| K7 | In zehn Tagen | Verteiler | Mailjet | Sa 28.11. | 08:00 | Anmeldeseite, Heft | +| K8 | Lebenslauf einer Wärmepumpe | Verteiler | Mailjet | Di 01.12. | 07:00 | Anmeldeseite, Heft | +| K9 | Klingt gut, oder? | Verteiler | Mailjet | Do 03.12. | 07:00 | Anmeldeseite, Heft | +| K10 | Trotzdem lief alles über meinen Tisch | Verteiler | Mailjet | Sa 05.12. | 08:00 | Anmeldeseite, Heft | +| K11 | Morgen Abend, 18 Uhr | Segment „noch nicht angemeldet“ | Mailjet | Mo 07.12. | 07:00 | Anmeldeseite, Heft | +| B0 | Du bist dabei: 8. Dezember, 18 Uhr | jede Anmeldung | **WebinarGeek**, Bestätigung | sofort | | eigener Zugangslink, Heft | +| B1 | Morgen Abend, 18 Uhr | Angemeldete | **WebinarGeek**, Erinnerung | 24 Std. vorher | Mo 18:00 | eigener Zugangslink | +| B2 | Heute Abend, 18 Uhr | Angemeldete | **WebinarGeek**, Erinnerung | 9 Std. vorher | Di 09:00 | eigener Zugangslink | +| B3 | In einer Stunde | Angemeldete | **WebinarGeek**, Erinnerung | 1 Std. vorher | Di 17:00 | eigener Zugangslink | +| B4a | Danke für gestern Abend | Segment „teilgenommen“ | Mailjet | Mi 09.12. | 09:00 | Haris | +| B4b | Wir haben ohne dich angefangen | Segment „nicht erschienen“ | Mailjet | Mi 09.12. | 09:00 | Haris | +| B4c | Deine drei Zahlen | nur falls die Teilnahmedaten fehlen: alle Angemeldeten, statt B4a und B4b | Mailjet | Mi 09.12. | 09:00 | Haris | +| B5 | Du hast zwei Wege | Angemeldet | Mailjet | Fr 11.12. | 09:00 | Haris | +| B6 | Letzte Mail vor Weihnachten | Angemeldet | Mailjet | Di 15.12. | 09:00 | Haris | + +**Warum diese Uhrzeiten:** Inhaber im SHK-Handwerk sind früh im Betrieb und lesen Mails, bevor der Tag losgeht. Um 7 Uhr liegt die Mail dann oben. Am Samstag eine Stunde später. Nach K2 und K3 vergleichen wir die Klicks. Die Öffnungen sind keine gute Zahl, weil Apple Mail sie verfälscht. Kommen wenige Klicks, testen wir eine Mail um 19 Uhr. Noah schreibt selbst: „Abends saß ich zwei Stunden vor meinen Mails.“ + +**Mengen:** Bei 2.816 Empfängern wären das mit 9 K-Mails gut 25.000 Mails, dazu die B-Mails. Wird das Heft der Türöffner, sind es deutlich weniger. Der Tarif muss das schaffen. Der kostenlose Tarif reicht laut Vergleichsseiten mit 6.000 Mails im Monat und 200 am Tag nicht. + +--- + +## Schritt für Schritt + +### 1. Klären, bevor wir anfangen + +Mit Noah: Wer darf die Mails bekommen? Siehe „Die kalten Mails“. Davon hängt ab, was wir importieren und ob K2 eine Automation wird. + +### 2. Konto einrichten + +- [ ] **Tarif hochstufen**, nach Absprache mit Noah. Automationen gibt es laut Mailjet nur im Tarif Premium. Mehrere Benutzer laut Vergleichsseiten auch nur dort, Segmente ab Essential. Mailjet hat die Preise am 09.09.2026 geändert, also auf mailjet.com/pricing nachsehen. Premium brauchen wir, wenn K2 als Automation läuft oder wenn beide ein eigenes Login brauchen. +- [ ] **Kollegen als Benutzer einladen.** +- [ ] **Absenderdomain `hivegrid.de` bestätigen.** Mailjet zeigt zwei Einträge für SPF und DKIM, die in die DNS-Einstellungen der Domain müssen. Dazu ein DMARC-Eintrag. Ohne diese Einträge landen Massenmails bei Gmail, Yahoo und Outlook im Spam, diese Anbieter verlangen sie inzwischen. **Wer hat Zugang zur DNS von hivegrid.de?** +- [ ] **Absender anlegen:** Name „Noah Geerkens“, Adresse zum Beispiel `noah@hivegrid.de`. Die Adresse muss Mailjet bestätigen. Antworten gehen an Noahs Postfach. +- [ ] **Firmenadresse im Konto eintragen.** Sie steht im Fuß jeder Mail: HiveGrid GmbH i. G., Xantener Straße 235a, 47495 Rheinberg. + +### 3. Kontakte vorbereiten + +- [ ] Die fünf Kontakteigenschaften von oben anlegen. +- [ ] Listen anlegen: „W0812 Verteiler“, „W0812 Angemeldet“ und „W0812 Test“ mit unseren eigenen Adressen. +- [ ] Nur Kontakte importieren, die Mails bekommen dürfen. Als CSV mit den Spalten `email`, `vorname`, `betrieb`, `anrede` und `angemeldet` (überall Nein). Doppelte Adressen, Tippfehler und tote Adressen raus. Wenn zu viele Mails zurückkommen, sperrt Mailjet den Versand. +- [ ] Die drei Segmente anlegen. + +### 4. Vorlage bauen + +- [ ] **Eine Vorlage, die wie ein Brief aussieht:** weißer Hintergrund, nur Text, kein Bild oben, keine großen Knöpfe. Links stehen im Text, so wie in Noahs Texten („hier ist dein Platz: …“). Noah schreibt als Mensch, ein Newsletter-Look würde dem widersprechen. Bei Gmail landet so etwas auch öfter im Tab „Werbung“. +- [ ] **Fuß:** Abmelde-Link und Impressum. Den Abmelde-Link fügt Mailjet in Marketing-Mails selbst ein. + +### 5. Kampagnen in Mailjet anlegen + +Für jede Mail gleich. Am besten baut ihr die erste komplett und kopiert sie dann für die anderen. + +1. **Name** (nur intern), zum Beispiel „W0812 K03 Insel“. +2. **Absender** Noah Geerkens, **Antwort an** Noah. +3. **Empfänger:** Liste oder Segment aus dem Versandplan. +4. **Betreff** und **Vorschautext** aus dem PDF. +5. **Text** aus dem PDF. Statt „Moin [Vorname],“ die Eigenschaft `anrede` einsetzen, gefolgt von einem Komma. „Google Meet“ ersetzen, siehe Punkt 4 unter „Was fehlt“. +6. **Links einsetzen**, mit einem Zusatz, an dem man erkennt, welche Mail die Anmeldung gebracht hat. Zum Beispiel `webinar.hivegrid.de/?utm_source=mailjet&utm_medium=email&utm_campaign=webinar-0812&utm_content=k03`. +7. **Testmail** an die Liste „W0812 Test“. Auf Handy und Rechner lesen, jeden Link klicken. +8. **Die zweite Person prüft.** +9. **Versand planen:** Datum und Uhrzeit aus dem Versandplan. + +### 6. Mails in WebinarGeek einrichten + +- [ ] **Bestätigung:** Noahs Text B0 einsetzen, mit dem eigenen Zugangslink und dem Heft-Link. +- [ ] **Drei Erinnerungen:** B1 24 Stunden vorher, B2 9 Stunden vorher, B3 eine Stunde vorher, jeweils mit dem eigenen Zugangslink. +- [ ] Absendername auf „Noah Geerkens“ stellen und Antworten an Noah, wenn WebinarGeek das zulässt. +- [ ] Die Standard-Mails von WebinarGeek abschalten, die wir nicht wollen, damit niemand doppelt Post bekommt. + +### 7. Anmeldeseite und Zapier + +- [ ] Auf `webinar.hivegrid.de` das Anmeldeformular von WebinarGeek einbetten. WebinarGeek bietet dafür einen Knopf, ein Formular in der Seite, einen Link und ein Widget an. So braucht es keinen eigenen Code. +- [ ] Die beiden Zapier-Abläufe von oben bauen: Anmeldung und angesehen. +- [ ] Wird das Heft der Türöffner: ein zweites Formular „Heft holen“, das den Kontakt auf „W0812 Verteiler“ setzt. Darauf startet die Automation mit K2. +- [ ] Die Mobilnummer braucht Mailjet nicht. Wo landet sie, zum Beispiel im CRM für Haris? + +### 8. Testen, spätestens zwei Tage vor K1 + +1. Über die echte Anmeldeseite anmelden: Kommt die Bestätigung von WebinarGeek mit dem eigenen Zugangslink und dem Heft? Steht der Kontakt danach in Mailjet auf beiden Listen, mit `angemeldet` = Ja? +2. Ein Testkontakt ohne Vornamen: Steht dort „Moin,“ und nicht „Moin ,“? +3. Jeder Link: Heft, Anmeldeseite, Haris. +4. Landet die Mail im Posteingang? Testen bei Gmail, Outlook, GMX, web.de und T-Online. Viele Handwerksbetriebe nutzen die drei letzten. +5. Aus einer K-Mail abmelden. Bekommt der Kontakt danach noch B-Mails? Daran sehen wir, ob die Abmeldung nur für eine Liste gilt. +6. Eine Kampagne an die Test-Liste planen und danach noch eine Adresse zur Liste hinzufügen. Bekommt die neue Adresse die Mail? Daran sehen wir, ob Mailjet die Liste beim Versand nimmt oder beim Planen. Für K11 und die B-Mails ist das wichtig. +7. Ein angemeldeter Testkontakt darf nicht im Segment „noch nicht angemeldet“ stehen. +8. Ein Test-Webinar in WebinarGeek ansehen: Setzt Zapier `teilnahme` auf „teilgenommen“? + +### 9. Während die Mails laufen + +- Nach jedem Versand in die Statistik schauen: zurückgekommene Mails, Spam-Meldungen, Abmeldungen. Steigen sie stark, die geplanten Kampagnen anhalten und mit Noah reden. +- Antworten gehen an Noah, dazu kommen Abwesenheitsnotizen. K1 bittet ausdrücklich um eine Antwort. **Wer liest und beantwortet sie?** +- Wer sich abmeldet, kommt auf die Ausschlussliste, falls Test 5 das nötig macht. + +### 10. Nach dem Webinar + +- Am Abend des 08.12. prüfen, ob die Teilnahme aus WebinarGeek in Mailjet angekommen ist. Die Zahl im Segment „teilgenommen“ muss zur Statistik in WebinarGeek passen. +- Stimmt das nicht und lässt es sich bis zum Morgen des 09.12. nicht beheben, geht nur B4c an alle Angemeldeten. Der Text passt für Teilnehmer und für die, die nicht da waren. + +--- + +## Was fehlt: Anmerkungen zu Noahs Texten + +### Blocker + +1. **Wer darf die Mails bekommen?** Offen, Noah entscheidet. Siehe „Die kalten Mails“. +2. ~~K1 und K2 sind überfällig.~~ Entschieden am 12.11.: Start am Di 17.11., K5 und K6 fallen weg. +3. **Links.** Dejan bereitet sie vor: + - **Heft-Link:** Wo liegt das Heft? Hat es den Selbsttest mit den drei Zahlen, siehe Punkt 13? + - **`webinar.hivegrid.de`:** geht bald live, mit dem Formular von WebinarGeek. + - **Zugangslink:** entfällt als fester Link. WebinarGeek setzt den eigenen Link jedes Angemeldeten ein. + - **Gesprächs-Link mit Haris:** Mit welchem Werkzeug, zum Beispiel Google-Kalender-Terminbuchung oder Calendly? + +### Wichtig + +4. **„Google Meet“ steht noch in den Texten.** Das betrifft K3, K9 und K11, außerdem B0 bis B3, die Anmeldeseite und die Danke-Seite. Vorschlag: „live im Browser“. Für „[Zugangslink Google Meet]“ kommt der eigene Link aus WebinarGeek. Den Satz „Du brauchst nur einen Browser, kein Programm“ in B0 und B1 könnt ihr so lassen. Die Danke-Seite zeigt WebinarGeek selbst, oder WebinarGeek leitet auf unsere weiter. Teilnehmerzahl und Call-to-Action im WebinarGeek-Tarif prüfen, siehe `../04-ueberraschung/README.md`. +5. **Das Webinar wird nach den Mails gebaut.** Entschieden am 12.11. Zum Abhaken, was die Mails versprechen: + - [ ] die Tafel live im CRM, Spalte für Spalte (K8, K11, B2) + - [ ] wie eine Anfrage einmal getippt in KWP, CRM und Ordner landet (K4) + - [ ] die vier Pannen (K9) + - [ ] unser Gewirr und daneben derselbe Ablauf in HiveGrid (K10) + - [ ] was in HiveGrid steckt und was nicht (K7, Anmeldeseite) + - [ ] Mitrechnen mit den drei Zahlen (K7, K11, B1 bis B3) + - [ ] eine Stunde, Fragen live + + Die Landkarte mit allen 188 Abläufen (K6) und den Abnahme-Ablauf in n8n (K5) versprechen nur K5 und K6. Die fallen weg. +6. **Uhrzeiten:** Der Vorschlag im Versandplan gilt, mit Begründung. +7. **B4 braucht die Teilnahme.** Kommt über Zapier aus WebinarGeek. Dadurch reichen B4a und B4b, B4c ist nur die Notlösung. Idee für B4b, wenn Noah eine Aufzeichnung freigibt: Bei WebinarGeek ist der Zugangslink auch der Link zur Aufzeichnung. B4b könnte also „schau es dir nachträglich an“ anbieten. +8. **Vorname.** Hat Noahs Liste überhaupt Vornamen? Kalte Listen haben oft nur `info@`-Adressen. Ohne Vornamen stünde dort „Moin ,“. Deshalb die Eigenschaft `anrede`: „Moin Max“ oder nur „Moin“, das Komma steht in der Vorlage. +9. **Termin am 12. Januar.** B4 und B6 versprechen ihn. Steht er fest, und wer schickt Anfang Januar die Einladung? +10. **Absender und Antworten.** Welche Adresse ist es genau, wer bestätigt die Domain, wer beantwortet die Antworten? Siehe Schritt 2 und 9. +11. **Datenschutz.** + - Mit Mailjet und WebinarGeek je einen Vertrag zur Auftragsverarbeitung schließen und beide in `hivegrid.de/datenschutz` aufnehmen. + - Die Mobilnummer: Zweck nennen, zum Beispiel den Rückruf von Haris, oder weglassen. + - Die Zustimmung nachweisbar speichern, mit Zeitpunkt und dem Text am Formular. In Deutschland ist Double-Opt-in üblich. Klären, ob die Bestätigung so ausreicht. +12. **Tracking der Anmeldungen.** Ohne den Link-Zusatz aus Schritt 5 sehen wir nicht, welche Mail die Anmeldungen bringt. + +### Kleinigkeiten in den Texten + +13. **Die drei Zahlen.** Noah will, dass jeder mit drei Zahlen ins Webinar kommt. Die Zahlen stammen aus dem Selbsttest im Heft. Im Webinar wird damit gerechnet, und das Gespräch mit Haris baut darauf auf. K7, K11, B1 bis B3 und B4 bis B6 sagen alle „deine drei Zahlen“. Welche das sind, steht aber nur in B4c, also ganz am Ende: + 1. Orte, an denen Infos liegen: die Kreuze im Selbsttest + 2. offene Angebote, die länger als zwei Tage ohne Anruf liegen + 3. Stunden am Tag für Mails, also das, was nur über den eigenen Tisch läuft + + **Was nicht passt:** + - Nach Zahl 1 fragt K3. Nach Zahl 2 fragt K8, ausdrücklich als „die zweite von drei Zahlen“. + - Nach Zahl 3 fragt keine K-Mail. + - K4 fragt nach einer anderen Zahl: wie oft eine Anfrage abgetippt wird, „im Selbsttest steht ein Feld dafür“. Leser halten das leicht für eine der drei. + + **Vorschlag:** + - In K7 und K11 die drei Zahlen einmal ausschreiben. Da steht ohnehin „Bring deine drei Zahlen mit“. + - In K9 oder K10 nach Zahl 3 fragen. + - Prüfen, ob der Selbsttest im Heft genau diese drei Felder hat. +14. **Angemeldete bekommen weiter „Platz sichern“.** K3 bis K10 gehen auch an Angemeldete und laden zur Anmeldung ein. Laut B0 ist das so gewollt. Wenn es stört, gehen auch K3 bis K10 nur an das Segment „noch nicht angemeldet“. Dann bekommen Angemeldete aber die Geschichten nicht mehr. + +--- + +## Offene Fragen an Noah + +- [ ] Wer darf die Mails bekommen? Woher kommen die 2.816 Adressen? Brief und Heft als Türöffner? +- [ ] Kurze Prüfung durch einen Anwalt für Wettbewerbsrecht, vor allem für den Brief-Weg +- [ ] Tarif von Mailjet hochstufen +- [ ] Heft: Wo liegt es, ist es fertig, hat der Selbsttest die drei Zahlen? +- [ ] Die drei Zahlen in K7 und K11 ausschreiben und in K9 oder K10 nach Zahl 3 fragen? +- [ ] „Google Meet“ in den Texten ersetzen +- [ ] Haris: Welcher Buchungslink? +- [ ] Absenderadresse und DNS-Zugang für hivegrid.de +- [ ] Wer beantwortet die Antworten? +- [ ] Steht der Termin am 12. Januar? Gibt es eine Aufzeichnung für B4b? + +--- + +## Quellen + +- Mailjet, gekaufte Listen: [Can I purchase a B2B contact list? Is it legal?](https://documentation.mailjet.com/hc/en-us/articles/360042624614-Can-I-purchase-a-B2B-contact-list-Is-it-legal-) und [Sending Policy](https://www.mailjet.com/sending-policy/) +- Mailjet, Automationen und Auslöser: [What is Email automation?](https://documentation.mailjet.com/hc/en-us/articles/35021196504219-Email-Automation) +- Mailjet, Automation nur im Tarif Premium: [Mailjet-Blog zu Automationen](https://mailjet.com/blog/news/mailjet-automation-anniversary) +- Mailjet, Preisänderung am 09.09.2026: [Mailjet Subscription Pricing Update](https://documentation.mailjet.com/hc/en-us/articles/25750983876763-Mailjet-Subscription-Pricing-Update-September-9-2026) +- Mailjet, Tarife im Vergleich (Drittseiten, Angaben schwanken): [Activepieces](https://www.activepieces.com/blog/mailjet-pricing-2026-plans-costs-and-add-ons), [CostBench](https://www.costbench.com/software/email-api/mailjet/free-plan/) +- Mailjet, Ausschlussliste: [Manage exclusion list](https://dev.mailjet.com/docs/email-api/contact-management/manage-exclusion-list) und [Listen verwalten](https://documentation.mailjet.com/hc/en-us/articles/360042503014-Managing-your-contact-lists) +- Mailjet, Personalisierung mit Standardwert: [What is Email Personalization?](https://documentation.mailjet.com/hc/en-us/articles/360042455754) +- WebinarGeek, Mails: [Bestätigung abschalten](https://help.webinargeek.com/en/articles/4342179-disable-confirmation-email), [Mails planen](https://help.webinargeek.com/en/articles/4269365-email-scheduling), [Nachfass-Mail](https://help.webinargeek.com/en/articles/4351632-follow-up-email) +- WebinarGeek, Anmeldung und Verbindungen: [Formular einbetten](https://help.webinargeek.com/en/articles/12051794-embed-form), [Zapier](https://help.webinargeek.com/en/articles/4273174-zapier), [Ablauf der Anmeldung](https://help.webinargeek.com/en/articles/12052145-registration-process-for-participants) diff --git a/webinar/mail-strecke/Texte-Noah-Stand-2026-11-04.pdf b/webinar/mail-strecke/Texte-Noah-Stand-2026-11-04.pdf new file mode 100644 index 0000000..440f9da Binary files /dev/null and b/webinar/mail-strecke/Texte-Noah-Stand-2026-11-04.pdf differ