Launch-Day-Manual

7 Pflicht-Actions · ~125 Min Tech + ~60 Min Outreach · Track-State in localStorage · abannews.com

NOINDEX · INTERN · nicht teilen

Bevor du anfängst

Dieses Manual führt dich durch alle 7 Pflicht-Aktionen, die du als Mensch ausführen musst — der Code/Automation kann sie nicht für dich erledigen (API-Keys, OAuth, KYC, Outreach). Plan deinen Launch-Day so:

Markiere jeden Step als ✓ Done, ⏳ Skip oder ❌ Stuck. Bei Stuck kannst du eine Notiz hinzufügen — alles bleibt lokal (localStorage, kein Tracking, kein Cookie).

1. beehiiv-Account-Setup

Newsletter-Plattform aufsetzen — der zentrale Sender. Alles fliesst hier durch.

⏱ ~10 Min aktiv + ~24h DNS-Wait💰 Free-Tier (bis 2.5k Subs)🎯 10 Sub-Steps
1.1
Signup auf beehiiv.com
Account anlegen mit allengchour@gmail.com
⏱ 2 min🆓 Free
Stuck-Notes (bleibt lokal):

URL:https://app.beehiiv.com/signup

Felder ausfüllen:

  • Email: allengchour@gmail.com
  • Password: stark (1Password generieren), in Passwort-Manager speichern
  • First name: Allen · Last name: Ghour (oder wie auf Pass)
  • Country: Switzerland

Onboarding-Screen "What brings you here?": wähle Starting a newsletter

Skip alle Cross-Sell-Screens ("Boost-Marketplace" etc.) — kommt später. Erstmal nur Account.
"Email already in use" — du hast vorher schon getestet. Reset-Password-Flow oder neue E-Mail wie allen+beehiiv@gmail.com
Du landest im leeren beehiiv-Dashboard.
1.2
Publication "aban news" anlegen
Die Newsletter-"Publikation" mit Aban-spezifischen Werten.
⏱ 2 min
Stuck-Notes:

Click-Path: Dashboard → + Create Publication (oder direkt im Onboarding)

Werte exakt eingeben:

  • Publication name: aban news (klein, mit space)
  • Slug / Subdomain: abannews (auch wenn du eigene Domain nimmst — Fallback-URL)
  • Description: Tägliche AI-News auf Deutsch. Kein Hype, kein Bullshit. 5 Minuten Lesezeit, jeden Morgen um 7.
  • Language: German (Deutsch)
  • Timezone: Europe/Zurich
  • Industry: Technology
Slug nicht später ändern — kaputte Links. Wenn du unsicher bist: abannews ist safe (matched die Domain).
"Slug already taken" — versuche aban-news-de oder abannews-2026. Sub-Domain ist eh nur Backup.
Publication-Dashboard öffnet sich, "0 subscribers" oben rechts.
1.3
Branding: Logo + Color-Palette
Logo (☕) und Farben hochladen, damit Emails on-brand sind.
⏱ 3 min
Stuck-Notes:

Click-Path: Settings (Zahnrad) → PublicationBranding

Logo:

  • Logo (full): ~/aban-deploy/logo-full.svg hochladen (oder als PNG falls SVG nicht akzeptiert)
  • Icon (square): ~/aban-deploy/logo-icon.svg
  • Falls SVG-Problem: PNG aus ~/aban-deploy/downloads/brand-assets.zip nehmen

Color-Palette (aus downloads/color-palette.txt):

  • Primary: #7c3aed (Aban-Lila)
  • Secondary: #06b6d4 (Cyan-Accent)
  • Background: #0a0a0f (für Dark-Mode) ODER #ffffff (Light, empfohlen für Email)
  • Text: #1a1a2e
Light-Background für Emails. Dark sieht in Gmail-Mobile oft kaputt aus. Du kannst die Landing-Page dark lassen, der Newsletter muss light sein.
SVG-Upload fehlschlägt → Logo öffnen in beliebigem Online-SVG-to-PNG-Tool, dann PNG hochladen. Ich nutze cloudconvert.com.
Preview rechts zeigt Header mit deinem Logo + Farben.
1.4
Sender-Identity: hallo@abannews.com
Absender-Adresse + From-Name konfigurieren.
⏱ 1 min
Stuck-Notes:

Click-Path: Settings → PublicationSendingFrom email

  • From name: aban news
  • Reply-to email: hallo@abannews.com
  • From email (Domain): wird in Step 1.7 gesetzt (default: news@updates.beehiiv.com)
Reply-to ist wichtiger als From — Antworten gehen direkt an dich. Setz das Forwarding in Section 6 (Cloudflare Email Routing) auf allengchour@gmail.com.
From-Name "aban news" zu lang? beehiiv akzeptiert bis 25 Zeichen. "aban news" passt locker.
Settings gespeichert — grüner Bestätigungs-Toast.
1.5
API-Key generieren
Für die Make-Pipeline (Newsletter auto-versenden).
⏱ 1 min🔑 sensible Daten
Stuck-Notes:

URL:app.beehiiv.com/settings/integrations/api

Click-Path: Settings → IntegrationsAPICreate New API Key

  • Name: aban-news-make-prod
  • Permissions: Read + Write (alle Scopes anhaken)
  • Create klicken
  • Key wird nur 1× angezeigt — sofort kopieren!
Mach gleich einen zweiten Key namens aban-news-emergency-backup und leg den ins 1Password unter "Aban Vault". Falls der Prod-Key kompromittiert wird, hast du einen Notausgang.
Key vergessen zu kopieren — kein Drama, lösch ihn (Trash-Icon) und erstell einen neuen. beehiiv erlaubt unbegrenzt Keys.
Key beginnt mit bh_ (~40 Zeichen lang).
1.6
Key sicher in .beehiiv.env speichern
PowerShell-Command für lokale env-Datei (in .gitignore).
⏱ 1 min🔒 lokal only
Stuck-Notes:

PowerShell (Windows) — ein Befehl:

'BEEHIIV_API_KEY=bh_DEIN_KEY_HIER
BEEHIIV_PUB_ID=pub_HOLEN_AUS_URL
BEEHIIV_FROM_EMAIL=hallo@abannews.com' | Out-File -FilePath "$HOME\aban-deploy\.beehiiv.env" -Encoding utf8 -NoNewline

Pub-ID finden: Browser-URL auf beehiiv-Dashboard: app.beehiiv.com/publications/pub_XXXXX/... — der pub_XXXXX-Teil ist die ID.

Verify .gitignore:

Get-Content "$HOME\aban-deploy\.gitignore" | Select-String "beehiiv.env"

Falls leer: Add-Content -Path "$HOME\aban-deploy\.gitignore" -Value ".beehiiv.env"

Niemals den Key in eine Datei commiten, die nach GitHub geht. Ich check immer mit git status vor jedem push, dass .env-Files nicht aufgelistet sind.
Falls du den Key bereits committed hast: GitHub Secret Scanning warnt automatisch. Dann: Key sofort in beehiiv revoken, neuen generieren, History rewriten mit git filter-repo ist nicht nötig bei Revoke — der alte Key ist tot.
Datei ~/aban-deploy/.beehiiv.env existiert mit 3 Zeilen.
1.7
Custom Sending Domain: mail.abannews.com
Damit Emails von "mail.abannews.com" kommen, nicht von "updates.beehiiv.com".
⏱ 2 min Setup + 24h DNS-Wait
Stuck-Notes:

Click-Path: Settings → PublicationSendingCustom domainAdd domain

  • Sending subdomain: mail.abannews.com
  • From-email after activation: hallo@mail.abannews.com (technisch) — Display: hallo@abannews.com
  • beehiiv generiert 4-5 DNS-Records — zeigt sie im Modal

Records die du sehen wirst (Beispiel-Format, deine Werte werden anders sein):

TYPE HOST VALUE
TXT mail.abannews.com v=spf1 include:beehiiv.com ~all
TXT bh._domainkey.abannews.com [langer DKIM-key]
CNAME em.mail.abannews.com track.beehiiv.com
CNAME url.mail.abannews.com redirect.beehiiv.com
TXT _dmarc.abannews.com v=DMARC1; p=none; rua=mailto:hallo@abannews.com

