It's 12:00 AM. Your cron job begins, like it does every night.
Except tonight, you have 40,000 active subscribers instead of 400.
The job begins charging every subscription that's due to expire that day, and in a few seconds, your database connections get maxed out. Stripe may begin returning 429 Too Many Requests errors. Then PHP times out. Now you don't know who actually got charged and who didn't.
This is the midnight cron nightmare. It's one of the most common yet avoidable flaws in subscription billing systems, and almost every self-built backend hits it at one point. Here's exactly why it happens, and how to build it correctly in Laravel 13.
The Straightforward Approach (And Why It Feels Fine at First)






