Google Play 구독 부가 상품 환불은 항목별로 할 수 있지만, 사용자는 번들 전체만 취소할 수 있습니다
Google Play에서는 기본 구독 하나에 최대 49개의 부가 상품을 하나의 구매 토큰으로 묶을 수 있습니다. 구독 부가 상품 환불이 어떻게 작동하는지, 나머지는 건드리지 않고 한 항목만 환불하는 API 호출은 무엇인지, Google이 이를 막는 경우는 언제인지, 그리고 환불 방식별로 어떤 비용이 드는지 정리했습니다.

핵심 요약
- Google Play의 부가 상품 포함 구독 기능은 기본 구독 하나와 최대 49개의 부가 상품, 즉 총 50개 항목을 하나의 구매로 묶습니다. 모든 항목은 같은 반복 결제 주기를 사용해야 합니다.
- Google Play 사용자는 Play 구독 센터에서 부가 상품 하나만 취소할 수 없습니다. 기본 구독과 부가 상품을 함께 취소하는 것만 가능하므로, 부가 상품 하나를 제거하는 기능은 개발자의 앱 안에서 제공해야 합니다.
- purchases.subscriptionsv2.revoke 메서드는 productId 하나를 지정한 itemBasedRefund를 받습니다. 다른 항목이 활성 상태로 남아 있으면 Google은 해당 항목만 취소하고 전액 환불하며, 구독은 계속 유지됩니다.
- 구독이 결제 거부 상태일 때, 항목이 만료되었거나 소유하지 않은 항목일 때, 그리고 선불 구독일 때 Google은 항목 단위 환불을 막습니다.
- 부가 상품이 포함된 구독에 proratedRefund를 사용하면 모든 항목의 최신 주문이 다음 갱신까지 남은 기간에 비례해 환불되고, 모든 항목의 이용 권한이 한꺼번에 취소됩니다.
- 부가 상품 포함 구독의 실시간 개발자 알림에는 subscriptionId가 없습니다. 따라서 백엔드는 purchases.subscriptionsv2.get을 호출하고 각 lineItem을 읽어 어떤 항목이 아직 이용 가능한지 확인해야 합니다.
- Google Play에서 개발자에게 증거를 요구하는 환불 절차는 orders.reviewrefund를 통해 검토 대상으로 표시된 지불 거절(차지백) 하나뿐이며, 기한은 24시간입니다. 2026년 8월 3일 이후의 주문에서 차지백에 패소하면, 개발자는 구매 가격에서 Play 서비스 수수료를 뺀 금액과 은행 수수료를 부담합니다.
Google Play에서 부가 상품 세 개가 붙은 기본 구독을 판매한다면, 나머지는 취소하지 않고 그중 어떤 부가 상품 하나만 환불할 수 있습니다. 하지만 사용자는 같은 일을 할 수 없습니다. Google은 사용자에게 번들 전체의 취소만 허용하므로, Google Play 구독 부가 상품 환불을 정밀하게 다루는 도구는 개발자인 여러분에게 있고, 그것도 API를 통해서만 쓸 수 있습니다. 잘 쓰면 문제가 된 항목만 환불합니다. 잘못 호출하면 전부 환불하거나 전부 취소하게 됩니다.
부가 상품 포함 구독의 구조
Google은 I/O 2025에서 구독용 다중 상품 결제를 발표했습니다. 하나의 구매 흐름에서 기본 구독과 선택형 부가 상품을 함께 판매하고, 같은 일정으로 묶어서 청구합니다. Google 개발자 가이드에는 명확한 제한이 있습니다.
- 자동 갱신 기본 요금제에만 부가 상품을 붙일 수 있습니다. 선불 요금제는 안 됩니다.
- 모든 항목은 같은 반복 결제 주기를 사용해야 합니다. 연간 기본 구독에 월간 부가 상품을 붙일 수 없습니다.
- 구매 하나에는 최대 50개 항목, 즉 기본 구독 하나와 최대 49개의 부가 상품이 들어갑니다.
- 이 기능은 대한민국에서 제공되지 않습니다.
이 모든 것이 하나의 구매 토큰에 들어 있습니다. purchases.subscriptionsv2.get을 호출하면 응답에 lineItems 목록이 있고, 항목마다 하나의 엔트리가 있습니다. 각 line item에는 고유한 productId, expiryTime, latestSuccessfulOrderId가 있습니다. 바로 이 마지막 필드 덕분에 항목별 환불이 가능합니다. 각 항목이 자신만의 최신 주문을 가지기 때문입니다.
비례 정산은 첫날부터 시작됩니다
사용자가 결제 주기 중간에 부가 상품을 추가하면, Google은 부가 상품이 기본 구독과 같은 날짜에 갱신되도록 비례 정산 금액을 즉시 청구합니다. Google의 예시를 보면, 7일 체험 후 8월 15일에 추가한 $10 월간 부가 상품에 8월의 남은 기간에 대해 $2.90가 청구됩니다. 따라서 부가 상품 하나에도 첫 정규 주문 전에 기간이 짧고 금액이 애매한 첫 주문이 있을 수 있습니다. 환불이 어느 주문에 적용될지 확인할 때 이 점을 기억하세요.
사용자는 번들 전체만 취소할 수 있습니다
Google의 사용자용 도움말 페이지는 이 점을 분명히 밝힙니다. 사용자는 기본 구독과 부가 상품을 함께만 취소할 수 있으며, 현재 Google Play에서 개별 부가 상품을 취소할 수 없습니다. 일시중지도 지원되지 않습니다. 사용자가 가격 인상을 거부하면 Google은 기본 구독과 모든 부가 상품을 함께 취소합니다.
그래서 부가 상품 하나만 그만두고 싶은 사용자에게 Play Store에는 두 가지 선택지만 남습니다. 전부 취소하거나, 환불을 요청하는 것입니다. 둘 다 여러분에게 좋지 않습니다. Google 가이드에 따르면 대신 앱에서 제거 기능을 제공할 수 있습니다. 제거된 부가 상품은 현재 결제 주기가 끝날 때 만료되고, 번들의 나머지는 계속 갱신됩니다.
Google Play 구독 부가 상품 환불 도구 비교
부가 상품이 포함된 구독에서 돈을 돌려주는 방법으로 Google은 다섯 가지를 제공합니다. 무엇을 환불하는지, 그리고 이용 권한이 종료되는지가 서로 다릅니다.
| 도구 | 환불되는 대상 | 이용 권한의 변화 |
|---|---|---|
| Play Console에서 특정 주문 환불 | 해당 주문에서 직접 정한 금액 | 아무것도 취소되지 않음 |
| orders.refund, revoke 미설정 | 주문 하나의 전액 | 아무것도 취소되지 않음 |
| subscriptionsv2.revoke와 itemBasedRefund | 한 항목의 최신 청구 전액 | 해당 항목만 종료됨. 단, 마지막 활성 항목이었다면 예외 |
| subscriptionsv2.revoke와 proratedRefund | 각 항목의 최신 주문을 남은 기간에 비례해 환불 | 모든 항목이 즉시 종료됨 |
| subscriptionsv2.revoke와 fullRefund | 각 항목의 최신 청구 전액 | 모든 항목이 즉시 종료됨 |
Google은 부가 상품 가이드에서 한 가지를 강하게 경고합니다. 부가 상품이 포함된 구독에는 지원 중단된 purchases.subscriptions.refund를 호출하지 마세요. 또한 orders.refund는 3년이 지난 주문에는 사용할 수 없습니다.
itemBasedRefund의 동작 방식
itemBasedRefund 객체에는 필수 필드가 productId 하나뿐이며, 취소할 항목을 지정합니다. Google은 두 가지 결과를 설명합니다.
- 다른 항목이 아직 활성 상태인 경우: 지정한 항목만 취소되고 전액 환불되며, 구독은 계속됩니다.
- 다른 활성 항목이 없는 경우: 해당 항목이 취소되고 전액 환불되며, 구독 전체가 취소됩니다.
요청 하나에 항목 하나만 지정할 수 있습니다. 부가 상품 두 개를 환불하려면 두 번 호출하세요.
Google이 항목 단위 환불을 막는 경우
Google은 세 가지 경우에 itemBasedRefund를 거부합니다. 구독이 어떤 형태로든 결제 거부 상태에 있을 때로, 유예 기간과 계정 보류가 모두 포함됩니다. 지정한 항목을 소유하지 않았거나 이미 만료되었을 때입니다. 또는 구매가 선불 구독일 때로, 선불 구독에서는 항목 단위 해지가 아예 지원되지 않습니다.
주문 ID로 환불하면 일어나는 일
Google 가이드에 따르면 orders.refund의 revoke 플래그는 해당 주문이 구독의 최신 주문일 때만 이용 권한을 종료합니다. 이전 주문이라면 환불은 성공하지만 아무것도 취소되지 않습니다. Play Console도 똑같이 동작합니다. 가장 최근 주문을 환불하면 구독이 삭제되고, 이전 주문을 환불하면 구독은 계속 활성 상태로 남습니다. 부가 상품이 있다면 올바른 line item의 latestSuccessfulOrderId에서 주문을 고르세요. 그렇지 않으면 의도와 다른 청구를 환불할 수 있습니다.
환불은 누가 결정하고, 언제 증거를 요구받는가
부가 상품이 포함된 구독의 환불 대부분은 다른 Play 구독과 마찬가지로 여러분 없이 결정됩니다. 구매 후 48시간 이내라면 사용자는 문제 신고를 통해 Google에 요청할 수 있고, Google이 결정합니다. 그 이후에는 Google이 사용자를 여러분에게 안내합니다. 그리고 새 구독 구매를 3일 이내에 확인(acknowledge)하지 않으면 Google이 자동으로 사용자에게 환불하고 구매를 취소합니다.
여러분의 입장을 묻는 절차는 하나뿐입니다. 카드 소지자가 차지백을 제기하고 Google이 이를 개발자 검토 대상으로 표시하면, PendingRefundReviewNotification을 받고 24시간 안에 orders.reviewrefund를 호출해 환불 선호와 사용 증거를 제출할 수 있습니다. 차지백 자체는 은행이 결정하며, 은행의 결정이 최종입니다.
서버에서 부가 상품 환불 추적하기
Google의 RTDN 레퍼런스에는 구독 번들 내 항목이 변경될 때의 SUBSCRIPTION_ITEMS_CHANGED와, 만료 전에 취소된 구독에 대한 SUBSCRIPTION_REVOKED가 나와 있습니다. Google 가이드에 따르면 subscriptionsv2.revoke를 통한 취소는 SUBSCRIPTION_REVOKED 알림과 VoidedPurchaseNotification을 모두 발생시키며, Voided Purchases API에도 기록됩니다.
문제는 subscriptionId입니다. Google은 부가 상품 포함 구독의 RTDN에서는 이 값이 제공되지 않는다고 말합니다. 그러니 어떤 항목이 바뀌었는지 알림만 믿고 판단하지 마세요. 번들에 대한 알림을 받을 때마다 다음을 수행합니다.
- purchaseToken으로 purchases.subscriptionsv2.get을 호출합니다.
- 모든 lineItem과 그 expiryTime을 읽습니다. Google은 예상한 항목만이 아니라 모든 항목의 expiryTime을 갱신해야 한다고 말합니다.
- 이용 권한은 구매 토큰 단위가 아니라 productId 단위로 부여하거나 제거합니다.
- 보완책으로 Voided Purchases API를 주기적으로 조회합니다. 지난 30일을 다룹니다.
유예 기간과 계정 보류는 번들 전체에 적용됩니다
결제 문제는 모든 항목에 동시에 영향을 줍니다. Google은 활성 항목 중 가장 짧은 유예 기간을 골라 갱신 전체에 적용합니다. 유예 기간 동안 사용자는 모든 항목을 계속 이용합니다. 계정 보류 중에는 모든 항목의 이용 권한이 정지됩니다. 결제가 끝내 복구되지 않으면 결제가 거부된 항목은 만료되고, 다른 항목은 각자의 결제 주기 남은 기간 동안 다시 이용 가능해집니다.

