The "gate access on your database, not the redirect" point is the one that bites later. Worth deciding up front what access looks like while a subscription is past_due: Stripe keeps retrying for a while, and cutting access on the first invoice.payment_failed locks out people whose card would have cleared on the next attempt. Keeping access until the status actually moves to canceled or unpaid tends to be kinder and simpler.