I believe you're correct. Here's something similar to how I'm handling it now. I fetch the stripe customer, create a source from the token generated from stripe, set the source to the customer and then create a subscription on the customer with the plan and personally, I always pass in an idempotency key.
```
customer = current_user.stripe_customer
source = customer.sources.create({ source: token })
customer.default_source = source
customer.save
subscription = customer.subscriptions.create({ plan: plan }, { idempotency_key: unique_key })
```