환불 방식별로 실제로 잃는 돈
부가 상품은 대개 여러분이 비용을 내는 무언가와 연결됩니다. 추가 클라우드 저장 공간은 스토리지 제공업체가 청구합니다. AI 크레딧 팩은 모델 API 호출로 청구됩니다. 추가 시트는 더 많은 컴퓨팅 자원을 뜻하고, 크리에이터 등급은 정산금 지급을 일으킬 수 있습니다. 이런 비용은 사용자가 부가 상품을 쓸 때 이미 발생하며, 환불은 가격만 돌려줄 뿐 그 비용은 하나도 돌려주지 않습니다.
너무 많이 환불하는 경우
비싼 실수는 불만이 부가 상품 하나에 관한 것인데 fullRefund나 proratedRefund를 쓰는 것입니다. 둘 다 모든 항목을 취소하므로 기본 구독 요금까지 돌려주게 되고, 계속 구독하려던 사용자도 잃습니다. itemBasedRefund는 해당 부가 상품의 최신 청구만 환불합니다. 이것이 막혔다면 해당 항목의 최신 주문에 orders.refund를 사용해 아무것도 종료하지 않고 돈만 돌려줄 수 있습니다.
부분 환불과 수수료
Play Console에서는 구독 주문에 부분 환불을 할 수 있으며, Google은 환불 비율이 개발자 수익과 서비스 수수료에도 똑같이 적용된다고 말합니다. 주문의 절반을 환불하면 Google 수수료의 절반도 함께 돌아옵니다. 하지만 그 부가 상품을 제공하는 데 들어간 여러분의 비용은 돌아오지 않습니다.
번들의 차지백
2026년 8월 3일 이후의 주문부터 Google은 차지백 비용을 개발자에게 넘깁니다. 차지백이 받아들여지면, 구매 가격에서 Play 서비스 수수료를 뺀 금액과 은행이 부과하는 수수료를 여러분이 부담합니다. 부가 상품이 여러 개 포함된 번들 주문은 잃을 때 금액도 더 큽니다. 난독화된 계정 ID에 연결된 부가 상품별 사용 로그가 24시간 검토에서 제출할 자료입니다.
부가 상품 환불 체크리스트
- Google Play에는 없으니, 부가 상품 하나를 제거하는 기능을 앱 안에 제공하세요.
- 알림을 받을 때마다 각 lineItem의 productId, expiryTime, latestSuccessfulOrderId를 저장하세요.
- 부가 상품 하나가 문제라면 기본적으로 itemBasedRefund를 사용하세요.
- 구독이 유예 기간이나 계정 보류 상태라면 대신 orders.refund로 해당 항목의 주문을 환불하세요.
- 번들에는 절대로 지원 중단된 purchases.subscriptions.refund를 호출하지 마세요.
- 차지백 검토 자료를 24시간 안에 보낼 수 있도록 계정별 부가 상품 사용량을 기록하세요.
- 환불률을 구독 단위뿐 아니라 부가 상품 단위로도 집계해, 성과가 나쁜 부가 상품이 기본 요금제 수치에 묻히지 않게 하세요.
자주 묻는 질문
- 사용자가 Google Play 구독에서 부가 상품 하나만 취소할 수 있나요?
- Google Play에서는 할 수 없습니다. Google 도움말 페이지에 따르면 사용자는 기본 구독과 부가 상품을 함께만 취소할 수 있습니다. 앱에서 부가 상품 하나를 제거하는 기능을 제공할 수 있으며, 제거된 부가 상품은 현재 결제 주기가 끝날 때 만료됩니다.
- 구독을 취소하지 않고 부가 상품 하나만 환불하려면 어떻게 하나요?
- 부가 상품의 productId를 지정한 itemBasedRefund와 함께 purchases.subscriptionsv2.revoke를 호출하세요. 다른 항목이 활성 상태로 남아 있으면 Google은 해당 항목만 취소하고 전액 환불합니다. revoke 플래그 없이 orders.refund로 해당 항목의 최신 주문을 환불할 수도 있으며, 이 경우 돈은 돌려주고 이용 권한은 그대로 둡니다.
- itemBasedRefund 호출이 실패한 이유는 무엇인가요?
- 구독이 결제 거부 상태일 때, 항목을 소유하지 않았거나 만료되었을 때, 그리고 선불 구독일 때 Google이 이를 막습니다. 호출 전에 line item의 expiryTime과 구독 상태를 확인하세요.
- 부가 상품이 포함된 구독에서도 비례 환불이 되나요?
- 됩니다. 다만 모든 것이 취소됩니다. Google은 각 항목의 최신 주문을 다음 갱신까지 남은 기간에 비례해 환불하고, 모든 항목의 이용 권한은 즉시 종료됩니다.
- 부가 상품이 환불되었다는 것은 어떤 RTDN으로 알 수 있나요?
- Google 가이드에 따르면 취소는 SUBSCRIPTION_REVOKED와 VoidedPurchaseNotification을 발생시키고, 번들 내 항목의 변경은 SUBSCRIPTION_ITEMS_CHANGED가 다룹니다. 번들에서는 subscriptionId가 없으므로 purchases.subscriptionsv2.get을 호출하고 각 lineItem을 읽어 무엇이 바뀌었는지 확인하세요.
출처 및 추가 자료
- Google Play Billing: Subscription with add-ons
- Google Play Help: Subscriptions with add-ons
- Google Play Developer API: purchases.subscriptionsv2.revoke
- Google Play Developer API: orders.refund
- Google Play Billing: Manage subscriptions and one-time purchases
- Play Console Help: Issue refunds and cancel orders
- Google Play Billing: Real-time developer notifications reference
- Google Play Billing: Subscription lifecycle
- Google Play Help: Request a refund on Google Play
- Google Play Developer API: orders.reviewrefund
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
App Store와 Google Play 환불 자동 처리
계속 읽기
과도한 환불 요청은 환불액보다 더 큰 손실을 부릅니다. 두 앱 스토어 모두 이를 품질 신호로 보기 때문입니다
Apple 가이드라인 5.6.4는 과도한 환불 요청을 앱이 품질 기준에 미달한다는 징후로 꼽고, Google의 개발자 배포 계약은 환불률을 근거로 신규 개발자의 앱을 삭제할 수 있게 합니다. 각 스토어가 무엇이라고 규정하는지, 삭제되면 무엇을 잃는지, 위험을 어떻게 피하는지 정리했습니다.
환불을 처리하기 전에 App Store 서버 알림을 검증하세요. 누구나 웹훅 URL로 요청을 보낼 수 있습니다
환불 알림은 서명을 확인하기 전까지는 하나의 HTTPS 요청에 불과합니다. App Store 서버 알림과 Google Play RTDN 메시지를 검증하는 방법, 각 스토어가 무엇에 서명하는지, 그리고 위조된 환불이나 잘못 거부된 환불이 어떤 비용을 초래하는지 설명합니다.