Alejandro Rioja.
AI Agents Growth

Как Автоматизировать Рассылку с Помощью ИИ-агента

Alejandro Rioja
Alejandro Rioja
5 мин чтения
TL;DR

Агент Claude читает мою очередь контента, выбирает самый сильный угол недели, составляет рассылку в моём стиле, сегментирует список по уровню вовлечённости и планирует отправку через API Kit — всё без того, чтобы я открывал редактор. Я просматриваю отрендеренный превью и нажимаю «Одобрить». Сложная творческая работа — моя; механическое исполнение — агента.

Бесплатная рассылка

Каждую среду. 28 400+ читателей. Никакой воды.

Содержание

Обновлено июнь 2026.

TL;DR: Агент Claude читает мою очередь контента, выбирает самый сильный угол недели, составляет рассылку в моём стиле, сегментирует список по уровню вовлечённости и планирует отправку через API Kit — всё без того, чтобы я открывал редактор. Я просматриваю отрендеренный превью и нажимаю «Одобрить». Сложная творческая работа — моя; механическое исполнение — агента.

[Заметка оператора] Рассылка, которая отправляется последовательно, обходит ту, что «лучше», но выходит когда приходит вдохновение. Ограничением были накладные расходы на исполнение, а не идеи. Идеи были; не хватало пропускной способности, чтобы форматировать, планировать и сегментировать их каждую неделю. Агент устранил этот разрыв.

Реальное узкое место в большинстве рабочих процессов рассылки

Большинство советов по автоматизации рассылок фокусируются на неправильном: приветственные последовательности, автоматизации, логика тегирования. Это хорошо, но не решает проблему создания контента неделю за неделей.

Настоящая помеха вот в чём: вы знаете, что хотите сказать, но садиться форматировать, писать варианты строки темы, выбирать правильный сегмент и планировать в нужное время стоит 2-3 часа переключения контекста в неделю. Умножьте на 52 недели — и вы потратите целую рабочую неделю только на отправку рассылок.

Агент обрабатывает каждый шаг после «я знаю, каков угол этой недели».

Стек, который я использую

Если вы не на Kit, тот же паттерн работает с любой платформой, у которой есть REST API для создания и планирования рассылок.

Шаг 1: Очередь контента

Агенту нужен источник правды о том, «о чём мы пишем». У меня это таблица Airtable со столбцами:

Каждую неделю я трачу 10 минут на добавление 2-3 тем в очередь. Это мой творческий вклад. Остальное — работа агента.

Шаг 2: Агент-составитель

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}`);
  },
};

Шаг 3: Этап одобрения

Агент создаёт рассылку в статусе черновика в Kit и помечает запись Airtable как «Approved». Kit отправляет мне уведомление со ссылкой на превью. Я нажимаю на неё, читаю, и если всё выглядит правильно, подтверждаю отправку. Если нужны изменения, редактирую напрямую в Kit.

Это ворота, которые не дают агенту стать полностью автономным в исходящей почте. Я доверяю черновикам примерно 90% времени. 10%, которые я выявляю при проверке — слегка неверный тон, статистику, которую хочу проверить, ссылку, которую хочу добавить — стоят 3-минутного обзора.

Что агент берёт на себя, чего я больше не хочу делать

Что по-прежнему моё

Идея. Тема в очереди — моя. Угол — мой. Агент — отличный исполнитель чёткого брифа; это не стратегический уровень. Если я положу плохую тему в очередь, получу хорошо написанную рассылку о плохой теме.

Также: ворота первой проверки. Каждая отправка проходит через мои глаза перед выходом. Это не изменится.

Итог оператора

Если вы тратите более часа в неделю на механику рассылки — форматирование, планирование, сегментацию — вам следует автоматизировать это. API Kit чистый, cron-триггер Worker надёжен как скала, а качество черновиков Claude достаточно высокое, чтобы я одобрял ~90% первых черновиков без изменений. Постройте очередь в Airtable, подключите Worker и вернитесь к созданию идей вместо выполнения отправок.

Читать дальше

Получайте ИИ-руководство на почту

Каждую среду. 28 400+ читателей. Никакой воды.

↵ — все результаты esc esc — закрыть