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

Каждый тип внутренней покупки возвращается по-своему, и только два из них вообще спрашивают вашу сторону

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

Стопка монет, навесной замок, календарь и билет в ряд на тепло освещённом столе, показывающие, как каждый тип внутренней покупки возвращается по-своему

Главное

  • В App Store есть четыре типа внутренних покупок: расходуемые, нерасходуемые, автопродлеваемые подписки и непродлеваемые подписки, и каждый возвращается по своим правилам. Google Play сортирует тот же каталог на разовые продукты и подписки.
  • Только два потока Apple вообще просят у разработчика доказательства до принятия решения о возврате: расходуемый CONSUMPTION_REQUEST и, начиная с WWDC24, CONSUMPTION_REQUEST по автопродлеваемой подписке. Нерасходуемые покупки и непродлеваемые подписки почти никогда не открывают это окно.
  • Расходуемые покупки несут наибольший риск возврата. Они тратятся при выдаче, их нельзя восстановить, и их ценность исчезает до того, как приходит возврат, именно поэтому Apple просит у вас данные о потреблении по ним.
  • Нерасходуемые покупки постоянны и восстанавливаемы, поэтому возврат должен отозвать право, которое аккаунт клиента всё ещё помнит. В Google Play покупка, которую вы не подтвердили в течение 72 hours, автоматически возвращается, и доступ отзывается.
  • Автопродлеваемые подписки возвращаются по часам. Apple вычисляет, сколько было потреблено, из прошедшего времени, а не из числа, которое вы отправляете, поэтому ваша задача, это честный refundPreference и данные об использовании за ним.
  • В App Store только Apple может оформить возврат внутренней покупки. В Google Play вы можете вернуть заказ сами из Play Console, из-за чего тип продукта, который вы продали, становится вашим собственным решением.
  • Каким бы ни был тип, возврат возвращает клиенту комиссию магазина, но никогда не возвращает ваши расходы. Вычисления, вызовы API, хранилище и выплаты, которые уже запустила расходуемая покупка, остаются потерянными.

Тип внутренней покупки, который вы выбрали в App Store Connect или Play Console, решает больше, чем то, как продукт продаётся. Он решает, как поведёт себя возврат, когда он придёт, сможет ли клиент вернуть предмет бесплатно после этого и спросят ли вообще вашу сторону до того, как деньги двинутся. Набор монет, пожизненная разблокировка, ежемесячная подписка и разовый сезонный абонемент, это четыре разных юридических и технических объекта, и правила возврата относятся к ним именно так. Большинство разработчиков выпускают их все через один и тот же код покупки, а потом удивляются, почему возвраты кажутся непоследовательными. Они не непоследовательны. Они зависят от типа.

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

Четыре типа внутренних покупок и почему возвраты разделяются по ним

Apple определяет четыре типа продуктов. Расходуемая покупка используется и покупается снова: игровая валюта, подсказки, пополнение энергии. Нерасходуемая покупка покупается один раз и остаётся навсегда: pro-разблокировка, удаление рекламы, скачиваемый набор уровней. Автопродлеваемая подписка списывается по повторяющемуся циклу, пока клиент не отменит. Непродлеваемая подписка даёт доступ на фиксированный срок, который не продлевается сам, как сезон контента, проданный одним периодом.

Google Play сортирует тот же каталог иначе, но приходит к тому же. Он делит продукты на разовые продукты и подписки, а разовый продукт помечается как расходуемый или нет по тому, потребляет ли его ваше приложение после покупки. Слова разные. Последствия для возврата, нет.

Тип внутренней покупкиВосстанавливается после возвратаЦенность на момент возвратаСпрашивает ли Apple ваши доказательства
РасходуемаяНет, восстановить нельзяОбычно уже потраченаДа, CONSUMPTION_REQUEST
НерасходуемаяДа, привязана к аккаунтуВсё ещё удерживается, право отзываетсяРедко
Автопродлеваемая подпискаДа, пока активнаПропорционально прошедшему времениДа, начиная с WWDC24
Непродлеваемая подпискаВаше приложение должно восстановитьСрок частично истёкРедко

Расходуемые покупки, это тип, на который реально нацелено возвратное мошенничество

Расходуемая покупка, это самый сложный случай возврата, с которым вы столкнётесь, и не случайно именно вокруг неё Apple построила запрос о потреблении. В тот момент, когда клиент покупает 10,000 монет, а ваш сервер выдаёт их, ценность доставлена. Если он потратит эти монеты и потом подаст на возврат, магазин может вернуть его деньги, но монеты исчезли, как и всё, что вам стоило их выдать. Собственный инструментарий Apple отражает это: расходуемая покупка покидает запись транзакции после завершения и никогда не несёт дату отмены, потому что отменять нечего постоянного.

