OPEN HYPER STEP
← 목록으로 (ai-startup)
AI-STARTUP · 35 / 100
ai-startup
CHAPTER 35 / 100
읽기 약 2
FUNCTION

AI 뉴스레터: 주간 자동 발행 시스템


핵심 개념

curation·요약·개인화·발송 — 매주 자동 뉴스레터.

본문

뉴스레터 자동화 흐름

📋 코드 (7줄)
1. 콘텐츠 수집 (RSS·트위터·뉴스 API)
2. 큐레이션 (LLM이 중요도 평가)
3. 요약 (3줄 요약·핵심 인용)
4. 구성 (HTML 템플릿)
5. 개인화 (구독자 관심사)
6. 발송 (Resend·SendGrid)
7. 분석 (open rate·click)

콘텐츠 수집

TYPESCRIPT📋 코드 (27줄)
// RSS Feed
import Parser from 'rss-parser';
const parser = new Parser();

const feeds = [
  'https://news.ycombinator.com/rss',
  'https://www.indiehackers.com/feed.xml',
  // ...
];

const allItems = [];
for (const url of feeds) {
  const feed = await parser.parseURL(url);
  allItems.push(...feed.items.map(item => ({
    title: item.title,
    url: item.link,
    pubDate: item.pubDate,
    source: feed.title,
  })));
}


// 트위터 (X API v2)
const tweets = await fetch(
  `https://api.twitter.com/2/users/${userId}/tweets?max_results=100`,
  { headers: { Authorization: `Bearer ${TWITTER_TOKEN}` } },
);

LLM 큐레이션

TYPESCRIPT📋 코드 (19줄)
const result = await generateObject({
  model: anthropic('claude-sonnet-4-6'),
  schema: z.object({
    items: z.array(z.object({
      title: z.string(),
      url: z.string(),
      summary: z.string().describe('3줄 한국어 요약'),
      relevance: z.number().min(1).max(10),
      category: z.enum(['ai', 'startup', 'engineering', 'design']),
      reason: z.string().describe('왜 이 항목이 중요한가'),
    })),
  }),
  prompt: `Review these articles and pick the 10 most important for our audience (Korean indie developers building AI startups).

Articles:
${allItems.map((it, i) => `${i+1}. [${it.source}] ${it.title}\n${it.url}`).join('\n\n')}`,
});

const top10 = result.object.items.filter(i => i.relevance >= 7);

HTML 템플릿 (React Email)

TSX📋 코드 (30줄)
import { Html, Body, Heading, Section, Text, Link, Hr } from '@react-email/components';

export function NewsletterEmail({ items, name }: any) {
  return (
    <Html>
      <Body style={{ fontFamily: 'sans-serif' }}>
        <Heading>{name}님, 이번 주 AI·창업 인사이트 📬</Heading>

        {items.map(item => (
          <Section key={item.url}>
            <Heading as="h3">{item.title}</Heading>
            <Text style={{ color: '#666' }}>출처: {item.source}</Text>
            <Text>{item.summary}</Text>
            <Link href={`${item.url}?utm_source=newsletter&utm_campaign=${weekNum}`}>
              자세히 →
            </Link>
            <Hr />
          </Section>
        ))}

        <Section style={{ marginTop: 32 }}>
          <Text style={{ color: '#999', fontSize: 12 }}>
            이 메일은 [Newsletter Name] 구독자에게 발송됩니다.
            <Link href="{unsubscribe_url}">구독 해지</Link>
          </Text>
        </Section>
      </Body>
    </Html>
  );
}

개인화

TYPESCRIPT📋 코드 (20줄)
// 구독자 관심사 기반 큐레이션
async function generatePersonalized(subscriber: Subscriber) {
  const allItems = await fetchAllItems();

  const result = await generateObject({
    model: anthropic('claude-sonnet-4-6'),
    schema: ItemsSchema,
    prompt: `Pick 10 articles for this subscriber:

Profile:
- Interests: ${subscriber.interests.join(', ')}
- Role: ${subscriber.role}
- Reading history: ${subscriber.recentClicks.join(', ')}

Articles to choose from:
${allItems.slice(0, 100).map(formatItem).join('\n')}`,
  });

  return result.object.items;
}

발송 (Resend Batch)

TYPESCRIPT📋 코드 (21줄)
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY!);

const subscribers = await db.subscribers.findMany({ where: { active: true } });

// Batch 발송 (500개씩)
const chunks = chunk(subscribers, 100);
for (const batch of chunks) {
  await resend.batch.send(
    batch.map(sub => ({
      from: 'You <newsletter@example.com>',
      to: sub.email,
      subject: `📬 이번 주 인사이트 (${weekNum}주차)`,
      react: NewsletterEmail({ items: sub.personalizedItems, name: sub.name }),
      headers: {
        'List-Unsubscribe': `<https://example.com/unsubscribe?token=${sub.token}>`,
      },
    })),
  );
  await sleep(1000);  // Rate limit
}

분석

TYPESCRIPT📋 코드 (11줄)
// 발송 후 추적
- Open rate (이메일 픽셀)
- Click rate (링크 click)
- Unsubscribe
- Forward (가능한 경우)


// 다음 주 개선
- 클릭 많은 카테고리 → 가중치 ↑
- 클릭 없는 카테고리 → 빈도 ↓
- 활성 구독자만 발송 (3개월 비활성 제외)

비용 (1000명 구독자)

📋 코드 (14줄)
월 4통 발송 × 1000명 = 4000 emails

Resend:
- 3000/mo 무료
- 추가 $0.001/email

Claude Sonnet (큐레이션):
- 주 1회 × 4 = $2

총: $5~10/mo


수동 작성 시 주 4시간 × $50 = $800/mo
→ 99% 절감

다음 챕터

CH.36 "AI 소셜 미디어".


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
무료

월 $0 — 검증·시작 단계

AI 뉴스레터을 무료 도구만으로
시작하는 방법을 알려줘.
소자본

월 $20~50 — MVP·초기 운영

월 $20~50 예산으로 AI 뉴스레터을
검증·MVP 단계까지 진행하는 전략은?
프로덕션

월 $200~500 — 성장 단계

AI 뉴스레터을 프로덕션 단계로
확장할 때 필요한 도구·운영 체계는?
스택

풀스택 — 도구 조합 분석

2026년 AI 뉴스레터 관련 도구 5개를
조합한 추천 스택을 알려줘.

⭐ 이것만 기억하세요
AI 뉴스레터: 주간 자동 발행 시스템 이 3가지만 확실히 잡으세요
1.RSS + LLM 큐레이션 + Resend = 자동 뉴스레터
2.개인화 (관심사·이력)으로 click rate 2~3배
3.월 $5~10으로 1000명 구독자 발송


공유하기
진행도 35 / 100