구독 업그레이드 환불은 모두 스토어의 결정이지 당신의 결정이 아니며, 그 돈은 당신의 수익에서 곧바로 빠져나갑니다
고객이 상위 등급으로 옮기면 스토어는 이전 요금제의 사용하지 않은 날짜에 대해 구독 업그레이드 환불을 발생시키고, 당신의 수익을 자동으로 줄입니다. App Store와 Google Play에서 업그레이드 환불이 어떻게 작동하는지, 그리고 Apple이 왜 그 금액을 당신의 서버로 보내지 않는지 설명합니다.

핵심 요약
- 구독 업그레이드 환불은 자동입니다. 고객이 주기 중간에 상위 등급으로 옮기면 스토어는 당신에게 묻지 않고 이전 요금제의 사용하지 않은 날짜를 크레딧하거나 환불하며, 그 돈은 당신이 이미 계상한 수익에서 나갑니다.
- App Store에서는 업그레이드가 즉시 적용되고 Apple은 원래 구독의 일할 금액을 환불합니다. 다운그레이드는 다음 갱신일까지 기다리며 아무것도 환불하지 않습니다.
- Apple은 업그레이드 환불 금액을 당신의 서버로 보내지 않습니다. 업그레이드된 거래에는 isUpgraded 플래그가 붙지만 가격 필드는 여전히 새 등급의 전액을 보여 주므로, App Store Server Notifications로 계산한 수익은 부풀려집니다.
- 일할된 업그레이드 환불이 계상되는 유일한 곳은 App Store Connect 재무 보고서입니다. Apple 직원은 이 금액을 App Store Server API, Notifications, StoreKit 어느 것으로도 얻을 수 없다고 말합니다.
- 업그레이드 시 Google Play는 카드로 돈을 돌려주지 않습니다. 사용하지 않은 시간을 크레딧하거나 가격 차액을 청구하며, 어느 쪽이 되는지는 당신이 설정한 교체 모드에 달려 있습니다. 기본값은 WITH_TIME_PRORATION입니다.
- 업그레이드 환불은 고객의 환불 요청이 아닙니다. CONSUMPTION_REQUEST도 없고 차지백 심사도 없으므로 12 hours나 24 hours의 창도 없고 다툴 대상도 없습니다. 이것은 대사하는 것이지 싸우는 것이 아닙니다.
- 교체 모드는 수익에 관한 결정입니다. WITH_TIME_PRORATION은 추가 유료 시간을 고객에게 넘기고 당신은 그것을 상위 등급의 원가로 제공하게 됩니다. 반면 CHARGE_PRORATED_PRICE는 차액을 지금 청구합니다. 따라서 기본값을 잘못 두면 업그레이드가 일어날 때마다 이익이 조금씩 새어 나갑니다.
고객이 업그레이드를 누르고, 당신의 five dollar 등급에서 ten dollar 등급으로 옮기면 당신은 더 큰 매출을 계상합니다. 바로 그 순간 스토어는 당신이 결코 보지 못하는 다른 일을 합니다. 이전 요금제에서 이미 결제한 날짜에 대해 그 고객에게 구독 업그레이드 환불을 건네고, 그 돈은 당신의 수익에서 나갑니다. 아무도 당신에게 묻지 않습니다. App Store에서는 서버가 받는 이벤트 안에서 그 금액을 찾을 수조차 없습니다.
이것은 당신이 싸울 수 있는 환불이 아닙니다. Apple의 CONSUMPTION_REQUEST도 아니고 Google Play의 차지백 심사도 아닙니다. 이것은 일할 계산이며, 두 스토어가 사람들에게 요금제를 바꾸도록 허용하는 방식 그 자체에 내장되어 있어, 구독자가 한 등급 위로 옮길 때마다 스스로 실행됩니다. 아래에서는 각 스토어에서 업그레이드 환불이 실제로 무엇인지, Apple이 왜 그 금액을 당신의 서버에서 감추는지, 그리고 잘못된 Google Play 설정이 당신에게 얼마를 치르게 하는지 설명합니다.
구독 업그레이드 환불이란 실제로 무엇인가
업그레이드 환불은 고객이 결제했지만 쓰지 않을 시간에 대해 스토어가 정산하는 것입니다. 불만, 분쟁, 당신의 환불 정책과는 아무 상관이 없습니다. 오로지 요금제 변경이라는 동작만으로 발생합니다.
이것은 일할 계산이지 고객의 불만이 아니다
구독자가 청구 기간 중간에 상위 등급으로 옮길 때, 그는 이미 그 기간이 끝날 때까지 이전 가격으로 결제해 두었습니다. 스토어는 사용하지 않은 부분에 대해 그를 보전합니다. Apple은 원래 구독의 일할 환불을 합니다. Google Play는 사용하지 않은 가치를 새 요금제로 크레딧합니다. 둘 다 당신이 응답할 수 있는 흐름을 거치지 않고, 둘 다 당신의 승인을 기다리지 않습니다.
오직 업그레이드만이 이를 촉발한다
변경의 방향이 돈의 흐름을 결정합니다. App Store에서 업그레이드는 같은 구독 그룹 안에서 더 상위로 순위가 매겨진 상품으로의 이동이며, 그 이동만이 즉시 적용되고 환불됩니다. 다운그레이드는 더 하위 순위로의 이동이며, 다음 갱신 때 적용되고 환불이 없습니다. 크로스그레이드는 같은 순위의 상품 사이의 이동이며, 그 시점은 관련된 기간의 길이에 달려 있습니다. App Store Connect에서 상품 순위를 잘못 매기면, 당신이 업그레이드라고 여기는 변경이 다른 것처럼 동작합니다.
| App Store 변경 | 적용 시점 | 돈에 무슨 일이 일어나는가 |
|---|---|---|
| 상위 등급으로 업그레이드 | 즉시 | Apple이 원래 구독의 일할 금액을 환불 |
| 하위 등급으로 다운그레이드 | 다음 갱신일 | 환불 없음, 더 낮은 가격으로 갱신 |
| 크로스그레이드, 선결제 기간 동일 | 즉시 | 새 구독 시작, 유료 서비스 계속 |
| 크로스그레이드, 기간 상이 | 다음 갱신일 | 주기 중 환불 없음 |
App Store는 왜 업그레이드 환불을 당신의 서버에서 감추는가
여기가 수익 보고를 망가뜨리는 부분입니다. Apple은 업그레이드 환불을 하지만, 얼마를 환불했는지는 당신의 서버에 결코 알려 주지 않습니다.
isUpgraded만이 유일한 신호이고, 가격은 틀렸다
새 거래는 isUpgraded가 true로 설정된 채 도착하여 요금제 변경이 일어났음을 알려 줍니다. 그 거래의 가격 필드는 Apple이 이전 등급에서 회수한 금액이 아니라 여전히 새 등급의 전체 표시 가격을 보여 줍니다. 어떤 App Store Server Notification도 환불 수치를 담지 않습니다. Apple이 개발자 포럼에서 스스로 밝힌 말로 하면, 일할 환불 금액은 App Store Server API, Notifications, StoreKit 어느 것으로도 얻을 수 없으며, 모든 재무 회계 목적의 출처는 App Store Connect 보고서입니다.
재무 보고서만이 정직한 기록이다
App Store Connect 재무 및 판매 보고서는 일할된 업그레이드 환불을 계상합니다. 바로 그 보고서가 Apple이 실제로 당신에게 지급하는 금액을 좌우하기 때문입니다. 그래서 한 번이라도 상위로 옮긴 적이 있는 구독자에 대해서는 그것이 진실의 출처가 됩니다. 회계는 보고서에서 만들고, 서버 이벤트는 수익이 아니라 이용 권한 신호로 다루십시오.

