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

Возвраты за дополнения к подпискам Google Play можно делать по одному элементу, но клиент может отменить только весь пакет

Google Play позволяет добавить к базовой подписке до 49 дополнений на одном токене покупки. Разбираем, как работают возвраты за дополнения к подписке, какой вызов API возвращает деньги за один элемент, не затрагивая остальные, где Google это блокирует и во что вам обходится каждый способ возврата.

Человек за столиком в кафе смотрит в телефон на Android рядом с подробным чеком. Это пакетная покупка, где возвраты за дополнения к подписке Google Play считаются построчно

Главное

  • Функция подписок с дополнениями в Google Play объединяет базовую подписку и до 49 дополнений, всего 50 элементов, в одну покупку. У всех элементов должен быть одинаковый период регулярного списания.
  • Пользователи Google Play не могут отменить отдельное дополнение в центре подписок Play. Они могут отменить только базовую подписку вместе с дополнениями, поэтому удаление одного дополнения должно происходить в приложении разработчика.
  • Метод purchases.subscriptionsv2.revoke принимает itemBasedRefund с одним productId. Если другие элементы остаются активными, Google отзывает и полностью возвращает только этот элемент, а подписка продолжает работать.
  • Google блокирует возврат по элементу, если подписка находится в состоянии отклонённого платежа, если срок элемента истёк или он не принадлежит пользователю, а также для предоплаченных подписок.
  • proratedRefund для подписки с дополнениями возвращает последний заказ каждого элемента пропорционально времени до следующего продления и сразу отзывает доступ ко всем элементам.
  • Уведомления для разработчиков в реальном времени по подписке с дополнениями не содержат subscriptionId. Поэтому бэкенд должен вызвать purchases.subscriptionsv2.get и прочитать каждый lineItem, чтобы понять, какие элементы ещё дают доступ.
  • Единственный процесс возврата в Google Play, где разработчика просят предоставить доказательства, это чарджбэк, отмеченный для проверки через orders.reviewrefund, со сроком 24 часа. Для заказов, оформленных после 3 августа 2026 г., проигранный чарджбэк стоит разработчику цены покупки за вычетом сервисного сбора Play плюс комиссии банка.

Если вы продаёте в Google Play базовую подписку с тремя дополнениями, вы можете вернуть деньги за любое из них, не отменяя остальные. Ваш клиент со своей стороны так сделать не может. Google разрешает пользователям отменять только весь пакет, поэтому точные инструменты для возвратов за дополнения к подпискам Google Play есть только у вас, разработчика, и только через API. Используйте их правильно, и вы вернёте деньги именно за ту позицию, с которой возникла проблема. Выберите не тот вызов, и вы вернёте или отзовёте всё.

Как устроена подписка с дополнениями

Google объявила оформление нескольких продуктов в одной подписке на I/O 2025. Один процесс покупки продаёт базовую подписку и необязательные дополнения, которые оплачиваются вместе по одному графику. Руководство Google для разработчиков задаёт жёсткие ограничения:

  • Дополнения могут быть только у базовых планов с автопродлением. У предоплаченных планов их быть не может.
  • У всех элементов должен быть одинаковый период регулярного списания. Ежемесячные дополнения к годовой базовой подписке не допускаются.
  • Покупка содержит не более 50 элементов, то есть одну базовую подписку и до 49 дополнений.
  • Функция недоступна в Южной Корее.

Всё это хранится на одном токене покупки. Когда вы вызываете purchases.subscriptionsv2.get, ответ содержит список lineItems, по одной записи на элемент. У каждой позиции свои productId, expiryTime и latestSuccessfulOrderId. Именно последнее поле делает возможными возвраты по отдельным элементам: у каждого элемента свой последний заказ.

Пропорциональное списание начинается с первого дня

Когда пользователь добавляет дополнение посреди цикла, Google сразу списывает пропорциональную сумму, чтобы дополнение продлевалось в ту же дату, что и базовая подписка. Собственный пример Google: ежемесячное дополнение за 10 $, добавленное 15 августа после 7-дневного пробного периода, за которое списали 2,90 $ за остаток августа. Значит, у одного дополнения может быть короткий заказ с нестандартной суммой до первого полного заказа. Помните об этом, когда выясняете, какой заказ затронет возврат.

Клиент может отменить только весь пакет

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

