#architecture #subscription #saas #recurring-billing #system-design
Вопрос:
Существует SAAS с возможностью иметь несколько платных подписок на разные каналы. Пользователи оплачиваются с помощью повторяющихся счетов с плавающей стоимостью.
Channel A cost = $10/month
Channel B cost = $15/month
Например, пользователь оформляет подписку на канал А 1 января, с него взимается плата 1 февраля (10 долларов США). Затем пользователь подписывается на канал B 17 января, а следующий счет запланирован на 17 февраля.
Одно из очевидных решений, которое я нашел, состоит в том, чтобы предложить пользователю оплатить необходимую часть подписки B плюс основную ежемесячную цену в размере 15 долларов.
required_extra_amount = (30 - 17) * $15 / 30
Таким образом, расчетные периоды будут синхронизированы с общей датой выставления счетов 1-го числа каждого месяца. Цена составит 25 долларов.
Каков наилучший способ взимать плату с пользователя наименьшее количество раз? Я был бы очень признателен за любую ссылку на эту тему.
Комментарии:
1. Вы предлагаете созданное вами мультитенантное приложение SaaS и хотите выяснить, как взимать плату с пользователей в зависимости от их активности в вашей системе, или вы хотите передать получаемые вами сборы SaaS своим пользователям? Или что-то еще?
2. Я создал приложение SAAS, в котором каждый клиент может подписаться сразу на несколько каналов контента, а общий счет-это сумма цен. Вся логика (подписка/зарядка) реализована мной, поэтому я гибок к любому шагу. Основной вопрос заключается в том, как наилучшим образом синхронизировать платежные периоды. В идеальном случае с пользователя следует взимать плату только один раз в месяц (это будет намного проще для понимания общей стоимости использования приложения). Я уверен, что эта задача не уникальна и имеет оптимальное решение, но мои исследования на эту тему не принесли никаких ценных результатов.
Ответ №1:
Если вы хотите выставлять счета за фиксированный цикл, то взимание платы с пользователей на пропорциональной основе является очевидным решением. Ваш код был на правильном пути — единственное осложнение в том, что вы, казалось, предполагали фиксированный 30-дневный месяц, который для платежного цикла может сработать (?).
Я бы, наверное, сделал что-то подобное:
UserCharge = (DaysToBeBilled / DaysInBillingPeriod) * FullPeriodRate
Так что, если:
- Оплаченный день = 15
- дней в расчетном периоде = 30
- Полный период = 10 долларов
- Ежемесячная плата = 5 долларов США
- (30 / 15) * 10 = 5.
Кроме того:
- (31 / 5) * $15 = $2.42
- (31 / 17) * $15 = $8.22
- (31 / 30) * $15 = $14.51
DaysInBillingPeriod просто нужно задать с помощью простого поиска количество дней в соответствующем месяце года, и алгоритм будет работать с любой продолжительностью расчетного периода, а не только ежемесячно.