앱의 ROAS는 Apple과 Google이 환불한 구매까지 여전히 세고 있습니다. 순 ROAS로 입찰하세요
환불은 광고 플랫폼으로 거의 돌아가지 않아서, ROAS는 Apple과 Google이 이미 환불한 구매를 계속 성과로 잡습니다. Firebase, Google Ads, AdAttributionKit가 어디서 환불을 놓치는지, 그 비용이 얼마인지, 앱의 순 ROAS를 어떻게 만드는지 정리합니다.

핵심 요약
- Firebase가 자동 수집하는 app_store_refund 이벤트는 Google Play가 인앱 구매를 환불할 때만 발생합니다. Google은 이를 Android 전용으로 표시하므로, App Store 환불은 Firebase가 기록한 in_app_purchase 수익을 절대 줄이지 않습니다.
- Google Ads는 Android 앱의 Google Play 인앱 구매를 자동으로 추적하고 구매 금액을 전환 가치로 보고합니다. 구독의 경우 첫 구매와 첫 결제 금액만 기록합니다.
- Google Ads 전환 조정으로 전환 가치를 수정하거나 0으로 철회할 수 있습니다. Google에 따르면 온라인 전환은 거래 ID와 함께 전송된 경우에만 조정할 수 있습니다.
- Apple의 AdAttributionKit에는 첫 실행 이후 0일차부터 2일차, 3일차부터 7일차, 8일차부터 35일차까지 세 개의 전환 기간이 있으며, 세분화된 전환 값은 첫 번째 포스트백에만 담깁니다.
- 순 ROAS는 광고에 귀속된 수익에서 해당 구매의 환불을 빼고 광고비로 나눈 값입니다. 구매자의 환불이 더 많은 캠페인은 총 ROAS가 더 높아도 순 ROAS로는 순위가 더 낮을 수 있습니다.
- 환불 신호는 광고 네트워크가 아니라 개발자의 서버에 도착합니다. Apple은 REFUND App Store 서버 알림을 보내고, Google Play는 실시간 개발자 알림과 Voided Purchases API로 무효화된 구매를 알립니다. 후자는 30일 전까지 조회할 수 있습니다.
- 개발자가 증거를 제출할 수 있는 환불 절차는 두 가지뿐입니다. 12시간 안에 응답하는 Apple의 CONSUMPTION_REQUEST, 그리고 24시간 안에 orders.reviewrefund로 응답하는 Google Play의 지불 거절 검토입니다.
광고 대시보드는 인앱 구매가 일어나는 순간 이를 기록하고, 대부분은 다시 되돌리지 않습니다. 나중에 Apple이나 Google이 그 구매를 환불하면 돈은 정산금에서 빠져나가지만 캠페인 수익에는 그대로 남습니다. 그래서 ROAS는 그 판매를 만든 광고에 계속 공을 돌립니다. 순 ROAS, 즉 환불을 뺀 수익을 광고비로 나눈 값이 어떤 캠페인이 실제로 돈을 벌었는지 알려 주는 숫자입니다. 이 숫자는 직접 만들어야 합니다. 환불 신호는 광고 네트워크가 아니라 여러분의 서버에 도착하기 때문입니다.
환불을 빼지 않으면 ROAS가 수익을 부풀리는 이유
ROAS는 귀속 수익을 광고비로 나눈 값입니다. 수익 쪽은 보통 구매 시점에 한 번, 기기의 SDK나 스토어에서 가져온 전환 데이터로 기록됩니다. 환불은 그 이후 기기 밖에서, 고객과 Apple 또는 Google 사이에서 일어나는 일입니다. 무언가가 그것을 같은 캠페인으로 다시 가져오지 않으면 그 구매는 계속 집계됩니다.
환불이 드물고 고르게 퍼져 있다면 문제가 없을 것입니다. 하지만 대개는 그렇지 않습니다. 앱이 실제로 주는 것보다 더 많이 약속하는 광고 소재, 엉뚱한 잠재고객에게 노출된 혜택, 도난 카드가 가득한 트래픽 소스는 특정 캠페인으로 환불을 몰아옵니다. 총 ROAS는 바로 그 차이를 가립니다.
순 ROAS란?
순 ROAS는 같은 비율에서 매출 쪽의 환불을 뺀 것입니다. 캠페인에 귀속된 수익에서 바로 그 구매들의 환불을 빼고, 캠페인 비용으로 나눕니다. 스토어 수수료와 세금까지 빼는 팀도 있습니다. 무엇을 더 빼든, 어떤 캠페인이 이기는지를 바꾸는 것은 환불입니다.
스토어와 광고 대시보드 사이에서 환불이 사라지는 곳
Firebase는 Google Play 환불은 기록하지만 App Store 환불은 기록하지 않습니다
Google의 자동 수집 이벤트 목록에는 in_app_purchase가 있습니다. 이 이벤트는 사용자가 Apple App Store 또는 Google Play에서 처리되는 인앱 구매(첫 구독 포함)를 완료할 때 발생합니다. 짝을 이루는 환불 이벤트인 app_store_refund는 Google Play가 인앱 구매를 환불할 때 발생하며, Google은 이를 Android 전용으로 표시합니다. app_store_refund와 자동 구독 이벤트는 모두 BigQuery로 내보내지지 않습니다.
같은 페이지에는 애널리틱스가 유료 앱의 구매 수익과 환불을 자동으로 측정하지 않으며, 보고된 수익이 Google Play Developer Console과 다를 수 있다는 내용도 있습니다. iOS에서는 Firebase가 이미 기록한 구매에서 App Store 환불을 자동으로 빼 주는 장치가 없습니다.
Google Ads는 구매 금액을 전환 가치로 기록합니다
인앱 결제를 사용하는 Android 앱의 경우, Google Ads는 앱에 코드를 추가하지 않고도 광고를 클릭한 사람의 인앱 구매를 추적할 수 있습니다. Google에 따르면 구매 금액은 자동으로 전환 가치로 보고됩니다. 구독은 첫 구매만 전환으로 기록되고, 첫 결제 금액만 기록됩니다. 이 도움말 문서에는 환불에 대한 언급이 없습니다.
Google Ads에도 수정 도구는 있습니다. 전환 조정으로 전환 수는 그대로 둔 채 전환 가치를 수정하거나, 전환을 철회해 가치를 0.00으로 만들 수 있으며, 이는 CPA와 ROAS 입찰 전략 모두에 반영됩니다. Google에 따르면 온라인 전환은 거래 ID를 사용한 경우에만 조정할 수 있고, 철회한 전환은 다시 조정할 수 없습니다. 이 페이지는 앱 전환을 언급하지 않으므로, 조정을 전제로 무언가를 만들기 전에 여러분의 전환 설정이 조정을 지원하는지 확인하세요.
Apple의 광고 포스트백은 많은 환불이 도착하기 전에 닫힙니다
AdAttributionKit에는 사용자가 앱을 처음 실행한 시점부터 시작되는 세 개의 전환 기간이 있습니다. 0일차부터 2일차, 3일차부터 7일차, 8일차부터 35일차입니다. 앱은 기간이 끝날 때까지 전환 값을 업데이트할 수 있습니다. 그런 다음 Apple은 무작위 지연 후 포스트백을 보냅니다. 첫 번째는 24시간에서 48시간, 두 번째와 세 번째는 24시간에서 144시간입니다. 앱이 값을 일찍 잠그면 시스템은 그 기간의 이후 업데이트를 무시합니다.
세분화된 전환 값은 첫 번째 포스트백에만 담깁니다. 이후 포스트백에는 기껏해야 대략적인 값만 담깁니다. 1일차에 일어난 구매를 Apple이 10일차에 환불해도, 그 구매는 더 이상 바꿀 수 없는 포스트백으로 이미 보고된 상태입니다.
| 측정 지점 | 구매 시 기록하는 내용 | 구매가 환불되면 일어나는 일 |
|---|---|---|
| Firebase in_app_purchase, Android 및 iOS | 제품 ID, 가격, 가치, 통화, 수량 | Android: app_store_refund 발생. iOS: 자동 환불 이벤트 없음 |
| Google Ads, Google Play 전환, Android | 구매 금액을 전환 가치로, 구독은 첫 결제만 | 설명 없음. 조정으로 거래 ID와 함께 전송된 온라인 전환을 수정하거나 철회 가능 |
| AdAttributionKit 포스트백, iOS | 기간별 전환 값 하나, 세분화된 값은 첫 번째만 | 해당 기간의 포스트백이 준비되면 고정 |
| 여러분의 서버 | 모든 거래를 여러분의 사용자 ID와 연결해 기록 | Apple REFUND 알림, Google Play 무효화된 구매 신호 |
앱 환불은 언제 도착하고, 누가 결정하는가
환불은 한 가지 일정으로 오지 않습니다. 구매 후 몇 시간 안에 오는 것도 있고 몇 달 뒤에 오는 것도 있습니다. 캠페인 보고서가 확정된 것처럼 보인 뒤에도 코호트의 ROAS가 계속 내려가는 이유입니다.
| 환불 경로 | 스토어가 직접 밝힌 시점 | 결정 주체 | 서버에 도착하는 신호 |
|---|---|---|---|
| Google Play 환불 요청 | 48시간 이내에는 고객이 Google에 요청. 그 이후에는 Google이 개발자에게 안내 | Google, 그다음은 여러분 | RTDN과 Voided Purchases API를 통한 무효화된 구매 |
| Google Play 개발자 환불 | 여러분이 실행할 때 | 여러분 | 무효화된 구매(권한을 취소한 경우) |
| Google Play 무단 청구 신고 | 거래 후 120일 이내 | 무효화된 구매 | |
| Apple 환불 | reportaproblem.apple.com에서 요청, 24시간에서 48시간 안에 업데이트 | Apple | revocationReason이 포함된 REFUND 알림 |
| Apple 소비 정보 요청 | 여러분이 12시간 안에 응답 | Apple, 여러분의 데이터를 바탕으로 | CONSUMPTION_REQUEST |
| Google Play 지불 거절 검토 | 여러분이 24시간 안에 orders.reviewrefund로 응답 | 은행, 여러분의 증거를 검토한 뒤 | 지불 거절이 유지되면 무효화된 구매 |
환불을 보지 못하는 ROAS가 치르는 비용
예산이 같은 두 캠페인을 예로 들어 보겠습니다. 아래 숫자는 설명을 위한 예시이며 벤치마크가 아닙니다.
| 항목 | 캠페인 A | 캠페인 B |
|---|---|---|
| 광고비 | $10,000 | $10,000 |
| 귀속 구매 수익 | $14,000 | $12,500 |
| 총 ROAS | 1.40 | 1.25 |
| 그 수익 중 환불된 비율 | 18% | 4% |
| 환불 후 수익 | $11,480 | $12,000 |
| 순 ROAS | 1.15 | 1.20 |
총 ROAS는 A로 예산을 옮기라고 말합니다. 순 ROAS는 1달러당 더 많이 남긴 쪽이 B라고 말합니다. 입찰이 총 가치를 기준으로 돌아가면, 알고리즘은 A의 구매자 같은 사람을 계속 더 찾아냅니다. 그들이 환불을 요청했다는 사실을 아무것도 알려 주지 않기 때문입니다.
광고비는 첫 번째 청구서일 뿐입니다. 환불한 고객은 다음과 같은 비용도 남깁니다.
- 지급금. 구매당 지급하는 제휴, 크리에이터, 인플루언서 계약은 계약서에 따로 정하지 않는 한 보통 환불을 뺀 금액이 아니라 판매 금액을 기준으로 지급합니다.
- 컴퓨팅, API 호출, 스토리지. 환불한 사용자는 접근 권한이 취소될 때까지 여러분의 서버, 유료 서드파티 API, 스토리지를 사용했습니다. 그 청구서는 환불되지 않습니다.
- 지불 거절 비용. 2026년 8월 3일부터 Google은 지불 거절된 구매 금액과 은행 수수료를 개발자에게 넘기므로, 분쟁이 잦은 Android 트래픽 소스는 잃는 수익보다 더 많은 비용이 듭니다.
- 타기팅 악화. 환불된 구매로 학습한 가치 기반 입찰은 환불받은 사람들과 비슷한 사람을 더 찾아 나섭니다.

