Все статьи
Deep dive8 мин чтения

Возврат за платное приложение никогда не доходит до вашего сервера, поэтому заметить его должно само приложение

Возвраты за приложения с оплатой при покупке обходят все уведомления, которые слушает ваш сервер. Google дает покупателям два часа на возврат и удаляет приложение, Apple по вашему договору может вернуть деньги в течение 90 дней, и ни один из них не запрашивает доказательств. Здесь разобрано, что сообщает каждый магазин, сколько это стоит и как проверить возврат в приложении.

Смартфон на деревянном столе рядом с порванным чеком из магазина и несколькими монетами, иллюстрация возврата за платное приложение

Главное

  • Возврат за платное приложение касается цены самой загрузки приложения, а не встроенной покупки, и ни Apple, ни Google не документируют для него серверное уведомление.
  • Справка Play Console от Google говорит, что после покупки платного приложения у покупателя есть до двух часов, чтобы вернуть его с полным возвратом денег, и вернуть конкретное приложение можно только один раз.
  • Правила возврата Google Play говорят, что в рамках возврата приложение удаляется, а покупатель, который снова купит то же приложение, второй возврат не получит.
  • Тип REFUND в App Store Server Notifications V2 от Apple охватывает расходуемые и нерасходуемые покупки, автовозобновляемые и невозобновляемые подписки. Покупки самого приложения в этом списке нет.
  • Apple Developer Program License Agreement, Schedule 2 раздел 6.3, позволяет Apple вернуть деньги покупателю, который отказывается в течение 90 дней после загрузки, а разработчик возмещает Apple эту сумму.
  • Документация StoreKit от Apple указывает revocationDate в AppTransaction, подписанной записи о покупке приложения, которую приложение может проверить на устройстве.
  • Ни CONSUMPTION_REQUEST, ни orders.reviewrefund от Google Play не задокументированы для покупок загрузки приложения, поэтому решение о возврате за платное приложение принимается без доказательств разработчика.

Приложения с оплатой при покупке возвращают через боковую дверь, за которой большинство инструментов для работы с возвратами никогда не следит. Когда покупатель возвращает само приложение, а не что-то купленное внутри него, Apple и Google забирают деньги из вашей выплаты, не отправив вашему серверу ни одного уведомления. Google хотя бы удаляет приложение. На iOS разработчики на собственных форумах Apple сообщают, что покупатели после возврата продолжают им пользоваться. Если вы продаете платное приложение, возврат за него это единственный возврат, который вы увидите только как отрицательную строку в отчете, если приложение не проверит его на устройстве.

Правила возврата за платные приложения в Google Play и App Store

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

ПравилоGoogle PlayApp Store
Быстрый самостоятельный возвратДо двух часов после покупки, полный возвратНе задокументирован
Более длинное окно для запросаПокупатель может подать запрос в течение 48 часов, затем обращается к разработчикуApple может вернуть деньги в течение 90 дней после загрузки, по Schedule 2 договора с разработчиком
Сколько разОдин раз на приложение. Повторную покупку вернуть нельзяНе задокументировано
Что происходит с приложениемУдаляется в рамках возвратаНе задокументировано. Разработчики сообщают, что покупатели сохраняют доступ после возврата
Разработчик может вернуть деньгиДа, только полные возвраты, через Play ConsoleНет
Серверное уведомление вамНе задокументированоНе задокументировано
Запрос доказательств у васНе задокументированНе задокументирован

Как работает двухчасовой возврат в Google Play

Справка Play Console от Google говорит об этом прямо: после покупки платного приложения у пользователя есть до двух часов, чтобы вернуть его с полным возвратом денег, и вернуть приложение можно только один раз. Правила возврата для покупателей добавляют, что в течение 48 часов покупатель может получить возврат в зависимости от покупки, что в рамках возврата приложение удаляется и что тот, кто снова купит то же приложение, возврат за него не получит. После 48 часов Google направляет покупателей к разработчику.

Как Apple возвращает деньги за платное приложение

В App Store покупатель обращается к Apple через reportaproblem.apple.com, выбирает причину и отмечает приложение. Apple обещает ответ в срок от 24 до 48 часов. Вернуть деньги за покупку в App Store самостоятельно вы не можете. Внешнюю границу задает ваш договор. Раздел 6.3 Schedule 2 соглашения Apple Developer Program License Agreement гласит, что если покупатель хочет отказаться в течение девяноста дней после загрузки или приложение не соответствует вашим спецификациям или применимому законодательству, Apple может вернуть полную цену, а вы возмещаете Apple эту сумму или предоставляете ей кредит на эту сумму.

