Alejandro Rioja.
AI Agents Growth

Wie man seinen Newsletter mit einem KI-Agenten automatisiert

Alejandro Rioja
Alejandro Rioja
5 Min. Lesezeit
TL;DR

Ein Claude-Agent liest meine Content-Queue, wählt den stärksten Blickwinkel der Woche, entwirft einen Newsletter in meiner Stimme, segmentiert die Liste nach Engagement-Stufe und plant den Versand über die Kit-API — alles ohne dass ich einen Editor öffne. Ich überprüfe eine gerenderte Vorschau und klicke auf Genehmigen. Die harte kreative Arbeit gehört mir; die mechanische Ausführung gehört dem Agenten.

Kostenloser Newsletter

Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.

Inhaltsverzeichnis

Aktualisiert Juni 2026.

TL;DR: Ein Claude-Agent liest meine Content-Queue, wählt den stärksten Blickwinkel der Woche, entwirft einen Newsletter in meiner Stimme, segmentiert die Liste nach Engagement-Stufe und plant den Versand über die Kit-API — alles ohne dass ich einen Editor öffne. Ich überprüfe eine gerenderte Vorschau und klicke auf Genehmigen. Die harte kreative Arbeit gehört mir; die mechanische Ausführung gehört dem Agenten.

[Operator-Lektüre] Ein Newsletter, der konsistent versendet wird, schlägt einen, der “besser” ist, aber nur versendet wird, wenn die Inspiration kommt. Die Einschränkung war der Ausführungsaufwand, nicht die Ideen. Ich hatte Ideen; ich hatte nicht die Kapazität, sie jede Woche zu formatieren, zu planen und zu segmentieren. Der Agent hat diese Lücke beseitigt.

Der tatsächliche Engpass in den meisten Newsletter-Workflows

Die meisten Newsletter-Automatisierungsratschläge konzentrieren sich auf das Falsche: Willkommenssequenzen, Automatisierungen, Tagging-Logik. Das ist in Ordnung, aber es löst nicht das wöchentliche Erstellungsproblem.

Das eigentliche Problem ist folgendes: Sie wissen, was Sie sagen wollen, aber sich hinzusetzen, um es zu formatieren, die Betreffzeilen-Varianten zu schreiben, das richtige Segment auszuwählen und es zur richtigen Zeit zu planen, kostet 2-3 Stunden Kontextwechsel pro Woche. Multipliziert mit 52 Wochen haben Sie eine ganze Arbeitswoche damit verbracht, Newsletter zu versenden.

Der Agent übernimmt jeden Schritt nach “Ich weiß, was der Blickwinkel dieser Woche ist.”

Der Stack, den ich verwende

Wenn Sie nicht auf Kit sind, funktioniert dasselbe Muster mit jeder Plattform, die eine REST-API zum Erstellen und Planen von Broadcasts hat.

Schritt 1: Die Content-Queue

Der Agent braucht eine Wahrheitsquelle dafür, “worüber wir schreiben.” Meine ist eine Airtable-Tabelle mit Spalten:

Jede Woche verbringe ich 10 Minuten damit, 2-3 Themen zur Queue hinzuzufügen. Das ist mein kreativer Input. Der Rest ist die Aufgabe des Agenten.

Schritt 2: Der Entwurfs-Agent

typescript
// workers/newsletter-agent/index.ts
import Anthropic from "@anthropic-ai/sdk";
import Airtable from "airtable";

const client = new Anthropic();

const VOICE_SYSTEM = `You are writing a weekly newsletter for Alejandro Rioja's subscribers.
His audience: founders and operators interested in AI agents, SEO, and growing a one-person business.
Voice: direct, first-person, practitioner. No hype, no "exciting times," no excessive bullet lists.
Structure every newsletter as:
1. One-sentence hook (the problem or observation)
2. The core insight (3–5 paragraphs, no headers, conversational)
3. One concrete action the reader can take this week
4. A short sign-off (2 sentences max)
Subject line: specific, outcome-oriented, under 50 chars. No clickbait.
Return JSON: { "subject": "...", "preheader": "...", "body": "..." }`;

async function getNextTopic(): Promise<{ id: string; topic: string; notes: string; tier: string }> {
  const base = new Airtable({ apiKey: process.env.AIRTABLE_API_KEY }).base(process.env.AIRTABLE_BASE_ID!);
  const records = await base("Newsletter Queue")
    .select({ filterByFormula: "{Status} = 'Queue'", sort: [{ field: "Created", direction: "asc" }], maxRecords: 1 })
    .firstPage();
  if (!records.length) throw new Error("Queue is empty. Add topics.");
  const r = records[0];
  return { id: r.id, topic: r.get("Topic") as string, notes: (r.get("Notes") as string) ?? "", tier: (r.get("Tier") as string) ?? "all" };
}

