본문으로 건너뛰기

프로모코드 및 레퍼럴 정책

1. 목적​

프로모션 코드와 래퍼럴(친구 초대) 시스템을 통해 사용자 획득과 구독 전환을 촉진합니다. 파트너 협업, 인플루언서 마케팅, 기존 사용자의 추천을 통한 신규 가입 유도를 위한 정책을 정의합니다.


2. 프로모코드 (PromoCode)​

2-1. 기본 구조​

필드타입설명
codeCharField(50)프로모 코드 (unique)
typeCharField유형: corporate / influencer / referral
nameCharField(100)프로모션 이름
descriptionTextField프로모션 설명
bonus_weeksIntegerField보너스 주 수
banner_textCharField(200)프로모 배너 텍스트 (다국어, TranslatableModel)

2-2. 프로모 코드 유형​

유형코드설명
기업 프로모션corporate협업 기업과의 공동 프로모션
인플루언서influencer인플루언서 전용 코드
래퍼럴referral친구 초대 코드

2-3. 사용 제한​

필드설명
max_uses최대 사용 횟수 (null이면 무제한)
current_uses현재 사용 횟수
one_time_only1회 사용 제한 여부
new_users_only최초 가입자 전용 여부 (has_subscribed_before = False인 사용자만 사용 가능)
valid_from유효 시작일
valid_until유효 종료일 (nullable)
is_active활성화 여부

2-4. 구독 타입 제한 및 오퍼 매핑​

필드설명
subscription_types적용 가능한 구독 타입 JSON (예: ["monthly", "six_months", "annual"])
offer_mapping플랜별 offer ID 매핑 (예: {"subs-monthly-1": "sns50off"})
discount_mapping플랜별 할인율(%) 매핑 (예: {"subs-monthly-1": 50})
ios_offer_codeiOS App Store offer code (예: SNS50OFF)

2-5. 유효성 검사​

프로모 코드는 다음 조건을 모두 충족해야 사용 가능합니다:

  1. is_active = True
  2. 현재 시각이 valid_from 이후
  3. valid_until이 null이거나 현재 시각 이전이 아닌 경우
  4. max_uses에 도달하지 않은 경우
  5. new_users_only인 경우 has_subscribed_before = False인 사용자만 사용 가능
  6. 사용자당 1회만 사용 가능 (PromoCodeUsage unique 제약)

2-6. 프로모코드 API​

EndpointMethod설명
/api/promocodes/apply/POST프로모 코드 임시 적용
/api/promocodes/applied/GET현재 적용된 프로모 코드 조회
/api/promocodes/applied/clear/DELETE임시 적용 프로모 코드 해제

3. 임시 적용 프로모 코드 (AppliedPromoCode)​

3-1. 동작 방식​

  • 프로모 코드를 먼저 임시 적용한 후, IAP 결제를 진행합니다.
  • 사용자당 1개의 임시 적용 프로모 코드만 유지됩니다 (OneToOne).
  • expires_at 시점을 초과하면 자동 만료됩니다.
  • 래퍼럴 코드(valid_until=None)는 만료 없이 첫 구독 전까지 무기한 유지됩니다.

3-2. 적용 흐름​

  1. 프로모 코드 적용: POST /api/promocodes/apply/ → AppliedPromoCode 생성
  2. IAP 결제: 앱 스토어를 통한 인앱 결제 진행
  3. 서버 검증: POST /api/payments/verify/ → 결제 검증 시 적용된 프로모 코드 확인
  4. 사용 기록: PromoCodeUsage 레코드 생성, 보너스 주수 적용

4. 래퍼럴 코드 (ReferralCode)​

4-1. 구조​

필드설명
referrer추천인 사용자 (FK)
promo_code연결된 프로모 코드 (OneToOne)
total_referrals총 추천 수
successful_referrals성공한 추천 수 (구독 완료)

4-2. 래퍼럴 혜택​

  • 추천인과 피추천인 모두 1주 구독 추가
  • 최초 가입 시에만 래퍼럴 코드 입력 가능
  • 1회만 사용 가능
  • 다른 프로모 코드와 중복 적용 가능 (is_referral_stackable)
  • 추천인 최대 보너스 캡: 52주

4-3. 초대 코드 입력 화면 (InvitationCode)​

노출 조건​

  • 대상: 백엔드 응답의 is_new_user == true인 유저 (첫 가입)
  • 타이밍: 소셜 로그인 직후, 홈 화면 진입 전
  • 플로우: 로그인 → InvitationCode 화면 → 홈(selectMap)
  • 건너뛰기: 항상 가능 (건너뛰기 버튼 상시 활성화)

코드 자동 채움 우선순위​

순위소스동작
1딥링크코드 즉시 채움, 토스트 메시지 표시. 클립보드 검증 스킵.
2클립보드백그라운드 서버 검증 → 유효 시 자동 채움
3없음빈칸, 수동 입력 대기

클립보드 자동 감지 UX​

  1. 화면 진입 → 코드 입력란 빈칸 + 확인 버튼 disabled
  2. 백그라운드에서 클립보드 읽기 → 서버 validate API 호출
  3. 유효한 코드: 입력란에 자동 채움 + 확인 버튼 enabled
  4. 유효하지 않은 코드: 빈칸 유지 + 확인 버튼 enabled (수동 입력 대기)
  5. 건너뛰기 버튼은 검증 중에도 항상 enabled

