I have set up Stripe far too many times. I've never enjoyed it. I've talked to the Stripe team about the shortcomings and they say they'll fix them...eventually.
Until then, this is how I recommend setting up Stripe. I don't cover everything - check out things that are still your problem for clarity on what I'm NOT helping with.
IMO, the biggest issue with Stripe is the "split brain" it inherently introduces to your code base. When a customer checks out, the "state of the purchase" is in Stripe. You're then expected to track the purchase in your own database via webhooks.
There are over 258 event types. They all have different amounts of data. None of them should be trusted. It's far too easy to have a payment be failed in stripe and "subscribed" in your app.
Trying to apply partial updates from Stripe is hellish. I recommend avoiding it entirely. My solution is simple: a single syncStripeData(customerId: string) function that syncs all of the data for a given Stripe customer to your KV.