테마
Epic Spec: E-07 쿠폰 & 추천인 코드 시스템
마케팅 실행력 확보를 위한 쿠폰/추천인 코드 인프라 구축
50명 액션플랜 달성의 핵심 도구
메타
| 항목 | 값 |
|---|---|
| Epic ID | E-07 |
| Sprint | S52 |
| 상태 | approved |
| PO 승인일 | 2026-01-20 |
| 담당 개발자 | - |
1. WHY: 왜 이 기능이 필요한가?
문제 정의
현재 장사왕은 마케팅 실행 수단이 없다.
- 신규 유저 전환 도구 부재: Trial만으로는 결제 전환이 어려움
- 추천 인센티브 없음: 기존 유저의 바이럴 동기가 없음
- 결제 정책 마찰: 일할 환불 정책으로 인한 운영 복잡도
현재 상황:
- Trial 후 결제 전환 시 "왜 돈을 내야 하지?" 장벽
- 만족한 유저도 추천할 동기가 없음
- 50명 유료 목표 달성을 위한 마케팅 레버가 없음근거 데이터
| 지표 | 수치 | 출처 |
|---|---|---|
| Trial → 유료 전환율 | 측정 필요 | GA4 |
| 자발적 추천 건수 | 0건 | 내부 |
| 마케팅 캠페인 실행 가능 여부 | 불가 | 현재 기능 없음 |
기대 효과
| 기능 | 기대 효과 |
|---|---|
| 첫결제 100원 쿠폰 | Trial 유저의 결제 전환율 향상 + 빌링키 확보 |
| 추천인 코드 | 기존 유저의 바이럴 루프 활성화 |
| 결제 정책 변경 | 운영 단순화 + SaaS 표준 모델 정착 |
2. 결제 정책 변경
AS-IS (기존 정책)
결제 취소 시 → 일할 계산하여 즉시 환불
예시:
- 1/15 결제 (110,000원)
- 1/20 취소 요청
- 5일 사용분 = 110,000 × (5/30) = 18,333원
- 환불 금액 = 91,667원문제점:
- 환불 계산 복잡
- 부분 환불 처리 어려움
- 재결제 시 혼란
TO-BE (신규 정책)
결제 취소 시 → 이번 결제 기간까지 서비스 이용
→ 다음 정기결제부터 취소 적용
→ 환불 없음
예시:
- 1/15 결제 (110,000원), 결제 기간: 1/15~2/14
- 1/20 취소 요청
- 2/14까지 서비스 계속 이용 가능
- 2/15 정기결제 발생 안 함 (구독 종료)장점:
- SaaS 표준 모델 (Netflix, Spotify 등)
- 운영 단순화
- 쿠폰 처리 로직 명확화
마이그레이션 플랜
┌─────────────────────────────────────────────────────────────┐
│ 기존 PG(PortOne) 유저 │ 신규 PG(Toss) 유저 │
├─────────────────────────────────────────────────────────────┤
│ AS-IS 정책 유지 │ TO-BE 정책 적용 │
│ (일할 환불) │ (기간 만료 후 해지) │
│ │ │
│ 이유: │ 이유: │
│ - 기존 약관 준수 │ - 신규 약관으로 시작 │
│ - 혼란 방지 │ - 쿠폰 시스템 최적화 │
└─────────────────────────────────────────────────────────────┘기준일: 신규 PG 전환 완료일 (TossPayments 라이브)
3. 쿠폰 시스템
3.1 쿠폰 유형
| 유형 | 코드 | 설명 | 사용 예시 |
|---|---|---|---|
| 정액 할인 | FIXED | 고정 금액 차감 | 109,900원 할인 → 첫결제 100원 |
| 정률 할인 | PERCENT | 비율 차감 | 50% 할인 → 55,000원 |
| 무료 체험 연장 | TRIAL_EXT | Trial 기간 추가 | +14일 무료 |
3.2 쿠폰 속성
typescript
interface Coupon {
id: string;
code: string; // 쿠폰 코드 (예: FIRST100)
type: 'FIXED' | 'PERCENT' | 'TRIAL_EXT';
// 할인 정보
discountAmount?: number; // 정액 할인 금액
discountPercent?: number; // 정률 할인 비율 (0-100)
maxDiscountAmount?: number; // 정률 할인 최대 금액
trialDays?: number; // 무료 체험 연장 일수
// 사용 조건
minPaymentAmount?: number; // 최소 결제 금액
validFrom: Date; // 유효 시작일
validUntil: Date; // 유효 종료일
maxUsageTotal?: number; // 전체 사용 가능 횟수
maxUsagePerUser: number; // 유저당 사용 가능 횟수 (기본: 1)
// 적용 범위
applicablePlans: string[]; // 적용 가능 플랜 (빈 배열 = 전체)
isFirstPaymentOnly: boolean; // 첫 결제 전용 여부
// 상태
isActive: boolean;
usedCount: number;
createdAt: Date;
updatedAt: Date;
}3.3 쿠폰 발급 정책
| 항목 | 정책 |
|---|---|
| 발급 방식 | 어드민에서 수동 생성 / 시스템 자동 발급 |
| 발급 수량 | 쿠폰별 maxUsageTotal 설정 (무제한 = null) |
| 코드 형식 | 영문 대문자 + 숫자, 6~12자 |
| 유효 기간 | 쿠폰별 개별 설정 필수 |
3.4 쿠폰 사용 정책
기본 규칙
| 규칙 | 내용 |
|---|---|
| 중복 사용 | ❌ 불가 - 1회 결제에 1개 쿠폰만 |
| 정기결제 자동 적용 | ❌ 불가 - 쿠폰은 해당 결제에만 적용 |
| 다음 결제 이월 | ❌ 불가 - 미사용 쿠폰은 소멸하지 않고 보유 |
쿠폰 + 크레딧 동시 적용 순서
⚠️ 업계 표준 (Stripe, Chargebee): 쿠폰 먼저 → 크레딧 나중
[적용 순서]
1. 원가에서 쿠폰 할인 먼저 적용
2. 쿠폰 적용 후 금액에서 크레딧 차감
3. 남은 금액 결제
[예시]
원가: 110,000원
쿠폰: 50% 할인 (55,000원)
크레딧: 14,000원
계산:
① 110,000 - 55,000(쿠폰) = 55,000원
② 55,000 - 14,000(크레딧) = 41,000원
③ 최종 결제: 41,000원
[이유]
- 쿠폰은 마케팅 비용 (할인율 기반)
- 크레딧은 고객 자산 (잔액 차감)
- 쿠폰 먼저 적용해야 크레딧 사용량 최소화 → 고객에게 유리결제 취소 시 쿠폰 원복 정책 (TO-BE 정책 기준)
┌─────────────────────────────────────────────────────────────┐
│ 시나리오: 쿠폰으로 첫결제 100원 → 구독 취소 │
├─────────────────────────────────────────────────────────────┤
│ 1. 구독 취소 = 결제 취소가 아님 │
│ 2. 현재 결제 기간은 그대로 사용 │
│ 3. 쿠폰은 이미 "사용 완료" 상태 │
│ 4. 재구독 시 새로운 쿠폰 필요 (같은 쿠폰 재사용 불가) │
└─────────────────────────────────────────────────────────────┘결제 실패 시 쿠폰 처리
┌─────────────────────────────────────────────────────────────┐
│ 시나리오: 쿠폰 적용 후 결제 시도 → 결제 실패 │
├─────────────────────────────────────────────────────────────┤
│ 1. 결제 실패 = 쿠폰 미사용 (사용 처리 안 됨) │
│ 2. 재시도 시 같은 쿠폰 적용 가능 │
│ 3. 유효기간 내라면 언제든 재시도 가능 │
└─────────────────────────────────────────────────────────────┘정기결제 실패 시 처리 (기존 구독자)
┌─────────────────────────────────────────────────────────────┐
│ 시나리오: 정기결제 실패 (잔액 부족 등) │
├─────────────────────────────────────────────────────────────┤
│ 1. 정기결제에는 쿠폰이 적용되지 않음 │
│ 2. 결제 실패 → 현행 재시도 정책 따름 (E-06 참조) │
│ 3. 재시도 모두 실패 시 구독 자동 해지 │
│ 4. 보유 쿠폰은 그대로 유지 (재구독 시 사용 가능) │
└─────────────────────────────────────────────────────────────┘3.5 이관 인센티브 쿠폰 (기존 유저)
목적
E-06 PG 이관 시 기존 PortOne 유저가 TossPayments로 카드 재등록을 유도하기 위한 인센티브 쿠폰
쿠폰 스펙
| 항목 | 값 |
|---|---|
| 쿠폰 코드 | MIGRATE10 (시스템 자동 생성) |
| 유형 | 정률 할인 (PERCENT) |
| 할인 비율 | 10% |
| 할인 금액 | 11,000원 (PRO10 기준) |
| 유저당 사용 | 1회 |
| 적용 조건 | TossPayments 카드 재등록 완료 시 자동 발급 |
| 적용 범위 | 재등록 후 첫 번째 정기결제에만 적용 |
| 유효 기간 | 발급일로부터 60일 |
발급 조건
[이관 인센티브 쿠폰 발급 조건]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
필수 조건 (모두 만족):
1. 기존 PortOne(이니시스) 결제 이력이 있는 유저
2. TossPayments로 카드 재등록 완료
3. 이관 인센티브 쿠폰 미발급 상태
발급 시점:
• TossPayments 빌링키 발급 성공 시 자동 발급
적용 시점:
• 재등록 후 첫 번째 정기결제에 자동 적용
• (첫결제 100원 쿠폰과 다름: 이건 "정기결제"에 적용)
주의:
• 신규 가입자에게는 발급되지 않음
• 이미 TossPayments로 가입한 유저에게는 발급되지 않음사용 예시
[예시: 기존 유저 김셀러의 이관]
1. 김셀러: PortOne으로 1년간 결제 중
2. 이관 안내 알림 수신
3. TossPayments 카드 재등록 완료
4. [시스템] MIGRATE10 쿠폰 자동 발급
5. 다음 정기결제일 (2월 15일)
- 원가: 110,000원
- 쿠폰 할인: -11,000원 (10%)
- 최종 결제: 99,000원
6. 그 다음달 (3월 15일)
- 원가: 110,000원
- 쿠폰: 없음 (이미 사용)
- 최종 결제: 110,000원3.6 첫결제 100원 전략 (신규 유저)
플로우
[Trial 시작]
↓
[Trial 기간 중 몰연동]
↓
[Trial 만료 D-3 알림] ← "첫결제 100원 쿠폰 지급!"
↓
[결제 페이지 진입]
↓
[쿠폰 자동 적용: 109,900원 할인]
↓
[100원 결제 + 빌링키 등록]
↓
[구독 시작 - 다음달부터 110,000원]쿠폰 스펙
| 항목 | 값 |
|---|---|
| 쿠폰 코드 | FIRST100 (시스템 자동 생성) |
| 유형 | 정액 할인 (FIXED) |
| 할인 금액 | 109,900원 |
| 유저당 사용 | 1회 |
| 적용 조건 | 첫 결제 전용 (isFirstPaymentOnly: true) |
| 자동 발급 조건 | Trial 유저 + 몰연동 완료 |
목표
| 지표 | Before | Target |
|---|---|---|
| Trial → 결제 전환율 | TBD | +20%p |
| 빌링키 확보율 | 0% | 80% |
4. 추천인 코드 시스템
4.1 추천인 코드 구조
typescript
interface ReferralCode {
id: string;
code: string; // 추천인 코드 (예: SELLER-ABC123)
ownerId: string; // 코드 소유자 (추천인) ID
// 통계
totalReferrals: number; // 총 추천 수 (가입)
activatedReferrals: number; // 활성화 수 (몰연동)
paidReferrals: number; // 결제 완료 수
// 상태
isActive: boolean;
createdAt: Date;
}4.2 크레딧 기반 보상 시스템
크레딧 스펙
typescript
interface ReferralCredit {
id: string;
userId: string; // 크레딧 보유자
balance: number; // 현재 잔액 (원)
// 이력
transactions: CreditTransaction[];
}
interface CreditTransaction {
id: string;
type: 'EARN' | 'USE' | 'EXPIRE';
amount: number;
referralId?: string; // 관련 피추천인 ID
reason: string;
createdAt: Date;
}보상 구조 (2단계)
┌─────────────────────────────────────────────────────────────┐
│ 추천인 보상 = 크레딧 지급 (총 7,000원/건) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1단계: 피추천인 몰연동 완료 │
│ → 추천인에게 3,500원 크레딧 지급 │
│ │
│ 2단계: 피추천인 첫 결제 완료 │
│ → 추천인에게 3,500원 크레딧 추가 지급 │
│ │
│ ※ 단순 가입만 = 보상 없음 │
└─────────────────────────────────────────────────────────────┘크레딧 사용
| 항목 | 정책 |
|---|---|
| 사용처 | 정기결제 시 자동 차감 |
| 차감 순서 | 오래된 크레딧부터 FIFO |
| 최소 결제 | 0원 가능 (크레딧으로 전액 결제) |
| 누적 상한 | 없음 (무제한 누적 가능) |
| 유효 기간 | 적립일로부터 12개월 |
| 현금 환급 | ❌ 불가 |
보상 예시
[예시 1: 3명 추천, 모두 결제]
- 추천인 A가 B, C, D를 추천
- B 몰연동: +3,500원 → B 결제: +3,500원
- C 몰연동: +3,500원 → C 결제: +3,500원
- D 몰연동: +3,500원 → D 결제: +3,500원
- 총 크레딧: 21,000원
- 다음 정기결제: 110,000 - 21,000 = 89,000원
[예시 2: 10명 추천, 모두 결제]
- 총 크레딧: 70,000원
- 다음 정기결제: 110,000 - 70,000 = 40,000원
[예시 3: 16명 추천, 모두 결제]
- 총 크레딧: 112,000원
- 다음 정기결제: 0원 (전액 크레딧)
- 잔여 크레딧: 2,000원 (다다음 결제에 사용)4.3 피추천인 혜택
| 혜택 | 내용 |
|---|---|
| 가입 시 | Trial 14일 (기본과 동일) |
| 첫 결제 시 | 첫결제 100원 쿠폰 (몰연동 완료 시 자동 발급) |
4.4 추천 코드 가입 UX
[추천 코드 입력 방법]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
방법 1: URL 파라미터 (권장)
────────────────────────────
• 추천인이 공유하는 링크: https://jangsawang.com/signup?ref=SELLER-ABC123
• 피추천인이 링크 클릭 시 자동 적용
• 쿠키/세션에 저장하여 가입 완료 시까지 유지
방법 2: 가입 페이지 입력란
────────────────────────────
• 가입 폼 하단에 "추천 코드 (선택)" 입력란
• 직접 입력 가능
• URL 파라미터로 진입 시 자동 채워짐 (수정 불가)
[가입 페이지 UI]
┌────────────────────────────────────────────────────────────┐
│ 장사왕 회원가입 │
├────────────────────────────────────────────────────────────┤
│ │
│ 이메일 * │
│ ┌──────────────────────────────────────────┐ │
│ │ seller@example.com │ │
│ └──────────────────────────────────────────┘ │
│ │
│ 비밀번호 * │
│ ┌──────────────────────────────────────────┐ │
│ │ •••••••• │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ───────────────────────────────────────────── │
│ │
│ 추천 코드 (선택) │
│ ┌──────────────────────────────────────────┐ │
│ │ SELLER-ABC123 ✅ 유효한 코드 │ │
│ └──────────────────────────────────────────┘ │
│ └ 친구에게 받은 추천 코드가 있다면 입력하세요 │
│ │
│ [ 가입하기 ] │
│ │
└────────────────────────────────────────────────────────────┘
[추천 코드 검증]
• 입력 시 실시간 유효성 검사 (debounce 300ms)
• 유효: ✅ "유효한 코드입니다" + 추천인 닉네임 표시
• 무효: ❌ "존재하지 않는 코드입니다"
• 비활성: ⚠️ "현재 사용할 수 없는 코드입니다"4.5 어뷰징 방지
| 정책 | 내용 |
|---|---|
| 자기 추천 | ❌ 같은 이메일/전화번호 불가 |
| 중복 가입 | ❌ 이전에 가입 이력 있는 유저 불가 |
| 동일 IP 제한 | ⚠️ 24시간 내 동일 IP 3건 초과 시 검토 대기 |
| 비정상 패턴 | 🔍 단기간 대량 추천 시 수동 검토 |
4.6 추천 코드 공유 UX
[공유 방법]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 링크 복사
• URL: https://sellerking.io/signup?ref=SELLER-ABC123
• 클립보드 복사 + "복사 완료!" 토스트
2. 카카오톡 공유
• 카카오 SDK 연동
• 미리보기 카드: "장사왕으로 광고 순이익 분석하세요"
• 이미지: 서비스 썸네일 + 혜택 안내
3. QR 코드 (선택)
• 오프라인 네트워킹용
• 마이페이지에서 QR 다운로드 가능4.7 추천 넛지 타이밍 정책
[추천 코드 노출 타이밍]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 첫 순이익 양수 캠페인 발견 시 ⭐ 핵심
• 트리거: 진단 결과에서 순이익 양수 캠페인 첫 확인
• 위치: 진단 결과 페이지 하단 배너
• 메시지: "이 인사이트를 셀러 친구에게도 알려주세요!"
• CTA: [추천 코드 공유하기]
2. 정기결제 D-7 알림톡
• 트리거: 정기결제 7일 전
• 템플릿 하단에 추천 섹션 추가
• 메시지: "친구 추천하면 7,000원 크레딧!"
3. 월간 리포트 발송 시 (순이익 상승 유저만)
• 트리거: 월간 리포트 + 전월 대비 순이익 상승
• 위치: 리포트 하단
• 메시지: "이 성과를 친구도 누릴 수 있게 해주세요"
4. 유료 전환 직후 (첫 결제 완료)
• 트리거: 첫 결제 성공
• 위치: 결제 완료 페이지 + 알림톡
• 메시지: "장사왕 시작을 축하해요! 친구에게도 알려주세요"4.8 바이럴 루프 퍼널
[바이럴 퍼널 정의]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[현재 유료 유저 N명]
↓
[추천 코드 공유] ← 목표: 30%
↓
[피추천인 가입] ← 목표: 20%
↓
[몰연동 완료] ← 목표: 60%
↓
[첫 결제 완료] ← 목표: 50%
[퍼널 목표 수치]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| 단계 | 전환율 목표 | 측정 방법 |
|------|------------|----------|
| 공유율 | 30% | 마이페이지 진입 대비 공유 클릭 |
| 가입 전환 | 20% | 추천 링크 클릭 대비 가입 완료 |
| 몰연동 전환 | 60% | 추천 가입자 대비 몰연동 완료 |
| 결제 전환 | 50% | 몰연동 완료 대비 첫 결제 |
[바이럴 계수 K]
K = N × 0.3 × 0.2 × 0.6 × 0.5 = 0.018N
→ K > 1 (자가 성장) 달성을 위해 공유율 강화 필요5. 유저 스토리
5.1 신규 유저 - 첫결제 100원 플로우
👤 신규 셀러 A
1. 장사왕 가입 → Trial 14일 시작
2. 스마트스토어 몰연동 완료
3. [시스템] 첫결제 100원 쿠폰 자동 발급
4. Trial D-3 알림: "내일 Trial 끝나요! 첫결제 100원으로 시작하세요"
5. 결제 페이지 진입 → 쿠폰 자동 적용
6. 100원 결제 완료 + 빌링키 등록
7. 다음달 15일, 110,000원 정기결제5.2 기존 유저 - 추천 플로우
👤 기존 유료 유저 B
1. 마이페이지에서 "내 추천 코드" 확인: SELLER-B1234
2. 지인 C에게 코드 공유
3. C가 코드로 가입 → Trial 시작
4. [시스템] "C님이 가입했어요!" 알림 (보상 아직 없음)
5. C가 몰연동 완료
6. [시스템] +3,500원 크레딧 지급! 알림
7. C가 첫 결제 완료
8. [시스템] +3,500원 크레딧 추가 지급! 알림
9. B의 다음 정기결제: 110,000 - 7,000 = 103,000원5.3 구독 취소 → 재구독 플로우
👤 유료 유저 D (TO-BE 정책, 신규 PG)
1. 1/15 결제 완료 (110,000원)
2. 1/20 구독 취소 요청
3. [시스템] "2/14까지 이용 가능, 이후 구독 종료" 안내
4. 2/14까지 정상 이용
5. 2/15 구독 종료 (자동)
6. 3/1 재구독 결정
7. 결제 페이지 진입 → 첫결제 쿠폰 없음 (이미 사용)
8. 110,000원 결제 → 구독 재시작5.4 쿠폰 + 크레딧 동시 보유 플로우
👤 유저 E (추천 크레딧 14,000원 + 쿠폰 보유)
1. 보유 상태:
- 추천 크레딧: 14,000원
- 50% 할인 쿠폰 (55,000원 할인)
2. 결제 페이지:
- 원가: 110,000원
- 쿠폰 적용: -55,000원 → 55,000원
- 크레딧 적용: -14,000원 → 41,000원
- 최종 결제: 41,000원
3. 다음달:
- 원가: 110,000원
- 쿠폰: 없음 (이미 사용)
- 크레딧: 0원 (소진)
- 최종 결제: 110,000원6. 시스템 플로우
6.1 TossPayments 빌링 UI 제약사항
⚠️ 중요: TossPayments 자동결제(빌링) 결제창은 UI 커스텀을 지원하지 않음
제약사항:
- 결제창 내에서 쿠폰 선택/적용 UI 표시 불가
- 할인 정보를 결제창에 직접 표시 불가
- 결제 금액과 상품명만 전달 가능
→ 쿠폰/크레딧 선택은 장사왕 페이지에서 처리 후,
최종 금액과 상품명을 TossPayments에 전달하는 방식으로 구현6.2 상품명(orderName) 처리 로직
┌─────────────────────────────────────────────────────────────┐
│ 첫 결제 (쿠폰 적용 시) │
├─────────────────────────────────────────────────────────────┤
│ orderName: "장사왕 PRO10 (첫결제 할인)" │
│ amount: 100 (또는 쿠폰 적용 후 금액) │
│ │
│ 예시: │
│ - 첫결제 100원 쿠폰 → "장사왕 PRO10 (첫결제 할인)", 100원 │
│ - 50% 할인 쿠폰 → "장사왕 PRO10 (50% 할인)", 55,000원 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 정기결제 (2회차 이후) │
├─────────────────────────────────────────────────────────────┤
│ orderName: "장사왕 PRO10 (2월)" │
│ amount: 110000 - 크레딧 차감액 │
│ │
│ 예시: │
│ - 크레딧 없음 → "장사왕 PRO10 (2월)", 110,000원 │
│ - 크레딧 7,000원 → "장사왕 PRO10 (2월)", 103,000원 │
│ - 크레딧 110,000원 이상 → "장사왕 PRO10 (2월)", 0원 │
└─────────────────────────────────────────────────────────────┘개발 포인트:
- 첫 결제와 정기결제의 상품명 생성 로직 분리 필요
- 정기결제 배치 시 해당 월 자동 계산하여 상품명에 반영
- 크레딧 차감 후 금액이 0원이면 결제 API 호출 생략 (빌링키만 유지)
6.3 결제 플로우 (TO-BE)
[결제 페이지 진입 - 장사왕 페이지]
↓
[쿠폰 선택/자동 적용] ← 장사왕 UI에서 처리
↓
[크레딧 자동 차감 계산] ← 장사왕 서버에서 계산
↓
[최종 결제 금액 + 상품명 결정]
↓
[TossPayments SDK 호출] ← amount, orderName 전달
↓
[TossPayments 결제창] ← 쿠폰 UI 없음, 금액만 표시
↓
┌───┴───┐
성공 실패
↓ ↓
[쿠폰 사용 처리] [쿠폰 미사용 유지]
[크레딧 차감] [크레딧 유지]
[빌링키 등록] [재시도 안내]
↓
[구독 시작]6.4 정기결제 플로우
[정기결제일 도달]
↓
[보유 크레딧 확인]
↓
[크레딧 자동 차감]
↓
[남은 금액 결제 시도]
↓
┌───┴───┐
성공 실패
↓ ↓
[결제 완료] [D+1 재시도]
↓ ↓
[구독 갱신] [3회 실패 시 해지]6.5 추천인 보상 플로우
[피추천인 가입]
↓
[추천 코드 검증]
↓
┌───┴───┐
유효 무효
↓ ↓
[연결 기록] [일반 가입 처리]
↓
[Trial 시작]
↓
[몰연동 완료?]
↓
YES
↓
[추천인에게 3,500원 크레딧 지급]
[첫결제 100원 쿠폰 발급]
↓
[첫 결제 완료?]
↓
YES
↓
[추천인에게 3,500원 크레딧 추가 지급]7. 화면 설계
7.1 결제 페이지 (2단계 구조)
STEP 1: 장사왕 결제 페이지 (쿠폰/크레딧 선택)
┌────────────────────────────────────────────────────────────┐
│ 결제하기 │
├────────────────────────────────────────────────────────────┤
│ │
│ 📦 장사왕 PRO10 │
│ 월 110,000원 │
│ │
│ ───────────────────────────────────────────── │
│ │
│ 🎫 쿠폰 │
│ ┌──────────────────────────────────────────┐ │
│ │ ✅ 첫결제 100원 쿠폰 (-109,900원) │ │
│ └──────────────────────────────────────────┘ │
│ [다른 쿠폰 선택] │
│ │
│ 💰 추천 크레딧 │
│ 보유: 7,000원 → 사용: 0원 (결제금액 100원 미만) │
│ │
│ ───────────────────────────────────────────── │
│ │
│ 결제 금액 │
│ 상품 금액 110,000원 │
│ 쿠폰 할인 -109,900원 │
│ 크레딧 사용 -0원 │
│ ───────────────────────────────── │
│ 최종 결제 금액 100원 │
│ │
│ ※ 다음 결제일: 2026.02.15 (110,000원) │
│ │
│ [ 100원 결제하기 ] ← 클릭 시 STEP 2로 │
│ │
└────────────────────────────────────────────────────────────┘STEP 2: TossPayments 결제창 (카드 등록만)
┌────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 💳 결제하기 │ │
│ │ │ │
│ │ 장사왕 PRO10 (첫결제 할인) ₩100 │ │
│ │ ↑ 상품명에 할인 정보 포함 │ │
│ │ │ │
│ │ ──────────────────────────────────────────────── │ │
│ │ │ │
│ │ 카드 번호 │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ 0000 - 0000 - 0000 - 0000 │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 유효기간 CVC │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ MM / YY │ │ 000 │ │ │
│ │ └───────────┘ └───────────┘ │ │
│ │ │ │
│ │ [₩100 결제하기] │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ powered by toss payments │
│ │
└────────────────────────────────────────────────────────────┘
※ TossPayments 결제창에서는 쿠폰 선택 UI 없음
※ 최종 금액과 상품명(할인 정보 포함)만 표시됨7.2 마이페이지 - 추천 코드
┌────────────────────────────────────────────────────────────┐
│ 내 추천 코드 │
├────────────────────────────────────────────────────────────┤
│ │
│ 🎁 친구 추천하고 크레딧 받기! │
│ │
│ 내 추천 코드 │
│ ┌──────────────────────────────────────────┐ │
│ │ SELLER-ABC123 [복사] │ │
│ └──────────────────────────────────────────┘ │
│ │
│ 💰 보상 안내 │
│ • 친구가 몰연동하면 3,500원 크레딧 │
│ • 친구가 결제하면 3,500원 추가 크레딧 │
│ • 크레딧은 다음 결제 시 자동 차감! │
│ │
│ ───────────────────────────────────────────── │
│ │
│ 📊 추천 현황 │
│ │
│ 총 추천 5명 │
│ 몰연동 완료 3명 (+10,500원 적립) │
│ 결제 완료 2명 (+7,000원 적립) │
│ │
│ 💳 내 크레딧 잔액: 17,500원 │
│ └ 다음 결제 시 자동 차감됩니다 │
│ │
│ ⏰ 만료 예정 크레딧 │
│ ┌──────────────────────────────────────────┐ │
│ │ 3,500원 2026-03-15 만료 (D-54) │ │
│ │ 7,000원 2026-05-20 만료 (D-120) │ │
│ └──────────────────────────────────────────┘ │
│ └ 크레딧은 적립일로부터 12개월 내 사용해주세요 │
│ │
└────────────────────────────────────────────────────────────┘7.3 어드민 - 쿠폰 관리
┌────────────────────────────────────────────────────────────┐
│ 쿠폰 관리 [+ 쿠폰 생성] │
├────────────────────────────────────────────────────────────┤
│ │
│ [전체] [활성] [만료] [소진] 🔍 검색 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 코드 유형 할인 사용현황 상태 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ FIRST100 정액 109,900원 45/∞ 🟢 활성 │ │
│ │ HALF50 정률 50% 12/100 🟢 활성 │ │
│ │ LAUNCH 정액 110,000원 50/50 ⚫ 소진 │ │
│ │ TEST2025 무료체험 +14일 3/10 🟡 만료 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ [1] [2] [3] ... [10] │
│ │
└────────────────────────────────────────────────────────────┘7.4 디자인 필요 화면
PRD_결제페이지개발범위_20260126.md 기준
P0 (필수) - 15일
| # | 화면명 | 주요 구성 요소 | 예상 공수 |
|---|---|---|---|
| 3 | 결제 페이지 | • 요금제 선택 (BASIC/PREMIUM/ADVANCED) • 결제 주기 (월간/연간) • 쿠폰 코드 입력 + 보유 쿠폰 목록 • 크레딧 잔액 표시 • 금액 미리보기 (원금액, 쿠폰, 크레딧, 최종 금액) | 5일 |
| 4 | 결제 전 최종 확인 | • 선택 요금제 요약 • 금액 상세 (원금액, 쿠폰, 크레딧, 최종) • 다음 결제 예정일 • 약관 동의 체크박스 • [이전] / [결제하기] 버튼 | 3일 |
| 5 | 결제 완료 (성공) | • 주문번호, 결제일시 • 금액 상세 내역 • 구독 정보 (시작일, 다음 결제일) • 추천 코드 발급 안내 • [영수증 다운로드] / [홈으로] | 2일 |
| 6 | 결제 완료 (실패) | • 오류 메시지, 오류 코드 • 해결 방법 안내 • [다시 시도] / [고객센터 문의] | 1일 |
| 7 | 마이페이지 변경 | [추가] 추천인 정보 섹션 • 내 추천 코드 표시 (복사/공유 버튼) • 추천 실적 (추천한 친구 수, 적립 크레딧) [추가] 크레딧 정보 섹션 • 보유 크레딧 잔액 • [크레딧 사용 내역 보기] 버튼 [추가] 쿠폰 정보 섹션 • 보유 쿠폰 목록 (코드, 유효기간, 할인금액) • [쿠폰 등록하기] 버튼 | 3일 |
| 8 | 결제 내역 상세 | [변경] 상세 내역 모달 • 기존: 주문번호, 결제일시, 요금제, 금액 • 추가: 금액 상세 (원금액, 쿠폰 할인, 크레딧 사용, 카드 결제) • 사용된 쿠폰 코드 표시 • [영수증 다운로드] 버튼 | 1일 |
P1 (권장) - 2일
| # | 화면명 | 주요 구성 요소 | 예상 공수 |
|---|---|---|---|
| 9 | 크레딧 사용 내역 | • 크레딧 요약 (보유, 적립, 사용, 만료) • 거래 내역 테이블 (날짜, 유형, 금액, 잔액, 사유) • 페이지네이션 | 2일 |
디자인 요청 사항
┌─────────────────────────────────────────────────────────────┐
│ 디자인 요청 시 전달 필요 항목 │
├─────────────────────────────────────────────────────────────┤
│ 1. 본 에픽 스펙 (E-07-coupon-referral.md) │
│ 2. PRD_결제페이지개발범위_20260126.md │
│ 3. E-06-pg-migration.md (PG 이관 관련) │
│ 4. 기존 화면 스크린샷 (마이페이지, 결제 내역) │
└─────────────────────────────────────────────────────────────┘
디자인 우선순위:
• P0 화면 (#3~#8): 개발 병행을 위해 와이어프레임 우선 제공 요청
• P1 화면 (#9): P0 완료 후 진행 가능8. 예외 & 엣지 케이스
8.1 쿠폰 관련
| 상황 | 처리 |
|---|---|
| 유효기간 만료 쿠폰 적용 시도 | "쿠폰이 만료되었어요" 토스트 |
| 이미 사용한 쿠폰 재사용 시도 | "이미 사용한 쿠폰이에요" 토스트 |
| 최소 금액 미달 | "110,000원 이상 결제 시 사용 가능해요" 안내 |
| 첫결제 쿠폰 + 기존 결제 이력 | 쿠폰 미노출 (적용 불가) |
| 쿠폰 + 무료 플랜 | 쿠폰 미노출 (적용 불가) |
8.2 크레딧 관련
| 상황 | 처리 |
|---|---|
| 크레딧 > 결제금액 | 0원 결제 (빌링키만 등록) |
| 크레딧 유효기간 만료 | 만료 예정 30일 전 알림, 자동 소멸 |
| 정기결제 시 크레딧 부족 | 보유 크레딧 전액 사용 + 나머지 카드 결제 |
| 구독 해지 후 크레딧 | 12개월간 유지, 재구독 시 사용 가능 |
크레딧 만료 예정 알림 상세
[알림톡 발송 시점]
• 만료 D-30: 첫 번째 알림
• 만료 D-7: 두 번째 알림 (미사용 시)
[알림톡 템플릿]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[장사왕] 크레딧 만료 예정 안내
안녕하세요, #{userName}님!
보유하신 크레딧이 곧 만료됩니다.
■ 만료 예정 크레딧
• 금액: #{expiringAmount}원
• 만료일: #{expiryDate}
만료 전 정기결제에 자동 사용되니 걱정 마세요!
추가 크레딧이 필요하시면 친구를 추천해보세요.
[친구 추천하고 크레딧 받기]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[예시]
안녕하세요, 김셀러님!
보유하신 크레딧이 곧 만료됩니다.
■ 만료 예정 크레딧
• 금액: 3,500원
• 만료일: 2026-02-15
만료 전 정기결제에 자동 사용되니 걱정 마세요!
추가 크레딧이 필요하시면 친구를 추천해보세요.8.3 추천 관련
| 상황 | 처리 |
|---|---|
| 자기 추천 시도 | "본인 추천은 불가능해요" 안내 |
| 이미 가입된 이메일 | "이미 가입된 계정이에요" 안내, 추천 무효 |
| 무효한 추천 코드 | "유효하지 않은 코드예요" 안내, 일반 가입 |
| 피추천인 Trial 중 이탈 | 추천인 보상 없음 |
| 피추천인 구독 취소 | 이미 지급된 크레딧 회수 안 함 |
8.4 결제 관련
| 상황 | 처리 |
|---|---|
| 결제 실패 | 쿠폰/크레딧 미차감, 재시도 안내 |
| 정기결제 실패 | 3일간 재시도, 3회 실패 시 구독 해지 |
| 환불 요청 (기존 PG) | AS-IS 정책 적용 (일할 환불) |
| 환불 요청 (신규 PG) | TO-BE 정책 적용 (환불 없음, 기간 이용) |
9. 성공 지표
9.1 지표 체계 개요
┌─────────────────────────────────────────────────────────────┐
│ E-07 쿠폰 & 추천인 코드 지표 체계 │
├─────────────────────────────────────────────────────────────┤
│ [Sprint 내 판단] │
│ Primary: Trial→결제 전환율 +20%p AND 쿠폰 사용률 ≥ 80% │
│ Secondary: 첫결제 100원 쿠폰 발급률 ≥ 70% │
├─────────────────────────────────────────────────────────────┤
│ [Sprint 이후 확인] │
│ Lagging: 추천 가입 비율 20% AND 바이럴 계수 K ≥ 0.1 │
│ Ultimate: 유료 유저 50명 달성 │
├─────────────────────────────────────────────────────────────┤
│ [Guard Rails] │
│ • 쿠폰 어뷰징 발생 금지 │
│ • 결제 페이지 이탈률 30% 초과 금지 │
│ • 크레딧 계산 오류 0건 유지 │
└─────────────────────────────────────────────────────────────┘9.2 Sprint 내 판단 지표
| 계층 | 지표 | 산식 | 목표 |
|---|---|---|---|
| Primary | Trial→결제 전환율 | 첫결제 완료 / Trial 시작 유저 | +20%p |
| Primary | 쿠폰 사용률 | 쿠폰 사용 결제 / 쿠폰 발급 유저 | ≥ 80% |
| Secondary | 첫결제 쿠폰 발급률 | 쿠폰 발급 / 몰연동 완료 유저 | ≥ 70% |
| Secondary | 빌링키 확보율 | 빌링키 등록 / 첫결제 시도 | ≥ 90% |
9.3 Sprint 이후 확인 지표
| 계층 | 지표 | 산식 | 목표 |
|---|---|---|---|
| Lagging | 추천 가입 비율 | 추천 코드 가입 / 전체 가입 | ≥ 20% |
| Lagging | 추천 결제 전환율 | 추천 가입자 결제 / 추천 가입자 | ≥ 50% |
| Lagging | 바이럴 계수 K | 유료유저 × 공유율 × 가입전환 × 몰연동 × 결제전환 | ≥ 0.1 |
| Ultimate | 유료 유저 수 | 활성 유료 구독자 | 50명 |
9.4 Guard Rails
- 쿠폰 어뷰징 발생 0건 유지 (동일 IP/이메일 패턴 감지)
- 결제 페이지 이탈률 30% 초과 금지
- 크레딧 계산 오류 0건 유지
- 추천 보상 지급 오류 0건 유지
- 쿠폰 적용 오류 CS 5건/주 초과 금지
9.5 성공 판단 기준
[Sprint 종료 시점]
✅ 성공: Trial→결제 +20%p AND 쿠폰 사용률 ≥ 80%
⚠️ 부분 성공: 둘 중 하나만 달성
❌ 실패: 둘 다 미달성 OR Guard Rails 위반
[Sprint +4주 후]
✅ 가설 검증: 유료 유저 50명 AND 추천 가입 비율 20%
→ "쿠폰/추천 시스템이 마케팅 레버로 작동한다"9.6 GA4 이벤트 정의
| 이벤트명 | 트리거 | 파라미터 |
|---|---|---|
coupon_applied | 쿠폰 적용 | coupon_code, discount_amount |
coupon_used | 쿠폰으로 결제 완료 | coupon_code, payment_amount |
first_payment_coupon_issued | 첫결제 쿠폰 자동 발급 | user_id, coupon_code |
first_payment_coupon_used | 첫결제 쿠폰으로 결제 완료 | user_id, payment_amount |
migrate_coupon_issued | 이관 인센티브 쿠폰 발급 | user_id, coupon_code |
migrate_coupon_used | 이관 인센티브 쿠폰 사용 | user_id, discount_amount |
referral_signup | 추천 코드로 가입 | referral_code, referrer_id |
referral_activated | 피추천인 몰연동 | referral_code, credit_amount |
referral_paid | 피추천인 결제 | referral_code, credit_amount |
credit_earned | 크레딧 적립 | amount, reason |
credit_used | 크레딧 사용 | amount, payment_id |
credit_expiring_soon | 크레딧 만료 예정 알림 발송 | user_id, amount, days_until_expiry |
credit_expired | 크레딧 만료 | user_id, amount |
10. 이벤트 트래킹 명세
10.1 GA4 이벤트 JavaScript 구현
javascript
// E-07 쿠폰 & 추천인 코드 이벤트
// 1. 쿠폰 적용
dataLayer.push({
event: "payment",
event_name: "coupon_applied",
params: {
coupon_code: "FIRST100",
coupon_type: "FIXED",
discount_amount: 109900,
original_price: 110000,
final_price: 100,
plan_type: "PRO10",
is_first_payment: "Y"
}
});
// 2. 쿠폰으로 결제 완료
dataLayer.push({
event: "payment",
event_name: "coupon_used",
params: {
coupon_code: "FIRST100",
coupon_type: "FIXED",
discount_amount: 109900,
payment_amount: 100,
payment_method: "card",
card_company: "shinhan",
billing_key_issued: "Y",
pg_provider: "tosspayments"
}
});
// 3. 첫결제 쿠폰 자동 발급
dataLayer.push({
event: "coupon",
event_name: "first_payment_coupon_issued",
params: {
user_id: "user_12345",
coupon_code: "FIRST100",
trigger: "mall_connected", // mall_connected, trial_ending
days_since_signup: 3
}
});
// 4. 이관 인센티브 쿠폰 발급
dataLayer.push({
event: "coupon",
event_name: "migrate_coupon_issued",
params: {
user_id: "user_12345",
coupon_code: "MIGRATE10",
previous_pg: "portone",
new_pg: "tosspayments",
months_as_customer: 6
}
});
// 5. 추천 코드로 가입
dataLayer.push({
event: "referral",
event_name: "referral_signup",
params: {
referral_code: "SELLER-ABC123",
referrer_id: "user_54321",
entry_source: "url_param", // url_param, manual_input
signup_source: "landing"
}
});
// 6. 피추천인 몰연동 완료 (추천인 보상 1단계)
dataLayer.push({
event: "referral",
event_name: "referral_activated",
params: {
referral_code: "SELLER-ABC123",
referrer_id: "user_54321",
referee_id: "user_67890",
credit_amount: 3500,
days_since_signup: 2,
mall_type: "smartstore"
}
});
// 7. 피추천인 결제 완료 (추천인 보상 2단계)
dataLayer.push({
event: "referral",
event_name: "referral_paid",
params: {
referral_code: "SELLER-ABC123",
referrer_id: "user_54321",
referee_id: "user_67890",
credit_amount: 3500,
total_credit_earned: 7000,
referee_payment_amount: 100,
days_since_signup: 10
}
});
// 8. 크레딧 적립
dataLayer.push({
event: "credit",
event_name: "credit_earned",
params: {
user_id: "user_54321",
amount: 3500,
reason: "referral_activated", // referral_activated, referral_paid
referral_code: "SELLER-ABC123",
total_balance: 10500,
expiry_date: "2027-01-23"
}
});
// 9. 크레딧 사용
dataLayer.push({
event: "credit",
event_name: "credit_used",
params: {
user_id: "user_54321",
amount: 7000,
payment_id: "pay_12345",
original_price: 110000,
credit_discount: 7000,
final_price: 103000,
remaining_balance: 3500
}
});
// 10. 크레딧 만료 예정 알림
dataLayer.push({
event: "credit",
event_name: "credit_expiring_soon",
params: {
user_id: "user_54321",
amount: 3500,
days_until_expiry: 30,
notification_type: "alimtalk",
expiry_date: "2027-01-23"
}
});
// 11. 크레딧 만료
dataLayer.push({
event: "credit",
event_name: "credit_expired",
params: {
user_id: "user_54321",
amount: 3500,
original_earn_date: "2026-01-23",
reason: "referral_activated"
}
});
// 12. 추천 코드 공유
dataLayer.push({
event: "referral",
event_name: "share_referral_code",
params: {
referral_code: "SELLER-ABC123",
share_method: "kakao", // kakao, link_copy, qr
share_location: "mypage", // mypage, nudge_banner, notification
total_referrals: 5
}
});
// 13. 결제 페이지 진입
dataLayer.push({
event: "payment",
event_name: "enter_payment_page",
params: {
plan_type: "PRO10",
original_price: 110000,
available_coupons: 1,
available_credit: 7000,
is_first_payment: "Y",
entry_source: "trial_ending"
}
});
// 14. 결제 버튼 클릭
dataLayer.push({
event: "payment",
event_name: "click_payment_button",
params: {
plan_type: "PRO10",
original_price: 110000,
coupon_applied: "Y",
coupon_code: "FIRST100",
credit_applied: 0,
final_price: 100,
pg_provider: "tosspayments"
}
});10.2 이벤트 파라미터 상세
| 파라미터 | 타입 | 설명 | 예시 |
|---|---|---|---|
coupon_type | string | 쿠폰 유형 | FIXED, PERCENT, TRIAL_EXT |
coupon_code | string | 쿠폰 코드 | FIRST100, MIGRATE10 |
referral_code | string | 추천인 코드 | SELLER-ABC123 |
entry_source | string | 코드 입력 경로 | url_param, manual_input |
share_method | string | 공유 방법 | kakao, link_copy, qr |
reason | string | 크레딧 적립 사유 | referral_activated, referral_paid |
11. 개발 범위
11.1 P0 (MVP 필수)
| 기능 | 설명 | 담당 |
|---|---|---|
| Coupon 테이블 설계 | 쿠폰 스키마 및 API | BE |
| 쿠폰 어드민 CRUD | 생성/조회/수정/비활성화 | BE/FE |
| 결제 페이지 쿠폰 적용 | 2단계 결제 UI | FE |
| 첫결제 100원 쿠폰 자동 발급 | 몰연동 시 자동 발급 | BE |
| TossPayments 결제 연동 | 쿠폰 적용 후 금액 전달 | BE |
11.2 P1 (핵심 기능)
| 기능 | 설명 | 담당 |
|---|---|---|
| ReferralCode 테이블 설계 | 추천인 코드 스키마 | BE |
| 가입 시 추천 코드 입력 | URL 파라미터 + 수동 입력 | FE |
| Credit 시스템 | 크레딧 적립/사용/만료 | BE |
| 정기결제 크레딧 자동 차감 | 결제 시 크레딧 우선 적용 | BE |
| 마이페이지 추천 코드 UI | 코드 조회/복사/공유 | FE |
| 추천 보상 로직 | 2단계 보상 (몰연동/결제) | BE |
11.3 P2 (확장 기능)
| 기능 | 설명 | 담당 |
|---|---|---|
| 이관 인센티브 쿠폰 | PortOne→Toss 이관 시 발급 | BE |
| 카카오톡 공유 | 카카오 SDK 연동 | FE |
| 크레딧 만료 예정 알림 | D-30, D-7 알림톡 | BE |
| 추천 넛지 타이밍 | 순이익 양수 시 배너 등 | FE |
| 바이럴 퍼널 대시보드 | 어드민 추천 통계 | BE/FE |
| QR 코드 생성 | 오프라인 공유용 | FE |
11.4 개발 우선순위 매트릭스
┌─────────────────────────────────────────────────────────────────┐
│ 개발 우선순위 매트릭스 │
├───────────────────┬──────────────────┬──────────────────────────┤
│ P0 (Week 1) │ P1 (Week 2) │ P2 (Backlog) │
├───────────────────┼──────────────────┼──────────────────────────┤
│ Coupon 테이블 │ Referral 테이블 │ 이관 인센티브 쿠폰 │
│ 어드민 CRUD │ 추천 코드 입력 │ 카카오톡 공유 │
│ 결제 페이지 UI │ Credit 시스템 │ 크레딧 만료 알림 │
│ 첫결제 쿠폰 발급 │ 크레딧 자동 차감 │ 추천 넛지 배너 │
│ Toss 연동 │ 마이페이지 UI │ 바이럴 대시보드 │
│ │ 2단계 보상 로직 │ QR 코드 │
└───────────────────┴──────────────────┴──────────────────────────┘12. 의존성 & 제약
기술 의존성
| 의존 항목 | 상태 | 비고 |
|---|---|---|
| TossPayments 연동 | 진행중 | E-06 PG 이관 |
| 빌링키 결제 API | 확인됨 | Toss 정기결제 |
| 어드민 페이지 | 확인됨 | 기존 어드민 확장 |
제약 조건
- 기존 PG(PortOne) 유저는 기존 정책 유지 필수
- 크레딧은 현금 환급 불가
- 쿠폰 중복 사용 불가
13. 스토리 목록 (예정)
Epic Spec 확정 후 📋 Penny가 분해
| Story ID | 제목 | 규모 | 우선순위 | 담당 | 상태 |
|---|---|---|---|---|---|
| E-07-S-01 | 쿠폰 데이터 모델 및 API | M | P0 | BE | draft |
| E-07-S-02 | 쿠폰 어드민 CRUD | M | P0 | BE/FE | draft |
| E-07-S-03 | 결제 페이지 쿠폰 적용 | M | P0 | FE | draft |
| E-07-S-04 | 추천인 코드 시스템 | M | P1 | BE | draft |
| E-07-S-05 | 크레딧 시스템 | M | P1 | BE | draft |
| E-07-S-06 | 크레딧 정기결제 연동 | M | P1 | BE | draft |
| E-07-S-07 | 마이페이지 추천 코드 UI | S | P1 | FE | draft |
| E-07-S-08 | 자동 쿠폰 발급 (첫결제 100원) | S | P0 | BE | draft |
| E-07-S-09 | 알림 시스템 연동 | S | P1 | BE | draft |
| E-07-S-10 | 크레딧 만료 예정 알림 | S | P2 | BE | draft |
| E-07-S-11 | 이관 인센티브 쿠폰 발급 로직 | S | P2 | BE | draft |
| E-07-S-12 | 추천 코드 공유 UX (카카오/링크) | S | P2 | FE | draft |
| E-07-S-13 | 추천 넛지 타이밍 정책 구현 | M | P2 | FE | draft |
| E-07-S-14 | 바이럴 퍼널 대시보드 (어드민) | M | P2 | BE/FE | draft |
| E-07-S-15 | GA4 이벤트 트래킹 (12개 이벤트) | S | P1 | FE | draft |
Story Point 추정
| 규모 | Story | 합계 |
|---|---|---|
| M (2pt) | S-01, S-02, S-03, S-04, S-05, S-06, S-13, S-14 | 16 |
| S (1pt) | S-07, S-08, S-09, S-10, S-11, S-12, S-15 | 7 |
| 총합 | 23 SP |
우선순위별 Story Point
| 우선순위 | Story | SP |
|---|---|---|
| P0 (MVP 필수) | S-01, S-02, S-03, S-08 | 7 SP |
| P1 (핵심) | S-04, S-05, S-06, S-07, S-09, S-15 | 10 SP |
| P2 (확장) | S-10, S-11, S-12, S-13, S-14 | 6 SP |
의존성 그래프
[BE] S-01 쿠폰 모델/API
│
┌────┴────┬─────────────────┐
▼ ▼ ▼
[BE/FE] S-02 [FE] S-03 [BE] S-08
어드민CRUD 결제페이지 자동발급
│
▼
[TossPayments 결제 연동]
│
┌─────────────┴─────────────┐
▼ ▼
[BE] S-04 추천코드 [BE] S-05 크레딧
│ │
▼ ▼
[FE] S-07 마이페이지 [BE] S-06 정기결제
│ │
└─────────┬─────────────────┘
▼
[FE] S-15 GA414. QA 체크리스트
쿠폰 시스템 테스트
쿠폰 어드민
- [ ] 쿠폰 생성 정상 동작 (코드, 유형, 할인금액, 유효기간)
- [ ] 쿠폰 조회/필터링 정상 동작
- [ ] 쿠폰 수정 정상 동작
- [ ] 쿠폰 비활성화 정상 동작
- [ ] 사용 현황 통계 정상 표시
쿠폰 적용
- [ ] 결제 페이지에서 쿠폰 선택 가능
- [ ] 자동 발급 쿠폰 자동 적용
- [ ] 쿠폰 코드 수동 입력 가능
- [ ] 쿠폰 할인금액 정상 계산 (정액/정률)
- [ ] 할인 후 금액 정상 표시
- [ ] 무효 쿠폰 에러 메시지 표시
쿠폰 유효성 검증
- [ ] 만료된 쿠폰 사용 불가
- [ ] 이미 사용한 쿠폰 재사용 불가
- [ ] 최소 금액 미달 시 사용 불가
- [ ] 첫결제 쿠폰 + 기존 결제 이력 → 사용 불가
- [ ] 전체 사용 횟수 초과 시 사용 불가
첫결제 100원 쿠폰
- [ ] 몰연동 완료 시 자동 발급
- [ ] Trial D-3 알림에 쿠폰 안내 포함
- [ ] 결제 페이지 자동 적용
- [ ] 100원 결제 + 빌링키 등록 정상 동작
- [ ] 다음 결제일 110,000원 표시
이관 인센티브 쿠폰
- [ ] PortOne 유저가 Toss 재등록 시 자동 발급
- [ ] 첫 정기결제에 10% 할인 자동 적용
- [ ] 신규 가입자에게는 미발급
추천인 코드 테스트
코드 생성/조회
- [ ] 가입 시 추천 코드 자동 생성
- [ ] 마이페이지에서 코드 조회
- [ ] 코드 복사 기능 정상 동작
- [ ] 추천 현황 통계 정상 표시
코드 입력
- [ ] URL 파라미터 ?ref= 자동 적용
- [ ] 가입 폼에서 코드 수동 입력 가능
- [ ] 실시간 유효성 검사 동작 (debounce)
- [ ] 유효 코드: ✅ + 추천인 닉네임 표시
- [ ] 무효 코드: ❌ "존재하지 않는 코드" 표시
- [ ] 비활성 코드: ⚠️ "사용할 수 없는 코드" 표시
어뷰징 방지
- [ ] 자기 추천 불가 (같은 이메일/전화번호)
- [ ] 중복 가입 불가 (이전 가입 이력 체크)
- [ ] 동일 IP 24시간 내 3건 초과 시 검토 대기
공유 기능
- [ ] 링크 복사 + 토스트 표시
- [ ] 카카오톡 공유 정상 동작
- [ ] 미리보기 카드 정상 표시
크레딧 시스템 테스트
크레딧 적립
- [ ] 피추천인 몰연동 시 3,500원 적립
- [ ] 피추천인 결제 시 3,500원 추가 적립
- [ ] 적립 알림 발송
- [ ] 마이페이지 잔액 반영
크레딧 사용
- [ ] 정기결제 시 자동 차감
- [ ] FIFO 순서로 차감 (오래된 것 먼저)
- [ ] 0원 결제 가능 (크레딧 > 결제금액)
- [ ] 차감 후 잔액 정상 표시
크레딧 만료
- [ ] 적립일로부터 12개월 후 만료
- [ ] D-30 만료 예정 알림 발송
- [ ] D-7 재알림 발송
- [ ] 만료 시 자동 소멸
쿠폰 + 크레딧 동시 적용
- [ ] 쿠폰 먼저 적용 → 크레딧 나중 적용
- [ ] 예: 110,000 - 55,000(쿠폰) - 14,000(크레딧) = 41,000원
보상 지급 테스트
2단계 보상
- [ ] 1단계: 피추천인 몰연동 → 추천인 +3,500원
- [ ] 2단계: 피추천인 결제 → 추천인 +3,500원
- [ ] 단순 가입만으로는 보상 없음
- [ ] 피추천인 Trial 이탈 시 보상 없음
- [ ] 피추천인 구독 취소 시 기 지급 크레딧 회수 안 함
결제 플로우 테스트
2단계 결제 UI
- [ ] STEP 1: 장사왕 결제 페이지 (쿠폰/크레딧 선택)
- [ ] STEP 2: TossPayments 결제창 (금액만 표시)
- [ ] 최종 금액 + 상품명(할인정보 포함) 정상 전달
- [ ] 결제 성공 시 쿠폰 사용 처리
- [ ] 결제 실패 시 쿠폰/크레딧 미차감
정기결제
- [ ] 정기결제일 크레딧 자동 차감
- [ ] 상품명 "장사왕 PRO10 (2월)" 형식
- [ ] 결제 실패 시 3일간 재시도
- [ ] 3회 실패 시 구독 자동 해지
이벤트 트래킹 테스트
- [ ]
coupon_applied발생 (쿠폰 선택 시) - [ ]
coupon_used발생 (결제 완료 시) - [ ]
first_payment_coupon_issued발생 (발급 시) - [ ]
referral_signup발생 (추천 가입 시) - [ ]
referral_activated발생 (몰연동 시) - [ ]
referral_paid발생 (결제 시) - [ ]
credit_earned발생 (적립 시) - [ ]
credit_used발생 (사용 시) - [ ]
share_referral_code발생 (공유 시)
엣지 케이스 테스트
결제 관련
- [ ] 결제 실패 후 쿠폰 재사용 가능
- [ ] 구독 취소 후 기간 내 계속 이용
- [ ] 재구독 시 첫결제 쿠폰 불가 (이미 사용)
- [ ] 크레딧 > 결제금액 시 0원 결제 처리
정책 분기
- [ ] 기존 PG 유저: AS-IS 정책 (일할 환불)
- [ ] 신규 PG 유저: TO-BE 정책 (환불 없음)
체크리스트
PO 승인 전 체크
- [x] 문제 정의가 명확한가?
- [x] 비즈니스 로직이 구체적인가? (쿠폰 유형, 크레딧 계산, 적용 규칙)
- [x] 와이어프레임/플로우가 있는가?
- [x] 엣지 케이스가 정의되었는가?
- [x] 성공 지표가 측정 가능한가?
- [x] 기술 의존성이 확인되었는가?
승인
| 항목 | 확인 |
|---|---|
| PO 승인 | ☑ |
| 승인일 | 2026-01-20 |
| 비고 | 파티 모드 리뷰 완료, 이관 인센티브 쿠폰/크레딧 만료 알림/공유 UX/넛지 정책/바이럴 퍼널 추가 |
변경 이력
| 버전 | 날짜 | 변경 내용 | 작성자 |
|---|---|---|---|
| 1.0 | 2026-01-20 | 초안 작성 | PO |
| 1.1 | 2026-01-20 | 파티 모드 리뷰 완료, 이관 쿠폰/크레딧 만료 알림/공유 UX/넛지 정책/바이럴 퍼널 추가 | PO |
| 1.2 | 2026-01-23 | 성공 지표 계층 구조 (9.1~9.6) 추가 | PO |
| 1.3 | 2026-01-23 | 이벤트 트래킹 JS 코드 예시 추가 | PO |
| 1.4 | 2026-01-23 | 개발 범위 P0/P1/P2 분류 추가 | PO |
| 1.5 | 2026-01-23 | QA 체크리스트 추가 | PO |
| 1.6 | 2026-01-26 | 디자인 필요 화면 섹션 추가 (PRD 기준) | PO |
작성일: 2026-01-20최종 수정: 2026-01-26
