파트너 구독 플랜 카탈로그 및 권한 통합
ADR-270 파트너 구독 플랜 카탈로그 및 권한 통합
1. Metadata
- ADR ID: ADR-270
- Status: draft
- Date: 2026-03-10
- Owner: YSY
- Related ADRs: ADR-090, ADR-220, ADR-230, ADR-250, ADR-280
2. Domain Decision
- 파트너 구독 모델은
subscription_state와plan_code를 분리해 저장한다. subscription_state는trialing|active|past_due|canceled|expired로 고정하고, 발행 권한은active에서만 허용한다.- 플랜 카탈로그는 버전 엔터티로 관리하고
effective_from/effective_to구간을 명시한다. - Add-on 카탈로그는 플랜 카탈로그와 분리하고
addon_code단위로 버전 관리한다. - 플랜 변경 시 권한 파라미터(entitlement) 적용 시점은
업그레이드 즉시,다운그레이드 다음 청구 주기로 고정한다. - 발행 제한 파라미터(
monthly_limit,concurrent_active_slots,reissue_interval)는 플랜 카탈로그에서 단일 관리한다. - 권한 판정 SoT는
partner_state + subscription_state + base_plan_entitlement + addon_entitlement조합으로 고정한다. - 쿠폰 발행/적용 규칙은 ADR-280에서 단일 관리한다.
3. Product Decision
- MVP 공개 판매 플랜은 월 구독 단일 플랜(
basic)을 기본으로 운영한다. - 확장 플랜(
plus,pro)은 카탈로그에 정의할 수 있으나is_public=false상태에서는 노출하지 않는다. - 플랜 비교 항목은 최소
월 발행 한도,동시 노출 한도,재발행 간격,지원 수준으로 고정한다. - 구독 해지는 기본값을
기간 종료 시 해지(cancel_at_period_end)로 제공한다. - 결제 실패(
past_due)는 발행 차단 상태로 처리하고 복구 경로를 즉시 제공한다. - 공개 Add-on은 월 정액 10,000원 단일 가격으로 시작한다.
- 파트너는 Add-on을 여러 개 선택할 수 있다.
pre_paid기능은prepaid_unlockAdd-on 또는 상위 플랜 기본 권한에서만 활성화한다.- 월 청구 금액은
plan_price + addon_price합산으로 계산한다. basic플랜에서 활성 Add-on이 3개 이상이면plus전환 추천을 노출한다.
3.1 Plan Catalog Baseline (2026-03-10)
아래 표는 현재 운영 기준값이다.basic만 공개 판매하며 plus/pro는 내부 비공개 플랜(is_public=false)으로 유지한다.
| plan_code | is_public | price_krw_month | monthly_limit | concurrent_active_slots | reissue_interval_minutes | distance | support_level |
|---|---|---|---|---|---|---|---|
| basic | true | 19000 | 20 | 1 | 240 | 1km | standard |
| plus | false | 49000 | 60 | 1 | 120 | 2km | priority |
| pro | false | 99000 | 120 | 2 | 60 | 5km | dedicated |
3.2 Add-on Catalog Baseline (2026-03-10)
MVP Add-on은 다중 선택 모델로 시작하며, basic에서 3개 이상 선택 시 plus 전환 추천 정책을 적용한다.
상위 등급의 혜택을 하나 선택하여 해제할 수 있다.
기본 구독료는 basic 19,000원/월이며, 아래 예시는 Add-on을 포함한 총 월 청구액 예시다.
| addon_code | is_public | price_krw_month | max_selectable | entitlement_patch | eligibility |
|---|---|---|---|---|---|
| prepaid_unlock | true | 10000 | 99 | pre_paid=true | pg_configured=true |
총 월 청구액 예시:
basic(19,000) + prepaid_unlock(10,000) = 29,000원/월basic(19,000) + Add-on 3개(각 10,000원) = 49,000원/월->plus(49,000원)전환 추천
4. UX Decision
- 파트너 프로필에는 현재 플랜, 구독 상태, 다음 결제(또는 만료) 시점을 항상 노출한다.
- 플랜 변경 화면은 현재 플랜 대비 달라지는 권한 항목을 먼저 보여준다.
- 다운그레이드 예약 상태에서는 적용 예정일을 명시하고, 적용 전까지 현재 권한을 유지함을 안내한다.
- 발행 차단 화면은 차단 사유(
구독 상태vs플랜 한도)를 구분해 노출한다. - 앱은 구독 조회/상태 안내를 담당하고 결제 실행은 웹 채널로 연결한다.
- Add-on 선택 화면은 다중 선택과 합산 가격(
기본 플랜 + Add-on 합계)을 고정 노출한다. prepaid_unlock미보유 상태에서 선결제 설정 진입 시 구매 유도 CTA를 제공한다.basic에서 Add-on 3개 이상 선택 시plus전환 추천 팝업/배너를 우선 노출한다.
5. Tech Decision
- 구독 상태 동기화 SoT는 결제 웹훅 이벤트로 고정한다.
- 서버 권한 판정 함수는
plan_code,plan_version,addon_codes,entitlement_snapshot을 함께 반환한다. - 플랜 변경 이벤트는
PLAN_CHANGED, 상태 변경 이벤트는SUBSCRIPTION_STATE_CHANGED로 분리 기록한다. - Add-on 변경 이벤트는
ADDON_CHANGED로 분리 기록한다. - 권한 판정 응답에는
can_issue,deny_reason,next_recovery_action을 포함한다. - 캐시를 사용하더라도 권한 판정 최종 값은 서버 실시간 조회 결과를 우선한다.
6. Ops Decision
- 카탈로그 변경(가격/한도/노출 여부)은 변경 요청서와 적용 시각을 운영 캘린더로 관리한다.
- 플랜 변경/실패/해지 이벤트 지연을 일일 점검 항목으로 운영한다.
- 상태 불일치(
billing=active,capability=false등) 감지 알람을 상시 운영한다. - 가격/한도 정책 변경 시 ADR-270, ADR-090, BUSINESS 문서를 동시에 갱신한다.
- Add-on eligibility(
pg_configured) 불일치 건수와 결제 실패율을 분리 모니터링한다.
7. Implementation Contract (Optional)
7.1 API Contract
- 파트너 권한 조회 응답은
partner_state,subscription_state,plan_code,plan_version,addon_codes,can_issue,total_price_krw_month를 함께 포함한다. - 플랜 변경 요청은
target_plan_code,addon_codes,apply_timing(immediate|next_cycle)를 명시한다. - 발행 전 점검 API는 플랜 파라미터 스냅샷(
monthly_limit,concurrent_active_slots,reissue_interval)을 반환한다.
7.2 Data Contract
subscription_plans:plan_code,version,price_krw,billing_cycle,is_public,effective_from,effective_to.partner_subscriptions:partner_id,subscription_state,plan_code,current_period_end,cancel_at_period_end.subscription_addons:addon_code,version,price_krw,is_public,max_selectable,effective_from,effective_to.partner_subscription_addons:partner_id,addon_code,status,current_period_end.- 권한 판정 이력은
plan_code,plan_version,addon_codes,deny_reason,total_price_krw_month를 감사로그에 함께 저장한다.
7.3 Error/Observability Contract
- 표준 코드:
PARTNER_CAPABILITY_DENIED,PLAN_LIMIT_EXCEEDED,SUBSCRIPTION_PAST_DUE,PLAN_CHANGE_PENDING,ADDON_NOT_ELIGIBLE,ADDON_UPGRADE_RECOMMENDED. - 운영 지표: 구독 상태 동기화 지연, 플랜 변경 반영 지연, 권한 판정 불일치 건수.
7.4 Test/Acceptance Contract
subscription_state=active가 아니면can_issue=false가 반환되어야 한다.- 업그레이드 즉시 변경 시 권한 파라미터가 같은 요청 내에서 반영되어야 한다.
- 다운그레이드 예약 상태에서는 적용 시점 전까지 기존 권한이 유지되어야 한다.
- 플랜 파라미터 변경 후 발행 제한 계산(ADR-090)이 새 버전을 사용해야 한다.
basic + prepaid_unlock조합에서pre_paid=true와total_price_krw_month=29000이 반환되어야 한다. 여기서29000은기본 19,000원 + Add-on 10,000원의 합산 금액이다.basic에서 Add-on 3개 이상 활성화 시ADDON_UPGRADE_RECOMMENDED안내 값이 반환되어야 한다.
8. Validation
- Domain/Product/UX/Tech/Ops 결정이 충돌하지 않는다.
- 구현 기준은 SPEC과 정합성을 유지한다.
- 운영 절차는 RUNBOOK으로 연결된다.
- ADR-090/220/250과 역할 경계가 중복되지 않는다.