async function draftNewsletter(topic: string, notes: string): Promise<{ subject: string; preheader: string; body: string }> {
  const msg = await client.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: 2048,
    system: VOICE_SYSTEM,
    messages: [{ role: "user", content: `Write this week's newsletter on: "${topic}". Additional notes: ${notes || "none"}` }],
  });
  const text = (msg.content[0] as any).text.replace(/```json\n?/, "").replace(/```/, "").trim();
  return JSON.parse(text);
}

async function scheduleWithKit(draft: { subject: string; preheader: string; body: string }, tier: string): Promise<string> {
  const segmentId = tier === "engaged" ? process.env.KIT_ENGAGED_SEGMENT_ID : null;
  const sendAt = new Date();
  sendAt.setDate(sendAt.getDate() + ((4 - sendAt.getDay() + 7) % 7)); // next Thursday
  sendAt.setHours(9, 0, 0, 0); // 9am CT

  const payload: any = {
    broadcast: {
      subject: draft.subject,
      content: draft.body,
      description: draft.preheader,
      send_at: sendAt.toISOString(),
      email_layout_template: "minimal",
    },
  };
  if (segmentId) payload.broadcast.segment_id = segmentId;

  const res = await fetch("https://api.kit.com/v4/broadcasts", {
    method: "POST",
    headers: { "Content-Type": "application/json", "X-Kit-Api-Key": process.env.KIT_API_KEY! },
    body: JSON.stringify(payload),
  });
  const data = await res.json();
  return data.broadcast?.id ?? "";
}

export default {
  async scheduled(_event: ScheduledEvent, env: Env) {
    // Inject env vars
    Object.assign(process.env, env);
    const { id, topic, notes, tier } = await getNextTopic();
    const draft = await draftNewsletter(topic, notes);
    const broadcastId = await scheduleWithKit(draft, tier);

    // Mark as Approved in Airtable (not Sent — human reviews the Kit preview before confirm)
    const base = new Airtable({ apiKey: env.AIRTABLE_API_KEY }).base(env.AIRTABLE_BASE_ID);
    await base("Newsletter Queue").update(id, { Status: "Approved", KitBroadcastId: broadcastId });

    console.log(`Scheduled broadcast ${broadcastId} for topic: ${topic}`);
  },
};

Schritt 3: Der Genehmigungsschritt

Der Agent erstellt den Broadcast im Entwurfsstatus von Kit und markiert den Airtable-Eintrag als “Approved.” Kit sendet mir eine Benachrichtigung mit einem Vorschau-Link. Ich klicke darauf, lese es, und wenn es richtig aussieht, bestätige ich den Versand. Wenn ich Änderungen möchte, bearbeite ich direkt in Kit.

Das ist das Tor, das verhindert, dass der Agent beim ausgehenden E-Mail vollständig autonom wird. Ich vertraue den Entwürfen etwa 90% der Zeit. Die 10%, die ich bei der Überprüfung entdecke — ein leicht falscher Ton, eine Statistik, die ich verifizieren möchte, ein Link, den ich hinzufügen möchte — sind die 3-minütige Überprüfung wert.

Was der Agent übernimmt, das ich nie wieder tun möchte

Was mir noch gehört

Die Idee. Das Thema in der Queue ist meins. Der Blickwinkel ist meiner. Der Agent ist ein großartiger Ausführender eines klaren Briefings; er ist keine Strategieschicht. Wenn ich ein schlechtes Thema in die Queue stelle, bekomme ich einen gut geschriebenen Newsletter über ein schlechtes Thema.

Außerdem: das erste Überprüfungstor. Jeder einzelne Versand wird von mir überprüft, bevor er rausgeht. Das wird sich nicht ändern.

Das Fazit des Operators

Wenn Sie mehr als eine Stunde pro Woche mit Newsletter-Mechanik verbringen — Formatierung, Planung, Segmentierung — sollten Sie es automatisieren. Die Kit-API ist sauber, der Worker-Cron-Auslöser ist felsenfest, und die Claude-Entwurfsqualität ist hoch genug, dass ich ~90% der ersten Entwürfe unverändert genehmige. Bauen Sie die Queue in Airtable, verbinden Sie den Worker und kehren Sie zur Ideengenerierung zurück, anstatt Versendungen auszuführen.

Weiterlesen

Holen Sie sich das KI-Playbook in Ihr Postfach

Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.

↵ alle Ergebnisse anzeigen esc esc zum Schließen