본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 04. 29. 08:56

인디 개발자를 위한 SaaS 성장 지표 — 매주 MRR, 이탈률, LTV를 추적하세요

요약

본 기사는 인디 SaaS(Software as a Service) 개발자가 성장을 측정하고 최적화하는 데 필수적인 5가지 핵심 지표(MRR, 이탈률, LTV, CAC, NRR)를 소개합니다. 단순히 지표를 아는 것을 넘어, Supabase의 데이터베이스 기능과 GitHub Actions(GHA), 그리고 서버리스 함수를 활용하여 이러한 성장 지표들을 자동으로 계산하고 주간 보고서 형태로 Slack에 알림을 받는 구체적인 자동화 파이프라인 구축 방법을 제시합니다.

핵심 포인트

  • SaaS 성장의 핵심은 MRR, 이탈률, LTV, CAC, NRR 등 5가지 필수 지표를 꾸준히 추적하는 것입니다.
  • Supabase의 SQL View 기능을 사용하여 복잡한 주간 성장 지표(MRR, Churn Rate 등)를 자동 집계할 수 있습니다.
  • GHA와 서버리스 함수를 결합하여 주기적인 데이터 분석 결과를 Slack으로 자동으로 보고받는 워크플로우를 구축할 수 있습니다.
  • 이탈 고객을 대상으로 취소 후 일정 기간 뒤 재참여 이메일을 예약 발송하는 자동화된 마케팅 흐름을 구현할 수 있습니다.

지표를 추적하지 않으면 무엇이 작동하는지 알 수 없습니다. 이것이 인디 SaaS 를 위한 5 가지 필수 지표입니다.

5 가지 필수 지표

  • MRR (Monthly Recurring Revenue, 월간 반복 수익): = 유료 사용자 × 월별 요금
    • 목표: +10% MoM (연간 2.5 배 복리 성장)
  • Churn Rate (이탈률): = 기간 초 사용자의 수 / 이탈한 사용자의 수
    • 목표: < 5% / 달 (연간 유지율 70% 이상)
  • LTV (Lifetime Value, 고객 생애 가치): = 월별 요금 / 월별 이탈률
    • 예시: $9.90/월, 3% 이탈 → LTV = $330
  • CAC (Customer Acquisition Cost, 고객 획득 비용): = 총 마케팅 지출 / 신규 유료 사용자
    • 목표: LTV / CAC > 3
  • NRR (Net Revenue Retention, 순 수익 유지율): = (초기 MRR + 확장 - 축소 - 이탈) / 초기 MRR
    • 목표: > 100% (확장이 이탈을 상회함)

Supabase 에서 지표 자동 계산
-- 주간 지표를 집계하는 뷰 생성

CREATE OR REPLACE VIEW weekly_metrics AS
SELECT
date_trunc ('week', s.created_at) AS week,
COUNT() FILTER (WHERE s.status = 'active') AS active_subscriptions,
SUM(p.amount) FILTER (WHERE s.status = 'active') / 100.0 AS mrr,
COUNT(
) FILTER (
WHERE s.status = 'canceled' AND s.updated_at >= date_trunc ('week', NOW ()) - INTERVAL '1 week'
) AS churned_this_week,
AVG(EXTRACT(EPOCH FROM (s.updated_at - s.created_at)) / 86400.0) FILTER (WHERE s.status = 'canceled') AS avg_days_to_churn
FROM subscriptions s
JOIN prices p ON s.price_id = p.id
GROUP BY 1;

GHA 를 통한 주간 Slack 알림
// supabase/functions/weekly-growth-report/index.ts
const { data } = await supabase.rpc('get_growth_metrics');
const message = 📊 Weekly Growth Report ${new Date().toLocaleDateString('en-US')} MRR: $${data.mrr.toLocaleString()} (${data.mrr_growth > 0 ? '+ ' : ''}${data.mrr_growth}% WoW) Paying users: ${data.active_users} Churned: ${data.churned_users} (${data.churn_rate}%) LTV: $${data.ltv.toLocaleString()};
await fetch(Deno.env.get('SLACK_WEBHOOK')!, {
method: 'POST',
body: JSON.stringify({ text: message }),
});

이탈 분석: 자동화된 재참여 이메일
// 취소 3 일 후 재참여 이메일 발송

case 'customer.subscription.deleted': {
const sub = event.data.object;
const userId = sub.metadata.user_id;
// 3 일 후 이메일 예약
await supabase.from('email_queue').insert({
user_id: userId,
template: 'churn_winback',
send_at: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(),
});
}

요약

  • 추적할 5 가지 지표 → MRR / 이탈률 / LTV / CAC / NRR
  • 우선순위 → MRR 성장 최적화 전에 먼저 이탈률 감소
  • 자동화 → Supabase 뷰 + GHA 주간 스케줄링 + Slack 알림
  • 경고 → 이탈률 > 5% 또는 MRR -5% WoW → 즉시 Slack ping

인디 개발자에게 있어 "항상 가시적인" 지표는 매주 수동 검토보다 항상 낫습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
3

댓글

0