Илья Шкура
EN UK RU

Заметки · октябрь 2026

Приложение говорит, что тариф закончился, а Stripe продолжает списывать деньги с карты.

Folioport — демонстрационный портал, собранный для кейса: студии вымышленные, данные тестовые, а Stripe работал в тестовом режиме. В нём дизайн-студии делятся работами со своими клиентами, и у него три тарифа: Free, Studio за €29 в месяц и Agency за €79. Оплату тарифов через Stripe добавили в Claude Code по запросам обычными словами. На обычном пути она работала. Студия могла купить тариф и продлить его, неудачный платёж повторялся, а отмена действовала до конца месяца.

Дороже всего стоили проблемы на путях, которыми основатель пользуется реже. На каждом из них приложение говорило о тарифе одно, а Stripe тем временем делал другое.

Один тариф, две записи

Приложение с подписками хранит каждый тариф дважды. У приложения есть своя запись: эта студия на Agency. У Stripe есть подписка: эта карта платит €29 каждый месяц. Обе появляются вместе, когда кто-то покупает тариф, а дальше их ничто не связывает. Stripe списывает деньги, пока ему не скажут остановиться: ваш код, кто-то в кабинете Stripe или его собственные настройки, когда платежи раз за разом не проходят. То, что приложение показывает на своих страницах, тут ничего не значит.

Поэтому каждое место в приложении, которое меняет тариф платящего клиента, должно определять, что происходит с подпиской Stripe и со следующим списанием. Где этого нет, карта продолжает платить.

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

  • Подаренный тариф. Основатель бесплатно дал Agency студии, которая платила €29 за Studio. Приложение показывало Agency без оплаты, а через месяц Stripe снова списал €29. На странице владельца было написано «Contact us to change it», и способа отменить не было. В выручке основателя стояло €0, а деньги продолжали приходить.
  • Приостановленная студия. Основатель приостановил платящую студию, а Stripe продолжал списывать €29 в месяц. Владелец пытался отменить тариф и открыть страницу оплаты, и приложение отказывало в обоих случаях с надписью «This studio is suspended». То есть платили за студию, которой нельзя было пользоваться.
  • Передача студии. Владелец передал студию участнику команды, а подписка осталась на карте прежнего владельца. Новый владелец перешёл на Agency, и за это заплатила карта прежнего. Прежний владелец теперь был только участником и отменить уже не мог.
  • Удаление, остановившееся на полпути. Удаление студии отменяло её подписку только на самом последнем шаге. Когда удаление останавливалось после первого шага, у студии стояло «Being deleted», а через месяц с карты снова списывали деньги.
  • Отмена, в которой приложение отказывало. Владелец студии, где людей больше, чем разрешает Free, не мог перестать платить. Кнопка «Cancel and move to Free» была неактивна, а на странице самого Stripe отменить тоже было нельзя. Выйти можно было, только сначала убрав людей.
Страница отчёта: подаренный тариф продолжал списывать деньги с карты. Как сдано: через месяц снова списано €29, а владелец видит Contact us to change it. После исправления подписка сразу отменяется, и за неиспользованное время возвращается €28,99
Из отчёта: подаренный тариф, как сдано и после исправления.

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

Та же нестыковка, только наоборот

Две записи могут расходиться и в обратную сторону, и тогда теряет бизнес. Студии, которые были на Studio или Agency ещё до появления оплаты, имели тариф в приложении и никакой подписки в Stripe. Ничто никогда не просило их заплатить, а выручка основателя считала их по полной цене.

Исправление

Правило стало простым: смена тарифа в приложении сначала проходит через Stripe, а клиент всегда может уйти.

  • Когда платящей студии дарят тариф, её подписка сразу отменяется, а неиспользованная часть месяца возвращается. Другим способом поменять тариф платящей студии основатель теперь не может.
  • Пока студия приостановлена, с неё ничего не списывают, а её владелец по-прежнему может отменить тариф и открыть страницу оплаты. После снятия приостановки студию просят оплатить текущий месяц, с обычным предупреждением.
  • Каждый владелец платит как отдельный клиент Stripe. После передачи студии подписка прежнего владельца действует до конца оплаченного месяца и больше ни разу не списывает деньги. Дальше новый владелец платит своей картой.
  • Первый шаг удаления останавливает подписку, а регулярная очистка останавливает те, что остались.
  • Отменить тариф и перейти на меньший можно всегда, какого бы размера ни была студия. Это вступает в силу в конце оплаченного месяца, и ничего не удаляется.
  • Если за платный тариф никто не платит, владельца предупреждают за 14 дней, как перед концом пробного периода. Владелец может оставить тариф, заплатив, а после этой даты студия переходит на Free.
Исправленная страница тарифов: Free, Studio за €29 и Agency за €79 в месяц, с оплатой через Stripe и доступной кнопкой Cancel and move to Free
После исправления: страница тарифов, где отменить может каждая платящая студия.

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

Проверьте своё приложение

  • Выпишите все способы, которыми в вашем приложении может поменяться тариф, кроме покупки и отмены. Вспомните админку, подаренный тариф, купон, приостановку или блокировку, передачу аккаунта другому человеку, его удаление и всё, что может сделать ваша поддержка.
  • В тестовом режиме сделайте каждое из них с аккаунтом, который платит. Потом откройте этого клиента в кабинете Stripe. Если ваше приложение говорит Free, приостановлен или удалён, а Stripe всё ещё показывает дату следующего платежа, с этой карты спишут деньги.
  • Чтобы увидеть само продление, не дожидаясь конца месяца, используйте тестовые часы Stripe (test clocks): они переводят тестовую подписку вперёд во времени.
  • Попробуйте уйти как клиент в каждом состоянии: когда аккаунт приостановлен, сразу после передачи и когда аккаунт больше, чем разрешает ваш бесплатный тариф. Может ли клиент отменить тариф в приложении? Даёт ли это сделать страница оплаты Stripe?
  • Если код писал кто-то другой, задайте ему один вопрос: «Перечислите все места, где меняется тариф, и для каждого скажите, что происходит с подпиской Stripe». Если хоть где-то ответ вроде «ничего», это и есть дыра.

Полный кейс со снимками до и после и отчётом: Оплата тарифов и приложения для телефона, которые ИИ добавил в портал: проверены и исправлены. Ещё одна похожая дыра в деньгах: Возврат больше заказа.

Хотите проверить эти случаи в своём приложении? Приложения, собранные с ИИ: каждая проблема — с шагами, которые её показывают, с тем, что она делает с деньгами, и с тестом исправления.