Поэтому у клиента, который хочет отказаться от одного дополнения, в Play Store есть два варианта: отменить всё или попросить вернуть деньги. Ни один из них вам не выгоден. Руководство Google говорит, что удаление может предложить ваше приложение. Удалённое дополнение истекает в конце текущего расчётного периода, а остальная часть пакета продолжает продлеваться.

Сравнение инструментов возврата за дополнения к подпискам Google Play

Google даёт пять способов вернуть деньги по подписке с дополнениями. Они различаются тем, что возвращают и прекращается ли доступ.

ИнструментЧто возвращаетсяЧто происходит с доступом
Возврат конкретного заказа в Play ConsoleВыбранная вами сумма по этому заказуНичего не отзывается
orders.refund без revokeПолная сумма одного заказаНичего не отзывается
subscriptionsv2.revoke с itemBasedRefundПолная последняя оплата за один элементПрекращается только этот элемент, если он не был последним активным
subscriptionsv2.revoke с proratedRefundПоследний заказ каждого элемента пропорционально оставшемуся времениВсе элементы прекращаются сразу
subscriptionsv2.revoke с fullRefundПолная последняя оплата за каждый элементВсе элементы прекращаются сразу

В руководстве по дополнениям Google даёт одно строгое предупреждение: не вызывайте устаревший purchases.subscriptions.refund для подписки с дополнениями. Кроме того, orders.refund не работает с заказами старше трёх лет.

Как работает itemBasedRefund

Объект itemBasedRefund принимает одно обязательное поле, productId, которое указывает элемент для отзыва. Google описывает два исхода:

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

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

Когда Google блокирует возврат по элементу

Google отклоняет itemBasedRefund в трёх случаях. Подписка находится в любом состоянии отклонённого платежа, включая льготный период и блокировку аккаунта. Указанный элемент не принадлежит пользователю или уже истёк. Или покупка является предоплаченной подпиской, где отказ от отдельных элементов вообще не поддерживается.

Что делает возврат по ID заказа

Руководство Google отмечает, что флаг revoke в orders.refund прекращает доступ, только если заказ является последним в подписке. Для более старого заказа возврат проходит, но ничего не отзывается. Play Console работает так же: верните самый последний заказ, и подписка будет удалена. Верните более старый, и она останется активной. В случае с дополнениями берите заказ из latestSuccessfulOrderId нужной позиции, иначе можете вернуть не тот платёж, который имели в виду.

Кто решает вопрос о возврате и когда у вас просят доказательства

Большинство возвратов по подписке с дополнениями решается без вас, как и по любой другой подписке Play. В течение 48 часов после покупки пользователь может обратиться к Google через «Сообщить о проблеме», и решение принимает Google. После этого Google направляет его к вам. А если вы не подтвердите новую покупку подписки в течение трёх дней, Google автоматически вернёт деньги пользователю и отзовёт покупку.

Только один процесс спрашивает вашу версию событий. Когда держатель карты оформляет чарджбэк и Google отмечает его для проверки разработчиком, вы получаете PendingRefundReviewNotification, и у вас есть 24 часа, чтобы вызвать orders.reviewrefund с предпочтением по возврату и доказательствами использования. Решение по самим чарджбэкам принимает банк, и оно окончательное.

Отслеживание возвратов за дополнения на сервере

Справочник Google по RTDN называет SUBSCRIPTION_ITEMS_CHANGED для изменений элемента в пакете подписки и SUBSCRIPTION_REVOKED для подписки, отозванной до истечения срока. Руководство Google говорит, что отзыв через subscriptionsv2.revoke вызывает и уведомление SUBSCRIPTION_REVOKED, и VoidedPurchaseNotification, а также фиксируется в Voided Purchases API.

Подвох в subscriptionId. По словам Google, он не передаётся в RTDN для подписок с дополнениями. Поэтому не полагайтесь на то, что уведомление скажет вам, какой элемент изменился. При каждом уведомлении по пакету:

  • Вызовите purchases.subscriptionsv2.get с purchaseToken.
  • Прочитайте каждый lineItem и его expiryTime. Google говорит, что обновлять expiryTime нужно для всех элементов, а не только для того, который вы ожидаете.
  • Выдавайте или отзывайте доступ по productId, а не по токену покупки.
  • Регулярно опрашивайте Voided Purchases API для подстраховки. Он охватывает последние 30 дней.