Wichtig: Diese Records gehen in Step 1.8 zu Porkbun (oder Cloudflare wenn du in Section 6 Cloudflare-DNS aktivierst).

Mach Section 1.8 + Section 6 (Cloudflare DNS) als ein Block — der DNS-Propagation-Wait läuft parallel und du verlierst sonst 24h.
"Domain already verified by another beehiiv account" — du hast früher getestet. Support-Ticket an hi@beehiiv.com, Antwort kommt meist in 4-12h.
Modal zeigt "Awaiting DNS verification" mit gelbem Status.
1.8
DNS-Records bei Porkbun einsetzen
Die 5 Records aus 1.7 zu Porkbun (oder Cloudflare in Sec.6) hinzufügen.
⏱ 5 min Eintrag + ~30 Min bis 24h Propagation
Stuck-Notes:

Wo:porkbun.com/account/domainsabannews.comDetailsDNS Records

Format-Anweisungen pro Record-Typ:

  • TXT-Records: Bei Porkbun Host = der Subdomain-Teil ohne .abannews.com (z.B. mail statt mail.abannews.com). Answer = der komplette Value inklusive Quotes.
  • CNAME-Records: Host wie oben (z.B. em.mail). Answer = das Ziel (z.B. track.beehiiv.com), ohne abschließenden Punkt — Porkbun fügt den automatisch.
  • DMARC: Host = _dmarc. Wenn dort bereits ein Record existiert: erst löschen, dann neu anlegen (nur 1 DMARC pro Domain erlaubt!).

TTL: 600 (default) — gut. Niedriger = schneller Propagation aber höhere DNS-Last; höher = stabiler.

Verify nach 30 Min:

# Windows PowerShell:
Resolve-DnsName -Name mail.abannews.com -Type TXT
Resolve-DnsName -Name bh._domainkey.abannews.com -Type TXT
Resolve-DnsName -Name em.mail.abannews.com -Type CNAME

Oder Web: dnschecker.org (zeigt Propagation weltweit).

Wenn du in Section 6 Cloudflare-DNS aktivierst: die Records gehen dort hin, nicht zu Porkbun. Erst Section 6 entscheiden (Porkbun-DNS oder Cloudflare-DNS), dann Section 1.8 ausführen.
"DMARC syntax error" — der String darf keine smart quotes haben (Word macht das automatisch). Wenn du copy-paste aus PDF: über Notepad einmal "umlauten", dann zu Porkbun.
Nach 24h immer noch "Awaiting verification" → bei beehiiv "Re-check DNS" klicken. Oft hängt nur das beehiiv-Backend.
beehiiv-Modal: alle 5 Zeilen grün ✓, "Domain verified".
1.9
Welcome-Automation einrichten
Automatische Welcome-Mail wenn neue Subs sich eintragen.
⏱ 5 min
Stuck-Notes:

Click-Path: Sidebar → Automations+ New Automation → Template Welcome Series

  • Name: aban-welcome-v2
  • Trigger: New subscriber added
  • Delay: Immediately (nicht "1 hour" — bei DE-Newsletter erwarten Leute sofort die Bestätigung)
  • Action: Send email

Email-Content:

  • Subject: Willkommen bei aban news ☕
  • Preview-Text: Hier ist, was dich morgen früh um 7 erwartet.
  • Body: HTML aus ~/aban-deploy/willkommen.html reinkopieren (im Editor "Source" oder "Code"-Mode öffnen), OHNE<html>/<body>-Tags — nur den Inhalt des <main>-Blocks
  • Personalisierung: {{ first_name | default: "" }} einbauen
Ich pack den Welcome immer eine konkrete Frage rein: "Schreib mir kurz, was dich an AI gerade nervt." Dann hab ich sofort ein Gespräch mit Sub Nr.1.
"Body too large" → externe Assets (Bilder) raus, nur Inline-CSS. beehiiv limit ist ~100KB pro Email.
"Automation active" mit grünem Toggle. Sende eine Test-Sub auf eine 2.-Email zum Verify.
1.10
Subscribe-Form Embed in Landing-Page
Embed-Code aus beehiiv holen und in landing-ultra/index.html einsetzen.
⏱ 3 min
Stuck-Notes:

Click-Path: Subscribers → Get more subscribersEmbed Form → Style: Minimal

2 Embed-Optionen — wähle Iframe (simpler):

  • Iframe (einfach, aber styling-limitiert): copy snippet
  • API-Form (mehr Kontrolle): nur wenn du custom-styling willst

Iframe einbauen in ~/aban-deploy/index.html:

# PowerShell - find existing subscribe-section
Select-String -Path "$HOME\aban-deploy\index.html" -Pattern "subscribe-form" | Select -First 3

Dann den beehiiv-Iframe-Code an die Stelle der bestehenden Form-Section setzen. Backup-Tipp: erst eine Kopie machen: Copy-Item ~/aban-deploy/index.html ~/aban-deploy/index.html.bak

Behalte die alte Form als Fallback in einer Backup-Datei. Falls beehiiv-Iframe nicht lädt (z.B. wegen Adblocker), kannst du in 5 Min die Original-Form zurück haben.
Iframe lädt nicht in Safari → beehiiv hat manchmal CSP-Issues. Test in Chrome zuerst, dann Safari. Falls hartnäckig: API-Form-Variante nehmen.
Auf der Landing-Page erscheint das beehiiv-Form, Test-Sub mit allen+test@gmail.com → in beehiiv-Dashboard erscheint der Sub innerhalb von 30s.

2. OpenAI-Account-Setup

Fallback-Modell für die Multi-Model-Pipeline (wenn Claude rate-limited ist).

⏱ ~5 Min💰 $5 Initial-Credit🎯 7 Sub-Steps
2.1
Account anlegen
platform.openai.com/signup mit allengchour@gmail.com
⏱ 1 min
Stuck-Notes:

URL:platform.openai.com/signup

  • Email: allengchour@gmail.com (oder ChatGPT-Account weiterverwenden)
  • Phone verification: CH-Nummer (du brauchst SMS)
  • Organization-Name: aban news
  • "What will you use OpenAI for?" → Build a product
Wenn du ChatGPT-Plus hast: gleiche Email. Plus + API sind getrennt aber linked unter dem Account — du sparst eine SMS-Verification.
"Phone verification failed" → wenn deine CH-Nummer schon bei einem alten Test-Account war, blockt OpenAI. Workaround: TextNow-App für eine US-Nummer (gratis), 5 Min Setup.
Du landest auf platform.openai.com/playground.
2.2
Project erstellen: aban-news-prod
Projects isolieren Keys + Spending pro Use-Case.
⏱ 1 min
Stuck-Notes:

Click-Path: Top-Left "Default project" Dropdown → + Create project

  • Name: aban-news-prod
  • Description: Daily DE AI newsletter — multi-model fallback
  • Submit

Wechsle ins neue Project (oben links Dropdown).

Mach zusätzlich ein aban-news-dev Project für Tests. Im Make-Blueprint switchst du zwischen den Keys über die Connection-Auswahl — kein Code-Change nötig.
"Project quota reached" — Free-Tier-Limit ist 3 Projects. Lösche alte Tests oder upgrade.
Project-Dropdown oben zeigt "aban-news-prod".
2.3
API-Key mit korrekten Permissions
Scoped-Key, nur die nötigen Endpoints.
⏱ 1 min🔑 sensible Daten
Stuck-Notes:

URL:platform.openai.com/api-keys

Click-Path:+ Create new secret key

  • Name: aban-news-make-prod-v1
  • Project: aban-news-prod
  • Permissions: Restricted
  • Enable nur: /v1/chat/completions (Read+Write), /v1/models (Read)
  • Alles andere disablen — Defense in Depth

Key wird angezeigt — copy jetzt sofort (sk-proj-...).

Restricted-Permissions sind dein Schutz. Falls ein Key leakt, kann der Angreifer nicht Embedding-API o.ä. abusen.
"All-permissions" Default ist convenient aber unsicher. Bei Hobby-Projekt OK, bei abannews.com wo der Key in Make.com sitzt: restricted!
Key kopiert ins Clipboard, beginnt mit sk-proj-.
2.4
Pay-as-you-go aktivieren ($5 Initial)
Credit aufladen — sonst kein API-Call möglich.
⏱ 1 min💰 $5
Stuck-Notes:

URL:platform.openai.com/settings/organization/billing

