Подписка ломается не на оплате, а на границах жизненного цикла
Жизненный цикл подписки — это не «активна/неактивна», а цепочка состояний: trial, promo, paid, grace, past_due, canceled, churned. Если между ними нет строгой машины состояний, появляются двойные списания, потерянные апгрейды и неконсистентная выдача доступа.
Критично разделять события и решения: платежный шлюз шлет событие, а биллинг принимает решение о смене состояния. Все переходы должны быть идемпотентны, а повторная доставка webhook — безопасна. Иначе один и тот же триал можно продлить дважды, а промо-период — ошибочно «съесть» при ретрае.
Промо и триалы надо считать отдельными сущностями, а не флагом в тарифе:
— триал заканчивается по времени или по исчерпанию лимита;
— промо-период не должен сбрасывать billing anchor без явного правила;
— апгрейд внутри периода требует proration, а даунгрейд — отложенного применения.
Отдельная зона риска — смена плана в момент неуспешного списания. Если dunning уже запущен, апгрейд не должен реанимировать просроченную подписку без проверки долга и приоритетов. Грамотно спроектированная dunning-стратегия способна спасти до 15% уходящей регулярной выручки.
Правильная архитектура — это явные статусы, журнал переходов и одна точка истины для entitlement. Идемпотентность в биллинге — это не рекомендация, а базовый вопрос выживания системы.
Подписки: биллинг-лаб
@subscriptions_billing_lab_arb
Подписка ломается не на оплате, а на границах жизненного цикла
Этот пост опубликован в Telegram-канале Подписки: биллинг-лаб. Подписаться можно по ссылке: @subscriptions_billing_lab_arb.