Льготный период и блокировка аккаунта действуют на весь пакет

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

Рабочий стол разработчика с ноутбуком, на котором графики расходов на серверы, рядом с подробным счётом, где учтены оплаченные расходы за каждым дополнением к подписке Google Play

Во что вам обходится каждый способ возврата

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

Слишком большой возврат

Дорогая ошибка: использовать fullRefund или proratedRefund, когда жалоба касается одного дополнения. Оба отзывают все элементы, так что вы возвращаете и базовую цену, и теряете подписчика, который хотел остаться. itemBasedRefund возвращает только последнюю оплату за это дополнение. Если он заблокирован, orders.refund по последнему заказу этого элемента вернёт деньги, ничего не прекращая.

Частичные возвраты и сборы

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

Чарджбэки по пакету

Для заказов, оформленных после 3 августа 2026 г., Google перекладывает расходы на чарджбэки на разработчиков. Если чарджбэк проходит, вы платите цену покупки за вычетом сервисного сбора Play плюс комиссии банка. Заказ пакета с несколькими дополнениями означает более крупный заказ, который можно потерять. Журналы использования по каждому дополнению, привязанные к обфусцированному ID аккаунта, это то, что вы отправите при проверке в течение 24 часов.

Чек-лист по возвратам за дополнения

  • Сделайте в приложении способ удалить одно дополнение, потому что Google Play его не предлагает.
  • При каждом уведомлении сохраняйте productId, expiryTime и latestSuccessfulOrderId каждого lineItem.
  • По умолчанию используйте itemBasedRefund, когда проблема в одном дополнении.
  • Если подписка находится в льготном периоде или блокировке аккаунта, вместо этого верните деньги за заказ элемента через orders.refund.
  • Никогда не вызывайте устаревший purchases.subscriptions.refund для пакета.
  • Записывайте использование дополнений по каждому аккаунту, чтобы ответ на проверку чарджбэка можно было отправить в течение 24 часов.
  • Считайте долю возвратов по каждому дополнению, а не только по подписке, чтобы слабое дополнение не пряталось в цифрах базового плана.

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

Может ли пользователь отменить только одно дополнение в подписке Google Play?
Не через Google Play. На справочной странице Google сказано, что пользователи могут отменить базовую подписку и дополнения только вместе. Ваше приложение может предложить удаление одного дополнения, и тогда оно истечёт в конце текущего расчётного периода.
Как вернуть деньги за одно дополнение, не отменяя подписку?
Вызовите purchases.subscriptionsv2.revoke с itemBasedRefund, указав productId дополнения. Если другие элементы остаются активными, Google отзывает и полностью возвращает только этот элемент. Можно также вернуть последний заказ элемента через orders.refund без флага revoke. Деньги вернутся, а доступ останется без изменений.
Почему мой вызов itemBasedRefund не сработал?
Google блокирует его, если подписка находится в состоянии отклонённого платежа, если элемент не принадлежит пользователю или истёк, а также для предоплаченных подписок. Перед вызовом проверьте expiryTime позиции и состояние подписки.
Работает ли пропорциональный возврат для подписки с дополнениями?
Да, но он отзывает всё. Google возвращает последний заказ каждого элемента пропорционально времени до следующего продления, и доступ ко всем элементам сразу прекращается.
Какое RTDN сообщает, что за дополнение вернули деньги?
По руководству Google, отзыв вызывает SUBSCRIPTION_REVOKED и VoidedPurchaseNotification, а SUBSCRIPTION_ITEMS_CHANGED охватывает изменения элемента в пакете. Поскольку для пакетов subscriptionId отсутствует, вызовите purchases.subscriptionsv2.get и прочитайте каждый lineItem, чтобы увидеть, что изменилось.

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

RefundHalt

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

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

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

Чрезмерные запросы на возврат обходятся дороже самих возвратов: оба магазина приложений считают их сигналом качества

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

Подробный разбор8 мин чтения

Проверяйте серверные уведомления App Store, прежде чем реагировать на возврат, ведь отправить запрос на ваш URL вебхука может кто угодно

Уведомление о возврате остается обычным HTTPS-запросом, пока вы не проверили его подпись. Рассказываем, как проверять серверные уведомления App Store и сообщения RTDN из Google Play, что подписывает каждый магазин и во что обходится поддельный или ошибочно отклоненный возврат.

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

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