Все статьи
Руководство8 мин чтения

ROAS вашего приложения всё ещё учитывает покупки, за которые Apple и Google вернули деньги. Поэтому ставки стоит строить на чистом ROAS

Возвраты редко доходят до рекламных платформ, поэтому ROAS продолжает засчитывать покупки, деньги за которые Apple и Google уже вернули. Разбираем, где Firebase, Google Ads и AdAttributionKit теряют возвраты, во что это обходится и как построить чистый ROAS для приложения.

Рабочий стол маркетингового аналитика: графики рекламных кампаний на ноутбуке, iPhone, телефон на Android и распечатанные строки, вычеркнутые ручкой, как образ чистого ROAS после возвратов в приложениях

Главное

  • Автоматически собираемое событие Firebase app_store_refund срабатывает только тогда, когда Google Play возвращает деньги за встроенную покупку. Google помечает его как событие только для Android, поэтому возвраты в App Store никогда не уменьшают выручку in_app_purchase, которую зафиксировал Firebase.
  • Google Ads автоматически отслеживает встроенные покупки в Google Play для приложений на Android и передаёт стоимость покупки как ценность конверсии. Для подписок фиксируется только первая покупка и сумма первого платежа.
  • Корректировки конверсий в Google Ads позволяют изменить ценность конверсии или отозвать её до нуля. По словам Google, онлайн-конверсии можно корректировать, только если вместе с ними был отправлен идентификатор транзакции.
  • У AdAttributionKit от Apple три окна конверсии после первого запуска: дни с 0 по 2, с 3 по 7 и с 8 по 35. Детализированная ценность конверсии есть только в первом постбэке.
  • Чистый ROAS это выручка, атрибутированная рекламе, за вычетом возвратов по этим покупкам, делённая на рекламные расходы. Кампания с более высоким валовым ROAS может проиграть по чистому ROAS, если её покупатели чаще требуют деньги назад.
  • Сигналы о возвратах приходят на сервер разработчика, а не в рекламную сеть. Apple отправляет уведомление REFUND через App Store Server Notifications, а Google Play сообщает об аннулированных покупках через уведомления для разработчиков в реальном времени и Voided Purchases API, который охватывает последние 30 дней.
  • Только два сценария возврата позволяют разработчику представить доказательства: CONSUMPTION_REQUEST от Apple, на который нужно ответить в течение 12 часов, и проверка чарджбэка в Google Play через orders.reviewrefund, на которую нужно ответить в течение 24 часов.

Рекламные кабинеты записывают встроенную покупку в момент, когда она происходит, и большинство из них никогда её не отменяет. Когда 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.

На той же странице сказано, что Analytics не измеряет автоматически выручку и возвраты по покупкам платных приложений и что отражённая выручка может отличаться от данных в Google Play Developer Console. На iOS ничто автоматически не вычитает возврат в App Store из покупки, которую Firebase уже зафиксировал.

Google Ads записывает стоимость покупки как ценность конверсии

Для приложений на Android со встроенной оплатой Google Ads может отслеживать встроенные покупки людей, которые нажали на ваше объявление, без кода в приложении. По словам Google, стоимость покупки автоматически передаётся как ценность конверсии. Для подписок конверсией считается только первая покупка, и фиксируется только сумма первого платежа. О возвратах в справочной статье не говорится.

Инструмент для исправлений в Google Ads всё же есть. Корректировки конверсий позволяют изменить ценность конверсии, не меняя их количество, или отозвать её. Тогда ценность становится 0.00, и это учитывается в стратегиях назначения ставок по CPA и ROAS. По словам Google, онлайн-конверсии можно корректировать, только если вы использовали идентификатор транзакции, а отозванную конверсию нельзя скорректировать повторно. Конверсии из приложений на этой странице не упоминаются, поэтому, прежде чем на них опираться, убедитесь, что ваша настройка конверсий поддерживает корректировки.

Рекламные постбэки Apple закрываются раньше, чем приходит большинство возвратов

У AdAttributionKit три окна конверсии, которые начинаются при первом запуске приложения пользователем: дни с 0 по 2, с 3 по 7 и с 8 по 35. Приложение может обновлять ценность конверсии до конца окна. Затем Apple отправляет постбэк со случайной задержкой: от 24 до 48 часов для первого и от 24 до 144 часов для второго и третьего. Если приложение рано зафиксирует значение, система игнорирует дальнейшие обновления в этом окне.

