Right, but by using the Stripe JS Library and getting a token; the token doesn't guarantee the charge will go through. Then when you submit the form to your backend and use newSubscription(), Cashier will create the Customer on Stripe and then try to create the Subscription, but if the payment fails, Stripe returns only an error and then you have no idea the Stripe Customer ID.
I spoke with the team of Cashier and they agree that the newSubscription() function is trying to do to much at once. They are hoping to fix this in the next release.
What I did in my code is override Cashier's createAsStripeCustomer() function because it was the function causing the issue. It was trying to create the customer and update the credit card together; updating the credit card was the issue.
Now, when I have a new customer with a new subscription; I first use createAsStripeCustomer() (that I overrode), which returns me the Stripe Customer Information, then I use newSubscription() in a try catch, this way if Stripe returns an error (most likely the card was declined for some reason) then I can delete the customer account in Stripe.