Gerüst für ein eigenes B2B-Kaltakquise-Tool: Leads finden, E-Mail-Adresse ermitteln, getaktet anschreiben, Antworten einlesen, Abmeldungen sauber behandeln. Node.js und Postgres, keine fremde Plattform dazwischen.
Entpacken, npm install, loslegen. Wer den Code lieber in einem Stück an einen Coding-Assistenten gibt: outreach-starter.txt enthält alle 23 Dateien hintereinander, jede mit einer Zeile ===== DATEI: <pfad> =====. Einzeln steht alles weiter unten.
Fünf Stufen. Jede schreibt ihr Ergebnis in die Datenbank und setzt einen Status — dadurch ist jede Stufe einzeln wiederholbar, ohne die vorige neu laufen zu lassen.
newenriched oder invalidcontactedrepliednpm install cp .env.example .env # ausfüllen psql "$DATABASE_URL" -f migrations/001_outreach_schema.sql psql "$DATABASE_URL" -f migrations/002_sent_emails.sql npm start
CAMPAIGN_DRY_RUN=true ist Absicht. Erst auf false, wenn ein Testversand an die eigene Adresse sauber aussah — Betreff, Umlaute, Abmeldelink, Fußzeile.
Eine Kampagne ist eine Zeile in campaigns: Betreff plus Body-Template mit {{name}}, {{city}}, {{website}}. active = TRUE schaltet sie scharf.
Wer in der Mail um ein „kein Interesse" bittet, hat diese Wörter in jeder zitierten Antwort. Ohne Herausfiltern der eigenen Textbausteine wird jeder Interessent, der mit Zitat antwortet, gesperrt. Steht in optOut.js kommentiert — der mit Abstand teuerste Fehler des Systems.
SPF, DKIM und DMARC einrichten, bevor die erste Mail rausgeht, sonst landet alles im Spam. Das ist Voraussetzung, nicht Optimierung. Und mit 20–30 Mails pro Stunde anfangen, nicht mehr.
Dazu: echte Leute schreiben „Nein, danke" und „Bitte löschen", nicht „unsubscribe" — die Musterliste in optOut.js ist das Ergebnis mehrerer Durchläufe mit echten Antworten. Und ein Webserver ohne MX-Eintrag ist ein toter Briefkasten; mxCheck.js sortiert die vorab aus, statt Bounces zu sammeln.
Datei links wählen, rechts lesen, mit dem Knopf kopieren.
Kaltakquise per E-Mail an Firmen ist nach § 7 UWG nur in engen Grenzen zulässig, und die DSGVO gilt zusätzlich. Technisch unterstützt das Gerüst:
List-Unsubscribe gesetzt, Link siehe unsubToken.js)Selbst ergänzen: Hinweis nach Art. 14 DSGVO in der Mail, Impressum und Datenschutzerklärung mit Fristen, die zum Code passen. Keine Rechtsberatung — vor dem ersten echten Versand kurz prüfen lassen.
/jobs/*-Routen sind offen. Vor dem Deployment hinter ein Passwort legen oder rauswerfen und per CLI starten.harvest.js ist die Stelle dafür.Die Opt-out- und Scraper-Module sind der Teil, der wirklich Zeit gekostet hat. Der Rest ist bewusst einfach gehalten und darf ersetzt werden.