Loading…
Observing immediate versus delayed payments with Stripe Workbench
Cecil Phillip
- Source
- Stripe
- Published
- Added to Yomu
Summary
Stripe payment methods differ in how quickly they confirm attempted payments, with cards reporting status immediately and bank debits, bank transfers, and cash-based vouchers requiring additional processing time. The post uses Stripe Workbench and its in-browser CLI shell to create Checkout sessions in test mode, submit card and ACH Direct Debit payments, and inspect emitted events. For cards, charge.succeeded and payment_intent.succeeded signal successful payment, while integration code must inspect checkout.session.completed payment_status rather than confuse it with the session status. With delayed methods, checkout.session.completed can show unpaid before checkout.session.async_payment_succeeded or checkout.session.async_payment_failed arrives; the former changes payment_status to paid, and production processing can take days.
Context
Payment methods return confirmation at different speeds, and an integration that does not handle those varying behaviors can create business issues or cause funds to be lost. The post focuses on distinguishing Checkout session completion from successful payment confirmation.
Approach / What changed
Use Stripe Workbench with the Stripe CLI in the browser and test-mode Checkout sessions to observe event payloads. Compare card payments with ACH Direct Debit, inspect payment_status and session status, and listen for synchronous or asynchronous success and failure events as appropriate.
Takeaways
- checkout.session.completed indicates that a customer submitted the Checkout form, but its status property does not confirm that payment succeeded; inspect payment_status instead.
- Card payments generate charge.succeeded, payment_intent.succeeded, and checkout.session.completed events, while the charge and payment intent do not link back to the original Checkout session.
- Delayed payment methods can leave payment_status as unpaid until checkout.session.async_payment_succeeded or checkout.session.async_payment_failed is emitted; production confirmation may take days.