검증 API​

EndpointMethod설명
/api/promocodes/validate/POST프로모/래퍼럴 코드 유효성 검증 (임시 적용 없이 유효 여부만 반환)

4-4. 래퍼럴 API​

EndpointMethod설명
/api/promocodes/referral/create/POST래퍼럴 코드 생성
/api/promocodes/referral/my-stats/GET내 추천 현황 조회
/api/promocodes/referral/my-benefits/GET내 래퍼럴 혜택 조회
/api/promocodes/referral/rewards/GET래퍼럴 리워드 목록 조회

5. 래퍼럴 리워드 (ReferralReward)​

5-1. 구조​

필드설명
referral_code래퍼럴 코드 (FK)
user리워드 대상 사용자
reward_typereferrer (추천인) 또는 referee (피추천인)
bonus_weeks추가된 구독 주 수
subscription연결된 구독 (FK)
statuspending (대기) / applied (적용) / revoked (회수)
applied_at실제 적용 시점
revoked_at회수 시점
revoke_reason회수 사유

5-2. 최소 유지 기간​

  • 래퍼럴 혜택에는 최소 유지 기간 14일이 적용됩니다.
  • 피추천인이 14일 이내에 구독을 해지하면:
    • 피추천인의 보너스 주수만큼 end_date가 감소됩니다.
    • 추천인의 리워드도 revoked 상태로 변경됩니다.
    • 래퍼럴 코드의 successful_referrals이 감소됩니다.

5-3. 리워드 회수 처리​

  • applied 상태의 리워드: 구독에서 bonus_weeks만큼 기간을 감소시킨 후 회수
  • pending 상태의 리워드: 상태만 revoked로 변경
  • 이미 revoked인 리워드: 중복 회수 방지 (멱등성)

6. 파트너 프로모션 (PartnerPromotion)​

6-1. 구조​

필드설명
code숏코드 (unique, 예: SxR3OndzSDJM)
partner_name파트너 이름
promo_code연결된 프로모 코드 (FK, 선택적)
landing_page파트너 전용 랜딩 페이지 URL
custom_message파트너 전용 메시지
custom_image_url파트너 로고/이미지 URL
total_clicks총 클릭 수
total_conversions총 전환 수
total_views총 조회 수
conversion_rate전환율 (%) = (conversions / clicks) * 100

6-2. Web Redirect​

  • URL: /r/<code>/
  • 파트너 숏코드를 통해 앱 다운로드 또는 프로모션 랜딩 페이지로 리다이렉트합니다.

7. 초대 링크 및 공유​

7-1. 초대 링크 구조​

  • URL: /invite/<code>/
  • 래퍼럴 코드를 포함한 초대 링크를 통해 앱 딥링크로 연결됩니다.
  • 공유 URL: https://penta.pics/invite/<code>

7-2. 공유 문구​

공유 문구에는 추천인 코드 텍스트를 포함하여, 딥링크를 통하지 않더라도 수동 입력이 가능하도록 합니다.

디즈니 그림책 앱 '펜타'에서 1주 무료 구독 받아보세요!
추천인 코드: {CODE}
👇 아래 링크로 가입하면 혜택이 자동 적용돼요
https://penta.pics/invite/{CODE}
  • 번역 키 기반으로 구현 (한/영/일 + 추후 언어 확장 가능)
  • 기존 promo_free_trial 번역 키 업데이트

7-3. 딥링크 패턴​

패턴예시설명
HTTPS 초대https://penta.pics/invite/{code}웹 리다이렉트 → 앱 딥링크
HTTPS 프로모https://penta.pics/promo?code={code}프로모코드 딥링크
커스텀 스킴penta://promo?code={code}앱 직접 호출
Install ReferrerPlay Store referrer 파라미터Android QR → 설치 → 열기 플로우

7-4. 초대 링크 API​

EndpointMethod설명
/api/promocodes/invite/<code>/info/GET초대 링크 정보 조회
/invite/<code>/GET (Web)앱 딥링크 리다이렉트

8. 클릭 추적 (PromoCodeClick)​

프로모션 링크 클릭을 추적합니다.

필드설명
ip_address클릭 IP 주소
user_agent브라우저 User-Agent
referer리퍼러 URL
utm_sourceUTM 소스
utm_mediumUTM 매체
utm_campaignUTM 캠페인
utm_termUTM 키워드
utm_contentUTM 콘텐츠
device_type기기 유형 (mobile / tablet / desktop)
os운영체제
browser브라우저
converted전환 여부
converted_at전환 시각

9. 프로모코드 사용 기록 (PromoCodeUsage)​

필드설명
user사용자
promo_code사용한 프로모 코드
subscription연결된 구독
used_at사용 시각
ip_addressIP 주소
user_agentUser-Agent
applied_bonus_weeks적용된 보너스 주 수
  • 고유 제약: user + promo_code 조합 (사용자당 동일 코드 1회 사용)

10. 파트너 분석 (Analytics)​

  • Endpoint: GET /api/promocodes/analytics/<partner_code>/
  • 관리자 전용
  • 파트너별 클릭 수, 전환 수, 조회 수, 전환율 등의 분석 데이터를 제공합니다.