Детализированная ценность конверсии есть только в первом постбэке. Последующие постбэки в лучшем случае содержат грубое значение. Покупка в день 1, за которую Apple вернула деньги в день 10, уже попала в постбэк, который больше нельзя изменить.

Источник измеренийЧто фиксируется при покупкеЧто происходит, когда за покупку возвращают деньги
Firebase in_app_purchase, Android и iOSID продукта, цена, ценность, валюта, количествоAndroid: срабатывает app_store_refund. iOS: автоматического события возврата нет
Google Ads, конверсии Google Play, AndroidСтоимость покупки как ценность конверсии, для подписок только первый платёжНе описано. Корректировки могут изменить или отозвать онлайн-конверсии, отправленные с идентификатором транзакции
Постбэки AdAttributionKit, iOSОдна ценность конверсии на окно, детализированная только в первомНе меняется после того, как постбэк этого окна подготовлен
Ваш собственный серверКаждая транзакция, привязанная к вашему ID пользователяУведомление REFUND от Apple, сигналы Google Play об аннулированных покупках

Когда приходят возвраты в приложениях и кто их одобряет

Возвраты не приходят по единому графику. Одни поступают через несколько часов после покупки, другие через месяцы. Поэтому ROAS когорты продолжает снижаться уже после того, как отчёт по кампании казался окончательным.

Путь возвратаСроки по словам самого магазинаКто решаетСигнал на вашем сервере
Запрос возврата в Google PlayВ течение 48 часов покупатель обращается в Google. После этого Google направляет его к разработчикуGoogle, затем выАннулированная покупка через RTDN и Voided Purchases API
Возврат от разработчика в Google PlayКогда вы его оформитеВыАннулированная покупка, если вы отзываете доступ
Жалоба на несанкционированное списание в Google PlayВ течение 120 дней после транзакцииGoogleАннулированная покупка
Возврат от AppleЗапрос на reportaproblem.apple.com, ответ в течение от 24 до 48 часовAppleУведомление REFUND с revocationReason
Запрос Apple о потребленииВы отвечаете в течение 12 часовApple, на основе ваших данныхCONSUMPTION_REQUEST
Проверка чарджбэка в Google PlayВы отвечаете в течение 24 часов через orders.reviewrefundБанк, после ваших доказательствАннулированная покупка, если чарджбэк остаётся в силе

Во что обходится ROAS, не видящий возвратов

Возьмём две кампании с одинаковым бюджетом. Цифры ниже это иллюстрация, а не ориентир.

СтрокаКампания AКампания B
Рекламные расходы$10,000$10,000
Атрибутированная выручка от покупок$14,000$12,500
Валовой ROAS1.401.25
Доля возвратов в этой выручке18%4%
Выручка после возвратов$11,480$12,000
Чистый ROAS1.151.20

Валовой ROAS советует перенести деньги в A. Чистый ROAS показывает, что B сохранила больше с каждого доллара. Если ваши ставки опираются на валовую ценность, алгоритм продолжает искать новых покупателей, похожих на покупателей A, потому что ничто не сообщает ему, что они потребовали деньги назад.

Рекламные расходы это только первый счёт. Покупатель, получивший возврат, оставляет после себя ещё и это:

  • Выплаты. Партнёрские сделки с аффилиатами, авторами и инфлюенсерами с оплатой за покупку обычно платят с продажи, а не с продажи за вычетом возвратов, если в договоре не сказано иное.
  • Вычисления, вызовы API и хранилище. Пользователь, получивший возврат, пользовался вашими серверами, платными сторонними API и хранилищем, пока у него не отозвали доступ. Эти счета никто не возвращает.
  • Расходы на чарджбэки. С 3 августа 2026 года Google перекладывает на разработчика стоимость покупки по чарджбэку вместе с банковскими комиссиями. Поэтому источник трафика на Android с большим числом споров обходится дороже, чем выручка, которую он теряет.
  • Худший таргетинг. Назначение ставок по ценности, обученное на покупках с возвратом, ищет больше людей, похожих на тех, кому вернули деньги.
