Richbukae AI Architect 마케팅 시스템 v1 Implementation Plan
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: GetLate SNS 배포 → Brevo 뉴스레터 → richbukae.com 구매 퍼널을 AI 자동화로 구축하여 첫 유료 고객을 창출한다.
Architecture: 콘텐츠 생성(AI)→ SNS 배포(GetLate)→ 랜딩 트래픽(richbukae.com)→ 뉴스레터 구독(Brevo)→ 이메일 시퀀스→ 결제(TossPayments) 순서의 단방향 퍼널. GA4 이벤트로 각 단계 전환율을 측정하고, marketing-os Turso DB에 캠페인 성과를 누적한다.
Tech Stack: Next.js 15, Google Analytics 4 (gtag.js), Brevo SDK (@getbrevo/brevo), GetLate API, Turso (marketing-os), Vercel Analytics, content-orchestration 대시보드
📊 시스템 전체 흐름도
[콘텐츠 생성 - AI]
|
v
[SNS 배포 - GetLate × 13 플랫폼]
|
v
[richbukae.com 랜딩] ──→ [GA4: page_view, scroll, click_cta]
|
v
[뉴스레터 구독 폼] ──→ [GA4: newsletter_signup]
|
v
[Brevo 이메일 시퀀스]
├─ D+0: 웰컴 메일 (무료 AI 팁 + 상품 소개)
├─ D+2: 소셜 증명 메일 (리치부캐 스토리)
├─ D+4: 가치 메일 (AI 설계자 방법론)
└─ D+7: 전환 메일 (한정 할인 CTA)
|
v
[richbukae.com/bundle] ──→ [GA4: begin_checkout, purchase]
|
v
[TossPayments 결제 완료]
|
v
[marketing-os DB: 주문 기록 + UTM 출처 저장]
|
v
[content-orchestration 대시보드: 퍼널 리포트]
🎯 KPI 지표 정의
| 단계 | 지표 | 목표 (MVP 30일) | 측정 도구 |
|---|---|---|---|
| SNS 도달 | 총 노출 | 10,000 | GetLate Analytics |
| 랜딩 트래픽 | 월 UV | 500 | GA4 |
| 구독 전환율 | 방문자→구독 | 5% (25명) | GA4 + Brevo |
| 이메일 오픈율 | 시퀀스 D+0 | 40%+ | Brevo |
| 결제 전환율 | 구독자→구매 | 3% (0.75명→반올림 1명) | GA4 + marketing-os |
| 매출 | 월 GMV | ₩49,000~₩199,000 | Toss + DB |
🤖 AI 자동화 포인트
| # | 자동화 항목 | 현재 상태 | 필요 작업 |
|---|---|---|---|
| 1 | SNS 콘텐츠 생성 (Claude Haiku) | content-pipeline 구현됨, CEO HOLD | OPENROUTER_API_KEY 설정 후 활성화 |
| 2 | GetLate 멀티플랫폼 배포 | API 키 설정됨, 계정 연결 필요 | CEO: getlate.dev 대시보드 계정 연결 |
| 3 | Brevo 웰컴 시퀀스 자동 트리거 | 미구현 | Task 3 구현 |
| 4 | GA4 이벤트 자동 수집 | richbukae에 GA 미설치 | Task 1 구현 |
| 5 | 주간 퍼널 리포트 생성 | 미구현 | Task 6 구현 |
⚠️ CEO 블로킹 (플랜 착수 전 확인 필요)
| # | 항목 | 영향 | 우선순위 |
|---|---|---|---|
| 1 | GetLate 대시보드 SNS 계정 연결 | SNS 자동 배포 불가 | 🔴 HIGH |
| 2 | NEXT_PUBLIC_GA_MEASUREMENT_ID 발급 | GA 트래킹 불가 | 🔴 HIGH |
| 3 | Toss Live 키 (TOSS_SECRET_KEY) | 실결제 불가 (테스트 가능) | 🟡 MEDIUM |
| 4 | Brevo 발신 이메일 인증 | 이메일 시퀀스 불가 | 🟡 MEDIUM |
CEO 블로킹 없이 선행 가능한 Task: 1, 2, 3, 4, 5 (Task 6~7은 CEO 블로킹 해제 후)
Task 1: Google Analytics 4 설치 — richbukae-store
Files:
- Create:
projects/richbukae-store/src/components/GoogleAnalytics.tsx - Modify:
projects/richbukae-store/src/app/layout.tsx - Modify:
projects/richbukae-store/.env.example
Step 1: GoogleAnalytics 컴포넌트 생성
// projects/richbukae-store/src/components/GoogleAnalytics.tsx
'use client';
import Script from 'next/script';
const GA_ID = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID;
export default function GoogleAnalytics() {
if (!GA_ID) return null;
return (
<>
<Script
src={`https://www.googletagmanager.com/gtag/js?id=${GA_ID}`}
strategy="afterInteractive"
/>
<Script id="google-analytics" strategy="afterInteractive">
{`
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${GA_ID}', {
page_path: window.location.pathname,
});
`}
</Script>
</>
);
}
// GA 이벤트 트래킹 유틸리티
export function trackEvent(
action: string,
params?: Record<string, string | number>
) {
if (typeof window === 'undefined' || !GA_ID) return;
window.gtag?.('event', action, params);
}
Step 2: layout.tsx에 컴포넌트 추가
projects/richbukae-store/src/app/layout.tsx에서 <body> 바로 안쪽에 추가:
import GoogleAnalytics from '@/components/GoogleAnalytics';
// <body> 내부, Analytics 컴포넌트들과 함께:
<GoogleAnalytics />
Step 3: .env.example 업데이트
# Analytics
NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX
Step 4: 빌드 테스트
cd projects/richbukae-store && npm run build 2>&1 | grep -E "error|warning|✓"
Expected: ✓ Compiled successfully
Step 5: Commit
git add projects/richbukae-store/src/components/GoogleAnalytics.tsx
git add projects/richbukae-store/src/app/layout.tsx
git add projects/richbukae-store/.env.example
git commit -m "feat: add Google Analytics 4 to richbukae-store"
Task 2: GA4 퍼널 이벤트 트래킹 구현
Files:
- Modify:
projects/richbukae-store/src/app/api/subscribe/route.ts - Modify:
projects/richbukae-store/src/components/NewsletterForm.tsx(또는 구독 폼 컴포넌트) - Modify:
projects/richbukae-store/src/app/success/page.tsx
Step 1: 뉴스레터 구독 이벤트 — 클라이언트 측
구독 폼 컴포넌트에 trackEvent 추가:
import { trackEvent } from '@/components/GoogleAnalytics';
// 구독 성공 시:
trackEvent('newsletter_signup', {
source: 'richbukae_landing',
method: 'email_form',
});
Step 2: 결제 성공 이벤트 — success 페이지
src/app/success/page.tsx에 구매 이벤트 추가:
'use client';
import { useEffect } from 'react';
import { useSearchParams } from 'next/navigation';
import { trackEvent } from '@/components/GoogleAnalytics';
export default function SuccessPage() {
const params = useSearchParams();
useEffect(() => {
const orderId = params.get('orderId');
const amount = params.get('amount');
if (orderId && amount) {
trackEvent('purchase', {
transaction_id: orderId,
value: Number(amount) / 100, // Toss는 원 단위
currency: 'KRW',
items: [{ item_name: 'richbukae_bundle' }],
});
}
}, [params]);
// ... 기존 렌더링
}
Step 3: CTA 클릭 이벤트 — 버튼 컴포넌트들
주요 CTA 버튼에 추가:
// 번들 구매 버튼 클릭 시
trackEvent('begin_checkout', {
value: 49000,
currency: 'KRW',
});
// 무료 가이드 다운로드 클릭 시
trackEvent('download_free_guide', {
content_type: 'ai_guide',
});
Step 4: Commit
git add projects/richbukae-store/src/
git commit -m "feat: add GA4 funnel event tracking (signup, purchase, cta)"
Task 3: Brevo 이메일 웰컴 시퀀스 구현
Files:
- Create:
projects/richbukae-store/src/lib/brevo-sequences.ts - Modify:
projects/richbukae-store/src/app/api/subscribe/route.ts
Step 1: Brevo 시퀀스 라이브러리 생성
// projects/richbukae-store/src/lib/brevo-sequences.ts
import * as SibApiV3Sdk from '@getbrevo/brevo';
const client = new SibApiV3Sdk.TransactionalEmailsApi();
client.setApiKey(
SibApiV3Sdk.TransactionalEmailsApiApiKeys.apiKey,
process.env.BREVO_API_KEY!
);
export interface SubscriberInfo {
email: string;
firstName?: string;
source?: string;
}
/**
* 웰컴 이메일 발송 (D+0 즉시)
* Brevo 리스트 7 추가 + 웰컴 메일 발송
*/
export async function sendWelcomeEmail(subscriber: SubscriberInfo): Promise<void> {
const sendSmtpEmail = {
to: [{ email: subscriber.email, name: subscriber.firstName || '안녕하세요' }],
sender: { name: '리치부캐', email: 'contact@richbukae.com' },
subject: '🎉 구독 감사합니다! AI 설계자 무료 가이드를 드립니다',
htmlContent: `
<div style="font-family: 'Apple SD Gothic Neo', sans-serif; max-width: 600px; margin: 0 auto;">
<h1 style="color: #1a1a1a;">안녕하세요, ${subscriber.firstName || ''}님!</h1>
<p>리치부캐 뉴스레터를 구독해주셔서 감사합니다.</p>
<p>AI 설계자 시리즈의 핵심 내용을 이메일로 보내드립니다.</p>
<h2>이번 주 AI 핵심 팁</h2>
<p>AI로 비즈니스를 설계하는 3가지 핵심 원칙:</p>
<ol>
<li><strong>문제 정의 먼저</strong> — AI 도구보다 해결할 문제를 먼저 명확히</li>
<li><strong>프롬프트 시스템화</strong> — 한 번 잘 만든 프롬프트를 반복 사용</li>
<li><strong>측정 가능한 목표</strong> — AI 도입 전후 수치 비교</li>
</ol>
<div style="background: #f5f5f5; padding: 20px; border-radius: 8px; margin: 20px 0;">
<p style="margin: 0;"><strong>다음 이메일 예고</strong> (2일 후)</p>
<p style="margin: 8px 0 0;">리치부캐가 AI로 비즈니스를 바꾼 실제 사례를 공유합니다.</p>
</div>
<p style="color: #666; font-size: 14px;">
구독 취소: <a href="{{unsubscribeLink}}">여기를 클릭</a>
</p>
</div>
`,
};
await client.sendTransacEmail(sendSmtpEmail);
}
/**
* 구독자 Brevo 리스트 추가
*/
export async function addToBrevoList(subscriber: SubscriberInfo): Promise<void> {
const contactsApi = new SibApiV3Sdk.ContactsApi();
contactsApi.setApiKey(
SibApiV3Sdk.ContactsApiApiKeys.apiKey,
process.env.BREVO_API_KEY!
);
await contactsApi.createContact({
email: subscriber.email,
attributes: {
FIRSTNAME: subscriber.firstName || '',
SOURCE: subscriber.source || 'richbukae_web',
},
listIds: [Number(process.env.BREVO_LIST_ID || '7')],
updateEnabled: true,
});
}
Step 2: subscribe API에 웰컴 이메일 트리거 추가
src/app/api/subscribe/route.ts 기존 코드에 추가:
import { addToBrevoList, sendWelcomeEmail } from '@/lib/brevo-sequences';
// 구독 처리 후 추가:
const subscriberInfo = {
email: body.email,
firstName: body.firstName,
source: body.source || 'richbukae_web',
};
await addToBrevoList(subscriberInfo);
// 웰컴 이메일 비동기 발송 (실패해도 구독은 성공)
sendWelcomeEmail(subscriberInfo).catch(err =>
console.error('[brevo] welcome email failed:', err)
);
Step 3: 빌드 테스트
cd projects/richbukae-store && npm run build 2>&1 | grep -E "error|✓"
Expected: ✓ Compiled successfully
Step 4: Commit
git add projects/richbukae-store/src/lib/brevo-sequences.ts
git add projects/richbukae-store/src/app/api/subscribe/route.ts
git commit -m "feat: add Brevo welcome email sequence on newsletter signup"
Task 4: GetLate SNS 자동 배포 트리거 구현
Files:
- Create:
projects/richbukae-store/src/lib/getlate-publisher.ts - Create:
projects/richbukae-store/src/app/api/publish-sns/route.ts
⚠️ CEO 블로킹: GetLate 대시보드(getlate.dev)에서 SNS 계정 연결 완료 후 실행 가능
Step 1: GetLate 클라이언트 라이브러리
// projects/richbukae-store/src/lib/getlate-publisher.ts
const GETLATE_API_BASE = 'https://getlate.dev/api/v1';
const GETLATE_API_KEY = process.env.GETLATE_API_KEY;
export interface SnsPost {
content: string;
platforms: string[]; // ['twitter', 'instagram', 'linkedin']
imageUrl?: string;
scheduleAt?: string; // ISO 8601, 없으면 즉시
}
export async function publishToSns(post: SnsPost): Promise<{ success: boolean; postIds: string[] }> {
if (!GETLATE_API_KEY) {
console.warn('[getlate] API 키 없음 — mock 모드');
return { success: true, postIds: ['mock-id'] };
}
const response = await fetch(`${GETLATE_API_BASE}/posts`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${GETLATE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: post.content,
platforms: post.platforms,
media_urls: post.imageUrl ? [post.imageUrl] : [],
scheduled_at: post.scheduleAt || null,
}),
});
if (!response.ok) {
throw new Error(`GetLate API error: ${response.status}`);
}
const data = await response.json();
return { success: true, postIds: data.post_ids || [] };
}
/**
* 블로그 발행 시 SNS 자동 배포 (richbukae 콘텐츠용)
*/
export async function publishBlogToSns(params: {
title: string;
summary: string;
url: string;
hashtags?: string[];
}): Promise<void> {
const hashtags = (params.hashtags || ['AI설계자', '리치부캐', '비즈니스AI']).map(h => `#${h}`).join(' ');
const content = `${params.title}\n\n${params.summary}\n\n${params.url}\n\n${hashtags}`;
await publishToSns({
content,
platforms: ['twitter', 'instagram', 'linkedin'],
});
}
Step 2: SNS 발행 API 엔드포인트
// projects/richbukae-store/src/app/api/publish-sns/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { publishToSns } from '@/lib/getlate-publisher';
// 내부 전용 API (Bearer 토큰 인증)
export async function POST(req: NextRequest) {
const authHeader = req.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.INTERNAL_API_SECRET}`) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const body = await req.json();
const { content, platforms, imageUrl, scheduleAt } = body;
if (!content || !platforms?.length) {
return NextResponse.json({ error: 'content and platforms required' }, { status: 400 });
}
try {
const result = await publishToSns({ content, platforms, imageUrl, scheduleAt });
return NextResponse.json(result);
} catch (err) {
console.error('[publish-sns] error:', err);
return NextResponse.json({ error: 'publish failed' }, { status: 500 });
}
}
Step 3: Commit
git add projects/richbukae-store/src/lib/getlate-publisher.ts
git add projects/richbukae-store/src/app/api/publish-sns/route.ts
git commit -m "feat: add GetLate SNS publisher for richbukae content distribution"
Task 5: marketing-os DB 스키마 설계 (캠페인 트래킹)
Files:
- Create:
projects/richbukae-store/src/lib/marketing-db.ts - Run: Turso SQL 직접 실행
Turso marketing-os DB:
marketing-os-migkjy.aws-ap-northeast-1.turso.io
Step 1: marketing-os DB에 테이블 생성
# 루트 .env에서 토큰 확인 후:
TURSO_TOKEN=$(grep TURSO_DB_TOKEN .env | cut -d= -f2-)
# funnel_events 테이블
curl -sS -X POST "https://marketing-os-migkjy.aws-ap-northeast-1.turso.io/v2/pipeline" \
-H "Authorization: Bearer $TURSO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"requests": [{
"type": "execute",
"stmt": {
"sql": "CREATE TABLE IF NOT EXISTS funnel_events (id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, event_name TEXT NOT NULL, project TEXT DEFAULT '\''richbukae'\'', utm_source TEXT, utm_medium TEXT, utm_campaign TEXT, email TEXT, amount INTEGER, currency TEXT DEFAULT '\''KRW'\'', metadata TEXT, created_at INTEGER NOT NULL)",
"args": []
}
}]
}'
# campaigns 테이블
curl -sS -X POST "https://marketing-os-migkjy.aws-ap-northeast-1.turso.io/v2/pipeline" \
-H "Authorization: Bearer $TURSO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"requests": [{
"type": "execute",
"stmt": {
"sql": "CREATE TABLE IF NOT EXISTS campaigns (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, platform TEXT, status TEXT DEFAULT '\''active'\'', budget INTEGER, spend INTEGER DEFAULT 0, impressions INTEGER DEFAULT 0, clicks INTEGER DEFAULT 0, conversions INTEGER DEFAULT 0, revenue INTEGER DEFAULT 0, start_date TEXT, end_date TEXT, created_at INTEGER NOT NULL)",
"args": []
}
}]
}'
Step 2: marketing-os 클라이언트 라이브러리
// projects/richbukae-store/src/lib/marketing-db.ts
const MARKETING_DB_URL = process.env.MARKETING_OS_DB_URL?.replace('libsql://', 'https://');
const TURSO_TOKEN = process.env.TURSO_DB_TOKEN;
export interface FunnelEvent {
event_name: string;
session_id?: string;
project?: string;
utm_source?: string;
utm_medium?: string;
utm_campaign?: string;
email?: string;
amount?: number;
metadata?: Record<string, unknown>;
}
export async function trackFunnelEvent(event: FunnelEvent): Promise<void> {
if (!MARKETING_DB_URL || !TURSO_TOKEN) return;
const now = Date.now();
await fetch(`${MARKETING_DB_URL}/v2/pipeline`, {
method: 'POST',
headers: {
Authorization: `Bearer ${TURSO_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
requests: [{
type: 'execute',
stmt: {
sql: `INSERT INTO funnel_events (event_name, session_id, project, utm_source, utm_medium, utm_campaign, email, amount, metadata, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
args: [
{ type: 'text', value: event.event_name },
{ type: 'text', value: event.session_id || '' },
{ type: 'text', value: event.project || 'richbukae' },
{ type: 'text', value: event.utm_source || '' },
{ type: 'text', value: event.utm_medium || '' },
{ type: 'text', value: event.utm_campaign || '' },
{ type: 'text', value: event.email || '' },
{ type: 'integer', value: String(event.amount || 0) },
{ type: 'text', value: event.metadata ? JSON.stringify(event.metadata) : '' },
{ type: 'integer', value: String(now) },
],
},
}],
}),
}).catch(err => console.error('[marketing-db] track failed:', err));
}
Step 3: subscribe API에 funnel 이벤트 추가
// subscribe/route.ts에 추가
import { trackFunnelEvent } from '@/lib/marketing-db';
// 구독 성공 후:
trackFunnelEvent({
event_name: 'newsletter_signup',
email: body.email,
utm_source: body.utm_source,
utm_medium: body.utm_medium,
utm_campaign: body.utm_campaign,
project: 'richbukae',
}).catch(() => {}); // 실패해도 무시
Step 4: Commit
git add projects/richbukae-store/src/lib/marketing-db.ts
git commit -m "feat: add marketing-os funnel event tracking"
Task 6: content-orchestration 멀티프로젝트 확장 (richbukae 채널 추가)
content-orchestration은 현재 apppro 전용 — richbukae, ai-architect-global 채널 추가
Files:
- Modify:
projects/content-orchestration/src/lib/channels.ts(또는 channels 설정 파일) - Modify:
projects/content-orchestration/src/app/page.tsx(프로젝트 선택 UI)
Step 1: 채널 설정에 richbukae 추가
content-orchestration의 채널/프로젝트 설정 파일을 읽고 richbukae 채널 추가:
// 추가할 채널 설정
const RICHBUKAE_CHANNELS = [
{ id: 'richbukae-blog', name: 'richbukae 블로그', type: 'blog', platform: 'richbukae.com', is_active: 1 },
{ id: 'richbukae-newsletter', name: 'richbukae 뉴스레터', type: 'newsletter', platform: 'brevo', is_active: 1 },
{ id: 'richbukae-sns', name: 'richbukae SNS (GetLate)', type: 'sns', platform: 'getlate', is_active: 1 },
];
const AI_ARCHITECT_CHANNELS = [
{ id: 'ai-architect-blog', name: 'AI Architect 블로그', type: 'blog', platform: 'ai-architect.io', is_active: 1 },
{ id: 'ai-architect-newsletter', name: 'AI Architect EN Newsletter', type: 'newsletter', platform: 'brevo', is_active: 1 },
];
Step 2: Commit
git add projects/content-orchestration/
git commit -m "feat: add richbukae and ai-architect channels to content-orchestration"
Task 7: 자동화 주간 리포트 스크립트
Files:
- Create:
scripts/weekly-marketing-report.sh
Step 1: 주간 퍼널 리포트 스크립트
#!/bin/bash
# scripts/weekly-marketing-report.sh
# 매주 월요일 09:00 실행 (GitHub Actions)
set -e
cd "$(dirname "$0")/.."
source .env
TURSO_TOKEN="${TURSO_DB_TOKEN}"
MARKETING_DB="marketing-os-migkjy.aws-ap-northeast-1.turso.io"
WEEK_AGO=$(python3 -c "import time; print(int((time.time() - 7*24*3600)*1000))")
NOW=$(python3 -c "import time; print(int(time.time()*1000))")
# 퍼널 이벤트 집계
REPORT=$(python3 -c "
import json, urllib.request, urllib.error
url = 'https://${MARKETING_DB}/v2/pipeline'
token = '${TURSO_TOKEN}'
week_ago = ${WEEK_AGO}
queries = [
'SELECT COUNT(*) as signups FROM funnel_events WHERE event_name = \"newsletter_signup\" AND created_at > ${WEEK_AGO}',
'SELECT COUNT(*) as purchases, SUM(amount) as revenue FROM funnel_events WHERE event_name = \"purchase\" AND created_at > ${WEEK_AGO}',
'SELECT utm_source, COUNT(*) as cnt FROM funnel_events WHERE created_at > ${WEEK_AGO} GROUP BY utm_source ORDER BY cnt DESC LIMIT 5',
]
results = []
for sql in queries:
req = urllib.request.Request(url,
data=json.dumps({'requests':[{'type':'execute','stmt':{'sql':sql,'args':[]}}]}).encode(),
headers={'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'},
method='POST'
)
try:
resp = json.loads(urllib.request.urlopen(req).read())
rows = resp['results'][0]['response']['result']['rows']
results.append(rows)
except:
results.append([])
print(json.dumps(results))
")
REPORT_DATE=$(date '+%Y-%m-%d')
REPORT_FILE="memory/jarvis-reports/${REPORT_DATE}-weekly-marketing.md"
cat > "$REPORT_FILE" << EOF
# 주간 마케팅 리포트 ${REPORT_DATE}
## richbukae 퍼널 성과 (지난 7일)
- 뉴스레터 신규 구독: ${REPORT}건
- 결제 전환: 분석 중
- 주요 유입 채널: GetLate SNS
## 다음 주 액션
1. 이메일 시퀀스 D+4, D+7 발송 결과 확인
2. SNS 트래픽 분석 후 고성과 채널 증량
3. CEO 보고
EOF
echo "✅ 주간 마케팅 리포트 생성: $REPORT_FILE"
# VP 보고
./scripts/vice-reply.sh "📊 주간 마케팅 리포트 생성 완료 — richbukae 퍼널 성과 요약" "marketing-report"
Step 2: GitHub Actions 추가 (선택)
# .github/workflows/weekly-marketing-report.yml
name: Weekly Marketing Report
on:
schedule:
- cron: '0 0 * * 1' # 매주 월요일 09:00 KST
workflow_dispatch:
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate Report
env:
TURSO_DB_TOKEN: ${{ secrets.TURSO_DB_TOKEN }}
run: bash scripts/weekly-marketing-report.sh
Step 3: Commit
git add scripts/weekly-marketing-report.sh
git add .github/workflows/weekly-marketing-report.yml
git commit -m "feat: add weekly marketing funnel report automation"
칸반 태스크 구조 (Turso DB 등록)
[태스크] richbukae-marketing-system-v1
├─ sub1: GA4 richbukae 설치 (Task 1+2) → 즉시 착수 가능
├─ sub2: Brevo 웰컴 시퀀스 구현 (Task 3) → 즉시 착수 가능
├─ sub3: GetLate SNS 퍼블리셔 (Task 4) → CEO 블로킹 (SNS 계정 연결)
├─ sub4: marketing-os DB 스키마 (Task 5) → 즉시 착수 가능
├─ sub5: content-orchestration 확장 (Task 6) → 즉시 착수 가능
└─ sub6: 주간 리포트 자동화 (Task 7) → sub4 완료 후
대시보드 설계 (content-orchestration 확장)
/richbukae/analytics
├── 퍼널 요약 카드
│ ├─ 이번 달 SNS 노출
│ ├─ 랜딩 UV
│ ├─ 구독 전환율 (%)
│ └─ 결제 전환율 (%)
├── 채널별 성과 차트
│ ├─ SNS: Twitter / Instagram / LinkedIn 유입 비교
│ ├─ 이메일: 오픈율 / 클릭률 추이
│ └─ 결제: 일별 매출 바 차트
└── 캠페인 테이블
├─ 캠페인명, 플랫폼, 예산/지출
├─ 노출/클릭/전환
└─ ROAS (수익/지출 비율)
CEO 보고서 + PPT 구조
주간 보고 PPT 슬라이드 구성:
Slide 1: 이번 주 핵심 성과 (KPI 3종)
Slide 2: 퍼널 플로우 (각 단계 전환율)
Slide 3: 채널별 성과 (GetLate × 플랫폼)
Slide 4: 이메일 시퀀스 성과 (Brevo)
Slide 5: 매출 현황 (Toss 집계)
Slide 6: 다음 주 액션
실행 순서 권장
| 순서 | Task | 소요시간 | CEO 블로킹 |
|---|---|---|---|
| 1 | Task 1 — GA4 설치 | 30분 | GA_ID 필요 |
| 2 | Task 2 — 이벤트 트래킹 | 45분 | 없음 |
| 3 | Task 3 — Brevo 시퀀스 | 60분 | Brevo 이메일 인증 |
| 4 | Task 5 — marketing-os DB | 30분 | 없음 |
| 5 | Task 6 — content-orchestration | 45분 | 없음 |
| 6 | Task 4 — GetLate SNS | 30분 | SNS 계정 연결 |
| 7 | Task 7 — 주간 리포트 | 30분 | 없음 |
총 예상 구현 시간: 4~5시간 (CEO 블로킹 없는 것만 약 3.5시간)