Почему ваш сервер никогда не узнает о возврате за платное приложение

Каждый сигнал о возврате, который отправляют оба магазина, создан для встроенных покупок. Apple описывает свой notificationType как событие встроенной или внешней покупки, которое вызвало уведомление. Ее тип REFUND охватывает расходуемую покупку, нерасходуемую покупку, автовозобновляемую подписку или невозобновляемую подписку. Get Refund History возвращает встроенные покупки клиента, за которые были возвращены деньги. Загрузки приложения нет ни в одном из этих списков.

У Google то же самое. Уведомления разработчикам в реальном времени охватывают подписки, разовые продукты и аннулированные покупки, а productType аннулированной покупки это либо подписка, либо разовая покупка. Voided Purchases API, по собственному описанию, применяется к разовым встроенным заказам и подпискам и смотрит назад только на 30 дней.

Вызывает ли возврат за платное приложение CONSUMPTION_REQUEST?

Нет. Документация Apple говорит, что CONSUMPTION_REQUEST отправляется, когда клиент запрашивает возврат за расходуемую встроенную покупку или автовозобновляемую подписку. Это один из всего двух процессов возврата в обоих магазинах, которые запрашивают у разработчика доказательства. Второй это проверка чарджбэка в Google Play, на которую отвечают через orders.reviewrefund в течение 24 часов, и она приходит тем же потоком уведомлений о встроенных покупках. Ни один из них не задокументирован для загрузок приложений. Решение о возврате за платное приложение принимается без всего, что вы могли бы отправить.

Продолжает ли покупатель пользоваться приложением после возврата?

В Google Play правила говорят, что приложение удаляется. По iOS на форумах Apple есть темы от разработчиков, которые спрашивают именно об этом. В одной, от марта 2025, сказано: «Когда пользователь возвращает приложение с оплатой при покупке, у него по-прежнему есть доступ к приложению.» Другая, от 2022 года, подозревает, что покупатели покупают, устанавливают, оформляют возврат и продолжают пользоваться. Третья, от июня 2025, спрашивает, сообщают ли App Store Server Notifications V2 о возвратах на уровне приложения вообще. Ни в одной из трех нет ответа от Apple.

Сколько денег вам стоит возврат за платное приложение

Сторона выплат предсказуема. Справка Play Console говорит, что Google возвращает свою сервисную комиссию, когда вы делаете возврат, поэтому из вашей выплаты вычитается ваша доля, а не цена на витрине. Возврат, оформленный после того, как Google вам заплатил, вычитается из будущей выплаты, и если ваш баланс остается отрицательным не менее 48 часов, Google может списать деньги с вашего банковского счета. Со стороны Apple договор говорит, что вы возмещаете сумму, равную цене. На практике RevenueCat в 2022 году сообщил, что Apple вычла сумму после комиссии, показанную как Extended Partner Share, то есть Apple не оставила себе свою долю.

Не возвращаются те расходы, которые вы понесли, чтобы обслужить этого покупателя. Вот наглядный пример. Платное фотоприложение за $6.99 применяет фильтры через облачную модель и синхронизирует проекты с облачным хранилищем. Вы заплатили за рекламу, которая привела покупателя.

Статья расходовВозвращается в Google PlayВозвращается в App Store
Ваша доля от $6.99Забирается из вашей выплатыЗабирается из вашей выплаты
Сервисная комиссия магазинаВозвращается вам GoogleНе взимается, по отчету RevenueCat
Уже использованные облачные вычисления и вызовы APIНетНет
Хранилище для синхронизированных проектовНетНет
Расходы на рекламу для привлечения покупателяНетНет
Текущие серверные расходы, если покупатель продолжает пользоваться приложениемПрекращаются, приложение удаленоПродолжаются, пока ваше приложение не проверит

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

Как обнаружить возврат за платное приложение внутри приложения

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

На iOS читайте revocationDate в AppTransaction

