Skip to content

Epic Spec: E-06 PG사 이관 (토스페이먼츠)

메타

항목
Epic IDE-06
SprintS52
상태approved
PO 승인일2026-01-20
담당창훈 (수석)

1. WHY: 왜 이 기능이 필요한가?

문제 정의

현재 결제 시스템은 PortOne(구 아임포트) + 이니시스 조합을 사용 중이다. 정기결제 시 ActiveX 설치가 필요하고, UX가 매우 불편하다.

[현재 문제]
1. ActiveX 설치 필요 → 2026년에 용납 불가
2. 정기결제 UX 불편 → 이탈 요인
3. PG사 커뮤니케이션 원활하지 않음 → 이슈 대응 지연
4. 모바일 결제 경험 저하 → 전환율 하락

현재 결제 UX 플로우 (AS-IS)

[PC 웹에서 결제 시도]

[요금제 선택]

[ActiveX 문제로 PC 결제 불가]

["모바일에서만 결제 가능합니다" 안내]

[QR 코드 제공]

[사용자: 모바일로 QR 스캔]

[이니시스 카드등록 화면 (모바일)]

[결제 완료 화면]

문제점:

  • PC에서 결제 불가 (ActiveX 의존)
  • QR → 모바일 전환 과정에서 이탈 발생
  • UX 복잡도 높음

목표 결제 UX 플로우 (TO-BE)

[PC 또는 모바일 웹]

[요금제 선택 + 쿠폰 적용]

[TossPayments 결제창 (빌링키 등록)]  ← SDK 연동

[카드 정보 입력 + 본인인증]

[결제 완료 화면]

개선점:

  • PC/모바일 모두 동일 플로우 (ActiveX 없음)
  • 단일 플로우로 UX 단순화
  • TossPayments SDK가 결제 UI 제공 → 별도 디자인 불필요

현재 vs 목표

항목Before (PortOne + 이니시스)After (토스페이먼츠 직연동)
PC 결제❌ ActiveX 문제 → QR 우회✅ 직접 결제 가능
모바일 결제✅ QR 스캔 후 결제✅ 직접 결제
정기결제 UXActiveX 필요, 복잡깔끔, 원클릭
수수료낮음상승 (감수)
커뮤니케이션원활하지 않음개선 기대
연동 방식PortOne 래핑직연동 (API)

근거 데이터

지표수치출처비고
결제 페이지 이탈률TBDGA4측정 필요
ActiveX 관련 CS 문의TBD채널톡측정 필요
현재 유료 유저81명어드민이관 대상
월 MRR₩5,163,480어드민-

기대 효과

  1. 결제 UX 개선: ActiveX 제거, 원클릭 정기결제
  2. 전환율 향상: 결제 단계 이탈 감소
  3. 운영 효율: PG사 대응 속도 개선
  4. 브랜드 신뢰: 토스 브랜드 인지도 활용

2. WHAT: 상세 요구사항

핵심 기능

#기능설명필수 여부
1토스페이먼츠 결제 연동신규 결제 API 연동필수
2정기결제(빌링) 연동카드 등록 + 자동 결제필수
3기존 구독자 이관현재 81명 무중단 이관필수
4결제 UI 개선토스페이먼츠 SDK 적용필수
5결제 실패 처리재시도, 알림, 유예 기간필수
6어드민 결제 관리결제 현황, 환불 처리필수

비즈니스 로직

로직 1: 결제 플로우 (신규 가입)

[신규 구독 결제 플로우]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 요금제 선택
   └─ PRO10: ₩110,000/월 (현재 단일 요금제)

2. 결제 수단 등록
   ├─ 토스페이먼츠 SDK 호출
   ├─ 카드 정보 입력 (토스 UI)
   └─ 빌링키 발급 (billingKey)

3. 첫 결제 실행
   ├─ 빌링키로 즉시 결제
   ├─ 결제 성공 → 구독 활성화
   └─ 결제 실패 → 재시도 안내

4. 정기결제 스케줄 등록
   └─ 매월 가입일 기준 자동 결제

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[토스페이먼츠 API 흐름]

Frontend                    Backend                    TossPayments
    │                          │                            │
    │  1. 결제 요청            │                            │
    │ ─────────────────────→  │                            │
    │                          │  2. 결제 준비 (orderId)    │
    │                          │ ────────────────────────→ │
    │                          │                            │
    │  3. SDK 호출 (clientKey) │                            │
    │ ←─────────────────────   │                            │
    │                          │                            │
    │  4. 카드 정보 입력       │                            │
    │ ──────────────────────────────────────────────────→  │
    │                          │                            │
    │  5. 인증 완료 (paymentKey)                            │
    │ ←──────────────────────────────────────────────────  │
    │                          │                            │
    │  6. 결제 승인 요청       │                            │
    │ ─────────────────────→  │  7. 결제 승인              │
    │                          │ ────────────────────────→ │
    │                          │                            │
    │                          │  8. 승인 결과              │
    │                          │ ←──────────────────────── │
    │  9. 결제 완료            │                            │
    │ ←─────────────────────   │                            │

로직 2: 정기결제 (빌링)

[정기결제 로직]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[빌링키 발급]
1. 토스페이먼츠 카드 등록 UI 호출
2. 사용자 카드 정보 입력
3. 빌링키 발급 (billingKey)
4. DB에 빌링키 암호화 저장

[자동 결제 실행]
매일 배치 작업:
1. 오늘 결제 예정 구독 조회
   WHERE next_payment_date = TODAY

2. 각 구독에 대해 결제 실행
   POST /v1/billing/{billingKey}
   {
     "amount": 110000,
     "orderId": "ORDER_20260120_xxxxx",
     "orderName": "장사왕 PRO10 (2월)"
   }

3. 결제 결과 처리
   ├─ 성공 → 다음 결제일 업데이트 (+1개월)
   ├─ 실패 → 재시도 로직 실행
   └─ 카드 만료 → 카드 갱신 요청

