모든 글
Deep dive7분 소요

Apple의 Send Consumption Information이 이제 열두 개가 아니라 다섯 개의 필드를 요구합니다. 아래에서 하나씩 살펴봅니다

고객이 Apple에 환불을 요청할 때 Send Consumption Information 페이로드가 여러분의 답변입니다. Apple은 이를 열두 개 필드에서 다섯 개로, 필수 세 개와 선택 두 개로 줄였습니다. 아래에서 각 필드, 각각이 받아들이는 값, 그리고 이를 보내야 하는 12시간의 창을 설명합니다.

스마트폰 옆에 대부분의 페이지가 찢겨 나간 얇은 종이 양식 뭉치가 놓여 있어, Apple의 Send Consumption Information 페이로드가 열두 개 필드에서 다섯 개로 줄었음을 나타낸다

핵심 요약

  • Apple의 Send Consumption Information 페이로드는 이제 열두 개에서 줄어 다섯 개의 필드를 담습니다. 세 개는 필수로 customerConsented, deliveryStatus, sampleContentProvided이며, 두 개는 선택으로 consumptionPercentage와 refundPreference입니다.
  • customerConsented는 엄격한 관문입니다. Apple 자체 지침에 따르면 고객이 소비 데이터 공유에 동의하지 않았다면 페이로드 자체를 아예 보내지 않습니다.
  • deliveryStatus는 여러분의 가장 강력한 신호를 담습니다. DELIVERED는 구매가 정상적으로 작동했음을 말하고, 네 개의 UNDELIVERED 값은 고객이 작동하는 제품을 결코 받지 못했음을 Apple에 알립니다.
  • consumptionPercentage는 기존의 4단계 consumptionStatus 열거형을 milliunits 단위의 정확한 숫자로 대체했으며, 100,000 milliunits는 항목이 완전히 소비되었음을 의미합니다.
  • refundPreference는 이제 숫자가 아니라 문자열입니다. 세 값은 DECLINE, GRANT_FULL, GRANT_PRORATED이며, 이는 결정이 아니라 선호를 나타냅니다. 판정은 여전히 Apple이 합니다.
  • 여러분은 트랜잭션 id를 키로 하여 Send Consumption Information 엔드포인트에 PUT으로 페이로드를 보내고, Apple은 빈 본문과 함께 202 Accepted를 반환합니다. 창은 CONSUMPTION_REQUEST 이후 12시간입니다.
  • 자동 갱신 구독의 경우 Apple이 경과 시간으로부터 소비량을 스스로 계산하므로, consumptionPercentage는 소모형 및 비갱신 구매를 위한 것입니다.

고객이 환불을 원할 때 Apple이 여러분에게 요구하는 사실 목록이 훨씬 짧아졌습니다. Send Consumption Information 페이로드, 즉 개발자가 App Store 환불 결정에 보낼 수 있는 유일한 답변은 예전에 열두 개의 필드를 가지고 있었습니다. 이제는 다섯 개입니다. Apple은 WWDC24 무렵에 이를 정리해, 예전의 계정 프로파일링성 질문 대부분을 두 개의 간단한 질문과 하나의 숫자로 묶었습니다. 필드가 줄어든 것은 사소한 수정이 아닙니다. Apple이 어떤 증거를 저울질하는지를 바꾸고, 여러분이 결코 틀려서는 안 되는 필드가 무엇인지를 바꿉니다.

이것이 단순한 스키마 각주가 아니라 여러분이 주목할 만한 이유를 여기서 밝힙니다. 이 페이로드는 Apple 환불에서 여러분 측의 주장이 결정에 닿는 유일한 순간입니다. 소모형 환불은 여러분이 이미 실제 비용을 들여 전달한 매출을 되돌립니다. 그리고 이 다섯 개의 필드가 바로 제품이 전달되고 사용되었다고 Apple에 알리는 수단입니다. 12시간 창을 놓치거나 어느 필드를 잘못 채우면, Apple은 오직 고객의 주장만으로 판정합니다.