Именно поэтому расходуемая покупка, это тип продукта, где доказательства окупаются. Когда клиент запрашивает возврат по расходуемой покупке, Apple отправляет вашему серверу CONSUMPTION_REQUEST и ждёт до 12 hours вызова Send Consumption Information. В этом вызове вы задаёте deliveryStatus и, если вы доставили, consumptionPercentage. Процент, это целое число в milliunits от 0 до 100,000, где 100,000 означает, что клиент использовал всю покупку. Баланс монет, который по вашим записям полностью потрачен, это 100,000, которые вы можете сообщить, и это самый сильный отдельный факт, который вы можете предъявить в ответ на заявление о непреднамеренной покупке.

Расходуемые покупки нельзя восстановить, поэтому время решает всё

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

Подписки возвращаются по часам, которые вы не контролируете

На автопродлеваемых подписках большинство приложений зарабатывают деньги, и обновление возвратов WWDC24 наконец направило их через то же окно доказательств, что и расходуемые покупки. Начиная с App Store Server Notifications version 2.11, запрос на возврат по автопродлеваемой подписке тоже запускает CONSUMPTION_REQUEST. Так что возвраты по подпискам, которые раньше решались полностью без вас, теперь приходят с прикреплённым 12-часовым окном.

Загвоздка в том, как измеряется потребление. Для автопродлеваемой подписки Apple не хочет, чтобы вы придумывали процент использования. Она вычисляет потребление из прошедшего времени сама, поэтому тот, кто на шестом месяце годового плана, читается как примерно наполовину потреблённый, что бы вы ни отправили. Ваш рычаг, это не процент. Это честный refundPreference со значением GRANT_FULL, GRANT_PRORATED или DECLINE, подкреплённый тем сигналом об использовании, который у вас реально есть. Отправьте предпочтение, которое поддерживают доказательства, и дайте Apple взвесить его.

Непродлеваемые подписки ближе к разовой разблокировке

Непродлеваемая подписка, это фиксированный срок, который клиент покупает один раз, и для целей возврата она ведёт себя больше как нерасходуемая покупка, чем как автопродлеваемый план. Apple редко направляет к ней CONSUMPTION_REQUEST, и нет автоматического продления, к которому можно применить пропорцию. Ваше приложение отвечает за отслеживание срока и его восстановление на всех устройствах клиента, поэтому возврат означает завершение окна доступа, которым управляли вы сами, а не то, которое Apple отсчитывала за вас.

Нерасходуемые покупки постоянны, а это палка о двух концах

Нерасходуемая покупка, это самое чистое, что можно продать, и тихая ловушка при возврате. Она покупается один раз, она привязана к аккаунту клиента в магазине навсегда, и магазин может восстановить её на любое устройство по требованию. Эта постоянность, это преимущество, пока не приходит возврат, потому что теперь вам нужно отозвать право, которое аккаунт всё ещё помнит. Если ваша логика отзыва проверяет только на момент покупки и никогда не перепроверяет, клиент с возвратом может восстановить покупки и спокойно вернуться в платную функцию.

Google Play добавляет здесь одну жёсткую грань, которая ловит новых разработчиков. Если ваше приложение не подтверждает покупку в течение 72 hours, Google автоматически возвращает её и отзывает право. Нерасходуемая покупка, которую ваш платёжный код забыл подтвердить, не зависает в неопределённости. Она отменяется сама, и клиент теряет доступ к тому, за что заплатил, без всякого запроса с его стороны.

Смартфон, показывающий подтверждение платежа рядом с небольшой стопкой монет, несколько из которых отодвинуты в сторону, иллюстрирует, как каждый тип внутренней покупки возвращается по разным правилам

Кто вообще может оформить возврат, меняется от магазина и типа

Прежде чем планировать любой ответ на возврат, узнайте, у кого ручка. В App Store только Apple может оформить возврат внутренней покупки, для каждого типа продукта. Ваш код StoreKit не может вернуть покупку, и ваша служба поддержки тоже. Вы можете отправить данные о потреблении, чтобы повлиять на решение Apple по двум типам, которые открывают окно, и это весь ваш прямой контроль.

Google Play, это противоположность. Вы можете вернуть разовый продукт или заказ подписки сами из Play Console или через Voided Purchases и API возврата, полностью или частично. Эта свобода, это и ответственность: возврат, который вы оформляете по расходуемой покупке, всё равно должен отозвать предмет в вашем собственном бэкенде, потому что Google не знает, что ваши монеты потрачены. Тип продукта, который вы выбрали, решает, насколько чистым будет этот отзыв.

Что на самом деле стоит вам каждый тип возврата

Возвращённая цена, это строка, за которой все следят, и самая малая часть счёта. Когда любой магазин оформляет возврат, он вместе с ним отменяет свою комиссию, поэтому вы теряете чистую выручку, а не полную розничную цену. Это хорошая новость, и на этом она заканчивается. То, что магазин возвращает, это доля, которую он взял. То, что он никогда не возвращает, это то, что вы уже потратили на исполнение продажи, и это число резко меняется в зависимости от типа продукта.

Расходуемая покупка, это дорогой возврат

