Заметки · октябрь 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 отменить тоже было нельзя. Выйти можно было, только сначала убрав людей.
Во всех пяти случаях с клиента берут деньги за то, чего у него уже нет или чего он больше не хочет, а приложение не даёт ему способа это остановить. Клиент в таком положении пишет в банк и оспаривает списание. За каждое оспаривание бизнес платит комиссию, а если их слишком много, под угрозой оказывается сам аккаунт Stripe.
Та же нестыковка, только наоборот
Две записи могут расходиться и в обратную сторону, и тогда теряет бизнес. Студии, которые были на Studio или Agency ещё до появления оплаты, имели тариф в приложении и никакой подписки в Stripe. Ничто никогда не просило их заплатить, а выручка основателя считала их по полной цене.
Исправление
Правило стало простым: смена тарифа в приложении сначала проходит через Stripe, а клиент всегда может уйти.
- Когда платящей студии дарят тариф, её подписка сразу отменяется, а неиспользованная часть месяца возвращается. Другим способом поменять тариф платящей студии основатель теперь не может.
- Пока студия приостановлена, с неё ничего не списывают, а её владелец по-прежнему может отменить тариф и открыть страницу оплаты. После снятия приостановки студию просят оплатить текущий месяц, с обычным предупреждением.
- Каждый владелец платит как отдельный клиент Stripe. После передачи студии подписка прежнего владельца действует до конца оплаченного месяца и больше ни разу не списывает деньги. Дальше новый владелец платит своей картой.
- Первый шаг удаления останавливает подписку, а регулярная очистка останавливает те, что остались.
- Отменить тариф и перейти на меньший можно всегда, какого бы размера ни была студия. Это вступает в силу в конце оплаченного месяца, и ничего не удаляется.
- Если за платный тариф никто не платит, владельца предупреждают за 14 дней, как перед концом пробного периода. Владелец может оставить тариф, заплатив, а после этой даты студия переходит на Free.
После исправления каждый из этих случаев прогнали заново на Stripe в тестовом режиме, переводя время вперёд через следующее продление. Деньги с карт списывались только там, где это предусматривают правила основателя.
Проверьте своё приложение
- Выпишите все способы, которыми в вашем приложении может поменяться тариф, кроме покупки и отмены. Вспомните админку, подаренный тариф, купон, приостановку или блокировку, передачу аккаунта другому человеку, его удаление и всё, что может сделать ваша поддержка.
- В тестовом режиме сделайте каждое из них с аккаунтом, который платит. Потом откройте этого клиента в кабинете Stripe. Если ваше приложение говорит Free, приостановлен или удалён, а Stripe всё ещё показывает дату следующего платежа, с этой карты спишут деньги.
- Чтобы увидеть само продление, не дожидаясь конца месяца, используйте тестовые часы Stripe (test clocks): они переводят тестовую подписку вперёд во времени.
- Попробуйте уйти как клиент в каждом состоянии: когда аккаунт приостановлен, сразу после передачи и когда аккаунт больше, чем разрешает ваш бесплатный тариф. Может ли клиент отменить тариф в приложении? Даёт ли это сделать страница оплаты Stripe?
- Если код писал кто-то другой, задайте ему один вопрос: «Перечислите все места, где меняется тариф, и для каждого скажите, что происходит с подпиской Stripe». Если хоть где-то ответ вроде «ничего», это и есть дыра.