그것이 돈으로 당신에게 무엇을 치르게 하는가
업그레이드 환불은 반올림 오차가 아닙니다. 그것은 실제 수익이며, Google Play에서는 사용하지 않은 시간을 얼마나 내줄지까지 당신이 선택하게 됩니다.
환불은 당신이 이미 계상한 수익이다
당신의 9.99 월 등급에 있던 구독자가 30 day cycle의 day 20에 19.99로 업그레이드한다고 합시다. 그 달의 대략 3분의 1이 남았으므로 Apple은 원래의 9.99 중 약 3.33을 환불합니다. 당신이 매출 전체를 잃는 것은 아닙니다. 당신은 고객이 선결제했지만 쓰지 않을 부분을 돌려주는 것입니다. 중요한 것은 이 돌려줌이 자동이며 옛 매출에 얹힌다는 점입니다. 그래서 당신이 이미 센 수익은 나중에 줄어듭니다. 그것을 주기 중간에 상위로 옮기는 구독자마다 곱하면, 그것은 정산에서 발견하는 구멍이 아니라 당신이 마땅히 볼 수 있어야 하는 한 줄이 됩니다.
Google Play에서는 교체 모드가 진짜 원가 지렛대다
업그레이드 시 Google Play는 카드로 돈을 돌려주지 않습니다. 사용하지 않은 시간을 여러 방식 중 하나로 정산하며, 당신은 구매 흐름을 시작할 때 교체 모드를 전달하여 어느 쪽을 쓸지 선택합니다. 그 선택이 고객에게 유료 시간을 건넬지, 아니면 차액을 청구할지를 결정합니다. Google은 업그레이드에는 CHARGE_PRORATED_PRICE를, 다운그레이드에는 DEFERRED를 권장하지만, 라이브러리 기본값은 WITH_TIME_PRORATION입니다. 그래서 당신이 한 번도 설정하지 않은 흐름이 조용히 시간을 크레딧하고 있습니다.
| Google Play 교체 모드 | 적용 시점 | 사용하지 않은 시간에 무슨 일이 일어나는가 |
|---|---|---|
| WITH_TIME_PRORATION(기본값) | 즉시 | 새 요금제의 추가 시간으로 크레딧, 다음 청구일이 뒤로 밀림 |
| CHARGE_PRORATED_PRICE(업그레이드 전용) | 즉시 | 남은 기간의 가격 차액을 지금 청구, 청구일은 그대로 |
| WITHOUT_PRORATION | 즉시 | 지금은 아무것도 정산하지 않고, 새 가격은 다음 갱신부터 시작 |
| CHARGE_FULL_PRICE | 즉시 | 새 요금제의 전액을 지금 청구, 남은 가치는 이월되거나 일할됨 |
| DEFERRED | 다음 갱신 | 현재 요금제가 만료까지 진행된 뒤 새 요금제가 시작 |
업그레이드 환불이 장부를 놀라게 하지 않도록 하는 법
일할 계산을 끌 수는 없고, 끄고 싶지도 않을 것입니다. 바로 그것이 요금제 변경을 고객에게 공정하게 만들기 때문입니다. 당신이 할 수 있는 일은 그것을 보고, 값을 매기고, 실제로 다툴 수 있는 환불과 따로 두는 것입니다.
Apple 업그레이드를 재무 보고서와 대사하라
환불 금액은 결코 당신의 서버에 닿지 않으므로, App Store Connect 재무 및 판매 보고서가 일할된 업그레이드 환불이 나타나는 유일한 곳입니다. 구독자 수익을 매 기간 그 보고서와 대사하고, Server Notifications의 누계로 수익을 계산하지 마십시오. isUpgraded 플래그는 변경이 일어났음을 알려 줍니다. 보고서는 그것이 얼마였는지를 알려 줍니다.
Google Play 교체 모드를 의도적으로 선택하라
모든 요금제 변경에 대해 교체 모드를 의도적으로 전달하십시오. 업그레이드에서 가격 차액을 지금 걷고 싶다면 CHARGE_PRORATED_PRICE를 사용합니다. 남은 시간을 고객에게 주려는 때에만 WITH_TIME_PRORATION을 그대로 둡니다. 다운그레이드에는 DEFERRED를 사용해 기간이 끝날 때까지 현재 수익을 지킵니다. 기본값은 하나의 결정이며, 잘못된 기본값은 업그레이드가 일어날 때마다 이익을 조금씩 내줍니다.
업그레이드 환불을, 다툴 수 있는 환불과 분리하라
업그레이드 환불은 설계상 자동이며 최종적입니다. 그것은 고객이 돈을 돌려 달라고 하는 것이 아닙니다. 당신이 실제로 영향을 줄 수 있는 것은 고객이 시작한 환불입니다. 거기서 Apple은 CONSUMPTION_REQUEST를 보내 응답에 12 hours를 주고, Google Play는 orders.reviewrefund를 통해 차지백 심사를 열어 24 hours의 창을 줍니다. 그 둘이 결코 뒤섞이지 않도록 데이터에 태그를 다십시오. 하나는 당신이 대사하는 줄입니다. 다른 하나는 시간에 쫓기며 당신이 답하는 줄입니다.
요약
고객이 구독을 업그레이드하면 스토어는 그를 위해 사용하지 않은 시간을 자동으로 정산합니다. Apple은 이전 요금제의 일할 금액을 즉시 환불하고 그 수치를 결코 당신의 서버로 보내지 않으므로, App Store Connect 재무 보고서가 유일하게 정확한 기록입니다. Google Play는 당신이 설정한 교체 모드에 따라 시간을 크레딧하거나 차액을 청구하며, 기본값은 유료 시간을 고객에게 건네고 당신이 원가로 제공합니다. 그 어느 것도 CONSUMPTION_REQUEST나 차지백 심사를 거치지 않으므로 다툴 것이 없습니다. 업그레이드 환불을 대사하고, Google Play 모드를 의도적으로 설정하고, 그것을 당신이 아직 싸울 수 있는 환불과 따로 두십시오.
자주 묻는 질문
- 구독 업그레이드 환불은 내 승인을 요구하나요?
- 아니요. 구독 업그레이드 환불은 자동입니다. 고객이 주기 중간에 상위 등급으로 옮기면 스토어는 이전 요금제의 사용하지 않은 시간을 스스로 정산하며, 당신에게 요청도 없고 응답할 창도 없습니다. Apple은 원래 구독의 일할 금액을 환불하고, Google Play는 당신이 설정한 교체 모드에 따라 사용하지 않은 시간을 크레딧하거나 가격 차액을 청구합니다.
- 왜 업그레이드 후 내 App Store 수익이 지급액과 맞지 않나요?
- Apple이 업그레이드 환불 금액을 당신의 서버로 보내지 않기 때문입니다. 업그레이드된 거래는 isUpgraded가 true로 설정된 채 도착하지만 가격 필드는 여전히 새 등급의 전액을 보여 주고, 어떤 App Store Server Notification도 환불을 포함하지 않습니다. 서버 이벤트로 계산한 수익은 새 매출은 세면서 이전 요금제의 환불은 놓치므로, App Store Connect 재무 보고서와 대사하기 전까지 계속 부풀려진 채로 있습니다.
- 고객이 업그레이드할 때 Google Play는 카드로 돈을 돌려주나요?
- 아니요. Google Play는 사용하지 않은 시간을 현금 환불이 아니라 크레딧으로 다룹니다. 교체 모드에 따라, 남은 시간을 새 요금제로 크레딧하고 다음 청구일을 뒤로 미루거나, 남은 기간의 가격 차액을 청구합니다. 기본 모드는 WITH_TIME_PRORATION이며, 시간을 크레딧합니다.
- 구독 업그레이드 환불에 이의를 제기할 수 있나요?
- 아니요. 업그레이드 환불은 고객의 환불 요청이 아닙니다. Apple의 CONSUMPTION_REQUEST도 없고 Google Play의 차지백 심사도 없으므로 12 hours나 24 hours의 창도 없고 보낼 것도 없습니다. 업그레이드 환불은 대사하는 것입니다. 당신이 이의를 제기하는 것은 고객이 시작한 환불과 차지백뿐입니다.
- 다운그레이드는 고객에게 환불을 주나요?
- 아니요. App Store에서 다운그레이드는 다음 갱신일에 적용되고 아무것도 환불하지 않습니다. 고객이 유료 기간이 끝날 때까지 더 높은 수준을 유지하기 때문입니다. Google Play에서 다운그레이드를 처리하는 권장 방법은 DEFERRED 교체 모드로, 현재 요금제를 만료까지 유지한 뒤 더 낮은 요금제를 시작합니다.
- 업그레이드에는 어떤 Google Play 교체 모드를 써야 하나요?
- Google은 업그레이드에 CHARGE_PRORATED_PRICE를 권장합니다. 이는 남은 기간의 가격 차액을 즉시 청구하고 청구일을 그대로 둡니다. 기본값인 WITH_TIME_PRORATION은 대신 사용하지 않은 시간을 상위 등급의 추가 서비스로 크레딧하므로, 그 시간을 내줄 의도가 있을 때에만 사용하십시오.
출처 및 추가 자료
- Apple Developer: Auto-renewable subscriptions (upgrade, downgrade, and crossgrade behavior and prorated refunds)
- Apple Developer Forums: Retrieving the prorated refund amount after an upgrade (Apple staff on isUpgraded, the price field, and financial reports as the source)
- Android Developers: BillingFlowParams.SubscriptionUpdateParams.ReplacementMode (all replacement mode constants)
- Android Developers: About subscriptions (proration, default replacement mode, upgrade and downgrade recommendations)
- Google Play Developer API: Method orders.reviewrefund (chargeback review, 24 hours)
- Apple Developer: Send Consumption Information (CONSUMPTION_REQUEST response window)
RefundHalt
App Store와 Google Play 환불 자동 처리
계속 읽기
아이가 저지른 무단 인앱 결제는 거의 매번 부모에게 환불되고, 그 비용은 개발자가 떠안습니다
아이가 부모의 휴대폰에서 코인 팩을 구매하면 Apple과 Google 모두 그것을 환불하며, 어느 쪽도 먼저 개발자에게 묻지 않습니다. 규제 당국이 그렇게 만들도록 했기 때문입니다. 이러한 무단 인앱 결제 환불이 각 스토어에서 어떻게 처리되는지, 돈이 오가는 15분의 창, 그리고 실제로 얼마의 손실이 되는지 설명합니다.
앱 환불 세금은 애초에 당신의 것이 아니었으므로, 환불로 잃는 것은 영수증의 총액이 아니라 당신의 몫입니다
앱 내 구매를 환불하면 영수증에는 가격과 세금이 함께 돌아가는 것으로 표시됩니다. 그 세금은 애초에 당신의 돈이 아니었습니다. Apple 과 Google 이 merchant of record 로서 이를 징수하고 납부하며, 환불 시 당신의 몫에는 손대지 않고 되돌립니다. 환불이 실제로 얼마의 비용인지, 그리고 세금이 당신의 것이 되는 유일한 설정을 설명합니다.