Cashier 16.9.0 sends proration_behavior=create_prorations by default, so an upgrade from $29 to $79 on day 10 charges $0 today and adds $33.33 to the next renewal invoice.
When an immediate upgrade payment fails, Cashier has already saved the new plan, the status is past_due, and valid() is false, which locks the customer out of the plan they already paid for.
Use alwaysInvoice() with errorIfPaymentFails() on upgrades: Stripe returns a 402, Cashier throws a CardException, and the old plan stays active.