App Store 환불: 개발자에게 보이는 것과 대응 방법
글: Mehdi Azizi
게시, 8분
App Store 환불은 Apple이 단독으로 결정해요. 개발자는 CONSUMPTION_REQUEST를 받고 12시간 안에 응답할 수 있으며, 결정은 REFUND 알림으로 알게 돼요.
App Store에서는 환불을 승인하거나 거절하는 쪽은 언제나 Apple이고, 개발자는 아니에요. 고객은 Apple 사이트나 여러분의 앱에서 환불을 요청해요. Apple 서버 알림을 연결해 두었다면 요청 시점에 CONSUMPTION_REQUEST 알림을 받고, 결정이 나면 REFUND 또는 REFUND_DECLINED를 받아요. 그 사이 12시간 동안 소비 데이터와 여러분의 선호를 보낼 수 있어요. 단, 고객이 동의했을 때만요.
환불이 승인되면 해당 구매는 고객의 활성 권한에서 빠지고, 판매 보고서에는 마이너스로 표시돼요. 이 가이드에서는 각 단계, Apple에 보낼 수 있는 정보, 악용성 요청에 대해 할 수 있는 일을 자세히 설명해요. 규칙은 2026년 11월 3일에 다시 확인한 Apple 문서를 기준으로 했어요. 실제 사례는 제가 10월에 제 앱들에 연결한 알림에서 나온 거예요.
App Store 환불은 누가 결정하나요?
Apple, 오직 Apple만 결정해요. Apple 지원 페이지에 고객이 거치는 과정이 나와 있어요. reportaproblem.apple.com에 로그인하고, "Request a refund"를 선택하고, 사유를 고른 다음 해당 구매를 선택해요. Apple은 답변까지 24~48시간 기다리라고 안내해요.
고객은 여러분의 앱 안에서도 환불을 요청할 수 있어요. StoreKit이 이를 위한 요청 시트를 iOS 15부터 제공해요. Apple은 계정 설정이나 도움말 메뉴에서 호출하라고 권장해요. 시트에는 구매 항목과 사유 목록이 표시되고, Apple이 결정하는 데 최대 48시간이 걸려요.
어느 경우든 여러분이 승인할 것은 없어요. 정보와 선호를 전달할 수 있을 뿐이고, 이는 Apple이 판단할 때 고려하는 여러 기준 중 하나예요.
단계별로 각자 보는 것
| 단계 | 고객 쪽 | 개발자 쪽 |
|---|---|---|
| 요청 | Apple 양식 또는 앱 내 시트 | CONSUMPTION_REQUEST 알림 |
| 12시간 이내 | 대기 | 소비 데이터 전송 가능 |
| 48시간 이내 | Apple의 답변 | REFUND 또는 REFUND_DECLINED 알림 |
| 승인 후 | 결제 수단으로 금액 반환 | 활성 권한에서 구매 제거, 마이너스 판매 단위 |
| 이의 제기 후 | Apple이 환불을 취소 | REFUND_REVERSED 알림, 접근 권한 복구 필요 |
App Store Connect는 이미 승인된 환불만 Sales and Trends에서 보여줘요. 요청 자체는 서버 알림으로만 전달돼요. 알림이 없으면 환불을 뒤늦게 알게 돼요.
환불 관련 서버 알림
App Store Server Notifications V2에는 여기서 쓸모 있는 유형이 다섯 가지 있어요. App Store Connect에 등록한 HTTPS 주소로 받는데, 프로덕션용과 샌드박스용이 각각 하나씩 있어요.
| 알림 | 알려 주는 내용 | 해야 할 일 |
|---|---|---|
CONSUMPTION_REQUEST | 고객이 환불을 요청함 | 동의가 있으면 12시간 안에 응답 |
REFUND | Apple이 거래를 환불함 | 환불된 콘텐츠나 접근 권한 회수 |
REFUND_DECLINED | Apple이 요청을 거절함 | 없음, 접근 유지 |
REFUND_REVERSED | 고객의 이의 제기 후 Apple이 환불을 취소함 | 회수했던 것을 복구 |
REVOKE | 가족 공유로 공유된 구매를 더 이상 쓸 수 없음 | 가족 구성원의 접근 권한 회수 |
서버는 200~206 사이의 HTTP 코드로 응답해야 해요. 알림 응답 페이지에 따르면, 그렇지 않으면 Apple이 이전 시도로부터 1, 12, 24, 48, 72시간 후에 총 다섯 번 재시도해요. 샌드박스에서는 한 번만 보내요.
Consumption API: Apple에 전달할 수 있는 것
요청이 오면 Send Consumption Information으로 응답할 수 있어요. 규칙은 Apple의 문장 하나로 요약돼요. "Respond within 12 hours of receiving the CONSUMPTION_REQUEST notification." API 버전 2는 구독을 포함한 모든 상품 유형에 적용돼요.
요청의 필드는 다음과 같아요.
| 필드 | 필수 | Apple에 알려 주는 내용 |
|---|---|---|
customerConsented | 예 | 고객이 데이터 공유에 동의함 |
deliveryStatus | 예 | 구매가 전달되어 작동하는지, 아니라면 그 이유 |
sampleContentProvided | 예 | 구매 전에 체험, 미리보기 또는 설명이 제공되었는지 |
consumptionPercentage | 아니요 | 소비한 비율, 0 |
refundPreference | 아니요 | 여러분의 선호: DECLINE, GRANT_FULL 또는 GRANT_PRORATED |
중요한 점이 두 가지 있어요. deliveryStatus가 DELIVERED가 아니면 소비 비율은 0이어야 해요. 그리고 구독을 비례 환불할 때는 소비 비율을 생략해요. Apple이 직접 계산해요.
모든 것의 전제는 동의예요. Apple은 이렇게 써요. "You must obtain valid consent from the customer before sharing their personal data with Apple in the Send Consumption Information API." 동의가 없으면 응답하지 않아요. Apple은 광고 추적 창으로 이 동의를 받는 것도 금지해요. "Don't use the AppTrackingTransparency prompt to obtain consent".
RevenueCat을 쓴다면
RevenueCat을 쓰면 Apple 알림을 받고 요청에 응답하는 건 RevenueCat이에요. Refund Control 기능으로요. 정책은 네 가지 중 하나를 골라요. 전액 환불 선호, 거절 선호, 소비 데이터만 전송, 응답하지 않음.
데이터 공유를 켜는 건 고객 동의를 받았다고 확인하는 것과 같아요. RevenueCat도 직접 이렇게 말해요. "Enabling consumption data sharing confirms that you obtained consent from your Customers." 또 "Prefer no refund"는 특정 그룹에만 쓰라고 권하고, 이 선호가 고객 대부분에게 적용되면 경고를 띄워요.
알림을 여러분 서버에서도 받고 싶다면, RevenueCat 앱 설정에 "Apple Server Notification Forwarding URL" 필드가 있어요. Apple 알림에 관한 RevenueCat 페이지에 설명되어 있어요. 저도 이걸 써요. RevenueCat으로 구독을 구성하는 방법은 RevenueCat과 iOS 인앱 구독에 있어요.
수익과 구독에 미치는 영향
접근 권한. currentEntitlements 문서에 따르면 "Products that the App Store has refunded or revoked don't appear in the current entitlements". 앱이 currentEntitlements로 권한을 확인한다면 환불된 접근은 저절로 사라져요. 거래에는 회수 날짜와 사유가 revocationDate와 revocationReason에 담겨요.
보고서. 판매 보고서 도움말에 따르면 환불은 판매 단위와 고객 가격이 마이너스로 표시돼요. 구독의 경우 구독 데이터 페이지가 전액 환불과 부분 환불을 이벤트로 집계하고, 일일 판매 단위에서 빼요.
평판. 가이드라인 5.6.4는 과도한 환불 요청을 품질 부족의 신호 중 하나로 꼽아요. 높은 환불률은 단순한 금전 손실이 아니에요. Apple이 행동 강령 준수 여부를 판단할 때 고려할 수 있어요.
제 사례: 제 앱들에 연결한 알림
2026년 10월 12일, 제 앱들에 알림을 연결했어요. RevenueCat이 Apple 알림을 devoria.fr의 한 경로로 전달해요. 이 경로는 Apple 서명을 검증한 다음, 금액 없이 저에게 알림을 보내요. 결과만이 아니라 요청이 들어오는 순간을 보고 싶었거든요.
10월 18일, 제 트레이딩 시뮬레이터 TradaZen에 첫 실제 요청이 들어왔어요. 7일 무료 체험이 끝날 때 결제된 연간 구독이었어요. 표시된 사유는 실수로 한 구매였어요. 배운 점은 세 가지예요.
- 같은 요청이 여러 번 올 수 있어요. 같은 날 저녁에 똑같은 알림을 세 번 받았어요. 그 뒤로는 알림 유형과 거래 ID 기준으로 모든 알림의 중복을 제거해요.
- 결정은 하루도 안 돼서 나왔어요. Apple은 요청 후 약 22시간 만에 거절했어요. 고객은 접근 권한을 유지했어요.
- 거절이 끝은 아니에요. 같은 고객이 이틀 뒤 같은 거래로 다시 요청했어요.
체험 종료 시점의 "실수로 한 구매" 요청은 Apple에 보내는 응답으로 이길 수 있는 게 아니에요. 첫 결제 전에 페이월에서 막아야 해요.
규칙을 어기지 않고 악용성 요청 줄이기
허용되는 것:
- 고객이 동의했다면 모든 요청에 정확한 데이터로 응답하기.
- 선별적인 선호 표시하기. 예를 들어 모두에게 거절을 보내는 대신, 이미 소비된 구매에만 거절을 표시하는 식이에요.
- 각
REFUND를 고객 계정과 연결하기. 환불 알림에 관한 Apple 페이지가 반복 환불을 찾아내기 위해 이를 권장해요. - 구매 전에 무엇을 사는지 명확히 알리기. 가이드라인 3.1.2(c)는 구독을 제안하기 전에 사용자가 그 가격에 무엇을 얻는지 설명하라고 요구해요.
금지되는 것:
- 거짓 데이터 보내기. 요청을 거절시키려고, 또는 동의 없이 응답하는 것.
- 광고 추적 창으로 동의 받기. Apple이 명시적으로 금지해요.
- 구매 함정 만들기. 가이드라인 5.6은 고객을 원치 않는 구매로 유도하거나 전달되지 않은 것에 요금을 청구하는 것을 금지해요.
- 환불을 요청한 고객에게 압박 주기. 같은 규칙이 고객 서비스에서 위협 없이 존중할 것을 요구해요.
가장 좋은 수단은 여전히 앞단에 있어요. 가격, 첫 결제일, 해지 방법을 알려 주는 페이월이에요. 피해야 할 실수는 페이월 실수에, 체험 규칙은 App Store 무료 체험에 정리했어요.
프로덕션 전에 테스트하기
요청 테스트 페이지에 따르면 샌드박스와 Xcode의 StoreKit 테스트에서 환불 요청을 할 수 있어요. 샌드박스에서는 어떤 사유든 자동 승인돼요. 거절을 시뮬레이션하려면 "Other"를 고르고 DECLINE을 입력하세요. 비례 환불은 GRANT_PRORATED를 입력하면 돼요. 샌드박스에서는 소비 응답을 5분 안에 보내야 해요.
환불이 덜 나오는 구독
iOS & Android Kit는 제 앱들의 코드에서 출발해요. 온보딩, 페이월, 구독이 이미 구현되어 있고, 네 단계를 따라 여러분의 속도로 App Store까지 가요. 전체 구성은 iOS 인앱 구독 페이지에, 구독에 관한 Apple 규칙은 가이드라인 3.1.2에 자세히 나와 있어요.
페이월을 출시하기 전에 무료 진단을 받아 보세요. 프로젝트를 실제로 막고 있는 게 무엇인지 알려 주고, 제 Apple 리젝 방지 체크리스트도 보내 드려요.
자주 묻는 질문
개발자가 App Store 환불을 거절할 수 있나요?
아니요. Apple이 단독으로 결정해요. 소비 데이터와 선호(예: DECLINE)를 보낼 수 있고, 이는 여러 기준 중 하나로 고려돼요. 최종 결정은 Apple이 해요.
개발자는 환불 요청을 통보받나요?
네, App Store Server Notifications V2를 연결해 두었다면요. Apple은 요청 시점에 CONSUMPTION_REQUEST를, 결정 시점에 REFUND 또는 REFUND_DECLINED를 보내요. 알림이 없으면 보고서에서 승인된 환불만 보게 돼요.
Apple이 환불 요청을 처리하는 데 얼마나 걸리나요?
Apple은 고객에게 24~48시간이라고 안내해요. StoreKit 문서에는 최대 48시간이라고 나와 있어요. 여러분 쪽에서는 소비 데이터를 보낼 시간이 12시간이에요.
환불 후 접근 권한은 어떻게 되나요?
환불된 구매는 고객의 활성 권한에서 빠져요. StoreKit 2가 더 이상 currentEntitlements에 반환하지 않아요. 이후 Apple이 환불을 취소하면 REFUND_REVERSED를 받고, 접근 권한을 복구해야 해요.
Apple에 응답하려면 고객 동의가 필요한가요?
네. Apple은 Consumption API로 데이터를 공유하기 전에 유효한 동의를 요구해요. 동의가 없으면 알림에 응답하지 않아요. 광고 추적 창으로는 동의를 받을 수 없어요.
환불이 제 앱에 불리하게 작용하나요?
그럴 수 있어요. 가이드라인 5.6.4는 과도한 환불 요청을 품질 부족의 신호 중 하나로 꼽고, Apple은 이를 행동 강령 준수 여부를 판단할 때 고려할 수 있어요.

