Billing is far more complex than people tend to believe, and much more so with subscriptions. As your pricing plans become more convoluted with discounting, optional add-ons and conditionals it becomes hard not just to bill, but also to keep track of activities, ordering, and reporting. In this case it's easier to implement your own charging system, and leverage it using an external billing API (Stripe, Braintree...) that hosts your customer's payment methods.