Regarding user subscription to our SaaS using Stripe: when they subscribe for the first time, upon receiving "checkout.session.completed" event, is it possible that the user has NOT paid the invoice?
And, on the first subscription, is "invoice.paid" usually sent before "checkout.session.completed" (if they pay immediately)? If they pay it later, will "invoice.paid" come later?
Great questions about Stripe's webhook event ordering! Let me search for the most current information on this.Great questions! Here's what you need to know about Stripe subscription webhooks:
Yes, it's possible - but it depends on the payment method:
-
Card payments & synchronous methods: No, the invoice is already paid when you receive
checkout.session.completed. The event only fires after successful payment[1][2][3]. -
Asynchronous payment methods (SEPA Direct Debit, BACS, bank redirects): Yes, the invoice may still be unpaid when
checkout.session.completedfires. For these methods, you'll receive additional events:
For immediate payment (card payments):
- ✅
checkout.session.completedfires first - customer completed checkout - ✅
invoice.paidfires second - invoice confirmed paid
If they pay later:
- With async payment methods,
checkout.session.completedfires immediately invoice.paidfires later when the payment actually clears (days later for SEPA/BACS)
Special cases:
- Free trials:
checkout.session.completedfires, butinvoice.paidwon't fire until the trial ends and first payment succeeds - Network retries: Events may rarely arrive out of order - always design for idempotency[1][2][3]
For critical access provisioning:
✅ Listen to invoice.paid for actual payment confirmation
✅ Use checkout.session.completed for UI/UX (thank you page)
✅ Handle checkout.session.async_payment_succeeded for async methods
This ensures your system works correctly regardless of payment method[4][3][6].
- Checkout Sessions | Stripe API Reference
- When Does Stripe's checkout.session.completed Trigger? Clarifying ...
- Will the Checkout.Session.Completed Stripe event be triggered only upon ...
- Stripe Webhooks: Invoice.paid vs Checkout.Session.Completed ...
- Stripe webhooks: checkout.session.completed for asynchronous payments ...
- Guide to Stripe Webhooks: Features and Best Practices
- Stripe Webhooks: Invoice.paid vs Checkout.Session.Completed
- Fulfill orders | Stripe Documentation