AppTransaction это подписанная App Store запись о покупке приложения клиентом. Документация StoreKit от Apple теперь указывает в ней свойство revocationDate, описанное как дата отзыва покупки приложения. Читайте AppTransaction.shared при запуске, проверяйте результат и считайте revocationDate, отличное от nil, возвращенной загрузкой. Отправляйте подписанное значение на свой сервер, чтобы он перестал обслуживать этот аккаунт.

  • appTransactionID, по словам Apple, остается неизменным для Apple Account даже после возврата или повторной покупки, поэтому привязывайте к нему свои записи, и покупатель, который заплатит снова, будет узнан.
  • AppTransaction.refresh() получает свежую запись из App Store, но показывает запрос на вход. Apple советует вызывать его только после явного действия пользователя, например нажатия кнопки восстановления покупок.
  • Подписанное значение хранится на устройстве. Документация Apple не описывает для него серверного уведомления, поэтому ваш сервер знает только то, что сообщит приложение.
Разработчик держит перед ноутбуком телефон с замком на экране и проверяет доступ после возврата за платное приложение

На Android запросите у Play Integrity вердикт о лицензии

Удаление со стороны Google решает большинство случаев, но копия может его пережить, например установленная из резервной копии в обход магазина. Play Integrity API возвращает appLicensingVerdict для аккаунта, в который выполнен вход. LICENSED означает, что у пользователя есть право на приложение. UNLICENSED означает, что его нет, и Google предлагает показать диалог GET_LICENSED. UNEVALUATED означает, что Google не смог проверить, например потому, что пользователь не вошел в Google Play. Google также отмечает, что на некоторых старых устройствах пользователь сохраняет право после удаления, поэтому LICENSED не на каждом устройстве доказывает действующую покупку.

Сделайте сервер привратником

Проверки на клиенте можно вырезать патчем. Защищать стоит платную работу, которую выполняет ваш бэкенд, поэтому пусть бэкенд отклоняет вызовы от аккаунта, чей последний отчет был возвратом, вердиктом UNLICENSED или отсутствием вердикта после выбранного вами льготного периода. Именно это не дает возврату превратиться в бесплатные вычисления.

Когда платному приложению стоит перейти на встроенные покупки

Собственное руководство Apple по смене бизнес-модели описывает переход от платного приложения к бесплатному со встроенными покупками и использование originalAppVersion в AppTransaction, чтобы и дальше давать премиум-функции тем, кто купил платную версию. Выгода такого шага для возвратов конкретна. Как только цена переносится на нерасходуемую покупку или подписку, возвраты приходят как уведомления REFUND и аннулированные покупки, на которые ваш сервер может реагировать, а запрос на возврат за подписку в App Store вызывает CONSUMPTION_REQUEST. Это те сигналы, которые слушает RefundHalt и на которые отвечает в пределах 12-часового и 24-часового окон. Платная загрузка не дает вам ни одного из них.

Частые вопросы

Сколько времени есть у покупателя, чтобы вернуть платное приложение в Google Play?
До двух часов после покупки для полного возврата, согласно справке Play Console от Google, и только один раз на приложение. Правила возврата Google также говорят, что покупатель может получить возврат в течение 48 часов, после чего Google направляет его к разработчику. В рамках возврата приложение удаляется.
Уведомляет ли Apple мой сервер, когда кто-то возвращает мое платное приложение?
Такое уведомление не задокументировано. App Store Server Notifications от Apple охватывают события встроенных покупок, а тип REFUND перечисляет только расходуемые и нерасходуемые покупки, автовозобновляемые и невозобновляемые подписки. Приложение может прочитать revocationDate в AppTransaction на устройстве и сообщить его вашему серверу.
Сохраняет ли покупатель доступ к платному приложению на iOS после возврата?
Разработчики на форумах Apple сообщают, что сохраняет, а документация Apple не описывает ни одного шага, который удаляет приложение после возврата. Проверяйте revocationDate в AppTransaction при запуске и пусть ваш сервер перестает обслуживать аккаунты, которые сообщают о возвращенной загрузке.
Могу ли я сам вернуть деньги за платное приложение?
В Google Play да. Play Console позволяет оформлять полные возвраты за платные приложения, но никогда частичные, и Google возвращает свою сервисную комиссию. В App Store нет. Вернуть деньги за покупку в App Store может только Apple.
Могу ли я оспорить возврат за платное приложение данными об использовании?
Нет. CONSUMPTION_REQUEST от Apple задокументирован для расходуемых покупок и автовозобновляемых подписок, а проверка чарджбэка в Google Play через orders.reviewrefund приходит через уведомления, созданные для встроенных продуктов и подписок. Ни один магазин не документирует процесс предоставления доказательств для покупки самого приложения.

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

RefundHalt

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

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

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

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