Come Automatizzare la tua Newsletter con un Agente IA
Un agente Claude legge la mia coda di contenuti, sceglie l'angolazione più forte della settimana, bozza una newsletter con la mia voce, segmenta la lista per livello di coinvolgimento e pianifica l'invio tramite l'API di Kit — tutto senza che io apra un editor. Revisiono un'anteprima renderizzata e clicco su approva. Il lavoro creativo difficile è mio; l'esecuzione meccanica è dell'agente.
Ogni mercoledì. 28.400+ operatori. Zero riempitivo.
✓ Controlla la tua casella — clicca sul link di conferma per completare l'iscrizione.
✓ Iscrizione completata!
✓ Sei già nella lista.
Indice
Aggiornato giugno 2026.
TL;DR: Un agente Claude legge la mia coda di contenuti, sceglie l’angolazione più forte della settimana, bozza una newsletter con la mia voce, segmenta la lista per livello di coinvolgimento e pianifica l’invio tramite l’API di Kit — tutto senza che io apra un editor. Revisiono un’anteprima renderizzata e clicco su approva. Il lavoro creativo difficile è mio; l’esecuzione meccanica è dell’agente.
[Lettura dell’operatore] Una newsletter che invia in modo consistente supera una che è “migliore” ma che viene inviata quando arriva l’ispirazione. Il vincolo era il carico di esecuzione, non le idee. Avevo idee; non avevo la larghezza di banda per formattarle, pianificarle e segmentarle ogni settimana. L’agente ha eliminato quel divario.
Il vero collo di bottiglia nella maggior parte dei workflow di newsletter
La maggior parte dei consigli sull’automazione delle newsletter si concentra sulla cosa sbagliata: sequenze di benvenuto, automazioni, logica di tagging. Va bene, ma non risolve il problema di creazione settimana per settimana.
Il vero problema è questo: sai cosa vuoi dire, ma sedersi per formattarlo, scrivere le varianti della riga dell’oggetto, scegliere il segmento giusto e pianificarlo al momento giusto costa 2-3 ore di cambio di contesto a settimana. Moltiplicato per 52 settimane, hai trascorso un’intera settimana lavorativa solo a inviare newsletter.
L’agente gestisce ogni passaggio dopo “so qual è l’angolazione di questa settimana.”
Lo stack che sto usando
- Kit (già ConvertKit) — la piattaforma email. Eccellente API, solido tagging degli iscritti, analisi pulita. L’API compatibile con gli agenti è ciò che mi ha convinto.
- Claude (Anthropic SDK) — il livello di generazione
- Cloudflare Workers — trigger pianificato (si esegue ogni martedì alle 8 CT)
- Airtable — coda di contenuti e casella di approvazione
Se non sei su Kit, lo stesso schema funziona con qualsiasi piattaforma che abbia un’API REST per creare e pianificare trasmissioni.
Passo 1: La coda di contenuti
L’agente ha bisogno di una fonte di verità su “di cosa stiamo scrivendo.” La mia è una tabella Airtable con colonne:
Topic— l’angolazione o la domandaStatus— Queue / Approved / SentTier— se questo è per tutti gli iscritti o solo per quelli più coinvoltiNotes— qualsiasi vincolo (evitare questo tono, includere questo link, ecc.)
Ogni settimana, passo 10 minuti ad aggiungere 2-3 argomenti alla coda. Questo è il mio contributo creativo. Il resto è il lavoro dell’agente.
Passo 2: L’agente di bozza
// 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}`);
},
};Passo 3: Il passaggio di approvazione
L’agente crea la trasmissione nello stato di bozza di Kit e contrassegna il record Airtable come “Approved.” Kit mi invia una notifica con un link di anteprima. Clicco su di esso, lo leggo, e se sembra giusto, confermo l’invio. Se voglio modifiche, modifico direttamente in Kit.
Questo è il cancello che impedisce all’agente di essere completamente autonomo sull’email in uscita. Mi fido delle bozze circa il 90% delle volte. Il 10% che rilevo nella revisione — un tono leggermente sbagliato, una statistica che voglio verificare, un link che voglio aggiungere — vale i 3 minuti di revisione.
Cosa gestisce l’agente che non voglio mai più fare
- Scrivere varianti della riga dell’oggetto e scegliere la migliore
- Formattare il testo del preheader
- Calcolare il tempo di invio corretto (il mio pubblico apre il giovedì mattina; l’agente lo sa)
- Segmentare correttamente in base al livello dell’argomento
- Registrare tutto in Airtable in modo da avere un archivio
Cosa possiedo ancora
L’idea. L’argomento nella coda è mio. L’angolazione è mia. L’agente è un ottimo esecutore di un brief chiaro; non è un livello strategico. Se metto un argomento sbagliato nella coda, ottengo una newsletter ben scritta su un argomento sbagliato.
Anche: il cancello della prima revisione. Ogni singolo invio viene esaminato da me prima di partire. Questo non cambierà.
La conclusione dell’operatore
Se stai spendendo più di un’ora a settimana sulla meccanica della newsletter — formattazione, pianificazione, segmentazione — dovresti automatizzarla. L’API di Kit è pulita, il trigger cron del Worker è solido come una roccia, e la qualità della bozza di Claude è abbastanza alta da permettermi di approvare ~90% delle prime bozze senza modifiche. Costruisci la coda in Airtable, collega il Worker e torna a creare idee invece di eseguire invii.
Ogni mercoledì. 28.400+ operatori. Zero riempitivo.
✓ Controlla la tua casella — clicca sul link di conferma per completare l'iscrizione.
✓ Iscrizione completata!
✓ Sei già nella lista.
Ricevi il manuale dell'IA nella tua casella di posta
Ogni mercoledì. 28.400+ operatori. Zero riempitivo.
Controlla la tua casella di posta.
Ti abbiamo inviato un'email di conferma — clicca sul link per completare l'iscrizione. Controlla lo spam se non la vedi entro un minuto.
Sei iscritto.
Benvenuto — la prossima edizione arriverà presto nella tua casella.
Sei già nella lista — cercala ogni mercoledì.