Apple и Google позволяют продлить дату обновления подписки после сбоя, но их ограничения совсем не похожи
Когда ваше приложение падает, можно продлить дату обновления подписки, а не ждать запросов на возврат. Разбираем, как работают 90-дневные продления Apple и отсрочка оплаты в Google Play, где каждый магазин проводит границу и во что вам обходится каждый вариант.

Главное
- App Store Server API позволяет разработчику продлить дату обновления оплаченной активной автоматически возобновляемой подписки на срок от 1 до 90 дней, чтобы компенсировать сбой, отменённое мероприятие или прерванную прямую трансляцию.
- Apple допускает два продления даты обновления на одного клиента в течение 365 дней. Вступившее в силу продление отменить нельзя, а Apple отправляет клиенту письмо с новой датой обновления.
- Apple не продлевает подписку, которая находится в бесплатном пробном периоде, в состоянии повторных попыток оплаты, в льготном периоде с уже прошедшей датой окончания или уже истекла. У подписки должен быть хотя бы один оплаченный период.
- Дни, добавленные продлением даты обновления в Apple, не засчитываются в год оплаченного обслуживания, после которого доля разработчика в выручке от подписки растёт с 70% до 85%.
- Метод purchases.subscriptionsv2.defer в Google Play переносит следующую дату списания по подписке минимум на один день и максимум на год за один вызов. Пользователь сохраняет полный доступ без оплаты, а Google отправляет уведомление SUBSCRIPTION_DEFERRED.
- Продление даты обновления не возвращает денег: разработчик сохраняет платёж, но в добавленные дни платит за вычисления, хранение и вызовы API, а обновления, которое покрыло бы эти расходы, нет. Возврат отдаёт клиенту цену, но не возвращает ничего из уже потраченного на его обслуживание.
- Если из-за сбоя встроенная покупка не была доставлена и Apple присылает CONSUMPTION_REQUEST, честное значение deliveryStatus равно UNDELIVERED_SERVER_OUTAGE, а для любого статуса, кроме DELIVERED, Apple требует consumptionPercentage, равный 0.
Простой даёт каждому подписчику самый убедительный повод для возврата, и запретить им этим поводом воспользоваться вы не можете. Зато можете вернуть потерянные дни раньше, чем кто-то об этом попросит. Оба магазина приложений позволяют продлить дату обновления подписки, чтобы клиент получил бесплатное время вместо денег. Apple ограничивает каждое продление 90 днями и разрешает два в год. Google позволяет отсрочить оплату на срок до года за один вызов. Процедуры, уведомления и итоговые расходы различаются настолько, что одного плана на случай сбоя для обоих магазинов не хватит.
Как сбой влияет на риск возвратов
О возвратах решают магазины, а не вы. В App Store клиент обращается к Apple, и Apple принимает решение. Вы можете получить уведомление CONSUMPTION_REQUEST и 12 часов на то, чтобы отправить данные о потреблении через Send Consumption Information. На этом ваше участие заканчивается.
В Google Play покупатель может получить возврат в течение 48 часов после покупки, и вас об этом не спросят. После этого запросы приходят к вам. Единственный процесс Google, в котором запрашиваются ваши доказательства, это чарджбэк, отмеченный для проверки разработчиком: на него вы отвечаете через orders.reviewrefund в течение 24 часов. Решение банка по чарджбэку окончательное.
Значит, ни один магазин не даёт способа заблокировать возврат. В ваших руках другое: будет ли подписчик чувствовать себя обделённым, когда сервис снова заработает. Дополнительное время по подписке, выданное быстро и понятно объявленное, это именно тот инструмент, который оба магазина создали для такой ситуации.
Как продлить дату обновления подписки в App Store
Для этого в App Store Server API есть два эндпоинта. Extend a Subscription Renewal Date работает с одной подпиской, которую вы указываете по её originalTransactionId. Extend Subscription Renewal Dates for All Active Subscribers работает со всеми подходящими подписчиками одного productId, и его можно ограничить через storefrontCountryCodes, если сбой затронул только некоторые регионы.
Каждый запрос содержит три параметра: extendByDays, число от 1 до 90; extendReasonCode; и requestIdentifier, который вы генерируете сами. Код причины 3 означает проблему с сервисом или сбой. Код 1 означает удовлетворённость клиента, код 2 означает другие причины, а код 0 означает, что причина не указана.
Какие подписки Apple продлит
Подходят только активные автоматически возобновляемые подписки, у которых есть хотя бы один ранее оплаченный период. Apple пропускает такие подписки:
- Подписки в бесплатном пробном периоде, например в бесплатном триале.
- Неактивные подписки в состоянии повторных попыток оплаты.
- Подписки в льготном периоде оплаты, дата окончания которого уже прошла.
- Подписки, которые уже получили два продления даты обновления за последние 365 дней.
- Истёкшие подписки.
Семейный доступ работает автоматически. Когда Apple продлевает купленную подписку с поддержкой семейного доступа, подписки членов семьи тоже продлеваются. Напрямую выбрать подписку члена семьи нельзя.
Массовый запрос выполняется медленно, поэтому следите за уведомлениями
Apple предупреждает, что запрос на продление для всех активных подписчиков может занять часы или даже дни, в зависимости от их количества. Ответ 200 означает лишь, что Apple начала обработку. О результате вам сообщит App Store Server Notifications V2:
| Уведомление | Подтип | Что оно означает |
|---|---|---|
| RENEWAL_EXTENDED | нет | Дата обновления одной подписки продлена |
| RENEWAL_EXTENSION | FAILURE | Продление одной подписки не удалось |
| RENEWAL_EXTENSION | SUMMARY | Весь массовый запрос завершён |
Для каждого FAILURE возьмите originalTransactionId из подписанной транзакции в payload и повторите запрос через эндпоинт для одной подписки. Если удобнее опрашивать, Get Status of Subscription Renewal Date Extensions сообщает, завершён ли запрос и сколько продлений прошло успешно или с ошибкой.
Как работает отсрочка оплаты в Google Play
В Google для этого есть purchases.subscriptionsv2.defer, который вызывается один раз на каждый токен покупки. Тело запроса содержит deferralContext с тремя полями. Значение etag берётся из purchases.subscriptionsv2.get, и вызов завершится ошибкой, если оно не совпадает с последним etag подписки. Поле deferDuration задаёт, на сколько перенести дату. А validateOnly со значением true выполняет запрос как пробный прогон, не затрагивая подписку.
Руководство Google по биллингу задаёт диапазон от одного дня до одного года за один вызов API. Чтобы отсрочить дальше, вызовите метод снова до наступления новой даты окончания. Для автоматически продлеваемой подписки отсрочка переносит следующую дату обновления. Для предоплаченного плана она переносит время окончания. Для подписки с дополнениями все позиции откладываются на один и тот же срок. В ответе указан новый expiryTime каждой позиции.
Во время отсрочки пользователь остаётся подписанным, сохраняет полный доступ и не платит за дополнительное время. Google отправляет уведомление разработчику в реальном времени SUBSCRIPTION_DEFERRED. Старый метод purchases.subscriptions.defer устарел, поэтому в новом коде используйте метод v2.
Google не сообщает клиенту, поэтому это придётся сделать вам
Apple отправляет клиенту письмо после каждого успешного продления. Руководство Google по биллингу вообще не описывает никакого сообщения пользователю. Если цель в том, чтобы предотвратить запросы на возврат, подписчик должен знать о дополнительном времени. Сообщите ему сами, в приложении и по почте, и укажите, сколько дней и почему.
Apple и Google в сравнении
| Apple App Store | Google Play | |
|---|---|---|
| API | Extend a Subscription Renewal Date и массовый эндпоинт | purchases.subscriptionsv2.defer |
| Срок за один запрос | От 1 до 90 дней | От 1 дня до 1 года |
| Как часто | Дважды на клиента в течение 365 дней | Ограничение не указано; вызовите снова до новой даты окончания |
| Массовый вариант | Один вызов на productId, при необходимости по витринам | Один вызов на токен покупки |
| Бесплатный пробный период | Не подходит | В руководстве Google не описано |
| Уведомление | RENEWAL_EXTENDED, RENEWAL_EXTENSION | SUBSCRIPTION_DEFERRED |
| Уведомление клиента | Apple отправляет письмо | На вашей стороне |
| Можно отменить | Нет | В руководстве Google не описано |
Во что обходится продление по сравнению с возвратом
Возврат и продление забирают деньги из разных мест. Возврат отдаёт то, что клиент заплатил за период. Всё, что вы уже потратили на обслуживание этого клиента, остаётся потраченным: вычисления на каждую сессию, вызовы API моделей, хранение и любые выплаты автору, чей контент он использовал.
Продление сохраняет платёж. Его цена в том, что вы оказываете услугу без обновления, которое бы за неё заплатило. Каждый добавленный день активный подписчик продолжает накапливать те же счета. Для лёгкого пользователя это почти ноль. Для активного пользователя ИИ-функции 30 дополнительных дней могут означать 30 дней вызовов модели без какой-либо выручки. Подбирайте срок продления по длительности сбоя, а не по размеру извинения, которое вам хотелось бы принести.
| Чем вы жертвуете | Возврат | Продление даты обновления |
|---|---|---|
| Платёж за подписку | Возвращается клиенту | Остаётся у вас |
| Уже понесённые расходы на обслуживание клиента | Потеряны | Потеряны |
| Вычисления, хранение и вызовы API в добавленные дни | Нет, доступ прекращается | Оплачиваете вы, обновления ещё нет |
| Подписка после этого | Прекращается, если возврат отзывает доступ | Активна, обновляется в новую дату |
Цена в виде комиссии Apple
Apple выплачивает 70% от каждого обновления в течение первого года оплаченного обслуживания подписчика и 85% после этого. На странице Apple о подписках сказано, что дни продления не входят в дни оплаченного обслуживания. Поэтому продление на 30 дней отодвигает переход этого подписчика на 85% на 30 дней. Если вы участвуете в App Store Small Business Program, вы уже получаете 85%, и эта цена к вам не относится.
Цена в виде чарджбэков в Google Play
Для заказов, оформленных после 3 августа 2026 года, чарджбэк, который выиграл держатель карты, обходится разработчику в Google Play в стоимость покупки за вычетом сервисного сбора Play плюс комиссии банка. Сбой как раз из тех событий, которые отправляют раздражённого клиента в банк. Отсрочка, которая дойдёт до него раньше, дешевле спора, который вы не сможете выиграть.

