Как лучше всего управлять платежными периодами для нескольких одновременных подписок с разными ценами?

#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 просто нужно задать с помощью простого поиска количество дней в соответствующем месяце года, и алгоритм будет работать с любой продолжительностью расчетного периода, а не только ежемесячно.