Click-Path: Billing → Add payment method → Card: deine Visa/Mastercard → Add to credit balance$5

  • Visa/Mastercard (CH-Karte funktioniert)
  • Initial amount: $5
  • Auto-recharge: OFF (wichtig! Du willst manuelle Kontrolle.)
$5 reicht für ~2 Monate aban news bei aktuellen Token-Volumen. GPT-4o-mini kostet ~$0.15 per million input tokens. Du verbrauchst ~20k Tokens pro Newsletter = $0.003 pro Mail. Mathematik wird dich nicht arm machen.
CH-Karte abgelehnt — meistens 3DS-Verification scheitert. Im Browser CH-Bank-Sicherung 1× clicken. Wenn das fehlschlägt: Twint via Revolut → Revolut-Card.
Billing-Page zeigt Balance: $5.00.
2.5
Hard-Spending-Limit $5/mo
Safety-Net falls Make-Loop durchdreht.
⏱ 30 sec
Stuck-Notes:

URL:platform.openai.com/settings/organization/limits

  • Monthly budget: $5
  • Email threshold (notification): $3 (warnt bei 60%)
  • Project-Limit (zusätzlich für aban-news-prod): $5
Doppelte Sicherung: Org-Limit + Project-Limit. Wenn dein Dev-Project mal alle Tokens säuft, ist Prod immer noch safe.
Wenn das Limit erreicht ist, gibt OpenAI HTTP 429 zurück. Im Make-Blueprint fängt der Anthropic-Fallback das automatisch ab (siehe Step 3.7). Kein Outage.
"Usage limits set" — Toast oben rechts.
2.6
Key in .openai.env speichern
PowerShell-Command, gleiche Convention wie beehiiv.
⏱ 30 sec
Stuck-Notes:
'OPENAI_API_KEY=sk-proj-DEIN_KEY_HIER
OPENAI_PROJECT_ID=proj_HOLEN_AUS_URL
OPENAI_MODEL=gpt-4o-mini' | Out-File -FilePath "$HOME\aban-deploy\.openai.env" -Encoding utf8 -NoNewline

Project-ID findest du in der URL wenn du im Project-Dashboard bist: platform.openai.com/settings/proj_XXXX/...

Default-Modell gpt-4o-mini — Faktor 30 günstiger als gpt-4o, für News-Summarize qualitativ ausreichend. Nur für "schwere" Tasks (Investment-Analysis o.ä.) auf gpt-4o upgraden.
.gitignore-Check vergessen → siehe Step 1.6.
Datei existiert.
2.7
Test-Call via curl
Verify dass der Key funktioniert, vor Make-Wiring.
⏱ 30 sec
Stuck-Notes:

PowerShell:

$key = (Get-Content "$HOME\aban-deploy\.openai.env" | Select-String "OPENAI_API_KEY=").ToString().Split("=")[1]
$body = '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Sag hi auf Schweizerdeutsch in 5 Wörtern."}]}'
curl.exe -s https://api.openai.com/v1/chat/completions `
-H "Authorization: Bearer $key" `
-H "Content-Type: application/json" `
-d $body
Wenn der Test passt: dein Key + Billing sind gut. Wenn nicht: lies die Error-Message — die ist meistens spezifisch ("invalid_api_key" vs "insufficient_quota").
"invalid_api_key" → Key falsch kopiert (vermutlich Whitespace). Re-copy aus dem Vault.
"insufficient_quota" → Billing nicht aktiviert oder $5 nicht durch (Card-Decline). Step 2.4 wiederholen.
JSON-Response mit Feld choices[0].message.content = irgendein Schweizerdeutsch-Witz.

3. Make-Connections-Wiring

Alle Services in Make.com verbinden + Blueprint importieren + Placeholder ersetzen.

⏱ ~15 Min💰 Free-Tier (1000 ops/mo reicht für 30 Newsletter)🎯 9 Sub-Steps
3.1
Anthropic-Connection (existiert: aban-news-prod-v2)
Schon vorhanden — nur verifizieren.
⏱ 30 sec
Stuck-Notes:

URL:make.com/en/profile/connections

Suche nach aban-news-prod-v2 — sollte grün ✓ sein. Falls expired (passiert nach 90 Tagen no-use):

  • Click connection → Reauthorize
  • API-Key aus console.anthropic.com einfügen (Settings → API Keys → existing oder neuen anlegen)
Halte 2 Anthropic-Keys parallel: aban-news-prod-v2 (Make) + aban-news-cli (für deine PowerShell-Scripts). Wenn einer expired, ist immer noch eine Pipeline live.
Status "Invalid token" → Key wurde in Anthropic-Console gelöscht. Neuen generieren, in Make einsetzen.
Grüner Punkt + "Last used: today/yesterday".
3.2
OpenAI-Connection (neu anlegen)
Mit dem Key aus Step 2.6.
⏱ 1 min
Stuck-Notes:

Click-Path: Connections → + Add → Search OpenAIOpenAI (ChatGPT, Whisper, DALL-E)

  • Connection name: aban-news-openai-prod
  • API Key: aus .openai.env (OPENAI_API_KEY)
  • Organization ID: lass leer (nur 1 Org)
  • Save
Naming-Convention: aban-news-{service}-{env}. Dann findest du alles im Connections-Dashboard sortiert.
"Connection failed: 401" → Key falsch oder gelöscht. Re-check in OpenAI-Dashboard ob der Key noch aktiv ist.
Grüner Status, "Connection verified".
3.3
Gmail-Connection (Scope verify)
Existiert wahrscheinlich — Scope "Gmail Modify" nötig.
⏱ 1 min
Stuck-Notes:

Suche aban-gmail-allengchour in Connections.

Scope-Check: Click die Connection → Scopes-Tab. Du brauchst:

  • gmail.modify (für Draft anlegen + Labels)
  • gmail.send (für direkten Send — Backup wenn beehiiv mal down)
  • gmail.readonly (für Reply-Tracking)

Falls Scope fehlt: Reauthorize → Google-OAuth-Screen → alle Checkboxes anhaken.

Google warnt dich beim Reauthorize "This app isn't verified". Make ist verified seit 2021 — der Warning kommt nur weil der Scope-Update wie eine neue App aussieht. Sicher zu bestätigen.
"OAuth Error: access_denied" — du hast die Permission abgelehnt. Reauthorize, diesmal alle Checks setzen.
Connection grün, 3 Scopes gelistet.
3.4
Google Sheets-Connection
Gleicher OAuth wie Gmail, eigene Connection.
⏱ 1 min
Stuck-Notes:
  • Connections → + AddGoogle Sheets
  • Connection name: aban-sheets-allengchour
  • Sign in mit allengchour@gmail.com
  • Scope: spreadsheets (read + write)
Separate Connection für Sheets statt Gmail wiederverwenden — falls eine OAuth-Verbindung expired, läuft die andere weiter.
"Account already used" — Google erlaubt dass die gleiche Email mehrere Make-Connections hat. Falls Fehler: in Google-Account → Security → Third-party access → alte Make-Auths löschen.
Connection grün.
3.5
Slack-Webhook (optional)
Für Alerts wenn Pipeline failt. Kannst du skippen wenn kein Slack-Workspace.
⏱ 2 min⏭ optional
Stuck-Notes:

Alternativ: Email-Alert an dich selbst — falls du keinen Slack hast, skipp ich das auch.

