Hello,
I'm glad to hear you're starting to see conversions from trials to paid subscriptions, that's a great achievement!
On Stripe's end, we don't send anything to the customer when the trial is about to expire or has expired. We will send you the `customer.subscription.trial_will_end` event, usually three days before the end of the trial. The idea is that your integration would listen for this event and for example email the customer asking them to enter their card details before the end of the trial.
Separately, when the trial ends, the subscription's billing cycle will renew. At that point, a `customer.subscription.updated` event is sent to indicate that the subscription moved from Trialing to Active. An `invoice.created` event is also sent to indicate a new invoice has been created to collect funds from the customer. This invoice is not charged immediately to give you some time to modify it if needed, for example to add extra line items. An hour or two later, we automatically try to pay the invoice. In your case, payment would fail since the customer has no card saved at the time. We would then send the `invoice.payment_failed` event to your endpoint to react accordingly.
After a payment failure for an invoice, we can also send an email to your customer, assuming you have enabled the option in your account settings [1]. This email would contain a link to your website, which you can configure in the same view. This will let customers go to their account settings on your website for example to update their card details.
At that point, your code will collect a card token (tok_XXX) client-side and send it to your server. You will then call the Update Customer API [2] server-side and pass `source: tok_XXXX` to save their new card. This will automatically trigger a new attempt on all past due invoices. If the payment succeeds, you will get an `invoice.payment_succeeded` event to confirm the charge.
I hope this helps!
Remi