[결제 재시도 정책]
Day 0: 첫 시도 실패 → 즉시 알림 (카카오톡/이메일)
Day 1: 2차 시도
Day 2: 3차 시도
Day 3: 4차 시도 (최종)
Day 3+: 서비스 비활성화

로직 3: 기존 구독자 이관

[이관 전략]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

대상: 현재 유료 구독 중인 81명

[방법 1: 자연 이관 (권장)]
────────────────────────────────
• 신규 결제 → 토스페이먼츠
• 기존 구독 → 만료 시점까지 PortOne 유지
• 갱신 시점에 토스페이먼츠로 재등록 유도

장점: 무중단, 안전
단점: 이관 기간 길어짐 (최대 1개월)

[방법 2: 일괄 이관]
────────────────────────────────
• 특정 일자에 모든 구독자에게 카드 재등록 요청
• 재등록 완료 시 토스페이먼츠로 전환
• 미등록 시 PortOne으로 결제 유지 (Fallback)

장점: 빠른 이관
단점: 사용자 액션 필요, 이탈 리스크

[방법 3: 하이브리드 (추천)]
────────────────────────────────
1. 신규 가입 → 토스페이먼츠 (즉시)
2. 기존 구독 → 다음 갱신일에 카드 재등록 유도
3. 재등록 인센티브: 1개월 10% 할인 쿠폰

[이관 프로세스]
┌─────────────────────────────────────────────────────────────────┐
│  기존 구독자 A                                                   │
│                                                                 │
│  결제일 D-7: 카카오톡 알림                                       │
│  "결제 시스템이 업그레이드됩니다.                                 │
│   카드를 다시 등록해주시면 10% 할인 쿠폰을 드려요!"              │
│                                                                 │
│  [카드 재등록하기]                                               │
│                                                                 │
│  ├─ 재등록 완료 → 토스페이먼츠로 결제                            │
│  └─ 미등록 → 기존 PortOne으로 결제 (Fallback)                   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

로직 4: 결제 실패 처리

[결제 실패 시나리오]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[실패 유형별 처리]

1. 잔액 부족
   → 재시도 (Day 1, 3, 7)
   → 알림: "결제가 실패했어요. 카드 잔액을 확인해주세요"

2. 카드 한도 초과
   → 재시도 (Day 1, 3, 7)
   → 알림: "카드 한도를 확인해주세요"

3. 카드 만료
   → 카드 재등록 요청
   → 알림: "카드가 만료되었어요. 새 카드를 등록해주세요"

4. 카드 분실/정지
   → 카드 재등록 요청
   → 알림: "카드 상태를 확인해주세요"

5. 기타 오류
   → 재시도 후 수동 확인

[유예 기간 정책]
• 결제 실패 후 3일간 서비스 유지 (데이터 조회 가능)
• 3일간 재결제 시도 (Day 1, 2, 3)
• 3일 이후 서비스 비활성화

[알림 채널]
• 카카오톡 알림톡 (우선)
• 이메일
• 앱 푸시 (향후)

로직 5: 정기결제 완료 알림

[정기결제 완료 알림톡]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

⚠️ 필요 이유:
- 추천인 크레딧으로 인해 매달 결제 금액이 변동될 수 있음
- 사용자가 실제 결제된 금액을 명확히 인지해야 함
- 크레딧 잔액 안내로 추천 활동 유도

[알림톡 발송 시점]
정기결제 성공 즉시

[알림톡 템플릿]