What Send Consumption Information is

Send Consumption Information은 Apple이 여러분의 서버에 CONSUMPTION_REQUEST 알림을 보낸 뒤 여러분이 호출하는 App Store Server API 엔드포인트입니다. 그 알림은 어떤 고객이 앱 내 구매에 대해 Apple에 환불을 요청했고, Apple이 결정을 내리기 전에 여러분의 의견을 원한다는 뜻입니다. 여러분은 작은 JSON 본문, 즉 ConsumptionRequest를 그 엔드포인트에 PUT으로 보내 답합니다. Apple은 그것을 읽고, 고객의 이력과 함께 저울질한 뒤 판단을 내립니다. 환불을 결정하는 것은 결코 여러분이 아닙니다. 여러분은 사실을 제공합니다.

이 body가 인터페이스의 전부입니다. 별도의 양식도, 이의 제기도, 두 번째로 인정되는 제출도 없습니다. 그 한 번의 페이로드에 담아 보내는 것이 여러분 주장의 전부이므로, 각 필드의 의미는 필드 개수가 암시하는 것보다 더 중요합니다.

The five fields Apple asks for now

현재의 ConsumptionRequest에는 다섯 개의 멤버가 있습니다. 세 개는 필수이고 두 개는 선택입니다. Apple이 예전에 고객 계정에 대해 묻던 모든 것, 즉 계정 연령, 생애 지출, 생애 환불, 플레이 시간은 여러분이 보내는 내용에서 제거되었습니다.

필드필수 여부유형담는 내용
customerConsentedBoolean고객이 소비 데이터를 Apple과 공유하는 데 동의했는지
deliveryStatusString여러분의 앱이 작동하는 제품을 전달했는지
sampleContentProvidedBoolean구매 전에 무료 샘플이나 체험을 제공했는지
consumptionPercentage아니요Integer구매가 얼마나 소비되었는지, milliunits 단위
refundPreference아니요String그 환불 요청에 대해 여러분이 선호하는 결과

customerConsented is the gate

customerConsented는 Boolean이며, 여러분이 무언가를 보낼지 말지를 결정하는 필드입니다. 이는 고객이 여러분에게 소비 데이터를 Apple과 공유하도록 동의했는지를 기록합니다. Apple의 지침은 명확합니다. 고객이 동의하지 않았다면 소비 정보를 보내지 마십시오. 따라서 이는 자기 주장을 강화하려고 true로 바꾸는 필드가 아닙니다. 여러분이 이미 쥐고 있어야 하는 진짜 예 또는 아니요를 반영하며, 여기가 false라면 페이로드의 나머지는 보내서는 안 됩니다.

deliveryStatus is the field that moves refunds

deliveryStatus는 문자열 열거형이며, 여러분이 가진 가장 강력한 지렛대입니다. 이는 여러분의 앱이 실제로 작동하는 앱 내 구매를 전달했는지를 Apple에 알립니다. 한 값은 예를 말합니다. 나머지 네 개는 아니요를 말하며, 각각 이유가 다르고, 모두 고객에게 정당한 불만이 있음을 Apple에 알립니다.

Apple에 무엇을 알리는가
DELIVERED앱이 작동하는 앱 내 구매를 전달했다
UNDELIVERED_QUALITY_ISSUE품질 문제로 구매가 전달되지 않았다
UNDELIVERED_WRONG_ITEM고객이 잘못된 항목을 받았다
UNDELIVERED_SERVER_OUTAGE서버 장애가 전달을 막았다
UNDELIVERED_OTHER다른 이유로 구매가 전달되지 않았다

sampleContentProvided answers a fairness question

