Все статьи
Playbook7 мин чтения

Клиенты, которые дважды заплатили за одну подписку, обычно купили ее на двух платформах, и только один из этих возвратов зависит от вас

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

iPhone и Android-смартфон рядом на столе возле банковской выписки с двумя одинаковыми списаниями: клиента дважды списали за одну и ту же подписку

Главное

  • Клиент, которого дважды списали за одну подписку, обычно купил ее в двух разных магазинах, например в App Store и Google Play. Каждый магазин выставляет счет и возвращает деньги за свою покупку независимо.
  • Разработчик не может вернуть деньги за покупку в App Store. Решает Apple: через reportaproblem.apple.com или через окно возврата, которое приложение открывает методом beginRefundRequest из StoreKit. По словам Apple, одобрение или отказ занимает до 48 часов.
  • В Google Play вы можете сами вернуть деньги за заказ в разделе Order management в Play Console или через API orders.refund. API не возвращает заказы старше 3 лет.
  • Возврат последнего заказа подписки в Google Play сразу удаляет подписку и отменяет будущие продления. Возврат более старого заказа оставляет подписку активной.
  • Apple отправляет CONSUMPTION_REQUEST по запросам на возврат для любого типа продукта, включая автоматически продлеваемые подписки. Если клиент дал согласие, у вас есть 12 часов, чтобы ответить через Send Consumption Information.
  • Для заказов в Google Play, оформленных после 3 августа 2026 года, чарджбэк обходится вам в цену покупки за вычетом сервисного сбора Play плюс комиссия банка за чарджбэк.
  • Если передавать appAccountToken в покупках Apple и обфусцированный ID аккаунта в покупках Google Play, ваш сервер увидит одного клиента за двумя подписками до того, как произойдет второе списание.

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

Почему клиентов дважды списывают за одну подписку

Каждый магазин владеет своей покупкой. Apple выставляет счет за подписку в App Store, Google за подписку в Google Play, а ваш платежный провайдер за веб-план. Ни один из них не знает о существовании других. Ваш сервер единственное место, где две покупки могут встретиться, и то только если у обеих есть ID, который связывает их с одним аккаунтом.

Обычные пути к двойному списанию выглядят так:

  • Клиент меняет телефон, с iOS на Android или обратно, и подписывается снова, потому что новое приложение показывает пейволл.
  • Клиент оформляет подписку на вашем сайте, устанавливает приложение и не входит в аккаунт, поэтому приложение продает ему еще и подписку в магазине.
  • Клиент удаляет приложение и считает, что план на этом закончился. В справке Google сказано, что удаление приложения не отменяет подписку в Google Play, а план в App Store продлевается, пока его не отменят в аккаунте Apple.

«Ваше приложение и сайт явно друг с другом не общаются»

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

Кто может вернуть каждое списание

Здесь большинство ответов поддержки идет не туда. Обещать можно только то, что вы контролируете.

Где куплен дубльКто решает о возвратеКак остановить продлениеВаше участие
App StoreТолько Apple, через reportaproblem.apple.com или окно возврата в вашем приложенииКлиент отменяет подписку в своем аккаунте AppleCONSUMPTION_REQUEST, ответ в течение 12 часов, если клиент дал согласие
Google Play, в течение 48 часов после покупкиКлиент может запросить возврат у Google, или вы можете вернуть деньги самиВозврат последнего заказа отменяет будущие продленияНет при самостоятельном возврате через Google
Google Play, после 48 часовВы, в Play Console или через orders.refundВозврат последнего заказа отменяет будущие продленияРешаете вы
Ваш сайтВы, через своего платежного провайдераВы отменяете на своей сторонеРешаете вы

Может ли разработчик вернуть деньги за подписку в App Store?

Нет. Все возвраты в App Store обрабатывает Apple. Но вы можете сократить путь. Метод beginRefundRequest из StoreKit открывает окно возврата Apple прямо в вашем приложении, с уже заполненными данными покупки и списком причин. Согласно документации Apple, App Store одобряет или отклоняет запрос в течение 48 часов. Вне приложения клиент входит на reportaproblem.apple.com, выбирает «Запросить возврат средств», указывает причину и выбирает подписку.

Возврат на стороне Google Play своими силами

В Google Play контроль у вас. В Play Console откройте Order management, выберите заказ и оформите возврат. Справка Play Console однозначна насчет подписок: верните последний заказ, и подписка сразу удаляется, а будущие продления отменяются. Верните более старый заказ, и подписка остается активной. Если вы это автоматизируете, API orders.refund делает то же самое. Он принимает флаг revoke, чтобы сразу закрыть доступ, и отклоняет заказы старше 3 лет.

Во что вам обходится дублирующая подписка

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

Простой случай