Две стопки монет на столе, одна ниже после того, как часть монет убрали, рядом телефон и калькулятор, как иллюстрация того, как возвраты уменьшают выручку, на которой строится чистый ROAS

Высокая доля возвратов в одной кампании это мошенничество или невыполненное обещание?

Часто дело в обещании. revocationReason от Apple показывает, на чьей стороне причина возврата. Значение 0 означает, что App Store вернул деньги за транзакцию по другим причинам, например за случайную покупку. Значение 1 означает возврат из-за реальной или предполагаемой проблемы в вашем приложении. Скопление единиц из одной кампании обычно указывает на рекламный креатив или онбординг, к которому он ведёт. Скопление жалоб на несанкционированные списания в Google Play указывает на источник трафика.

Как построить чистый ROAS для приложения

Чтобы начать, новый инструмент не нужен. Нужно несколько связок, которых в ваших данных, скорее всего, пока нет.

  • Привяжите кампанию к пользователю. Сохраняйте результат атрибуции при установке рядом с вашим собственным ID пользователя, чтобы любую последующую транзакцию можно было связать с кампанией.
  • Привяжите транзакцию к пользователю. Задавайте appAccountToken для покупок на iOS и обфусцированный ID аккаунта для покупок в Google Play, чтобы каждое событие магазина сопоставлялось с вашим пользователем без догадок.
  • Принимайте возвраты на сервере. Обрабатывайте уведомление REFUND от Apple из App Store Server Notifications V2 и уведомления Google Play об аннулированных покупках. Для подстраховки опрашивайте Voided Purchases API, ведь он возвращает только аннулирования за последние 30 дней.
  • Показывайте валовые и чистые показатели рядом, по когортам покупок. Относите каждый возврат к кампании и дате покупки, которые его принесли, а не к дню, когда возврат появился.
  • Отправляйте корректировки туда, где платформа их принимает. Если ваши конверсии в Google Ads содержат идентификатор транзакции, измените или отзовите те, по которым был возврат. Если платформа не принимает корректировки, перераспределяйте её бюджет по чистым цифрам.
  • Отвечайте на два запроса доказательств вовремя. RefundHalt отвечает на CONSUMPTION_REQUEST от Apple в пределах 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, Analytics не измеряет автоматически выручку и возвраты по покупкам платных приложений.
Убирает ли Google Ads встроенные покупки с возвратом из конверсий?
Собственная статья Google о конверсиях Google Play этого не утверждает. В ней сказано, что стоимость покупки передаётся как ценность конверсии, а возвраты не упоминаются. Корректировки конверсий в Google Ads позволяют изменить или отозвать конверсию, и, по словам Google, онлайн-конверсии можно корректировать, только если вместе с ними был отправлен идентификатор транзакции.
Могут ли постбэки AdAttributionKit отразить возврат?
Только если возврат произошёл до того, как подготовлен постбэк этого окна конверсии. Окна охватывают дни с 0 по 2, с 3 по 7 и с 8 по 35 после первого запуска. Когда окно заканчивается или значение зафиксировано, Apple игнорирует дальнейшие обновления в этом окне.
Как рассчитать чистый ROAS для приложения?
Возьмите выручку, атрибутированную кампании, вычтите возвраты по этим же покупкам и разделите на рекламные расходы кампании. Относите каждый возврат к когорте покупок, которая его принесла, а в качестве записи о возвратах используйте уведомление REFUND от Apple и сигналы Google Play об аннулированных покупках.
Можно ли оспорить возвраты, которые снижают мой ROAS?
Только два вида. CONSUMPTION_REQUEST от Apple позволяет отправить данные о потреблении в течение 12 часов, а проверка чарджбэка в Google Play через orders.reviewrefund даёт вам 24 часа. Возвраты в Google Play в течение 48 часов, возвраты через поддержку и аннулированные покупки решаются без вас, а чарджбэки банка окончательны.

Источники и дополнительное чтение

RefundHalt

Автопилот возвратов для App Store и Google Play

Читайте дальше

Следующий запрос на возврат уже в пути.

Настройте RefundHalt за то время, что уходит на чтение очередного письма в поддержку о возврате, который вы не успели оспорить.