sampleContentProvided는 Boolean입니다. 이는 고객이 구매하기 전에 무료 샘플, 체험, 또는 그 구매가 무엇을 하는지에 대한 명확한 정보를 주었는지를 기록합니다. 여기가 true인 것은 작은 공정성 신호입니다. 고객은 자신이 무엇을 사는지 알 기회를 가졌습니다. 그 자체로 무언가를 결정하지는 않지만, 단 세 개뿐인 필수 필드 중 하나이므로 Apple이 모든 답변에 이를 분명히 원한다는 것을 알 수 있습니다.

consumptionPercentage is a number now, not a status

이것이 가장 크게 바뀐 필드입니다. 옛 페이로드에는 네 단계 열거형인 consumptionStatus가 있었습니다. UNDECLARED, NOT_CONSUMED, PARTIALLY_CONSUMED, FULLY_CONSUMED입니다. 새 페이로드는 이를 milliunits로 측정하는 정수인 consumptionPercentage로 대체합니다. 100,000 milliunits는 항목이 완전히 소비되었음을 의미하므로, 50,000은 절반이고 0은 손대지 않은 상태입니다. 정확한 숫자는 네 갈래 구간을 이깁니다. 고객이 크레딧 팩의 90퍼센트를 다 썼다고 말할 수 있게 해 주고, 부분 소비로 내림하지 않아도 되기 때문입니다.

사람들이 자주 걸려 넘어지는 유의점이 하나 있습니다. 자동 갱신 구독의 경우 Apple이 경과 시간으로부터 소비량을 스스로 산출하므로, consumptionPercentage는 소모형 및 비갱신 구매를 위한 것입니다. 해당되는 곳에서는 보내고, 해당되지 않는 곳에서는 Apple이 도출하도록 두십시오.

스마트폰에 약 3분의 2까지 채워진 원형 진행 링이 표시되어, milliunits로 측정하는 consumptionPercentage를 나타내며 100,000은 완전한 소비를 의미한다

refundPreference states a preference, not a verdict

refundPreference는 선택 문자열이며, 여러분이 선호하는 결과를 Apple에 알리는 곳입니다. 이것도 형태가 바뀌었습니다. 옛 필드는 prefer-grant, prefer-decline, no-preference 같은 값을 가진 숫자였습니다. 새것은 세 값을 가진 명명된 문자열입니다.

여러분이 요청하는 것
GRANT_FULLApple이 전액 환불하기를 선호한다
GRANT_PRORATED사용한 만큼을 반영한 부분 환불을 선호한다
DECLINEApple이 환불을 거절하기를 선호한다

What Apple dropped, and why it matters

옛 ConsumptionRequest에는 열두 개의 필드가 있었습니다. 그중 일곱 개가 여러분이 보내는 내용에서 사라졌습니다. accountTenure, lifetimeDollarsPurchased, lifetimeDollarsRefunded, playTime, userStatus, platform, appAccountToken은 페이로드에서 계정 프로파일링에 해당하는 절반을 이루었으며, 고객이 계정을 얼마나 오래 보유했는지, 얼마나 썼는지, 얼마나 환불받았는지, 앱을 얼마나 오래 사용했는지로 구간을 나누도록 요구하던 필드입니다.

Apple이 이를 없앤 데에는 주목할 만한 이유가 있습니다. 그 필드들은 개발자에게 고객의 프로필을 넘기라고 요구했고, 대다수 개발자는 이를 미신고로 남겨 두거나 짐작으로 채웠습니다. 남은 다섯 개는 구매와 전달에 관한 것으로, 여러분이 자신의 시스템에서 실제로 확인할 수 있는 사실입니다. 이 전환은 고객이 누구인가에서 이 특정 구매에서 무슨 일이 일어났는가로의 이동입니다.

옛 페이로드현재 페이로드
총 필드 수125
필수 필드사실상 강제되지 않음3
소비 신호consumptionStatus, 네 구간consumptionPercentage, 정확한 milliunits
환불 선호숫자 열거형명명된 문자열, 3개 값
계정 프로파일링연령, 생애 지출, 환불, 플레이 시간, 상태제거됨

The endpoint and the clock