Допустим, клиент три месяца платил $9.99 в месяц и в App Store, и в Google Play, прежде чем заметил. Это $29.97 двойных списаний. Если вы сами вернете три заказа в Google Play, вы отдадите $29.97, и проблема решится в тот же день. Если же клиент пойдет со стороной App Store в Apple, Apple решит, сколько вернуть, а вы узнаете об этом только из серверных уведомлений. В любом случае выручка одной платформы за эти три месяца уходит обратно.

Дорогой случай

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

Расходы, которые продолжаются тем временем

Пока оба плана активны, ваш бэкенд обслуживает одного человека, но видит две подписки. Если вы считаете места, синхронизируете данные или вызываете платные сторонние API по каждой подписке, вы, возможно, платите вдвойне за вычисления, хранение и вызовы API ради одного клиента. Объединение двух записей это прекращает.

Разработчик читает почту поддержки на ноутбуке рядом со смартфоном и разбирается с возвратом за дублирующую подписку

Как разобраться с двойным списанием в поддержке

Отвечайте быстро и одним сообщением. Каждый лишний круг переписки повышает шансы банковского спора.

  • Ищите обе покупки по аккаунту клиента, а не по адресу почты, с которого он написал.
  • Спросите, какой план он хочет оставить. Обычно это план на устройстве, которым он пользуется сейчас.
  • Если дубль в Google Play или на вашем сайте, верните деньги сами и сообщите, что все сделано.
  • Если дубль в App Store, направьте клиента на reportaproblem.apple.com или к кнопке возврата в вашем приложении, если вы ее сделали, и скажите, что подписку нужно отменить в настройках аккаунта Apple.
  • Если затем Apple пришлет CONSUMPTION_REQUEST, а клиент дал согласие, ответьте в течение 12 часов с точными данными об использовании. Дублирующий план, которым никто не пользовался, Apple легко одобрит.

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

Профилактика дешевле любого возврата, и инструменты для нее уже есть в обоих магазинах.

Привязывайте каждую покупку к ID аккаунта

В iOS сгенерируйте UUID для каждого аккаунта и передайте его как параметр покупки appAccountToken. Apple возвращает то же значение в транзакции и в информации о продлении подписки. Если покупка прошла вне вашего приложения, эндпоинт Set App Account Token позволяет позже привязать или обновить токен. В Android передавайте в setObfuscatedAccountId хешированный ID аккаунта длиной не более 64 символов и никогда не передавайте персональные данные в открытом виде.

Проверяйте права доступа перед показом пейволла

Прежде чем показать пейволл, спросите свой сервер, есть ли у вошедшего аккаунта активный план на какой-либо платформе. Сначала покажите предложение войти в аккаунт, а пейволл показывайте только аккаунтам без активного плана.

Отслеживайте два активных плана в одном аккаунте

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

RefundHalt сопоставляет подписки App Store и Google Play с вашими собственными ID аккаунтов. Поэтому клиент, который платит дважды, виден как один человек с двумя планами раньше, чем это заметит его банк.

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

Почему клиента дважды списали за одну и ту же подписку?
Обычно потому, что он купил ее на двух платформах, например в App Store и Google Play, или в магазине и на вашем сайте. Каждый магазин выставляет счет за свою подписку и не знает о другой, поэтому обе продлеваются, пока одну не отменят.
Могу ли я вернуть клиенту деньги за подписку в App Store?
Нет. Возвращать деньги за покупки в App Store может только Apple. Вы можете открыть окно возврата Apple в своем приложении методом beginRefundRequest из StoreKit или направить клиента на reportaproblem.apple.com. По словам Apple, одобрение или отказ занимает до 48 часов.
Как вернуть деньги за дублирующую подписку в Google Play?
Оформите возврат заказа в разделе Order management в Play Console или вызовите API orders.refund. Возврат последнего заказа сразу удаляет подписку и отменяет будущие продления. API не возвращает заказы старше 3 лет.
Отменяет ли возврат денег саму подписку?
В Google Play возврат последнего заказа отменяет будущие продления, а возврат более старого заказа оставляет подписку активной. В App Store решение о возврате принимает Apple, а клиент отменяет подписку в своем аккаунте Apple.
Как не дать пользователям подписаться дважды на iOS и Android?
Привязывайте свой ID аккаунта к каждой покупке: appAccountToken в Apple и обфусцированный ID аккаунта в Google Play. Затем перед показом пейволла проверяйте на сервере, есть ли активный план на любой платформе, и сначала просите пользователя войти в аккаунт.

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

RefundHalt

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

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

Deep dive8 мин чтения

Если ваше приложение удалят из Google Play или App Store, возвраты всё равно могут списываться с ваших выплат

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

Playbook8 мин чтения

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

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

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

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