So true — billing cycle two is the real launch. Test mode teaches you how subscriptions start; production teaches you how they fail. The past_due vs canceled distinction bit me too. At first I was revoking access on the very first invoice.payment_failed, which nuked users whose bank would've approved Stripe's retry two days later. Now I keep entitlements alive through the retry window (Smart Retries + dunning emails enabled) and only flip to canceled when Stripe says the subscription is genuinely dead. And the card-update half is why I eventually added a "payment failed — update your card" screen that deep-links to the billing portal. Tiny feature, outsized churn saver. Did you bake a grace period into your own entitlement logic, or do you let the payment provider's retry schedule handle it entirely?
