2026-08-10
쿠폰·프로모션 코드, 정기결제에서 어떻게 설계해야 할까
일회성 결제의 쿠폰은 단순합니다. 총액에서 할인만 적용하면 끝입니다. 하지만 정기결제에서는 "이 할인이 몇 번 결제 주기 동안 유지되는가"라는 시간 축이 하나 더 생기면서 설계가 복잡해집니다.
할인의 세 가지 유형
정기결제용 프로모션은 크게 세 방식으로 나뉩니다.
- 1회성 할인: 첫 결제에만 적용, 이후 정가로 복귀 (예: 첫 달 50% 할인)
- 기간 한정 할인: N번의 결제 주기 동안 유지 (예: 3개월간 20% 할인)
- 영구 할인: 구독이 유지되는 동안 계속 적용 (예: 얼리버드 30% 영구 할인)
이 세 유형을 하나의 데이터 모델로 표현하려면 duration_type(once/repeating/forever)과 duration_in_cycles(repeating일 때만 사용) 두 필드로 충분합니다. 무리하게 유연한 규칙 엔진을 만들기보다, 실제로 필요한 세 가지 유형만 명시적으로 지원하는 편이 유지보수 관점에서 낫습니다.
쿠폰 적용 시점과 갱신 결제의 관계
기간 한정 할인이 "3개월"이라면, 그 기준은 달력 날짜가 아니라 결제 성공 횟수여야 합니다. 결제가 실패해서 던닝 재시도가 도는 동안에는 할인 적용 기간이 소모되지 않아야, 결제 실패로 인한 지연이 고객에게 불리하게 작용하지 않습니다.
쿠폰.남은적용횟수 -= 1 // 결제가 "성공"했을 때만 차감쿠폰과 요금제 변경이 만나면
업그레이드/다운그레이드가 쿠폰과 함께 발생하면 처리가 까다로워집니다. 실무적으로 가장 무난한 규칙은 "쿠폰은 가입 시점의 요금제에 귀속되지 않고 구독 자체에 귀속되며, 할인율(%)은 요금제가 바뀌어도 유지하되 정액 할인(원)은 요금제 변경 시 재계산한다"입니다. 정액 할인을 요금제 변경 후에도 그대로 유지하면, 저가 요금제로 다운그레이드했을 때 할인액이 요금 자체보다 커지는 경우가 생길 수 있기 때문입니다.
중복 사용 방지
쿠폰 코드는 발급 개수 제한(max_redemptions)과 고객당 1회 제한을 함께 걸어야 남용을 막을 수 있습니다. 특히 이메일 재가입으로 같은 쿠폰을 반복 사용하는 패턴이 흔하므로, 결제수단(카드 지문 등) 기준으로도 재사용 여부를 판단하는 것이 안전합니다.
프로모션 설계는 요금제 설계와 맞닿아 있습니다. 요금제 자체를 어떻게 안전하게 변경·폐기할지는 요금제, 삭제 대신 "판매 중단" 해야 하는 이유에서, 업그레이드 시 비례 정산은 구독 업그레이드/다운그레이드, 비례 정산(Proration)은 언제 필요할까에서 다룹니다. 전체 그림은 구독결제 연동 완전 가이드를 참고하세요.