┌─────────────────────────────────────────────────────────────┐
│  [장사왕] 정기결제 완료                                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  안녕하세요, #{userName}님!                                  │
│  이번 달 장사왕 결제가 완료되었습니다.                        │
│                                                             │
│  ■ 결제 정보                                                │
│  • 상품: 장사왕 PRO10 (#{month}월)                          │
│  • 원가: 110,000원                                          │
│  • 크레딧 사용: -#{creditUsed}원                            │
│  • 결제 금액: #{actualAmount}원                             │
│  • 결제일: #{paymentDate}                                   │
│  • 결제 수단: #{cardInfo}                                   │
│                                                             │
│  ■ 크레딧 잔액: #{creditBalance}원                          │
│  └ 친구 추천하고 크레딧 더 받기 →                            │
│                                                             │
│  다음 결제 예정일: #{nextPaymentDate}                        │
│                                                             │
│  [결제 내역 확인하기]                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

[알림톡 예시 - 크레딧 사용 시]

  안녕하세요, 김셀러님!
  이번 달 장사왕 결제가 완료되었습니다.

  ■ 결제 정보
  • 상품: 장사왕 PRO10 (2월)
  • 원가: 110,000원
  • 크레딧 사용: -7,000원
  • 결제 금액: 103,000원
  • 결제일: 2026-02-15
  • 결제 수단: 신한카드 **** 1234

  ■ 크레딧 잔액: 14,000원
  └ 친구 추천하고 크레딧 더 받기 →

  다음 결제 예정일: 2026-03-15

[알림톡 예시 - 크레딧 전액 사용 시]

  안녕하세요, 박셀러님!
  이번 달 장사왕 결제가 완료되었습니다.

  ■ 결제 정보
  • 상품: 장사왕 PRO10 (2월)
  • 원가: 110,000원
  • 크레딧 사용: -110,000원
  • 결제 금액: 0원 (전액 크레딧)
  • 결제일: 2026-02-15

  ■ 크레딧 잔액: 5,000원
  └ 친구 추천하고 크레딧 더 받기 →

  다음 결제 예정일: 2026-03-15

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[알림톡 템플릿 변수]
• #{userName}: 사용자 이름
• #{month}: 결제 월
• #{creditUsed}: 이번 결제에 사용된 크레딧
• #{actualAmount}: 실제 결제 금액 (원가 - 크레딧)
• #{paymentDate}: 결제일
• #{cardInfo}: 결제 카드 정보 (마스킹)
• #{creditBalance}: 남은 크레딧 잔액
• #{nextPaymentDate}: 다음 결제 예정일

로직 6: 요금제 변경 (Upgrade/Downgrade)

[요금제 체계]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

| Grade | 요금제 | 최대 몰 연동 | 월 요금 |
|-------|--------|-------------|---------|
| 0 | Trial | 5 | ₩0 |
| 1 | Free | 0 | ₩0 |
| 150 | BASIC | 1 | ₩20,000 |
| 1100 | PRO 3 | 3 | ₩40,000 |
| 1200 | PRO 10 | 20 | ₩100,000 |
| 1250 | PRO 20 | 40 | ₩200,000 |
| 1300 | PRO 30 | 60 | ₩300,000 |

※ Grade가 높을수록 상위 요금제
※ 월 요금 = 기본요금 + (계정당 단가 × 연동 가능 계정 수)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[Upgrade 정책]
────────────────────────────────────────────────────────────────

• 즉시 차액 결제 (일할 계산)
• 상위 요금제 혜택 즉시 적용

[계산 방식]
남은 일수 = 다음 결제일 - 오늘
일할 차액 = (신규 요금 - 기존 요금) × (남은 일수 / 30)

[예시: PRO 3 → PRO 10]
• 기존: PRO 3 (₩40,000/월)
• 신규: PRO 10 (₩100,000/월)
• 남은 일수: 15일
• 차액: (100,000 - 40,000) × (15/30) = ₩30,000
• → 즉시 ₩30,000 결제 후 PRO 10 적용

[플로우]
1. 요금제 변경 요청 (PRO 3 → PRO 10)
2. 차액 계산 및 안내 (₩30,000)
3. [차액 결제하기] 클릭
4. 결제 완료 → 즉시 PRO 10 적용
5. 다음 정기결제일에 PRO 10 요금 (₩100,000) 결제

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[Downgrade 정책]
────────────────────────────────────────────────────────────────

• 다음 결제일에 적용
• 현재 결제 기간까지 기존 요금제 혜택 유지
• ⚠️ 연동 몰 수 제한 체크 필수

[핵심 제약: 연동 몰 수 체크]
하위 요금제의 최대 연동 가능 몰 수보다
현재 연동 중인 몰이 많으면 Downgrade 불가

[예시: PRO 10 → PRO 3]
• 현재: PRO 10 (최대 20개 연동), 5개 몰 연동 중
• 목표: PRO 3 (최대 3개 연동)
• 문제: 5개 > 3개 (초과)
• → 2개 몰 연동 해제 필요

[플로우]
1. 요금제 변경 요청 (PRO 10 → PRO 3)
2. 연동 몰 수 체크
   ├─ 초과 시 → 해제 필요 안내
   │   "PRO 3는 최대 3개 몰만 연동할 수 있어요.
   │    현재 5개 연동 중이에요. 2개를 먼저 해제해주세요."
   │   [몰 연동 관리로 이동]

   └─ 통과 시 → 변경 예약
       "다음 결제일(2/15)부터 PRO 3로 변경돼요.
        그때까지 PRO 10 혜택을 계속 이용하세요."
       [변경 예약하기]

3. 변경 예약 완료
4. 다음 결제일에 PRO 3 요금 (₩40,000) 결제
5. PRO 3 적용

[몰 연동 해제 플로우]
1. 마이페이지 → 몰 연동 관리
2. 해제할 몰 선택
3. 경고: "이 몰의 데이터는 더 이상 수집되지 않아요"
4. [연동 해제] 확인
5. 연동 해제 완료
6. 요금제 변경 페이지로 복귀
7. 다시 Downgrade 시도 (연동 몰 수 통과)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[요금제 변경 제한 케이스]
────────────────────────────────────────────────────────────────

| 케이스 | 처리 |
|--------|------|
| Trial → 유료 | 정상 (첫결제 쿠폰 적용 가능) |
| Free → 유료 | 정상 |
| 유료 → Free | Downgrade 정책 적용 (연동 몰 전체 해제 필요) |
| 결제 실패 중 변경 | ❌ 불가 - 결제 정상화 후 변경 가능 |
| 해지 예약 중 변경 | 해지 예약 취소 후 변경 가능 |

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

사용자 시나리오

시나리오 1: 신규 가입 결제

1. 셀러가 결제 페이지 진입
2. PRO10 요금제 ₩110,000/월 확인
3. [결제하기] 클릭
4. 토스페이먼츠 결제창 오픈 (깔끔한 UI)
5. 카드 정보 입력 (또는 간편결제)
6. 결제 완료
7. "구독이 시작되었습니다!" 안내
8. 서비스 즉시 이용 가능

---

시나리오 2: 기존 구독자 이관

1. 김셀러 (기존 PortOne 결제)
2. 결제일 D-7에 카카오톡 수신
   "결제 시스템 업그레이드! 카드 재등록 시 10% 할인"
3. [카드 재등록하기] 클릭
4. 토스페이먼츠 카드 등록
5. "다음 결제부터 새 카드로 결제됩니다"
6. 10% 할인 쿠폰 자동 적용

---

시나리오 3: 결제 실패 → 복구

1. 박셀러 정기결제 실패 (잔액 부족)
2. 즉시 카카오톡 알림
   "결제가 실패했어요. 7일 내 해결해주세요"
3. Day 1: 자동 재시도 → 실패
4. Day 3: 자동 재시도 → 성공
5. "결제가 완료되었습니다" 알림

---

시나리오 4: 요금제 Upgrade (PRO 3 → PRO 10)

1. 이셀러 PRO 3 사용 중 (3개 몰 연동)
2. 마이페이지 → 요금제 변경
3. PRO 10 선택
4. 차액 안내: "₩30,000 (남은 15일분)"
5. [차액 결제하기] 클릭
6. 결제 완료
7. "PRO 10으로 업그레이드됐어요! 이제 20개 몰까지 연동할 수 있어요"
8. 즉시 PRO 10 혜택 적용

---

시나리오 5: 요금제 Downgrade (PRO 10 → PRO 3, 연동 초과)

1. 최셀러 PRO 10 사용 중 (5개 몰 연동)
2. 마이페이지 → 요금제 변경
3. PRO 3 선택
4. 경고: "PRO 3는 최대 3개 몰만 연동할 수 있어요.
         현재 5개 연동 중이에요. 2개를 먼저 해제해주세요."
5. [몰 연동 관리로 이동] 클릭
6. 2개 몰 연동 해제
7. 다시 요금제 변경 → PRO 3 선택
8. "다음 결제일(2/15)부터 PRO 3로 변경돼요"
9. [변경 예약하기] 클릭
10. 변경 예약 완료

---

시나리오 6: 요금제 Downgrade (PRO 10 → PRO 3, 연동 미초과)

1. 한셀러 PRO 10 사용 중 (2개 몰 연동)
2. 마이페이지 → 요금제 변경
3. PRO 3 선택
4. 연동 체크 통과 (2개 < 3개)
5. "다음 결제일(2/15)부터 PRO 3로 변경돼요.
    그때까지 PRO 10 혜택을 계속 이용하세요."
6. [변경 예약하기] 클릭
7. 변경 예약 완료

3. HOW: 플로우 & 화면

결제 페이지 UI

[토스페이먼츠 결제창 - SDK 제공]
┌───────────────────────────────────────────────────────────────┐
│                                                               │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │                    💳 결제하기                           │ │
│  │                                                         │ │
│  │  장사왕 PRO10                            ₩110,000      │ │
│  │                                                         │ │
│  │  ─────────────────────────────────────────────────────  │ │
│  │                                                         │ │
│  │  결제 수단 선택                                         │ │
│  │                                                         │ │
│  │  ○ 카드 결제                                           │ │
│  │  ○ 토스페이                                            │ │
│  │  ○ 카카오페이                                          │ │
│  │  ○ 네이버페이                                          │ │
│  │                                                         │ │
│  │  ─────────────────────────────────────────────────────  │ │
│  │                                                         │ │
│  │  카드 번호                                              │ │
│  │  ┌─────────────────────────────────────────────────┐   │ │
│  │  │ 0000 - 0000 - 0000 - 0000                       │   │ │
│  │  └─────────────────────────────────────────────────┘   │ │
│  │                                                         │ │
│  │  유효기간          CVC                                  │ │
│  │  ┌───────────┐    ┌───────────┐                        │ │
│  │  │ MM / YY   │    │ 000       │                        │ │
│  │  └───────────┘    └───────────┘                        │ │
│  │                                                         │ │
│  │              [₩110,000 결제하기]                        │ │
│  │                                                         │ │
│  └─────────────────────────────────────────────────────────┘ │
│                                                               │
│                        powered by toss payments               │
│                                                               │
└───────────────────────────────────────────────────────────────┘

※ 요금제 선택 페이지는 현재 PRO10 단일 요금제이므로 별도 선택 UI 없음

결제 관리 (마이페이지)

[마이페이지 - 구독 관리]
┌───────────────────────────────────────────────────────────────┐
│ 📋 구독 정보                                                   │
├───────────────────────────────────────────────────────────────┤
│                                                               │
│  현재 플랜: PRO10                                              │
│  결제 금액: ₩110,000/월                                       │
│  다음 결제일: 2026-02-20                                      │
│                                                               │
│  ─────────────────────────────────────────────────────────   │
│                                                               │
│  💳 결제 수단                                                  │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │ 신한카드 **** 1234                            [변경]    │ │
│  └─────────────────────────────────────────────────────────┘ │
│                                                               │
│  ─────────────────────────────────────────────────────────   │
│                                                               │
│  📜 결제 내역                                                  │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │ 2026-01-20  PRO10 (1월)        ₩110,000     ✅ 완료    │ │
│  │ 2025-12-20  PRO10 (12월)       ₩110,000     ✅ 완료    │ │
│  │ 2025-11-20  PRO10 (11월)       ₩110,000     ✅ 완료    │ │
│  └─────────────────────────────────────────────────────────┘ │
│                                                               │
│  [플랜 변경]  [구독 해지]                                      │
│                                                               │
└───────────────────────────────────────────────────────────────┘

결제 내역 조회 (병행 운영)

┌─────────────────────────────────────────────────────────────┐
│  기존 회원 (PG 이관 전 결제 이력 있음)                      │
├─────────────────────────────────────────────────────────────┤
│  결제 내역 조회 시:                                         │
│  1. PortOne(이니시스) 결제 이력 조회                        │
│  2. TossPayments 결제 이력 조회                             │
│  3. 두 결과 병합하여 표시 (최신순)                          │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  신규 회원 (TossPayments only)                              │
├─────────────────────────────────────────────────────────────┤
│  결제 내역 조회 시:                                         │
│  TossPayments 결제 이력만 조회                              │
└─────────────────────────────────────────────────────────────┘

조회 위치:

  • 마이페이지 → 결제 내역
  • 어드민 → 회원 관리 → 해당 회원 결제 내역

신규 화면: 없음 (기존 UI에 데이터 소스만 병합)

어드민 결제 관리

[어드민 - 결제 현황]
┌───────────────────────────────────────────────────────────────┐
│ 💰 결제 현황                                     [이번 달 ▼]   │
├───────────────────────────────────────────────────────────────┤
│                                                               │
│  MRR: ₩5,163,480    유료: 81명    이탈: 3명                  │
│                                                               │
│  ─────────────────────────────────────────────────────────   │
│                                                               │
│  [전체]  [결제 예정]  [결제 실패]  [해지 예정]                 │
│                                                               │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │ 🔴 김셀러     결제 실패 (D+3)    ₩110,000               │ │
│  │    실패 사유: 잔액 부족                                  │ │
│  │    [수동 재시도] [연락하기]                              │ │
│  ├─────────────────────────────────────────────────────────┤ │
│  │ 🟡 박셀러     해지 예정 (D-5)    ₩110,000               │ │
│  │    해지 사유: -                                         │ │
│  │    [연락하기] [해지 취소]                               │ │
│  ├─────────────────────────────────────────────────────────┤ │
│  │ 🟢 이셀러     결제 완료          ₩110,000               │ │
│  │    2026-01-20 결제                                      │ │
│  └─────────────────────────────────────────────────────────┘ │
│                                                               │
└───────────────────────────────────────────────────────────────┘

디자인 요청사항

항목내용
톤앤매너신뢰감, 깔끔함 (토스 스타일 참고)
컬러토스 블루 활용, 성공=초록, 실패=빨강
결제창토스페이먼츠 SDK 기본 UI 사용
참고토스, 당근마켓, 리멤버 결제 플로우

3.5 디자인 필요 화면

PRD_결제페이지개발범위_20260126.md 기준

P1 (권장) - 2일

#화면명주요 구성 요소예상 공수
1몰연동 유도 팝업• 혜택 안내 (크레딧 3,500원, 쿠폰 100원)
• [지금 연동하기] / [나중에] 버튼
1일
2결제 유도 팝업• 쿠폰 발급 완료 안내
• [결제하러 가기] / [나중에] 버튼
1일

P2 (선택) - 3일

#화면명주요 구성 요소예상 공수
10토스 전환 유도 팝업• 시스템 변경 안내
• 새로운 혜택 소개 (쿠폰, 크레딧)
• [지금 재등록하기] / [나중에]
1일
11약관 동의 & 쿠폰 발급• 약관 동의 체크박스 (필수/선택)
• 전환 쿠폰 안내 (MIGRATE10)
• [동의하고 계속하기] 버튼
2일

기존 화면 (디자인 불필요)

┌─────────────────────────────────────────────────────────────┐
│  TossPayments SDK 기본 UI 사용으로 디자인 별도 불필요       │
├─────────────────────────────────────────────────────────────┤
│  • 결제 수단 선택                                           │
│  • 카드 정보 입력                                           │
│  • 간편결제 (토스페이, 카카오페이, 네이버페이)               │
│                                                             │
│  ※ 토스페이먼츠 SDK가 일관된 결제 UX 제공                   │
└─────────────────────────────────────────────────────────────┘

디자인 요청 사항

┌─────────────────────────────────────────────────────────────┐
│  디자인 요청 시 전달 필요 항목                                │
├─────────────────────────────────────────────────────────────┤
│  1. 본 에픽 스펙 (E-06-pg-migration.md)                      │
│  2. PRD_결제페이지개발범위_20260126.md                        │
│  3. E-07-coupon-referral.md (쿠폰/크레딧 관련)               │
│  4. 기존 화면 스크린샷 (결제 페이지, 이관 안내)               │
└─────────────────────────────────────────────────────────────┘

디자인 우선순위:
• P1 화면 (#1~#2): 신규 유저 온보딩 플로우
• P2 화면 (#10~#11): 기존 유저 마이그레이션 플로우

4. EDGE: 예외 & 엣지 케이스

결제 예외

상황처리 방법
결제창 이탈결제 미완료 처리, 재시도 가능
중복 결제 시도idempotency key로 중복 방지
부분 환불 요청일할 계산 환불 지원
카드사 점검다른 결제 수단 안내

이관 예외

상황처리 방법
이관 거부기존 PortOne 유지 (Fallback)
카드 재등록 실패다른 카드 시도 안내
양쪽 PG 동시 결제idempotency로 방지, 중복 시 자동 환불

시스템 예외

상황처리 방법
토스페이먼츠 장애PortOne Fallback (이관 완료 전)
웹훅 수신 실패폴링으로 결제 상태 확인
DB 장애결제 완료 후 트랜잭션 롤백 → 환불 처리

5. 성공 지표

5.1 지표 체계 개요

┌─────────────────────────────────────────────────────────────┐
│              E-06 PG 이관 지표 체계                          │
├─────────────────────────────────────────────────────────────┤
│  [Sprint 내 판단]                                           │
│  Primary: 결제 성공률 ≥ 95% AND 결제 페이지 이탈률 -20%      │
│  Secondary: 기존 구독자 이관율 ≥ 80%                         │
├─────────────────────────────────────────────────────────────┤
│  [Sprint 이후 확인]                                         │
│  Lagging: 결제 관련 CS 문의 -50%                             │
│  Ultimate: 이관 완료율 100% (PortOne 완전 종료)              │
├─────────────────────────────────────────────────────────────┤
│  [Guard Rails]                                              │
│  • 결제 성공률 90% 이하 시 롤백 검토                         │
│  • 웹훅 수신 성공률 99% 이상 유지                            │
│  • 이중 결제 0건 유지                                        │
└─────────────────────────────────────────────────────────────┘

5.2 Sprint 내 판단 지표

계층지표산식목표
Primary결제 성공률결제 성공 건 / 결제 시도 건≥ 95%
Primary결제 페이지 이탈률(결제 시작 - 결제 완료) / 결제 시작-20% (기존 대비)
Secondary기존 구독자 이관율토스 결제 전환 유저 / 기존 PortOne 유저≥ 80%
Secondary평균 결제 소요 시간결제 시작 ~ 완료 평균≤ 60초

5.3 Sprint 이후 확인 지표

계층지표산식목표
Lagging결제 관련 CS 문의채널톡 결제 관련 문의 건-50%
Lagging결제 실패 후 복구율재시도 성공 건 / 결제 실패 건≥ 70%
Ultimate이관 완료율토스 결제 유저 / 전체 유료 유저100%

5.4 Guard Rails (위반 시 롤백 검토)

  • 결제 성공률 90% 이하 시 즉시 롤백 검토
  • 웹훅 수신 성공률 99% 미만 시 폴링 모드 전환
  • 이중 결제 1건 이상 발생 시 긴급 대응
  • 결제 실패 10건/일 초과 시 원인 분석
  • 결제 소요 시간 120초 초과 시 UX 점검

5.5 성공 판단 기준

[Sprint 종료 시점]
✅ 성공: 결제 성공률 ≥ 95% AND 결제 이탈률 -20%
⚠️ 부분 성공: 성공률 90~95% OR 이탈률 개선 미미
❌ 실패: 성공률 < 90% OR Guard Rails 위반

[Sprint +4주 후]
✅ 가설 검증: 기존 구독자 이관율 ≥ 80%
→ "ActiveX 제거와 UX 개선이 결제 전환을 높였다"

[이관 완료 시점 (예상 +2개월)]
✅ 완전 성공: PortOne 결제 0건, 토스페이먼츠 100%

5.6 모니터링 지표 (실시간)

지표설명알림 기준
결제 성공률시도 대비 성공< 90% 시 Slack 알림
결제 실패 건수일별 실패 건> 5건/일 시 알림
평균 결제 소요 시간시작~완료> 60초 시 점검
웹훅 수신 성공률토스→서버< 99% 시 알림
정기결제 성공률빌링 결제 성공< 95% 시 알림
이중 결제 건수중복 결제 발생> 0건 시 즉시 알림

6. 이벤트 트래킹 명세

6.1 이벤트 목록

이벤트명트리거 시점우선순위
view_payment_page결제 페이지 진입P0
start_payment결제 시작 (SDK 호출)P0
complete_payment결제 완료P0
fail_payment결제 실패P0
view_card_registration카드 재등록 페이지 진입P0
complete_card_registration카드 재등록 완료P0
cancel_payment결제 취소/이탈P1
change_payment_method결제 수단 변경P1
view_payment_history결제 내역 조회P2

6.2 핵심 이벤트 상세

view_payment_page

javascript
dataLayer.push({
  event: "payment",
  event_name: "view_payment_page",
  params: {
    plan_type: "PRO10",
    plan_price: 110000,
    source: "gnb",                    // gnb | settings | onboarding
    has_coupon: "N",
    coupon_discount: 0,
    has_credit: "N",
    credit_amount: 0,
    is_new_user: "Y"                  // Y | N (기존 구독자 여부)
  }
});

start_payment

javascript
dataLayer.push({
  event: "payment",
  event_name: "start_payment",
  params: {
    plan_type: "PRO10",
    plan_price: 110000,
    payment_method: "card",           // card | tosspay | kakaopay | naverpay
    coupon_applied: "N",
    coupon_code: null,
    credit_applied: "N",
    credit_amount: 0,
    final_amount: 110000,
    pg_provider: "tosspayments"
  }
});

complete_payment

javascript
dataLayer.push({
  event: "payment",
  event_name: "complete_payment",
  params: {
    plan_type: "PRO10",
    plan_price: 110000,
    payment_method: "card",
    card_company: "shinhan",          // 카드사 코드
    final_amount: 110000,
    coupon_discount: 0,
    credit_used: 0,
    payment_id: "PAY_20260120_xxxxx",
    billing_key_issued: "Y",          // 빌링키 발급 여부
    pg_provider: "tosspayments",
    is_migration: "N"                 // Y: 이관 결제, N: 신규 결제
  }
});

fail_payment

javascript
dataLayer.push({
  event: "payment",
  event_name: "fail_payment",
  params: {
    plan_type: "PRO10",
    plan_price: 110000,
    payment_method: "card",
    fail_reason: "INSUFFICIENT_BALANCE",  // 실패 코드
    fail_message: "잔액이 부족합니다",
    pg_provider: "tosspayments",
    retry_count: 0
  }
});

view_card_registration (이관용)

javascript
dataLayer.push({
  event: "payment",
  event_name: "view_card_registration",
  params: {
    source: "migration_notice",       // migration_notice | settings | email
    days_before_renewal: 7,           // 갱신일까지 남은 일수
    has_incentive: "Y",               // 10% 할인 쿠폰 적용 여부
    current_pg: "portone"
  }
});

complete_card_registration

javascript
dataLayer.push({
  event: "payment",
  event_name: "complete_card_registration",
  params: {
    source: "migration_notice",
    card_company: "shinhan",
    new_pg: "tosspayments",
    incentive_coupon_issued: "Y",
    is_migration: "Y"
  }
});

6.3 측정 타이밍

시점확인 항목
릴리즈 D+1이벤트 수집 정상 여부, 결제 플로우 정상 동작
릴리즈 D+3결제 성공률 초기값, 실패 패턴 분석
릴리즈 D+7Primary 지표 1차 판정, 이관 안내 발송 효과
릴리즈 D+14이관율 1차 측정, Guard Rails 점검
릴리즈 D+30전체 이관 현황, CS 문의 변화

MRR 계산 방법 (쿠폰/크레딧 적용 시)

⚠️ 중요: E-07 쿠폰/크레딧 시스템 도입 후 MRR 계산 방식

[MRR 정의]
MRR = Monthly Recurring Revenue (월간 반복 매출)
     = 활성 구독자 수 × 월 구독 금액

[쿠폰/크레딧 적용 시 MRR 계산]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

방법 1: Gross MRR (총 MRR) - 권장
────────────────────────────────
• 할인 전 원가 기준으로 계산
• 쿠폰/크레딧 할인분은 별도 "할인" 항목으로 분리

예시:
• 구독자: 100명
• 월 요금: 110,000원
• Gross MRR = 100 × 110,000 = 11,000,000원
• 쿠폰 할인 총액: -500,000원
• 크레딧 사용 총액: -300,000원
• Net Revenue = 10,200,000원

방법 2: Net MRR (순 MRR)
────────────────────────────────
• 실제 결제 금액 기준
• Net MRR = Σ(각 구독자의 실제 결제액)

⚠️ 단점: 쿠폰/크레딧 사용량에 따라 MRR 변동 → 성장 추적 어려움

[권장 운영 방식]
• 대시보드: Gross MRR 표시 (성장 추적 기준)
• 재무 리포트: Net Revenue 표시 (실 수익 기준)
• 별도 지표: 쿠폰 할인율, 크레딧 사용률 모니터링

[어드민 표시 예시]
┌─────────────────────────────────────────────────────────────┐
│  MRR: ₩11,000,000 (Gross)                                  │
│  ├─ 쿠폰 할인: -₩500,000 (4.5%)                           │
│  ├─ 크레딧 사용: -₩300,000 (2.7%)                         │
│  └─ 실 수익: ₩10,200,000                                   │
└─────────────────────────────────────────────────────────────┘

7. 개발 범위 및 우선순위

7.1 P0 (필수, MVP)

항목설명담당
토스페이먼츠 결제 API 연동SDK + API 연동, 결제 승인BE
정기결제(빌링) 연동빌링키 발급, 자동 결제 스케줄러BE
결제 UI토스페이먼츠 SDK 결제창 적용FE
결제 웹훅 처리결제 완료/실패 웹훅 수신BE
결제 실패 재시도 로직Day 1, 3, 7 재시도 + 알림BE
빌링키 암호화 저장AES-256 암호화BE

7.2 P1 (중요)

항목설명담당
기존 구독자 이관 로직카드 재등록 + Fallback 처리BE
이관 안내 알림톡카카오 알림톡 템플릿 + 발송BE
정기결제 완료 알림톡결제 금액/크레딧 안내BE
결제 내역 병합 조회PortOne + 토스 내역 통합BE + FE
마이페이지 결제 관리카드 변경, 결제 내역 조회FE
이벤트 트래킹GA4 결제 이벤트 전송FE

7.3 P2 (선택)

항목설명담당
어드민 결제 관리 UI결제 현황 대시보드, 수동 처리FE
간편결제 지원토스페이, 카카오페이, 네이버페이FE + BE
결제 영수증 발급PDF 영수증 생성BE
환불 자동화일할 계산 자동 환불BE

8. 의존성 & 제약

기술 의존성

의존 항목상태비고
토스페이먼츠 계약⏳ 확인 필요계약 완료 여부
토스페이먼츠 API Key⏳ 발급 필요clientKey, secretKey
빌링키 암호화⏳ 설계 필요AES-256 등
결제 웹훅 엔드포인트⏳ 개발 필요/webhook/payment

제약 조건

  • 병행 운영: 이관 완료까지 PortOne + 토스페이먼츠 병행
  • 데이터 이관: 결제 내역 마이그레이션 필요
  • 환불 정책: 기존 정책 유지
  • PCI-DSS: 카드 정보 직접 저장 안 함 (토스 처리)

확인 필요 사항

항목담당상태
토스페이먼츠 계약 상태창훈 수석⏳ 확인 필요
수수료율 확정창훈 수석⏳ 확인 필요
기존 결제 데이터 마이그레이션창훈 수석⏳ 설계 필요
알림톡 템플릿 승인 (이관 안내)이삭⏳ 신청 필요
알림톡 템플릿 승인 (정기결제 완료)이삭⏳ 신청 필요

9. 스토리 목록 (예정)

Epic Spec 승인 후 분해

Story ID제목규모우선순위담당상태
E-06-S-01토스페이먼츠 결제 API 연동 + 빌링키 암호화LP0BEdraft
E-06-S-02정기결제(빌링) 연동 + 스케줄러LP0BEdraft
E-06-S-03결제 UI 개발 (SDK 적용)MP0FEdraft
E-06-S-04결제 웹훅 처리MP0BEdraft
E-06-S-05결제 실패 재시도 로직 (Day 1,3,7)MP0BEdraft
E-06-S-06기존 구독자 이관 로직 + Fallback 처리LP1BEdraft
E-06-S-07이관 안내 알림톡 (카카오)SP1BEdraft
E-06-S-08정기결제 완료 알림톡SP1BEdraft
E-06-S-09결제 내역 병합 조회 (PortOne + Toss)MP1BE+FEdraft
E-06-S-10마이페이지 결제 관리 UI (카드 변경, 내역)MP1FEdraft
E-06-S-11GA4 이벤트 트래킹 (10개 이벤트)SP1FEdraft
E-06-S-12어드민 결제 관리 UIMP2FEdraft

Story Point 추정

규모Story합계
L (3pt)S-01, S-02, S-069
M (2pt)S-03, S-04, S-05, S-09, S-10, S-1212
S (1pt)S-07, S-08, S-113
총합24 SP

의존성 그래프

[BE] E-06-S-01 결제 API

    ┌────┴────┬──────────────┐
    ▼         ▼              ▼
[BE] S-02  [BE] S-04      [FE] S-03
 빌링 연동   웹훅 처리       결제 UI
    │         │              │
    ▼         ▼              │
[BE] S-05  [BE] S-06         │
 재시도     이관 로직         │
    │         │              │
    │    ┌────┴────┐         │
    │    ▼         ▼         │
    │ [BE] S-07  [BE] S-08   │
    │  이관알림   완료알림    │
    │                        │
    └────────┬───────────────┘

      [BE+FE] S-09 결제내역 병합

        ┌────┴────┐
        ▼         ▼
    [FE] S-10  [FE] S-11
    마이페이지  이벤트트래킹

10. QA 체크리스트

기능 테스트

신규 결제 플로우

  • [ ] 결제 페이지 정상 진입
  • [ ] 토스페이먼츠 SDK 결제창 오픈
  • [ ] 카드 정보 입력 정상 동작
  • [ ] 결제 승인 성공 → 구독 활성화
  • [ ] 결제 완료 화면 표시
  • [ ] 빌링키 정상 발급 및 암호화 저장

정기결제 (빌링)

  • [ ] 결제 예정일에 자동 결제 실행
  • [ ] 결제 성공 시 다음 결제일 업데이트 (+1개월)
  • [ ] 결제 실패 시 재시도 로직 실행 (Day 1, 3, 7)
  • [ ] 결제 실패 알림톡 발송
  • [ ] 카드 만료 시 재등록 요청 알림

결제 완료 알림톡

  • [ ] 정기결제 성공 시 알림톡 발송
  • [ ] 원가, 크레딧 사용, 실결제 금액 정확히 표시
  • [ ] 크레딧 잔액 표시
  • [ ] 다음 결제 예정일 표시
  • [ ] 크레딧 전액 사용 시 (0원 결제) 정상 표시

기존 구독자 이관

  • [ ] 이관 안내 알림톡 발송 (D-7)
  • [ ] 카드 재등록 페이지 정상 동작
  • [ ] 재등록 완료 시 토스페이먼츠로 전환
  • [ ] 미등록 시 PortOne Fallback 정상 동작
  • [ ] 이관 인센티브 쿠폰 자동 적용

결제 관리 (마이페이지)

  • [ ] 현재 구독 정보 표시
  • [ ] 결제 수단 변경 기능
  • [ ] 결제 내역 조회 (PortOne + 토스 병합)
  • [ ] 구독 해지 기능

요금제 변경 (Upgrade/Downgrade)

  • [ ] 요금제 목록 및 혜택 비교 표시
  • [ ] Upgrade: 차액 계산 정확성 (일할 계산)
  • [ ] Upgrade: 차액 결제 후 즉시 상위 요금제 적용
  • [ ] Upgrade: 연동 가능 몰 수 증가 확인
  • [ ] Downgrade: 연동 몰 수 체크 동작
  • [ ] Downgrade: 초과 시 해제 필요 안내 표시
  • [ ] Downgrade: 몰 연동 관리 페이지 이동
  • [ ] Downgrade: 몰 연동 해제 정상 동작
  • [ ] Downgrade: 해제 후 요금제 변경 가능
  • [ ] Downgrade: 다음 결제일에 변경 예약 처리
  • [ ] Downgrade: 변경 예약 후 기존 요금제 혜택 유지
  • [ ] 결제 실패 중 요금제 변경 차단
  • [ ] 해지 예약 중 요금제 변경 차단

어드민 결제 관리

  • [ ] MRR 현황 표시 (Gross MRR, 할인액, 실수익)
  • [ ] 결제 예정/실패/해지 예정 목록
  • [ ] 수동 재시도 기능
  • [ ] 환불 처리 기능

결제 로직 테스트

  • [ ] 쿠폰 할인 정상 적용
  • [ ] 크레딧 차감 정상 적용
  • [ ] 최종 결제 금액 = 원가 - 쿠폰 - 크레딧
  • [ ] 크레딧 전액 사용 시 0원 결제 처리
  • [ ] idempotency key로 중복 결제 방지
  • [ ] 일할 계산 환불 정확성

결제 실패 케이스 테스트

  • [ ] 잔액 부족 → 재시도 + 알림
  • [ ] 카드 한도 초과 → 재시도 + 알림
  • [ ] 카드 만료 → 재등록 요청 알림
  • [ ] 카드 분실/정지 → 재등록 요청 알림
  • [ ] 유예 기간 3일 적용 (데이터 조회 가능)
  • [ ] 3일간 재결제 시도 (Day 1, 2, 3)
  • [ ] 3일 이후 서비스 비활성화

이벤트 트래킹 테스트

  • [ ] view_payment_page 이벤트 발생
  • [ ] start_payment 이벤트 발생
  • [ ] complete_payment 이벤트 발생
  • [ ] fail_payment 이벤트 발생 (실패 시)
  • [ ] view_card_registration 이벤트 발생 (이관)
  • [ ] complete_card_registration 이벤트 발생 (이관)
  • [ ] 파라미터 정확성 (금액, 결제수단, PG사 등)
  • [ ] GA4 DebugView에서 확인

엣지 케이스 테스트

결제 예외

  • [ ] 결제창 이탈 → 결제 미완료 처리
  • [ ] 중복 결제 시도 → idempotency로 차단
  • [ ] 카드사 점검 → 다른 결제 수단 안내

이관 예외

  • [ ] 이관 거부 → PortOne 유지 (Fallback)
  • [ ] 카드 재등록 실패 → 다른 카드 안내
  • [ ] 양쪽 PG 동시 결제 방지 → 자동 환불

시스템 예외

  • [ ] 토스페이먼츠 장애 → 에러 메시지 표시 (이관 완료 전 Fallback)
  • [ ] 웹훅 수신 실패 → 폴링으로 상태 확인
  • [ ] DB 트랜잭션 롤백 → 환불 처리

보안 테스트

  • [ ] 빌링키 AES-256 암호화 저장
  • [ ] 카드 정보 직접 저장 안 함 (PCI-DSS)
  • [ ] 결제 API 인증 토큰 검증
  • [ ] 웹훅 서명 검증

체크리스트

PO 승인 전 체크

  • [x] 문제 정의가 명확한가?
  • [x] 비즈니스 로직이 구체적인가? (결제 플로우, 이관 전략)
  • [x] 와이어프레임/플로우가 있는가?
  • [x] 엣지 케이스가 정의되었는가?
  • [x] 성공 지표가 측정 가능한가?
  • [ ] 기술 의존성이 확인되었는가? (계약 상태 확인 필요)

미결 사항

항목상태담당
토스페이먼츠 계약 상태⏳ 확인 필요창훈
수수료율 확정⏳ 확인 필요창훈
이관 인센티브 (10% 할인) 확정⏳ PO 결정 필요윤재
알림톡 템플릿⏳ 신청 필요이삭

승인

항목확인
PO 승인
승인일2026-01-20
비고파티 모드 리뷰 완료, MRR 계산 방식 추가

변경 이력

날짜변경 내용담당
2026-01-20Epic Spec 초안 작성윤재
2026-01-20파티 모드 리뷰 완료, MRR 계산 방식 추가윤재
2026-01-20PO 승인윤재
2026-01-23Notion PRD 수준 상세화 (성공 지표 체계, 이벤트 트래킹 명세, 개발 범위 분류, QA 체크리스트)윤재
2026-01-26디자인 필요 화면 섹션 추가 (PRD 기준)윤재
2026-01-27요금제 변경 정책 추가 (Upgrade/Downgrade, 연동 몰 수 제약)윤재
2026-01-28유예 기간 정책 AS-IS 반영 (7일→3일, 읽기전용 제거, 즉시 비활성화)윤재

작성일: 2026-01-20최종 수정: 2026-01-28

장사왕 Product Team