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