Launch-Day-Manual
7 Pflicht-Actions · ~125 Min Tech + ~60 Min Outreach · Track-State in localStorage · abannews.com
NOINDEX · INTERN · nicht teilenBevor 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:
- Vormittag (90 min): Section 1 (beehiiv) + 2 (OpenAI) + 3 (Make) — die Tech-Pipeline
- Mittagspause: Wait für DNS-Propagation (Section 1.8) + Stripe-KYC-Review (Section 5)
- Nachmittag (50 min): Section 4 (Sheets) + 6 (Cloudflare) — Plumbing
- Abend (60 min): Section 7 (Outreach) — der echte Wertschöpfungs-Marathon
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.
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
allen+beehiiv@gmail.comClick-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
abannews ist safe (matched die Domain).aban-news-de oder abannews-2026. Sub-Domain ist eh nur Backup.Click-Path: Settings (Zahnrad) → Publication → Branding
Logo:
- Logo (full):
~/aban-deploy/logo-full.svghochladen (oder als PNG falls SVG nicht akzeptiert) - Icon (square):
~/aban-deploy/logo-icon.svg - Falls SVG-Problem: PNG aus
~/aban-deploy/downloads/brand-assets.zipnehmen
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
Click-Path: Settings → Publication → Sending → From 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)
allengchour@gmail.com.URL:app.beehiiv.com/settings/integrations/api
Click-Path: Settings → Integrations → API → Create New API Key
- Name:
aban-news-make-prod - Permissions:
Read + Write(alle Scopes anhaken) - Create klicken
- Key wird nur 1× angezeigt — sofort kopieren!
aban-news-emergency-backup und leg den ins 1Password unter "Aban Vault". Falls der Prod-Key kompromittiert wird, hast du einen Notausgang.bh_ (~40 Zeichen lang).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 -NoNewlinePub-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"
git status vor jedem push, dass .env-Files nicht aufgelistet sind.git filter-repo ist nicht nötig bei Revoke — der alte Key ist tot.~/aban-deploy/.beehiiv.env existiert mit 3 Zeilen.Click-Path: Settings → Publication → Sending → Custom domain → Add 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.comWichtig: Diese Records gehen in Step 1.8 zu Porkbun (oder Cloudflare wenn du in Section 6 Cloudflare-DNS aktivierst).
Wo:porkbun.com/account/domains → abannews.com → Details → DNS Records
Format-Anweisungen pro Record-Typ:
- TXT-Records: Bei Porkbun
Host= der Subdomain-Teil ohne.abannews.com(z.B.mailstattmail.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 CNAMEOder Web: dnschecker.org (zeigt Propagation weltweit).
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.htmlreinkopieren (im Editor "Source" oder "Code"-Mode öffnen), OHNE<html>/<body>-Tags — nur den Inhalt des<main>-Blocks - Personalisierung:
{{ first_name | default: "" }}einbauen
landing-ultra/index.html einsetzen.Click-Path: Subscribers → Get more subscribers → Embed 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 3Dann 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
2. OpenAI-Account-Setup
Fallback-Modell für die Multi-Model-Pipeline (wenn Claude rate-limited ist).
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
platform.openai.com/playground.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).
aban-news-dev Project für Tests. Im Make-Blueprint switchst du zwischen den Keys über die Connection-Auswahl — kein Code-Change nötig.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-...).
sk-proj-.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.)
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
'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 -NoNewlineProject-ID findest du in der URL wenn du im Project-Dashboard bist: platform.openai.com/settings/proj_XXXX/...
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.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 $bodychoices[0].message.content = irgendein Schweizerdeutsch-Witz.3. Make-Connections-Wiring
Alle Services in Make.com verbinden + Blueprint importieren + Placeholder ersetzen.
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.comeinfügen (Settings → API Keys → existing oder neuen anlegen)
aban-news-prod-v2 (Make) + aban-news-cli (für deine PowerShell-Scripts). Wenn einer expired, ist immer noch eine Pipeline live.Click-Path: Connections → + Add → Search OpenAI → OpenAI (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
aban-news-{service}-{env}. Dann findest du alles im Connections-Dashboard sortiert.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.
- Connections →
+ Add→Google Sheets - Connection name:
aban-sheets-allengchour - Sign in mit allengchour@gmail.com
- Scope:
spreadsheets(read + write)
Alternativ: Email-Alert an dich selbst — falls du keinen Slack hast, skipp ich das auch.
Wenn Slack:
- Slack → Workspace →
Apps→Incoming Webhooks→ Add - Channel:
#aban-alerts(neu erstellen) - Webhook-URL kopieren (
https://hooks.slack.com/services/...) - Make → Connections →
+ Add→Webhook→ URL einsetzen
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
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.{"score":85,"forbidden":[]}).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 →
Scenarios→Create 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).
Placeholder-Liste:
| Placeholder | Wo | Ersetzen 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 |
{{...}}-Syntax stehen lässt: Make wirft beim Run "Bundle does not contain key" — der Blueprint läuft nicht durch.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)
4. Apps-Script Sheets-Setup
Master-Sheet mit 5 Tabs initialisieren via Apps-Script (paste & run).
- Öffne sheets.new in allengchour@gmail.com
- Titel oben:
aban-news-master - Menü
Extensions→Apps Script - Apps-Script-Editor öffnet sich in neuem Tab
aban-news ab (vorher anlegen). Dann hast du Sheets, später Backups, später Logs alle an einem Ort.function myFunction() {} ist offen.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
- Im Editor oben: Dropdown "Select function" →
setupAll - Click
Run▶ - Erstmaliges Run: Authorization-Flow startet (siehe 4.4)
Schritt-für-Schritt durch den Warning-Dialog:
Authorization requiredModal → clickReview permissions- Account-Wahl:
allengchour@gmail.com - Warning: "Google hasn't verified this app" → click Advanced (klein, unten links)
Go to "Untitled Project" (unsafe)— sounds shady but is OK weil DEIN Code- Permissions-Liste:
See, edit, create, and delete spreadsheets+Send email as you Allow
aban-news-setup. Macht den nächsten Auth-Dialog lesbarer.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 utf8MASTER_SHEET_ID + Tab-Names hardcoded im Blueprint.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.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)
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→ TabAuditLogKPI Update→ TabKPIsSubscriber Sync→ TabSubscribers
5. Stripe-CH-KYC
Payment-Processor für Founding-Memberships + Sponsorings. CH-Einzelfirma.
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.
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
ABAN NEWS safe.- 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.
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
- Tax-Country:
Switzerland - Tax-ID (UID): leer lassen wenn du keine Einzelfirma im HR hast
- VAT Registration:
Not registered - Tax-Reporting:
Form 1099-KNEIN (US-only) - Default Tax-Behavior für Produkte:
Inclusive(Brutto-Preise)
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
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.htmlCTA - 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
{CHECKOUT_SESSION_ID} erlaubt dir später, Bestell-Daten via Stripe-API zu pullen für Welcome-Email-Personalisierung.- 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→ tagfoundingoderpremium - Action 3:
Gmail → send personalized welcome
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:
- Success Founding
- Success Monthly mit Trial
- 3DS-Challenge → durchklicken
- Decline → kommst zurück zu Cancel-URL
- 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)
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)
6. Cloudflare-Worker + DNS
DNS bei Cloudflare (statt Porkbun), Email-Routing, Worker für Voice-Validator.
URL:dash.cloudflare.com/sign-up
- Email:
allengchour@gmail.com - Password: stark
- 2FA: TOTP-App empfohlen (Authy/1Password) — DNS = sensitive Infrastruktur
- Dashboard →
+ Add a site→abannews.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 zeigt dir 2 Nameserver: z.B. kate.ns.cloudflare.com + tom.ns.cloudflare.com (Namen sind random).
Porkbun:
- porkbun.com → Domain-List →
abannews.com→Details Authoritative nameservers→Edit- Existing entfernen (Porkbun-Default), CF-NS einsetzen
- Save
Verify-Loop: CF-Dashboard → "Pending nameserver update" → nach ~30 Min auto-detect.
- CF-Dashboard → abannews.com →
Email→Email Routing→Get started - Cloudflare fügt automatisch 3 MX-Records + 1 TXT hinzu (bestätigen)
- Routing-Rules:
hallo@abannews.com→ forward toallengchour@gmail.comdatenschutz@abannews.com→ forward toallengchour@gmail.comimpressum@abannews.com→ forward toallengchour@gmail.comsupport@abannews.com→ forward toallengchour@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.
via-cloudflare-Header → Label aban-news-mail. Dann hast du Inbox sauber.mail.abannews.com. Cloudflare-Routing ist für die ROOT-Domain. Konflikt-frei wenn du beehiiv auf Subdomain (mail.) hast und CF auf root.hallo@abannews.com, kommt in Gmail an innerhalb 30s.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});
}
};node --version testen, falls fehlt: nodejs.org install.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.
.cloudflare.env für andere Scripts:WORKER_VOICE_VALIDATOR=https://aban-voice-validator.xxx.workers.dev7. First-30-Subscriber-Outreach
Der echte Marathon. Die ersten 30 Subs sind nicht skalierbar — sie sind hand-crafted.
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.
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,
AllenTemplate 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, AllenTemplate 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,
AllenSend-Plan über 2 Tage:
| Slot | Time | Tier | Count |
|---|---|---|---|
| Tag 1 morning | 09-10h | Family | 5 |
| Tag 1 noon | 12-13h | Family | 5 |
| Tag 1 evening | 19-20h | Friends | 5 |
| Tag 2 morning | 09-10h | Friends | 5 |
| Tag 2 noon | 12-13h | Business | 5 |
| Tag 2 evening | 17-18h | Business | 5 |
Regeln:
- Max 5 Sends/Stunde — WhatsApp limit Personal-Account
- Niemals identisches Copy 2× hintereinander (sonst Bayes-Filter)
- Pro Send: minimal 1 Zeile personalization vorne
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
5 Standard-Reaktionen + Antworten:
- "Cool, hab subscribed!" → "Mega 🙏 sag mir bitte morgen nach der ersten Ausgabe ehrlich was du denkst — Lob auch erlaubt aber Kritik ist wertvoller."
- "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."
- "Wer steht dahinter?" → "Ich (Allen). Schweizer, mache das nebenbei. Mehr drüber: abannews.com/about"
- "Spam?" → "Nein 1 Mail pro Tag, gleiche Uhrzeit, du kannst jederzeit mit 1 Klick aus. Datenschutz: abannews.com/datenschutz"
- "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.
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.