한 캠페인의 환불률이 높다면 사기일까, 지키지 못한 약속일까?
대개는 약속의 문제입니다. Apple의 revocationReason은 환불이 어느 쪽에 해당하는지 알려 줍니다. 0은 실수로 한 구매처럼 기타 이유로 App Store가 거래를 환불했다는 뜻입니다. 1은 앱 안의 실제 문제나 사용자가 문제라고 느낀 점 때문에 환불했다는 뜻입니다. 한 캠페인에서 1이 몰려 나온다면 대개 광고 소재나 그 광고가 이어지는 온보딩을 가리킵니다. Google Play에서 무단 청구 신고가 몰려 나온다면 트래픽 소스를 가리킵니다.
앱의 순 ROAS를 만드는 방법
시작하는 데 새 도구는 필요 없습니다. 필요한 것은 여러분의 데이터가 아마 아직 하지 않는 몇 가지 연결입니다.
- 캠페인을 사용자에게 연결하세요. 설치 시점에 어트리뷰션 결과를 여러분의 사용자 ID와 함께 저장해, 이후 어떤 거래든 캠페인까지 추적할 수 있게 합니다.
- 거래를 사용자에게 연결하세요. iOS 구매에는 appAccountToken을, Google Play 구매에는 난독화된 계정 ID를 설정해, 모든 스토어 이벤트가 추측 없이 여러분의 사용자와 이어지게 합니다.
- 서버에서 환불을 수신하세요. App Store Server Notifications V2의 Apple REFUND 알림과 Google Play의 무효화된 구매 알림을 처리합니다. Voided Purchases API는 최근 30일의 무효화만 반환하므로, 안전장치로 주기적으로 조회합니다.
- 구매 코호트별로 총액과 순액을 나란히 보고하세요. 각 환불은 환불이 나타난 날이 아니라, 그 구매를 만든 캠페인과 구매일에 반영합니다.
- 플랫폼이 수정을 받는 곳에는 수정을 보내세요. Google Ads 전환에 거래 ID가 있다면 환불된 전환을 수정하거나 철회합니다. 수정을 받지 않는 플랫폼은 대신 순 수치를 기준으로 예산을 옮깁니다.
- 두 가지 증거 요청에 기한 안에 응답하세요. RefundHalt는 Apple의 CONSUMPTION_REQUEST에 12시간 기한 안에, Google Play의 지불 거절 검토에 24시간 안에 응답합니다. 이의를 제기할 수 있는 환불에는 여러분 쪽의 입장이 전달됩니다.
환불은 구매일과 환불일 중 언제 반영해야 할까?
캠페인 의사결정에는 구매일입니다. 환불은 어떤 구매에 관한 사실이고, 그 구매는 어떤 캠페인에 속합니다. 재무팀은 환불일 기준으로 장부에 올리기 때문에 ROAS 보고서와 정산금은 어느 날짜를 보더라도 일치하지 않습니다. 두 관점을 모두 유지하고 각각 이름을 붙여 두세요.
코호트의 순 ROAS는 언제 확정될까?
단계적으로 확정됩니다. Google의 셀프서비스 환불 기간은 48시간 후에 닫히고, Apple은 환불 요청에 대한 업데이트를 24시간에서 48시간 안에 받을 수 있다고 고객에게 안내합니다. 그리고 Google Play 무단 청구 신고는 거래 후 120일 이내에 들어올 수 있습니다. 초기 숫자는 잠정치로 보고, 나중에 같은 코호트를 다시 확인하세요.
자주 묻는 질문
- Firebase는 인앱 구매 수익에서 환불을 빼나요?
- Google Play에 한해서만 그렇습니다. Firebase가 자동 수집하는 app_store_refund 이벤트는 Google Play가 인앱 구매를 환불할 때 발생하며, Google은 이를 Android 전용으로 표시합니다. App Store 환불에 해당하는 자동 이벤트는 없고, Google은 애널리틱스가 유료 앱의 구매 수익과 환불을 자동으로 측정하지 않는다고 밝힙니다.
- Google Ads는 환불된 인앱 구매를 전환에서 제거하나요?
- Google Play 전환에 관한 Google 자체 문서에는 그렇다는 내용이 없습니다. 구매 금액이 전환 가치로 보고된다고만 하고 환불은 언급하지 않습니다. Google Ads 전환 조정으로 전환을 수정하거나 철회할 수 있으며, Google에 따르면 온라인 전환은 거래 ID와 함께 전송된 경우에만 조정할 수 있습니다.
- AdAttributionKit 포스트백에 환불이 반영될 수 있나요?
- 해당 전환 기간의 포스트백이 준비되기 전에 환불이 일어난 경우에만 가능합니다. 기간은 첫 실행 이후 0일차부터 2일차, 3일차부터 7일차, 8일차부터 35일차이며, 기간이 끝나거나 값이 잠기면 Apple은 그 기간의 이후 업데이트를 무시합니다.
- 앱의 순 ROAS는 어떻게 계산하나요?
- 캠페인에 귀속된 수익에서 바로 그 구매들의 환불을 빼고, 캠페인의 광고비로 나눕니다. Apple의 REFUND 알림과 Google Play의 무효화된 구매 신호를 환불 기록으로 사용해, 각 환불을 그 구매를 만든 구매 코호트에 반영합니다.
- ROAS를 낮추는 환불에 이의를 제기할 수 있나요?
- 두 가지 경우만 가능합니다. Apple의 CONSUMPTION_REQUEST는 12시간 안에 소비 데이터를 보낼 수 있게 하고, orders.reviewrefund를 통한 Google Play의 지불 거절 검토는 24시간을 줍니다. Google Play의 48시간 이내 환불, 고객 지원 환불, 무효화된 구매는 여러분 없이 결정되며, 은행의 지불 거절은 최종적입니다.
출처 및 추가 자료
- Firebase Help: [GA4] Automatically collected events
- Google Ads Help: Measure app conversions with Google Play
- Google Ads Help: About conversion adjustments
- Apple Developer Documentation: Receiving postbacks in multiple conversion windows
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: revocationReason
- Google Play Developer API: Voided Purchases API
- Google Play Help: Apps, games, and in-app purchases refund policies
- Google Play Help: Learn about Google Play refund policies
- Apple Support: Request a refund for apps or content that you bought from Apple
RefundHalt
App Store와 Google Play 환불 자동 처리
계속 읽기
고객 영수증의 App Store 주문 ID를 보면 무엇을 샀는지, Apple이 이미 환불했는지 알 수 있습니다
Apple의 Look Up Order ID 엔드포인트는 고객의 App Store 영수증에 있는 주문 ID를 환불 날짜와 사유가 담긴 서명된 거래로 바꿔 줍니다. 환불 이메일에 활용하는 방법, 이 엔드포인트로 할 수 없는 일, Google Play 주문 ID와의 차이를 정리했습니다.
iOS 웹 결제 환불은 이제 Apple이 아니라 당신이 처리합니다. 은행 분쟁도 마찬가지입니다
미국 iPhone 앱은 이제 구매자를 웹 결제로 연결할 수 있습니다. Apple은 이런 판매의 환불을 도울 수 없다고 밝혔고, 그래서 환불 창구와 지불 거절, $15 분쟁 수수료가 개발자에게 넘어옵니다. 무엇이 바뀌는지, 비용이 얼마인지, 분쟁을 어떻게 줄이는지 정리했습니다.