여러분은 분쟁 대상 구매의 트랜잭션 id를 키로 하여 HTTP PUT으로 Send Consumption Information 엔드포인트에 페이로드를 보냅니다. PUT /inApps/v1/transactions/consumption/{transactionId}입니다. 성공하면 202 Accepted가 반환되고 응답 본문은 비어 있습니다. 그 빈 응답은 예상된 것이지 bug가 아닙니다. Apple이 여러분의 데이터를 큐에 넣었음을 확인해 주지만, 최종 결과에 대해서는 아무것도 알려 주지 않습니다. 결과는 나중에 REFUND 또는 REFUND_DECLINED 알림으로 도착합니다.

시계는 여러분이 늘릴 수 없는 부분입니다. Apple은 CONSUMPTION_REQUEST로부터 12시간의 응답 시간을 줍니다. 여러분의 첫 응답만 사용되므로, 첫 페이로드가 완전하고 정확해야 합니다. Apple은 같은 구매에 대해 CONSUMPTION_REQUEST를 두 번 이상 보낼 수 있지만, 각각의 마감은 고정되어 있으며, 수작업 검토가 시간대와 주말을 넘나들며 12시간 안에 들어맞는 일은 드뭅니다.

What a mishandled field costs you

The money left the building before the refund did

소모형 환불은 깔끔한 되돌림이 아닙니다. 고객이 크레딧 한 묶음이나 AI 생성 한 배치에 대해 환불을 요청할 무렵이면, 여러분은 이미 그것을 전달하는 데 비용을 썼습니다. 요청마다의 GPU 추론, 토큰 단위로 청구되는 서드파티 모델 API 호출, 여러분이 만들어 낸 것을 위한 스토리지, 그리고 그 사용에 연결된 크리에이터나 파트너 정산입니다. 스토어 가격은 고객에게 돌아갑니다. 여러분의 전달 비용은 여러분에게 돌아오지 않습니다. 그래서 이의를 제기할 수 있었던 환불은 손익이 맞아떨어지는 사건이 아니라, 그 계정에 응하기 위해 지불한 모든 것의 순손실입니다.

The five fields are how you avoid paying twice

deliveryStatus를 DELIVERED로 설정하고 높은 consumptionPercentage를 두는 것은, 고객이 제품을 받고 사용했다고 Apple에 알리는 두 가지 사실입니다. 그것들은 연산, API 호출, 스토리지가 모두 제 몫을 했다는 여러분의 증거입니다. 페이로드를 보내지 않고 두면 Apple은 그 사실을 전혀 듣지 못합니다. 고객의 주장으로 판정하고, 환불은 통과될 가능성이 커지며, 여러분은 되돌려진 매출과 그 뒤에 있는 전달 비용을 함께 떠안게 됩니다.

Chargebacks are the worse door, and silence points to it

Apple의 환불 흐름으로 만족을 얻지 못한 고객은 여전히 자신의 은행에 그 청구에 대해 이의를 제기할 수 있습니다. 카드 지급 거절은 최종적이고, 정액 분쟁 수수료가 붙으며, 결정을 Apple과 여러분의 손에서 가져가 버립니다. CONSUMPTION_REQUEST에 잘 응하면 분쟁은 Apple 시스템 안에 머물고, 그곳에서 여러분은 발언권을 가집니다. 그것을 무시하면 아슬아슬한 사안을 여러분이 발언권을 전혀 갖지 못하는 유일한 경로로 밀어 넣게 됩니다.

How RefundHalt handles it

이 다섯 개의 필드는 12시간 안에, 모든 CONSUMPTION_REQUEST에 대해, 올바른 트랜잭션을 키로 하여 정확히 채워야 한다고 하면 간단하지 않아집니다. RefundHalt는 알림을 포착하고, 그 구매에 대한 여러분 자신의 전달 및 사용 기록을 읽어, 창이 닫히기 전에 자동으로 페이로드를 보냅니다. deliveryStatus는 여러분의 로그가 실제로 보여주는 것을 반영하고, consumptionPercentage는 짐작이 아니라 실제 사용에서 나오며, refundPreference는 여러분이 한 번 설정한 정책을 따릅니다. 여러분이 얻는 것은 증거와 함께 검토되는 이의 제기 가능한 환불이지, 놓친 마감과 여러분 없이 내려진 결정이 아닙니다.