Возвращённая расходуемая покупка, это та, что может стоить больше своей цены. Скажем, клиент покупает 5,000 кредитов, каждый из которых запускает платный вызов вывода, тратит 4,000 из них, а потом подаёт на возврат. Магазин возвращает цену и свою комиссию, но вычисления, счёт за API по токенам, изображения, которые вы сгенерировали, и любая выплата авторам, которую профинансировали эти кредиты, все потрачены. Возврат нерасходуемой покупки хотя бы возвращает право под ваш контроль. Возврат расходуемой покупки забирает обратно продажу, всю стоимость которой вы уже оплатили.

Чарджбэк, это более тяжёлая версия того же счёта

Возврат и чарджбэк, это разные события, и у разрыва между ними теперь есть дата. Когда клиент оспаривает списание в своём банке, а не просит магазин, завершённый чарджбэк окончателен со стороны банка. Для заказов Google Play, размещённых 3 августа 2026 года или позже, проигранный чарджбэк списывает с разработчика цену покупки за вычетом сервисного сбора Play плюс банковский сбор за чарджбэк, фиксированная плата, которую устанавливает платёжная сеть. Google Play направляет чарджбэк вам на рассмотрение через orders.reviewrefund с 24-часовым окном, единственный поток Google, который просит ваши доказательства, и он может прийти по любому типу продукта.

Как реагировать, когда правила определяет тип

Вы не можете изменить, на какой тип продукта придёт возврат, после продажи, но вы можете перестать обрабатывать все четыре одинаково.

  • Фиксируйте выдачу и потребление для расходуемых покупок в момент, когда они происходят. Этот журнал, это вся ваша защита по единственному типу, который нельзя восстановить, а 12-часовое окно слишком коротко, чтобы строить его с нуля.
  • Перепроверяйте права для нерасходуемых покупок после возврата, а не только при покупке. Вызов восстановления должен проверять текущий статус, чтобы клиент с возвратом не смог вернуться в платную функцию.
  • Отвечайте на оба окна доказательств автоматически. 12-часовой запрос о потреблении и 24-часовое рассмотрение чарджбэка не могут ждать, пока кто-то прочитает почту, и они не продлеваются под часовые пояса.
  • Оценивайте свою защиту от возвратов только по двум оспоримым типам. Растущее число возвратов по типам, которые никогда не открывали окно, это сигнал о продукте или ценообразовании, а не провал ваших доказательств.

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

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

Могу ли я вернуть внутреннюю покупку сам?
Это зависит от магазина. В App Store только Apple может оформить возврат внутренней покупки, для каждого типа продукта, поэтому ваше единственное влияние, это данные о потреблении, которые вы отправляете по двум потокам, что их просят. В Google Play вы можете вернуть разовый продукт или заказ подписки сами из Play Console или через API возврата, полностью или частично.
У какого типа внутренней покупки самый высокий риск возврата?
У расходуемых. Расходуемая покупка тратится при выдаче, её нельзя восстановить, и её ценность обычно исчезает до того, как приходит запрос на возврат. Именно поэтому Apple отправляет CONSUMPTION_REQUEST по расходуемым покупкам и просит ваши данные о потреблении, и поэтому вычисления или стоимость API за расходуемой покупкой могут сделать её возврат дороже самой продажи.
Отправляет ли Apple запрос о потреблении для каждого типа покупки?
Нет. Apple отправляет CONSUMPTION_REQUEST для расходуемых покупок и, начиная с обновления WWDC24, для автопродлеваемых подписок. Нерасходуемые покупки и непродлеваемые подписки редко открывают это окно доказательств. Для каждого типа сам возврат всё равно решает Apple, а не вы.
Может ли клиент восстановить расходуемую покупку после возврата?
Нет. Расходуемые покупки нельзя восстановить, что и делает их возвраты окончательными для вас. Нерасходуемые покупки и активные подписки привязаны к аккаунту клиента в магазине и могут быть восстановлены, поэтому возврат по ним должен отозвать право, которое ваш бэкенд должен перепроверить, а не доверять ему с момента покупки.
Как иначе рассчитываются возвраты по подпискам?
Для автопродлеваемой подписки Apple вычисляет, сколько было потреблено, из прошедшего времени, а не из процента, который вы отправляете, поэтому половина срока читается как примерно наполовину потреблённая. Ваша роль, это честный refundPreference со значением GRANT_FULL, GRANT_PRORATED или DECLINE, подкреплённый данными об использовании, которые у вас есть, а не придуманное число потребления.

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

RefundHalt

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

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

Deep dive8 мин чтения

Законы о возврате средств за приложения меняются в зависимости от страны клиента, и почти ни один из них не даёт вам права голоса

Законы о возврате средств за приложения различаются между ЕС, Великобританией и США, но для большинства продаж приложений результат один и тот же. 14-дневное право на отказ в ЕС обычно аннулируется при оформлении покупки, покупатели в США полагаются на политику магазина, и ни один законный возврат не даёт вам возможности ответить. Лишь два магазинных потока когда-либо спрашивают вашу сторону.

Deep dive8 мин чтения

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

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

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

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