이런 상황을 떠올려 보세요. 고객이 연간 요금제를 구매해 일주일간 사용한 뒤 Apple에 환불을 요청합니다. 당신은 정산 금액이 줄어든 것을 보고서야 이 사실을 알게 됩니다. 아무도 당신에게 묻지 않았습니다. 적어도 그렇게 보입니다.
사실 Apple은 종종 묻습니다. Apple은 당신의 서버로 CONSUMPTION_REQUEST라는 메시지를 보내며, 고객이 구매한 상품을 실제로 어떻게 사용했는지 알고 싶어 합니다. 서버가 이 메시지를 수신하지 않으면 Apple은 당신 없이 결정을 내립니다. 이 가이드는 개발자를 위한 App Store 환불 절차를 단계별로 살펴보고, 사람들이 막히기 쉬운 지점을 짚어봅니다. iOS에서의 환불 대응을 더 폭넓게 알아보려면, RefundSensor의 App Store 환불 대응 페이지에서도 다루고 있습니다.
빠른 답변
CONSUMPTION_REQUEST 알림은 고객이 환불을 요청할 때 Apple이 사용 내역 정보를 요청하는 방식입니다. 고객이 데이터 공유에 동의했다면, 서버는 12시간 이내에 Send Consumption Information API를 호출해 전달 여부와 사용 내역을 보고해야 합니다. Apple은 그 정보를 참고해 최종 결정을 내립니다. 당신이 환불을 승인하거나 결과를 보장할 수는 없습니다.
Apple CONSUMPTION_REQUEST란 무엇인가요?
CONSUMPTION_REQUEST는 App Store Server Notifications V2의 알림 유형 중 하나입니다. Apple은 고객이 환불 요청을 시작할 때마다 이 알림을 보내며, 소모성 상품, 비소모성 상품, 자동 갱신되지 않는 구독, 자동 갱신 구독 등 모든 제품 유형을 대상으로 합니다.
이것을 명령이 아니라 질문이라고 생각하세요. Apple이 누군가에게 환불하라고 지시하는 것이 아닙니다. 당신이 알고 있는 정보를 묻는 것입니다. 최종 결정은 여전히 Apple이 내리며, 당신의 답변은 Apple이 참고하는 여러 요소 중 하나일 뿐입니다.
Apple 환불 워크플로는 어떻게 작동하나요
여기에는 두 가지 일이 일어나며, 사람들은 이 둘을 혼동하곤 합니다. 알림을 받는 것은 자동으로 이루어집니다. 사용 정보를 다시 보내는 것은 서버가 직접 처리해야만 이루어집니다.
고객이 Apple에 환불을 요청합니다.
Apple이 당신의 V2 알림 URL로 CONSUMPTION_REQUEST를 전송합니다.
서버는 해당 고객이 사용 데이터 공유에 동의했는지 확인합니다.
동의했다면, 서버는 12시간 이내에 사용 내역 정보를 전송합니다.
Apple이 결정을 내립니다. 환불이 승인되면 REFUND 알림이 뒤따릅니다.
단계별 구현 가이드
처음부터 끝까지의 설정 과정은 다음과 같습니다.
알림 URL을 추가하세요. App Store Connect에서 서버의 HTTPS URL을 입력하고 Version 2를 선택합니다.
빠르게 응답하세요. 200에서 206 사이의 상태 코드로 응답합니다. 40x나 50x를 반환하면 Apple이 재시도합니다.
서명을 확인하세요. V2 페이로드에는 서명이 포함되어 있습니다. 내부 내용을 읽기 전에 먼저 검증하세요.
고객을 찾으세요. 트랜잭션을 자체 데이터베이스의 사용자와 매칭합니다.
동의 여부를 확인하세요. 동의가 없으면 응답하지 않습니다.
API를 호출하세요. App Store Connect에서 발급한 In-App Purchase 키로 인증한 App Store Server API 요청을 통해 데이터를 전송합니다.
기록을 남기세요. 무엇을, 언제 보냈는지 기록을 보관합니다.
개발자가 Apple 환불 요청에 응답하는 방법
항상 동의 여부부터 확인하세요. 그 다음, Apple에게 실제로 무슨 일이 있었는지 알려주세요. 여기서 중요한 것은 구체적이고 정직한 데이터이므로, 내용을 부풀리지 마세요.
두 가지 사례를 살펴보겠습니다.
한 플레이어가 코인 팩을 구매하고 하루 만에 대부분을 소진합니다. 많은 사용량을 보고하세요. Apple에 환불 거부를 요청하는 것도 타당한 선택입니다.
한 구독자가 연간 요금을 지불했지만, 서버 장애로 콘텐츠가 전혀 로드되지 않았습니다. 콘텐츠가 전달되지 않았다고 보고하세요. 이 경우 환불을 승인하는 것이 정직한 답일 수 있습니다.
당신의 환불 선호도는 제안일 뿐입니다. Apple이 이를 따를 의무는 없습니다.
Apple Send Consumption Information API 설명
Send Consumption Information 엔드포인트는 트랜잭션 ID에 연결된 PUT 요청입니다(/inApps/v2/transactions/consumption/{transactionId}). CONSUMPTION_REQUEST를 받은 후 이 요청을 호출하며, Apple은 12시간 이내 응답을 요구합니다.
요청 본문은 다섯 개 필드로 구성된 ConsumptionRequest 객체입니다:
customerConsented: 고객이 데이터 공유에 동의했는지 여부입니다. 반드시 true여야 합니다. 그렇지 않으면 Apple이 HTTP 400 오류로 호출을 거부합니다.
deliveryStatus: 앱이 정상적으로 작동하는 구매 상품을 전달했는지 여부입니다.
sampleContentProvided: 무료 샘플이나 체험판을 먼저 제공했는지 여부입니다.
consumptionPercentage: 밀리유닛(milliunit) 단위로 나타낸 사용량입니다.
refundPreference: 당신이 원하는 결과입니다.
몇 가지 규칙에서 사람들이 실수하곤 합니다. deliveryStatus가 DELIVERED가 아니라면 consumptionPercentage를 0으로 설정해야 하며, 그렇지 않으면 요청이 실패합니다. GRANT_PRORATED를 사용하는 자동 갱신 구독의 경우, Apple이 자체적으로 계산하므로 consumptionPercentage는 생략합니다. 그리고 동의를 확인하는 것은 당신의 책임입니다. Apple은 이를 위해 App Tracking Transparency 프롬프트를 사용하지 말라고도 안내합니다.
App Store Server Notifications V2 통합
App Store Server Notifications V2는 Apple이 당신의 서버에 연락하는 방식입니다. TLS 1.2 이상을 지원하는 보안 HTTPS URL이 필요합니다.
CONSUMPTION_REQUEST는 여러 유형 중 하나일 뿐입니다. REFUND, REFUND_REVERSED 같은 다른 유형들은 사건이 어떻게 종료되었는지 알려줍니다. 환불 코드가 갱신 코드와 뒤섞이지 않도록 유형마다 별도의 핸들러를 두세요. App Store Connect 쪽 작업이 실제로 어떻게 진행되는지 보고 싶으신가요? Refund Sensor Apple 설정 가이드에서 키와 알림 URL을 다루고 있습니다.
피해야 할 흔한 실수
알림 수신에서 멈추는 것. CONSUMPTION_REQUEST는 서버가 데이터를 다시 전송하기 전까지는 아무 효과가 없습니다.
동의를 무시하는 것. 고객의 동의가 없으면 응답도 없어야 합니다.
12시간을 놓치는 것. 이런 알림은 밤이나 주말에도 도착합니다. 큐를 사용하고 알림을 설정하세요.
작동하지 않는 조합을 전송하는 것. 전달되지 않은 구매에 사용 비율을 넣으면 실패합니다.
서명 검증을 건너뛰는 것. 먼저 검증하고, 그 다음에 신뢰하세요.
느리게 응답하는 것. 성공 코드를 빠르게 반환하고 무거운 작업은 백그라운드에서 처리하세요. 그렇지 않으면 Apple이 계속 재시도합니다.
사용자를 찾을 방법이 없는 것. 트랜잭션을 고객과 연결할 수 없다면 실질적으로 보고할 내용이 없는 것입니다.
App Store 환불 워크플로를 자동화하는 방법
12시간짜리 시계를 수동으로 지켜보고 싶은 사람은 없습니다. App Store 환불 워크플로를 자동화하려면 작업을 작은 단위로 나누세요:
알림을 수신하고 즉시 성공 코드를 반환합니다.
이벤트를 큐에 넣습니다.
워커가 이를 검증하고, 사용자를 찾고, 동의 여부를 확인합니다.
워커가 저장된 사용 데이터를 바탕으로 요청을 구성하고 API를 호출합니다.
결과를 기록하고, 실패하면 담당자에게 알립니다.
이렇게 하면 일관된 응답과 명확한 감사 기록을 얻을 수 있고, 새벽 3시에 깨어 있을 필요도 없습니다. 이 과정을 직접 구축할 수도 있고, RefundSensor 같은 서비스에 파이프라인을 맡길 수도 있습니다.
개발자를 위한 모범 사례
실제 사용 데이터를 저장하세요: 세션, 사용한 크레딧, 열람한 콘텐츠 등입니다. 보관하지 않은 수치는 보고할 수 없습니다.
약관이나 온보딩 과정에 명확한 동의 단계를 추가하고, 동의한 시점을 기록하세요.
환불 규칙을 한 번 정리해 코드에 반영하고, 사례별로 그때그때 결정하지 마세요.
실제 배포 전에 샌드박스 알림으로 테스트하세요.
모든 구매에 계정 토큰을 연결해 나중에 구매자를 식별할 수 있도록 하세요. 자세한 방법은 appAccountToken 가이드에서 설명합니다.
매달 환불 결과를 검토하세요. 이상한 급증 현상은 고장난 기능이나 혼란스러운 유료화 장벽을 가리킬 수 있습니다.
결론
Apple 환불 워크플로는 결국 두 부분으로 나뉩니다. Apple이 CONSUMPTION_REQUEST를 보내고, 당신은 응답할지 선택합니다. 고객이 동의했다면, 12시간 이내에 Send Consumption Information API를 통해 정직한 데이터를 전송하세요. 최종 결정은 여전히 Apple이 내립니다.
좋은 첫 단계는 V2 알림 URL이 정상 작동하는지, 그리고 서버가 트랜잭션을 사용자와 매칭할 수 있는지 확인하는 것입니다. 이 두 가지를 확인해두면 나중에 많은 골칫거리를 줄일 수 있습니다.
자주 묻는 질문
고객이 환불을 요청할 때 Apple이 보내는 V2 메시지입니다. 사용 내역 정보를 요청하는 내용입니다.
Apple은 알림을 받은 후 12시간 이내에 응답하기를 요구합니다.
네. 동의가 없으면 응답하지 마세요. customerConsented 값이 true가 아닌 요청은 거부됩니다.
반드시 그런 것은 아닙니다. Apple은 제공된 데이터를 참고해 판단하지만, 최종 결정은 Apple이 내립니다.
소모성 상품, 비소모성 상품, 자동 갱신되지 않는 구독, 자동 갱신 구독이 포함됩니다.



