Alejandro Rioja.
AI Agents Growth

كيفية أتمتة نشرتك البريدية بوكيل ذكاء اصطناعي

Alejandro Rioja
Alejandro Rioja
5 د قراءة
TL;DR

يقرأ وكيل Claude قائمة انتظار المحتوى الخاصة بي، ويختار أقوى زاوية للأسبوع، ويصيغ النشرة البريدية بصوتي، ويقسم القائمة حسب مستوى التفاعل، ويجدول الإرسال عبر واجهة برمجة تطبيقات Kit — كل ذلك دون أن أفتح محرراً. أراجع معاينة مُصيَّرة وأضغط موافقة. العمل الإبداعي الصعب لي؛ التنفيذ الميكانيكي للوكيل.

نشرة بريدية مجانية

كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.

جدول المحتويات

محدث يونيو 2026.

خلاصة: يقرأ وكيل Claude قائمة انتظار المحتوى الخاصة بي، ويختار أقوى زاوية للأسبوع، ويصيغ النشرة البريدية بصوتي، ويقسم القائمة حسب مستوى التفاعل، ويجدول الإرسال عبر واجهة برمجة تطبيقات 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 دقائق.

ما يتولاه الوكيل مما لا أريد فعله مطلقاً

ما لا يزال ملكي

الفكرة. الموضوع في قائمة الانتظار ملكي. الزاوية ملكي. الوكيل منفّذ ممتاز لموجز واضح؛ إنه ليس طبقة استراتيجية. إذا وضعت موضوعاً سيئاً في القائمة، أحصل على نشرة بريدية مكتوبة جيداً عن موضوع سيئ.

أيضاً: بوابة المراجعة الأولى. كل إرسال يمر أمام عيني قبل خروجه. هذا لن يتغير.

خلاصة المشغّل

إذا كنت تقضي أكثر من ساعة أسبوعياً في ميكانيكيات النشرة البريدية — التنسيق والجدولة والتقسيم — فيجب أن تؤتمتها. واجهة برمجة تطبيقات Kit نظيفة، ومشغّل Worker cron صلب كالصخرة، وجودة مسودة Claude عالية بما يكفي لأوافق على نحو 90% من المسودات الأولى دون تغييرات. ابنِ القائمة في Airtable، وصِل Worker، وعُد إلى إنشاء الأفكار بدلاً من تنفيذ الإرسال.

تابع القراءة

احصل على دليل الذكاء الاصطناعي في صندوق بريدك

كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.

↵ لعرض كل النتائج esc esc للإغلاق