Когда продление не подходит
Покупка не была подпиской
Продление даты обновления применяется только к подпискам. Если сбой сломал расходуемую покупку или разовую разблокировку, доставьте товар повторно. Если Apple пришлёт по ней CONSUMPTION_REQUEST, сообщите, что произошло. В поле deliveryStatus у Apple есть для этого значение UNDELIVERED_SERVER_OUTAGE, и Apple указывает, что любой статус, кроме DELIVERED, должен сопровождаться consumptionPercentage, равным 0.
Клиент уже использовал оба продления Apple
Лимит Apple составляет два продления на клиента за 365 дней. Два сбоя за год исчерпают оба, и после третьего вам будет нечего предложить через магазин. Отслеживайте, сколько продлений использовал каждый originalTransactionId, чтобы уведомления FAILURE по массовому запросу не стали сюрпризом.
Клиент на бесплатном пробном периоде
Apple не продлевает подписку в бесплатном пробном периоде. Пользователь триала потерял бесплатные дни, а не оплаченные, поэтому риск возврата низкий. Если хотите компенсировать ему неудобства, сообщение в приложении обойдётся дешевле любого вызова API.
Чек-лист на случай следующего сбоя
- Зафиксируйте, когда сбой начался и закончился и какие продукты и регионы он затронул.
- Выберите число дней, покрывающее потерянное время. В Apple используйте код причины 3 и держитесь в пределах от 1 до 90.
- В Apple отправляйте один массовый запрос на каждый productId, ограничивая его через storefrontCountryCodes, если пострадали только некоторые регионы.
- Отслеживайте RENEWAL_EXTENSION FAILURE и повторяйте каждый случай через эндпоинт для одной подписки.
- В Google Play пройдитесь по активным токенам покупок, прочитайте etag каждого, сначала выполните запрос с validateOnly, затем отсрочьте по-настоящему.
- Сами сообщите подписчикам Google Play о дополнительном времени, потому что Google этого не сделает.
- Обновляйте срок действия прав по RENEWAL_EXTENDED и SUBSCRIPTION_DEFERRED, а не по собственным расчётам дат.
- Храните логи использования по каждому аккаунту, чтобы при запросе на возврат или чарджбэке ваши доказательства были готовы в течение 12 часов для Apple и 24 часов для Google.
Частые вопросы
- Сколько раз можно продлить дату обновления подписки в App Store?
- Дважды на клиента в течение 365 дней. Каждое продление может составлять от 1 до 90 дней, а подписка, которая уже получила два продления за последние 365 дней, для нового не подходит.
- Сообщает ли Apple клиенту, что я продлил его подписку?
- Да. После успешного продления даты обновления Apple отправляет клиенту письмо с новой датой обновления. Руководство Google Play по биллингу такого сообщения не описывает, поэтому на Android подписчиков нужно уведомлять самостоятельно.
- На какой срок можно отсрочить подписку в Google Play?
- Руководство Google по биллингу указывает от одного дня до одного года за один вызов purchases.subscriptionsv2.defer. Чтобы отсрочить дальше, вызовите API снова до наступления новой даты окончания. Пользователь сохраняет полный доступ и не платит за отсроченное время.
- Можно ли отменить продление даты обновления в Apple?
- Нет. Apple говорит, что после вступления продления подписки в силу отменить его невозможно. Перед отправкой запроса проверьте продукт, число дней и витрины.
- Влияет ли продление даты обновления на мою долю выручки 85% в Apple?
- Да. Apple не включает дни продления в дни оплаченного обслуживания, поэтому продление откладывает переход подписчика с 70% на 85% на число добавленных дней. Разработчики в App Store Small Business Program уже получают 85%.
- Можно ли продлить подписку на бесплатном пробном периоде?
- В App Store нельзя. Apple исключает подписки в бесплатном пробном периоде, а также в состоянии повторных попыток оплаты, с истёкшим льготным периодом и истёкшие подписки. Подходят только активные подписки хотя бы с одним оплаченным периодом.
Источники и дополнительное чтение
- Apple Developer: Extending the renewal date for auto-renewable subscriptions
- Apple Developer: Extend a Subscription Renewal Date
- Apple Developer: Extend Subscription Renewal Dates for All Active Subscribers
- Apple Developer: extendReasonCode
- Apple Developer: Auto-renewable subscriptions
- Apple Developer: deliveryStatus
- Google Play Developer API: purchases.subscriptionsv2.defer
- Google Play Billing: Manage subscriptions and one-time purchases
- Google Play Billing: Subscription lifecycle
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Автопилот возвратов для App Store и Google Play
Читайте дальше
Чрезмерные запросы на возврат обходятся дороже самих возвратов: оба магазина приложений считают их сигналом качества
Правило 5.6.4 Apple прямо называет чрезмерные запросы на возврат признаком того, что приложение не соответствует стандартам качества, а соглашение Google о распространении позволяет удалять приложения новых разработчиков по доле возвратов. Разбираем, что пишет каждый магазин, во что обходится удаление и как не попасть под удар.
Проверяйте серверные уведомления App Store, прежде чем реагировать на возврат, ведь отправить запрос на ваш URL вебхука может кто угодно
Уведомление о возврате остается обычным HTTPS-запросом, пока вы не проверили его подпись. Рассказываем, как проверять серверные уведомления App Store и сообщения RTDN из Google Play, что подписывает каждый магазин и во что обходится поддельный или ошибочно отклоненный возврат.