자주 묻는 질문

Apple의 Send Consumption Information에는 이제 필드가 몇 개 있습니까?
다섯 개입니다. 세 개는 필수로 customerConsented, deliveryStatus, sampleContentProvided이며, 두 개는 선택으로 consumptionPercentage와 refundPreference입니다. 이 페이로드의 이전 버전에는 열두 개의 필드가 있었고, Apple은 accountTenure, lifetimeDollarsPurchased, userStatus 같은 계정 프로파일링 필드를 제거했습니다.
소비 요청에서 deliveryStatus는 무엇을 의미합니까?
deliveryStatus는 여러분의 앱이 작동하는 앱 내 구매를 전달했는지를 Apple에 알립니다. DELIVERED는 전달했음을 의미합니다. 네 개의 UNDELIVERED 값, UNDELIVERED_QUALITY_ISSUE, UNDELIVERED_WRONG_ITEM, UNDELIVERED_SERVER_OUTAGE, UNDELIVERED_OTHER는 각각 명시된 이유로 전달하지 못했음을 말합니다. 페이로드에서 가장 강력한 신호이므로 여러분 자신의 로그와 일치해야 합니다.
consumptionPercentage는 백분율입니까, 아니면 원시 숫자입니까?
보통의 백분율이 아니라 milliunits로 측정하는 정수입니다. 100,000 milliunits는 고객이 구매를 완전히 소비했음을 의미하므로, 50,000은 절반이고 0은 손대지 않은 상태입니다. 이는 옛 consumptionStatus 열거형을 대체했으며, 그것은 미소비부터 완전 소비까지 네 구간만 있었습니다.
refundPreference를 DECLINE으로 설정하면 환불이 멈춥니까?
아니요. refundPreference는 여러분이 선호하는 결과를 나타낼 뿐, 무언가를 결정하지 않습니다. DECLINE은 환불하지 않는 편을 원한다고 Apple에 알리고, GRANT_FULL이나 GRANT_PRORATED는 그 반대를 알리지만, Apple은 여러분의 선호를 고객의 이력 및 자체 정책과 함께 저울질한 뒤 최종 판단을 내립니다.
고객이 소비 데이터 공유에 동의하지 않았다면 어떻게 됩니까?
그렇다면 페이로드를 보내서는 안 됩니다. customerConsented는 필수 Boolean이며, Apple의 지침은 고객이 소비 데이터 공유에 동의하지 않았다면 CONSUMPTION_REQUEST에 아예 응답하지 않는다는 것입니다. 동의는 여러분이 이미 쥐고 있어야 하는 진짜 예 또는 아니요이지, 자기 주장을 돕기 위해 true로 설정하는 값이 아닙니다.
소비 정보를 보내기까지 시간이 얼마나 있습니까?
Apple이 CONSUMPTION_REQUEST 알림을 보낸 때로부터 12시간입니다. 여러분은 Send Consumption Information 엔드포인트에 PUT으로 응답하고, 성공하면 빈 본문과 함께 202 Accepted가 반환됩니다. 여러분의 첫 응답만 사용되므로 첫 페이로드가 완전해야 하며, 수작업 프로세스가 그 창 안에 들어맞는 일은 드뭅니다.

출처 및 추가 자료

RefundHalt

App Store와 Google Play 환불 자동 처리

계속 읽기

다음 환불 요청은 이미 오고 있습니다.

이의를 제기하지 못한 환불에 관한 지원 이메일을 하나 더 읽는 시간이면 RefundHalt 설정을 마칠 수 있습니다.