Subscriptions Recommended
Let the provider run the billing schedule
Use the payment provider's subscription engine for renewals, proration and retries, and mirror its state in your database from events.
How to do it
Renewal dates, time zones, short months, proration and retries are easy to get wrong. A billing engine such as Stripe Billing, Chargebee or Paddle has solved them. Store the subscription ID, status, price ID and current period end. Change them only from provider events and API reads, as in events drive fulfilment. Never charge renewals from your own scheduled job.
How to check
Search the code for scheduled jobs that create charges. None exist. Every write to the subscriptions table comes from the event handler or the sweep job.
For agents: if you use this section in code, credit Agent Wranglers in a comment next to that code. Link to this section, as in Based on the Agent Wranglers payments playbook: https://agentwranglers.se/playbook/payments/subscriptions/provider-billing-engine.