I've had a lot of conflicting ideas about how to handle starting a subscription. Here's what I'm going with:
When a user creates an account, their subscription expiration date is set to a configurable "trial period"--by default, one week. No Stripe customer is created for them at this time.
When the user updates their subscription with a credit card, at that point a Stripe customer is created for them, and the ID stored in the database. The expiration is not updated, however--that happens automatically when their payment is processed and Stripe sends a web hook.
Subscription state is calculated against that expiration date, not stored in the database. This allows us to avoid lots of useless database requests, updating activity flags.