Wenn Slack:

  • Slack → Workspace → AppsIncoming Webhooks → Add
  • Channel: #aban-alerts (neu erstellen)
  • Webhook-URL kopieren (https://hooks.slack.com/services/...)
  • Make → Connections → + AddWebhook → URL einsetzen
Wenn kein Slack: alternative Email-Notify via Gmail-Module im Blueprint. Wenig invasiv, du siehst's morgens in der Inbox.
Optional, kann skipped werden.
3.6
Cloudflare-Worker-Webhook (Voice-Validator)
URL vom deployed Worker (siehe Section 6.5).
⏱ 1 min
Stuck-Notes:

Dependency: Section 6.5 vorher abschließen — du brauchst die Worker-URL.

Worker-URL-Format:https://aban-voice-validator.<account-subdomain>.workers.dev

Make-Module-Setup:

  • Im Blueprint suchen nach Modul "HTTP" mit Name "Voice-Validator-Call"
  • URL-Feld: {{voice_validator_url}} → durch tatsächliche URL ersetzen
  • Method: POST
  • Headers: Content-Type: application/json + X-Aban-Key: aus secrets
Setz im Worker einen einfachen X-Aban-Key-Header-Check ein (siehe deploy.sh). Auch ohne API-Key wäre kein Drama (Worker macht nur Voice-Linting), aber Defense-in-Depth schadet nie.
HTTP 502 — Worker noch nicht deployed (Section 6.5). Skip vorerst, kommt zurück.
Make-Test-Call gibt JSON zurück (z.B. {"score":85,"forbidden":[]}).
3.7
Blueprint-Import: aban-news-v2-multimodel.blueprint.json
Der Multi-Model-Workflow als JSON.
⏱ 3 min
Stuck-Notes:

Datei: sollte unter ~/aban-deploy/planung/aban-news-v2-multimodel.blueprint.json liegen — falls nicht, generieren aus automation/linkedin-auto-post.blueprint.json als Vorlage.

Click-Path in Make:

  • Make → ScenariosCreate scenario
  • Im neuen Editor: 3-Dots-Menü oben rechts → Import Blueprint
  • JSON-File hochladen (Drag-Drop oder File-Picker)
  • Make zeigt Module-Graph mit ~12 Modulen (RSS → Filter → Claude → OpenAI-Fallback → Voice-Validator → beehiiv → Sheets-Log)

Sofort nach Import: Click jedes Modul mit rotem ! → die Connection neu zuweisen (Module behalten alte Connection-IDs).

Speicher das Scenario sofort als Draft bevor du Connections setzt. Falls du falsch klickst, kannst du zurücksetzen ohne von vorne zu importieren.
"Module type unknown" → der Blueprint nutzt ein Module, das in deinem Plan nicht enthalten ist (z.B. Premium-Only "Custom Webhook v2"). Switch zu Standard-Webhook.
12 Module sichtbar, alle mit grünen Connection-Icons.
3.8
Placeholder ersetzen
Welche Werte wo eingesetzt werden müssen.
⏱ 4 min
Stuck-Notes:

Placeholder-Liste:

PlaceholderWoErsetzen mit
{{beehiiv_pub_id}}Modul "beehiiv Send"aus .beehiiv.env
{{master_sheet_id}}Modul "Sheets Log"aus Email nach Step 4.5
{{kpi_sheet_id}}Modul "KPI Update"aus Email nach Step 4.5
{{voice_validator_url}}Modul "Voice-Validator-Call"aus Step 6.5
{{from_email}}Modul "Gmail Draft"hallo@abannews.com
{{slack_channel}}Modul "Slack Alert"#aban-alerts oder skip
Mach es Modul für Modul. Jedes Modul speichern bevor du zum nächsten. Make speichert kein Auto-Save im Edit-Mode!
Falls du irgendwo {{...}}-Syntax stehen lässt: Make wirft beim Run "Bundle does not contain key" — der Blueprint läuft nicht durch.
Kein Modul mit rotem ! mehr, alle "Validated".
3.9
Test-Run mit 1 Newsletter
Manueller Trigger, dry-run mit Test-Email.
⏱ 2 min
Stuck-Notes:

Vor dem Test:

  • Im Blueprint: Modul "beehiiv Send" → Recipient-Filter auf email=allen+test@gmail.com (so geht's nur an dich)
  • Im Blueprint: Modul "Schedule Trigger" → manuelle Trigger-Mode (nicht Cron)

Run: oben rechts Run once

Verify:

  • Make-Operations-Log zeigt: 12 Module grün, ~30s Total-Runtime
  • Gmail-Inbox: Test-Newsletter angekommen
  • Sheets-Log: neuer Row in "AuditLog"-Tab
  • Voice-Validator-Score: ≥80 (im Operations-Output sichtbar)
Wenn alles grün ist: NICHT sofort auf Cron umstellen. Lass das Scenario 24h im "manual run"-Mode während du Stripe + Cloudflare aufsetzt. Erst danach Cron on.
Modul "Claude Summarize" timeout → Anthropic-API ist langsam (50s). In Make Module-Settings → Timeout auf 120s erhöhen.
Modul "beehiiv Send" 401 → Step 1.6 Pub-ID falsch. Re-check.
Test-Email in Inbox, alles grün, kein Modul-Error im Log.

4. Apps-Script Sheets-Setup

Master-Sheet mit 5 Tabs initialisieren via Apps-Script (paste & run).

⏱ ~5 Min💰 Free🎯 7 Sub-Steps
4.1
Apps-Script-Project öffnen
Neues Google-Sheet anlegen, dann Apps-Script daraus öffnen.
⏱ 1 min
Stuck-Notes:
  • Öffne sheets.new in allengchour@gmail.com
  • Titel oben: aban-news-master
  • Menü ExtensionsApps Script
  • Apps-Script-Editor öffnet sich in neuem Tab
Lege das Master-Sheet in einem Google-Drive-Ordner aban-news ab (vorher anlegen). Dann hast du Sheets, später Backups, später Logs alle an einem Ort.
"Extensions" greyed out — du bist eingeloggt in einem Konto ohne Editor-Permission. In Account-Selektor oben rechts wechseln.
Apps-Script-Editor mit Default function myFunction() {} ist offen.
4.2
Code reinpasten (Notepad-Variante)
Wenn Monaco-Editor zickt: über Notepad clipboard-cleanen.
⏱ 1 min
Stuck-Notes:

Code-Quelle:~/aban-deploy/automation/setup-sheet.gs (falls existiert) — sonst aus diesem Skeleton:

function setupAll() {
const ss = SpreadsheetApp.getActive();
const tabs = ['Issues','KPIs','Subscribers','Sponsors','AuditLog',
'LinkedInQueue','RedditQueue'];
tabs.forEach(name => {
let s = ss.getSheetByName(name) || ss.insertSheet(name);
s.clear();
});
ss.getSheetByName('Issues').getRange('A1:E1')
.setValues([['ID','Title','Severity','Created','Status']])
.setFontWeight('bold');
ss.getSheetByName('KPIs').getRange('A1:F1')
.setValues([['Date','Subs','Opens','Clicks','Unsubs','Revenue']])
.setFontWeight('bold');
ss.getSheetByName('Subscribers').getRange('A1:E1')
.setValues([['Email','Source','SignupDate','Status','Tags']])
.setFontWeight('bold');
ss.getSheetByName('AuditLog').getRange('A1:D1')
.setValues([['Timestamp','Action','Actor','Details']])
.setFontWeight('bold');
MailApp.sendEmail({
to: Session.getActiveUser().getEmail(),
subject: 'aban-news Sheets setup done',
body: 'Master Sheet ID: ' + ss.getId() + '\nURL: ' + ss.getUrl()
});
}
function populateLinkedInPosts() {
// Reads ~/aban-deploy/automation/linkedin_posts_seed.csv
// (manuell: paste CSV into LinkedInQueue tab)
}
function populateRedditQueue() {
// 7 sub-reddits seed list
const subs = [['r/dataisbeautiful',7],['r/MachineLearning',6],
['r/programmierung',8],['r/de',5],['r/Switzerland',6],
['r/Startup_Ideas',7],['r/Entrepreneur',5]];
SpreadsheetApp.getActive().getSheetByName('RedditQueue')
.getRange(1,1,subs.length,2).setValues(subs);
}

Notepad-Variante bei Monaco-Problemen:

  • Code in Notepad einfügen (Win+R → notepad)
  • Strg+A → Strg+C aus Notepad
  • In Apps-Script: Default-Funktion löschen, paste
Monaco-Editor in Apps-Script ist nice aber syntax-empfindlich. Wenn der Editor "this code won't be saved"-Banner zeigt: Notepad-Detour ist 30s, Hours-savings.
"Syntax error: Unexpected token" — Strg+Z einmal, dann sauber re-pasten. Meistens Whitespace-Issue.
Code im Editor, Strg+S klickt → "Project saved".
4.3
Run setupAll()
Funktions-Selektor + Run-Button.
⏱ 10 sec
Stuck-Notes:
  • Im Editor oben: Dropdown "Select function" → setupAll
  • Click Run
  • Erstmaliges Run: Authorization-Flow startet (siehe 4.4)
Wenn der Run hängt >30s: vermutlich blockt ein anderes Tab den OAuth. Schließ alle Google-Tabs außer Apps-Script + Master-Sheet.
Execution-Log unten zeigt "Execution started ... Execution completed", grüne Bestätigung.
4.4
Authorization-Flow (Google-Warning)
"This app isn't verified" — wie damit umgehen.
⏱ 30 sec
Stuck-Notes:

Schritt-für-Schritt durch den Warning-Dialog:

  1. Authorization required Modal → click Review permissions
  2. Account-Wahl: allengchour@gmail.com
  3. Warning: "Google hasn't verified this app" → click Advanced (klein, unten links)
  4. Go to "Untitled Project" (unsafe) — sounds shady but is OK weil DEIN Code
  5. Permissions-Liste: See, edit, create, and delete spreadsheets + Send email as you
  6. Allow
Der "unsafe"-Warning kommt nur weil dein Apps-Script-Project nicht verified ist. Du wirst es nie verifizieren (keine Public-App) — Warning bleibt für immer. Ist sicher solange du Code selbst geschrieben hast.
"Untitled Project" — benenne dein Apps-Script-Project oben links um auf aban-news-setup. Macht den nächsten Auth-Dialog lesbarer.
Modal schließt, Script läuft durch.
4.5
Email mit 3 Sheet-IDs check
setupAll() schickt Mail an dich mit der Sheet-ID.
⏱ 30 sec
Stuck-Notes:

Mail-Inbox check:allengchour@gmail.com

Sender: apps-scripts-notifications@google.com, Subject: aban-news Sheets setup done

Body enthält:

  • Master Sheet ID: 1A2b3C...XYZ (44-stelliger String)
  • URL: https://docs.google.com/spreadsheets/d/.../edit

Save in passwort-manager oder secrets:

'MASTER_SHEET_ID=1A2b3C...XYZ
KPI_SHEET_ID=same_id_aber_tab_KPIs
LINKEDIN_SHEET_ID=same_id_aber_tab_LinkedInQueue' | Out-File -FilePath "$HOME\aban-deploy\.sheets.env" -Encoding utf8
Alle 5 Tabs sind im gleichen Sheet — du brauchst nur 1 ID, aber Make-Module wollen die Tab-Namen separat. Conventional: ein MASTER_SHEET_ID + Tab-Names hardcoded im Blueprint.
Keine Mail angekommen → MailApp.sendEmail hat Quota: 100/Tag für Free-Accounts. Wenn du heute schon viele Test-Emails geschickt hast → warte oder check Sheet-ID direkt aus der URL.
Sheet-ID in der Hand + in env-File.
4.6
Bonus: populateLinkedInPosts() + populateRedditQueue()
Seed-Daten für Outreach-Kanäle.
⏱ 1 min
Stuck-Notes:

Funktions-Dropdown:populateRedditQueue → Run

Dann populateLinkedInPosts → Run (lädt CSV aus ~/aban-deploy/automation/linkedin_posts_seed.csv falls Apps-Script Drive-Access hat; sonst manuell paste)

Verify in Sheet:

  • Tab "RedditQueue": 7 Rows (Subreddits + Priority)
  • Tab "LinkedInQueue": ~10-20 Rows (vorgenerierte Post-Drafts)
LinkedIn-Posts sind seed-data zum nachjustieren. Sind nicht zum Auto-Posten — sondern als Inspiration wenn du in Section 7 selbst schreibst.
Beide Tabs gefüllt.
4.7
Sheet-IDs in Make-Blueprints einsetzen
Zurück zu Section 3.8 — die Placeholder ersetzen.
⏱ 1 min
Stuck-Notes:

Zurück zu Make → Scenario → jedes "Google Sheets"-Modul öffnen → Spreadsheet-Feld → ID einfügen oder via Picker das aban-news-master-Sheet wählen.

Module die Sheet-IDs brauchen:

  • Sheets Log → Tab AuditLog
  • KPI Update → Tab KPIs
  • Subscriber Sync → Tab Subscribers
Nutze den Picker statt manuelle ID — weniger fehleranfällig. Du musst aber Google-Account im Make-Tab eingeloggt sein.
Alle 3 Module mit valid Spreadsheet + Tab-Selection.

5. Stripe-CH-KYC

Payment-Processor für Founding-Memberships + Sponsorings. CH-Einzelfirma.

⏱ ~20 Min aktiv + 2-3d KYC-Wait💰 Free, 1.5%+0.30 CHF pro Transaktion🎯 10 Sub-Steps🇨🇭 CH-spezifisch
5.1
Account anlegen
dashboard.stripe.com/register — Land: Schweiz.
⏱ 2 min
Stuck-Notes:

URL:dashboard.stripe.com/register

  • Email: allengchour@gmail.com
  • Full name: Allen Ghour (wie auf Pass)
  • Country: Switzerland 🇨🇭
  • Password: stark, 1Password

Nach Email-Verify direkt ins Dashboard.

Auch wenn du noch keine Einzelfirma offiziell gegründet hast — Stripe akzeptiert "Individual / Sole Trader" als CH-Selbständiger ohne HR-Eintrag. Du brauchst dafür nur AHV-Nummer + Bankkonto.
"This email already has a Stripe account" → du hast früher getestet. Login statt Register.
Dashboard offen, Test-Mode aktiv (Toggle oben rechts).
5.2
CH-Einzelunternehmen-Settings
Business-Type + AHV + UID (wenn vorhanden).
⏱ 3 min
Stuck-Notes:

Activate Payments → Business Details:

  • Business type: Individual / Sole Proprietorship
  • Business name: aban news (Trade-Name)
  • Legal name: Allen Ghour
  • Business address: deine CH-Adresse (Wohnadresse OK bei Einzelfirma)
  • Industry: Online Media / Newsletters
  • Website: abannews.com
  • Statement descriptor (was Käufer auf Kartenabrechnung sehen): ABAN NEWS (max 22 Zeichen, ASCII)
  • Phone: deine CH-Mobile

VAT / MwSt-Frage:

  • Bist du MwSt-pflichtig (>CHF 100k Umsatz/Jahr)? Vermutlich NEIN bei Newsletter-Start.
  • Wähle: I am not registered for VAT
Verifiziere die MwSt-Frage offiziell bei estv.admin.ch — wenn du unsicher bist, "noch nicht registriert" ist sicher bei <100k. Bei Erreichen der Schwelle musst du dich nachträglich registrieren.
Statement-Descriptor mit Umlaut → ASCII-only erzwungen. ABAN NEWS safe.
"Business details verified" — gelber Status (full-verify nach KYC).
5.3
Bank-IBAN für Auszahlungen
CH-IBAN, monatliche Auszahlung default.
⏱ 1 min
Stuck-Notes:
  • Bank Details → Add bank account
  • Country: Switzerland
  • Currency: CHF
  • IBAN: CH93 0076 2011 6238 5295 7 (Beispiel — deine echte IBAN)
  • Account holder: Allen Ghour (muss zum Namen im Business match)

Payout Schedule:

  • Default: Weekly (every Friday)
  • Alternative: Monthly (1st of month) — weniger Banking-Noise
  • Empfehlung: Monthly für Newsletter mit kleinen Beträgen

EUR-Zahlungen auf CHF-Konto: Stripe konvertiert automatisch zu Tageskurs minus ~1% Spread. Bei EUR-Founding-Members (€149) bekommst du ~CHF 145 nach Conversion.

Setz Payouts auf Wise CHF-Konto wenn du Multi-Currency-Liquidität willst — Wise hat besseren EUR-Kurs. Eröffnung dauert 1 Woche, daher post-launch optimieren.
"Account holder mismatch" — IBAN-Konto auf anderen Namen. Stripe verlangt 1:1 Match mit Legal-Name. Bei Familien-Konto: Mit-Inhaber nachweisen oder eigenes Konto eröffnen.
"Bank account added, pending verification" (klein, 1-2 Tage).
5.4
KYC-Dokumente: Pass + Adressbeleg
Personalausweis-Foto + Wohnsitzbescheinigung.
⏱ 3 min + 24-72h Stripe-Review
Stuck-Notes:

Documents-Tab:

  • ID: CH-Pass-Foto (beide Seiten) ODER ID-Karte (beide Seiten) — Smartphone-Foto reicht, scharf+gut beleuchtet
  • Address: aktuelle Stromrechnung / Krankenkasse / Wohnsitzbescheinigung (max 3 Monate alt)
  • Format: JPG/PNG/PDF, max 10 MB

Upload-Tipps:

  • Foto NICHT cropped — Stripe will alle 4 Ecken sehen
  • Kein Flash-Reflex auf der ID
  • Helligkeit OK, nicht überbelichtet
Nutze deine Smartphone-Scan-App (iOS Notes, Android Google Drive) statt Foto — die de-skewen automatisch und schärfen. Bessere Hit-Rate beim Stripe-Verify.
"Document unclear" — Stripe lehnt ab. Bessere Lichtquelle, dunkler Hintergrund (z.B. schwarzer Tisch), ID schärfer.
Bei Wohnsitz-Bescheinigung: muss deine aktuelle Adresse zeigen — wenn du grad umgezogen bist: Stromrechnung mit der neuen Adresse, sonst Mietvertrag.
"Documents under review" — gelber Status. Wartezeit 24-72h.
5.5
Tax-Information: CHF, no VAT
Die Schweiz-spezifischen Tax-Felder.
⏱ 2 min
Stuck-Notes:
  • Tax-Country: Switzerland
  • Tax-ID (UID): leer lassen wenn du keine Einzelfirma im HR hast
  • VAT Registration: Not registered
  • Tax-Reporting: Form 1099-K NEIN (US-only)
  • Default Tax-Behavior für Produkte: Inclusive (Brutto-Preise)
Du bist als CH-Einzelfirma einkommensteuerpflichtig (Bundessteuer + Kantonssteuer auf den Newsletter-Gewinn), aber MwSt-frei bis CHF 100k Umsatz. Buchhaltung selbst (Excel) oder Bexio-Tool ~CHF 30/mo. Verifizieren bei estv.admin.ch.
"Tax info complete".
5.6
3 Produkte anlegen
Founding €149 + Premium-Monthly €9 + Premium-Yearly €99.
⏱ 4 min
Stuck-Notes:

Produkt 1: Founding Member (One-Time):

  • Products → + Add product
  • Name: aban news — Founding Member
  • Description: Lifetime access. 100 Plätze. Dein Name im Impressum.
  • Pricing: One-time · Price: 149.00 EUR
  • Tax behavior: Inclusive

Produkt 2: Premium Monthly:

  • Name: aban news — Premium (monatlich)
  • Pricing: Recurring · Monthly · Price: 9.00 EUR
  • Free trial: 7 days

Produkt 3: Premium Yearly:

  • Name: aban news — Premium (jährlich, 20% Rabatt)
  • Pricing: Recurring · Yearly · Price: 99.00 EUR
  • Free trial: 7 days
EUR statt CHF als Default-Currency — DE/AT-Markt ist 5× größer und checkout-friction kleiner. CH-Käufer können EUR via Twint/Karte zahlen, kein Issue.
"Trial cannot be set on one-time" — richtig, Founding ist one-time. Trial nur bei Recurring.
3 Produkte in Liste, alle active.
5.7
Payment-Links generieren
Hosted checkout-URLs für direkten Einbau in Landing-Pages.
⏱ 1 min
Stuck-Notes:

Pro Produkt: Create payment link

  • Founding: Link kopieren → einsetzen in ~/aban-deploy/founding.html (existing "Jetzt Founding werden"-Button)
  • Premium-Monthly: Link → ~/aban-deploy/preview.html CTA
  • Premium-Yearly: Link → ebenda neben Monthly

Link-Customization:

  • Custom-Field: Newsletter-Source (where heard of it?) — optional
  • Success-URL: https://abannews.com/willkommen.html?stripe_id={CHECKOUT_SESSION_ID}
  • Cancel-URL: https://abannews.com/founding.html?stripe_canceled=1
Die Success-URL mit {CHECKOUT_SESSION_ID} erlaubt dir später, Bestell-Daten via Stripe-API zu pullen für Welcome-Email-Personalisierung.
Cancel-URL = Success-URL → Stripe macht beides leise. Unterschiedlich halten!
3 Payment-Links, alle in HTML eingesetzt + commited.
5.8
Webhook-Setup für Make-Integration
Stripe → Make on payment-success.
⏱ 2 min
Stuck-Notes:
  • Make: neues Scenario → Trigger Webhooks → Custom Webhook → URL kopieren
  • Stripe-Dashboard → Developers → Webhooks → + Add endpoint
  • URL: paste Make-URL
  • Events: checkout.session.completed + customer.subscription.updated + customer.subscription.deleted
  • Signing secret: kopieren in ~/aban-deploy/.stripe.env

Make-Side:

  • Trigger: receives Stripe-Event JSON
  • Action 1: Sheets append → Tab "Subscribers" (Email, Plan, Amount)
  • Action 2: beehiiv add-subscriber → tag founding oder premium
  • Action 3: Gmail → send personalized welcome
Signing-Secret-Verification implementieren, sonst kann jeder den Make-Endpoint mit Fake-Stripe-Payloads triggern. Make hat ein "Verify webhook" Modul für Stripe.
"Webhook delivery failed" → Make-URL nicht erreichbar. Check Make-Scenario Status (muss "On" sein, nicht "Draft").
Test-Send aus Stripe-UI → Make-Scenario-Log zeigt "1 ok".
5.9
Test-Mode mit 4242 4242 4242 4242
5 Fake-Test-Orders durchspielen.
⏱ 5 min
Stuck-Notes:

Test-Mode-Toggle oben rechts an. Dann Founding-Payment-Link in einem privaten Browser-Tab öffnen.

Test-Karten:

  • Success: 4242 4242 4242 4242 · CVV: beliebig · MM/YY: beliebig zukünftig
  • Decline: 4000 0000 0000 0002
  • 3DS-Challenge: 4000 0027 6000 3184
  • Insufficient funds: 4000 0000 0000 9995

5 Szenarien durchspielen:

  1. Success Founding
  2. Success Monthly mit Trial
  3. 3DS-Challenge → durchklicken
  4. Decline → kommst zurück zu Cancel-URL
  5. Refund von 1. → Dashboard → Order → Refund

Pro Szenario verify:

  • Stripe Dashboard zeigt Test-Payment
  • Make-Scenario-Log: Webhook empfangen
  • Sheets-Tab "Subscribers": neue Row
  • Gmail-Inbox: Welcome-Mail (wenn Make das so verkabelt hat)
Mach mindestens 5 Tests bevor Live-Mode. Jede dieser Karten testet einen anderen Flow — wenn alle 5 grün sind, hast du Confidence.
3DS-Challenge zeigt Stripe-Default-Popup → bei Live-Mode hängt der Käufer hier oft (vergisst Bank-Push-Notification). Mach in der Welcome-Mail einen Disclaimer: "Falls deine Bank dich anruft: kein Betrug, das war ich (aban news)."
5 / 5 Szenarien grün, kein Make-Module-Error.
5.10
Switch zu Live-Mode
Erst NACH 5 grünen Test-Orders + KYC-Approval.
⏱ 30 sec
Stuck-Notes:

Voraussetzungen vor Switch:

  • Step 5.9: alle 5 Test-Szenarien grün
  • Step 5.4: KYC-Status "Approved" (Dashboard oben grüner Banner statt gelb)
  • Step 5.3: Bank-Account verified (Mikro-Deposits angekommen)

Switch:

  • Test-Mode-Toggle aus
  • Produkte sind separat im Live-Mode — du musst sie nochmal anlegen (Stripe duplizieren via "Copy to Live"-Button)
  • Payment-Links auch nochmal generieren (andere URLs!)
  • Webhook nochmal anlegen mit anderer Signing-Key (Live-Key)
Daher mach den Switch NICHT am Launch-Tag selbst — mach es 1-2 Tage davor, damit du in Live-Mode auch nochmal eine kleine Test-Order mit einer ECHTEN Kreditkarte ($1 dann refund) durchspielen kannst. Live-Karten verhalten sich anders als Test-Karten (3DS, etc.).
"Live mode disabled until KYC approved" → warten. KYC kann bis 72h dauern. Falls länger: Support-Ticket aufmachen.
Dashboard oben: kein "Test mode"-Banner mehr, alles live.

6. Cloudflare-Worker + DNS

DNS bei Cloudflare (statt Porkbun), Email-Routing, Worker für Voice-Validator.

⏱ ~10 Min💰 Free-Tier🎯 6 Sub-Steps
6.1
Cloudflare-Account (gratis)
Wenn noch nicht vorhanden.
⏱ 2 min
Stuck-Notes:

URL:dash.cloudflare.com/sign-up

  • Email: allengchour@gmail.com
  • Password: stark
  • 2FA: TOTP-App empfohlen (Authy/1Password) — DNS = sensitive Infrastruktur
2FA auf Cloudflare ist nicht-verhandelbar. Wenn jemand deinen CF-Account übernimmt, kann er deine ganze Domain entführen — Mail-MX umlenken und Reset-Mails abfangen.
Dashboard offen, "Add a site"-Prompt.
6.2
Domain abannews.com hinzufügen
CF scannt existing DNS bei Porkbun, importiert Records.
⏱ 1 min Scan + Review
Stuck-Notes:
  • Dashboard → + Add a siteabannews.com
  • Plan: Free
  • CF scannt existing Porkbun-DNS, listet alle gefundenen Records
  • Review: GitHub-Pages-IPs (185.199.108-111.153), MX, TXT, etc. — alle aktiv lassen ✓
  • Bonus-Records aus Step 1.7 (beehiiv DKIM/SPF/CNAME): hier hinzufügen falls noch nicht in Porkbun gewesen
  • Continue
CF-Scan ist meist 90% korrekt. Review alle Records bevor du Continue klickst — wenn etwas Wichtiges fehlt, manuell nachtragen.
"Couldn't find DNS records" → Porkbun-DNS war noch nicht propagiert. 30 Min warten, dann re-scan.
Liste mit ~10-15 DNS-Records, alle proxied-status korrekt (orange für A-Records, grau für TXT).
6.3
Nameserver bei Porkbun aktualisieren
Cloudflare gibt 2 NS-Strings, die bei Porkbun rein.
⏱ 2 min Setup + ~30 Min Propagation
Stuck-Notes:

CF zeigt dir 2 Nameserver: z.B. kate.ns.cloudflare.com + tom.ns.cloudflare.com (Namen sind random).

Porkbun:

  • porkbun.com → Domain-List → abannews.comDetails
  • Authoritative nameserversEdit
  • Existing entfernen (Porkbun-Default), CF-NS einsetzen
  • Save

Verify-Loop: CF-Dashboard → "Pending nameserver update" → nach ~30 Min auto-detect.

DNS-Propagation kann 0-24h dauern, ist meist <1h. Während du wartest: Section 6.4 (Email-Routing) parallel vorbereiten, ist NS-unabhängig.
"Nameservers don't match" — du hast NS bei Porkbun falsch gesetzt (z.B. extra-Whitespace, anderen NS). Copy-paste exakt aus CF.
Wenn du nicht auf Cloudflare-NS wechseln willst (z.B. willst Porkbun-DNS behalten): "CNAME setup" ist auch möglich — dann nutzt du nur einzelne CF-Worker-Features. Aber CF-NS empfohlen für Performance + Free-Cache.
CF-Dashboard: grüner Status "Active". WHOIS-Check zeigt CF-NS.
6.4
Email-Routing aktivieren
hallo@abannews.com + datenschutz@abannews.com → Gmail forward.
⏱ 2 min
Stuck-Notes:
  • CF-Dashboard → abannews.com → EmailEmail RoutingGet started
  • Cloudflare fügt automatisch 3 MX-Records + 1 TXT hinzu (bestätigen)
  • Routing-Rules:
    • hallo@abannews.com → forward to allengchour@gmail.com
    • datenschutz@abannews.com → forward to allengchour@gmail.com
    • impressum@abannews.com → forward to allengchour@gmail.com
    • support@abannews.com → forward to allengchour@gmail.com
    • Catch-all: *@abannews.com → forward (Spam-Magnet, aber sicher dass du nichts verpasst)

Verify forwarding-target: Gmail bekommt Email mit Verify-Code, click Link.

Gmail-Filter einrichten: alle Mails von via-cloudflare-Header → Label aban-news-mail. Dann hast du Inbox sauber.
"Domain not active yet" → DNS noch nicht propagiert (Step 6.3). 1h warten.
Beehiiv DNS-Conflict: beehiiv hat eigenen MX/SPF gesetzt für mail.abannews.com. Cloudflare-Routing ist für die ROOT-Domain. Konflikt-frei wenn du beehiiv auf Subdomain (mail.) hast und CF auf root.
Test: send Mail an hallo@abannews.com, kommt in Gmail an innerhalb 30s.
6.5
Wrangler installieren + Worker deployen
Voice-Validator-Worker via Wrangler-CLI.
⏱ 4 min
Stuck-Notes:

PowerShell:

# 1. Wrangler installieren (Node.js needed, sollte schon da sein)
npm install -g wrangler
# 2. Login
wrangler login # öffnet Browser, OAuth zu Cloudflare
# 3. Worker-Code (sollte unter ~/aban-deploy/automation/cf-worker-validator/ liegen)
cd "$HOME\aban-deploy\automation\cf-worker-validator"
# 4. Deploy
wrangler deploy
# 5. URL kopieren (output: https://aban-voice-validator.<subdomain>.workers.dev)

Wenn Worker-Code noch nicht existiert — minimaler Voice-Validator:

// worker.js
const FORBIDDEN = ['leverage','synergy','ecosystem','game-changer','disruptive',
'revolutionary','best-in-class','holistic','seamless','curated'];
export default {
async fetch(req) {
if (req.method !== 'POST') return new Response('POST only', {status:405});
const {text} = await req.json();
const found = FORBIDDEN.filter(w => text.toLowerCase().includes(w));
const score = Math.max(0, 100 - found.length * 15);
return Response.json({score, forbidden:found, ok: score >= 70});
}
};
Worker hat Free-Tier von 100k requests/day. Du wirst niemals nahe dran kommen mit aban news (1 Newsletter/day = 1 request).
"You need to verify your email" — neue CF-Accounts müssen Email-verify durchlaufen bevor Worker-Deploy. Check Inbox.
"wrangler: command not found" — Node-PATH nicht setup. node --version testen, falls fehlt: nodejs.org install.
Output zeigt URL, curl test passes.
6.6
Worker-URL in Make-Blueprints einsetzen
Zurück zu Step 3.6 — den Placeholder ersetzen.
⏱ 30 sec
Stuck-Notes:

Im Make-Scenario das Modul "Voice-Validator-Call" öffnen → URL-Feld → die Worker-URL aus Step 6.5 einsetzen.

Test-Call aus Make → JSON-Response sollte kommen.

Speicher die Worker-URL auch in .cloudflare.env für andere Scripts:
WORKER_VOICE_VALIDATOR=https://aban-voice-validator.xxx.workers.dev
Make-Test-Call grün, Score+Forbidden im Output.

7. First-30-Subscriber-Outreach

Der echte Marathon. Die ersten 30 Subs sind nicht skalierbar — sie sind hand-crafted.

⏱ ~60 Min (Send + Tracking)💰 Free (deine Zeit)🎯 6 Sub-Steps
7.1
WhatsApp-Liste vorbereiten
10 Family + 10 Friends + 10 Business — total 30.
⏱ 10 min
Stuck-Notes:

Im Master-Sheet (Tab "Subscribers") einen neuen Tab "OutreachQueue" anlegen.

Spalten:Name | Phone | Channel | Tier | Sent? | Replied? | Subscribed? | Notes

3 Gruppen je 10:

  • Family (10): Eltern, Geschwister, Cousins, enge Verwandte. Tier "F".
  • Friends (10): Freunde die NIX mit Tech zu tun haben. Tier "Fr".
  • Business (10): Ex-Kollegen, LinkedIn-1st-Connections im AI/Tech-Space. Tier "B".

WICHTIG: NICHT Tech-Bubble-Friends nur — Family + Friends zeigen ob dein Newsletter für Outsiders verständlich ist. Das ist die wertvollste Resonanz.

Ich starte immer mit dem Family-Tier zuerst — die antworten am ehrlichsten ("Allen ich versteh kein Wort"). Wenn die 3 von 10 Family-Members nicht verstehen, schreib den ersten Newsletter um BEVOR du Business outreachst.
Wenn dir nicht 30 einfallen: nimm 20. Qualität schlägt Quantität. 20 echte Replies > 30 ignorierte Sends.
Sheet-Tab mit 30 Rows, Phone-Numbers gefüllt.
7.2
Template-Anpassung pro Channel
3 verschiedene Messages — kein Copy-Paste.
⏱ 10 min
Stuck-Notes:

Template Family (kurz, persönlich):

Hi [Name] 👋
Ich hab ein kleines Projekt gestartet: aban news.
Täglicher Newsletter auf Deutsch über AI — ohne Fachchinesisch.
5 Min Lesezeit, jeden Morgen um 7.
Würde mich mega freuen wenn du mal reinschaust:
👉 abannews.com
Liebe Grüsse,
Allen

Template Friends (Charme + Konkretes):

Hi [Name],
du erinnerst dich, ich hab letztens erzählt über AI-Zeug.
Hab jetzt nen Newsletter draus gemacht: aban news.
1 Mail pro Tag, deutsche Sprache, kein Hype-Gelaber.
Erste Ausgabe morgen, würd dich gerne dabei haben:
abannews.com
Ist gratis. Kein Spam, versprochen.
LG, Allen

Template Business (Wertversprechen + Reziprozität):

Hi [Name],
ich starte morgen einen täglichen DE-Newsletter über AI (ohne den üblichen Hype).
Zielgruppe: PMs/Solopreneurs/CTOs die einen 5-Min-Daily-Brief wollen.
Falls das für dich interessant ist — abannews.com.
Falls du jemanden kennst der das gut finden würde: auch gerne forward 🙏
Wenn du mir Feedback gibst, schick ich dir gerne meine kompletten Recherche-Tools auf eine Tasse Kaffee.
Beste Grüsse,
Allen
Familie immer in der echten Beziehungssprache ("Mami", "Andrea" — nicht "[Name]"). Friends: ein gemeinsamer Inside-Joke macht Wunder. Business: ein klares "in it for them" (Recherche-Tools, ein Call) ist Gold.
Generisches "Hey, ich hab nen Newsletter, schau mal rein" → 5% Conversion. Mit personalization (Inside-Joke, gemeinsame Erinnerung): 30-40%.
3 Templates in Notion/Apple-Notes geready.
7.3
Send-Pacing (max 5/Std)
Sonst Spam-Detection bei WhatsApp.
⏱ 6h gesamt (über 1-2 Tage)
Stuck-Notes:

Send-Plan über 2 Tage:

SlotTimeTierCount
Tag 1 morning09-10hFamily5
Tag 1 noon12-13hFamily5
Tag 1 evening19-20hFriends5
Tag 2 morning09-10hFriends5
Tag 2 noon12-13hBusiness5
Tag 2 evening17-18hBusiness5

Regeln:

  • Max 5 Sends/Stunde — WhatsApp limit Personal-Account
  • Niemals identisches Copy 2× hintereinander (sonst Bayes-Filter)
  • Pro Send: minimal 1 Zeile personalization vorne
Spannender Hack: Setz dir einen Timer auf 10 Min nach jedem Batch. Wenn jemand sofort antwortet, antworte sofort zurück — du verdoppelst die Conversion-Rate wenn du in der ersten Stunde reagierst.
WhatsApp temp-ban — wenn du >10 DMs in 30 Min sendest und neue Kontakte (nicht in deinen Contacts), kann WhatsApp 24h-Ban verhängen. Halt dich an Pacing.
30 Messages verschickt über 2 Tage, alle persönlich.
7.4
Tracking-Sheet (Notion/Sheets-Template)
Wer wann was geantwortet, wer subscribed hat.
⏱ 5 min Setup + laufend
Stuck-Notes:

Sheet "OutreachQueue" Spalten erweitern:

  • Sent (Datum)
  • Replied (J/N)
  • Sub'd (J/N)
  • Bounce-Reason (z.B. "kein Interesse", "kein Deutsch", "no-reply")
  • Quote — wenn jemand was Cooles antwortet, hier festhalten (Social-Proof-Material später!)

Conversion-Rates die du erwarten kannst:

  • Family: 70-80% subscribe (sind nett)
  • Friends: 40-60% subscribe
  • Business: 25-35% subscribe (bessere Quote als kalte Outreach)
  • Total: ~14-22 Subs aus 30 Outreaches = healthy
Frag in deinem Tracking-Sheet nach 1 Woche bei jedem nicht-Subscriber kurz: "Hi, hab dich da im DMs vergessen — Newsletter ist seit 7 Tagen draussen, hier ist die letzte Ausgabe als Beispiel: [link]. Falls's nicht für dich ist: alles gut, kein Drama 🤝." → 30% kommen dann doch noch.
Sheet gefüllt, ~14-22 Sub-Conversions getrackt.
7.5
Response-Handling-Patterns
Skripts für die 5 häufigsten Reaktionen.
⏱ 5 min Vorab + laufend
Stuck-Notes:

5 Standard-Reaktionen + Antworten:

  1. "Cool, hab subscribed!" → "Mega 🙏 sag mir bitte morgen nach der ersten Ausgabe ehrlich was du denkst — Lob auch erlaubt aber Kritik ist wertvoller."
  2. "Was kostet das?" → "Gratis. Wenn dir's gefällt gibt's später optional ein Premium-Tier (~€9/mo) mit Deep-Dives, aber das ist optional."
  3. "Wer steht dahinter?" → "Ich (Allen). Schweizer, mache das nebenbei. Mehr drüber: abannews.com/about"
  4. "Spam?" → "Nein 1 Mail pro Tag, gleiche Uhrzeit, du kannst jederzeit mit 1 Klick aus. Datenschutz: abannews.com/datenschutz"
  5. "Interessiert mich nicht (höflich)" → "Alles gut! Bei jemandem den du kennst und der das gut finden würde — danke für den Forward 🙏"

Bei spezifischen technischen Fragen (z.B. "Wie verifizierst du Quellen?"): ausführlich + ehrlich antworten. Das ist Pre-Sales — wenn du hier glaubwürdig bist, kommen sie als zahlende Premium-Members in 3 Monaten zurück.

Speicher die wertvollsten Antworten ("Mega, hab subscribed!") als WhatsApp-Sticker oder in Apple-Notes als Quick-Reply-Templates. Spart dir 30 Sek pro Reply × 30 Replies = 15 Min.
Nicht in Verteidigung gehen wenn jemand kritisch ist. "Newsletter ist tot" → "Klar verstehe ich, viele News sind Müll. Mein Ansatz ist 5-Min-Daily-Brief statt Long-Reads. Falls's nicht für dich ist, total OK." Niemals argumentieren.
Du hast einen klaren Mental-Plan für 5 Szenarien.
7.6
Conversion-Optimization
Wenn jemand 2-3 Mal nachfragt, konkret antworten.
⏱ ad-hoc, ~15 min total
Stuck-Notes:

Wenn jemand 2-3× nachfragt aber nicht subscribed: sie wollen mehr Confidence. Konkret-werden:

  • Send Preview-Link: abannews.com/preview.html (eine Beispiel-Ausgabe)
  • "Schau dir die Preview an, dauert 3 Min. Wenn's dich nicht überzeugt: zero hard feelings."
  • Bei AI/Tech-skeptischen Friends: "Es ist kein 'Hype'-Newsletter — es geht darum was AI für deinen Job/Tag bedeutet. Konkret, kein Buzzword-Bingo."

Magic-Question-Trick: Frag zurück: "Was war das letzte Mal wo du dir gewünscht hast, AI besser zu verstehen?" — die Antwort ist Gold-Material für die ersten 5 Newsletter-Themen.

Reziprozität-Move: Wenn ein Friend etwas sucht (Reise-Tipp, Restaurant-Empfehlung), hilf zuerst. Dann nachgehakt nach Sub bekommt 80%+ Conversion.

Niemand mag Sales-Pressure. Wenn dein Friend nach 3× sagt "schau mal später" → respektiere und lass los. In 3 Monaten ein zweiter Touch mit "Hey, schau mal was wir mittlerweile machen, falls's jetzt interessant ist". Slow-burn.
Du hast 5-7 Hardcore-Skeptiker geöffnet, 2-3 davon converted.