Stripe events
Stripe webhook events: what each one means and what to email
The twelve Stripe events Kicklace handles: when each is sent, whether Stripe already emails the customer, the email worth sending, and what Kicklace does.
Payments
- checkout.session.completedWhen a customer finishes Checkout or pays through a Payment LinkStripe emails: A receipt, once you turn on Stripe's email for successful paymentsKicklace: A purchase for the session total
- payment_intent.succeededEach time a payment completes, including every subscription paymentStripe emails: A receipt, once you turn on Stripe's email for successful paymentsKicklace: A purchase for the amount received
- invoice.paidEach time an invoice is paid: a first payment, a renewal, a retry that worksStripe emails: A receipt, once you turn on Stripe's email for successful paymentsKicklace: A purchase for the amount paid, or a recovered payment after a retry
- invoice.payment_failedEach time a payment attempt on an invoice fails, retries includedStripe emails: Yes, once you turn on Send emails when card payments failKicklace: A failed payment, and the subscription shows past due
- charge.refundedEach time a charge is refunded, partial refunds includedStripe emails: Yes, once you turn on the refund emailKicklace: A refund for the total refunded on the charge so far
- checkout.session.expiredWhen a Checkout Session expires unpaid, after 24 hours unless you set it shorterStripe emails: No, a recovery email is yours to sendKicklace: A checkout left and what they were about to spend, if they agreed to promotional email
Subscriptions
- customer.subscription.createdWhen a subscription is created, in a trial or notStripe emails: Not for the start, though a receipt follows a paid first invoice if you turn it onKicklace: A trial started, or a subscription started
- customer.subscription.trial_will_endThree days before a trial ends by default, or at once if the trial is ended earlyStripe emails: Yes, a reminder 7 days before a free trial ends, once you turn it onKicklace: A trial ending, on the person and the subscription
- customer.subscription.updatedWhenever a subscription changes: a renewal, a new plan, a coupon, a status changeStripe emails: Not for the change itself, though renewal reminders and receipts go out on their ownKicklace: A renewal or plan change, and a card going past due; other changes are ignored
- customer.subscription.deletedWhen a subscription ends: cancelled at once, at the period's end, or after payments kept failingStripe emails: Yes, a cancellation email, once you turn it onKicklace: A subscription cancelled, or a failed payment if the card kept failing
Customers
- customer.createdWhenever a customer is created, by your code, the Dashboard or CheckoutStripe emails: NoKicklace: The person behind the customer, with nothing on their timeline
- customer.updatedWhenever any property of a customer changesStripe emails: NoKicklace: The person found again, with nothing on their timeline
Which one to use
Stripe sends a lot of events for one payment, and the one to trust depends on what you want to say.
- Somebody paid for the first time: checkout.session.completed if you use Checkout, and invoice.paid for anything billed as a subscription.
- A one-time payment you take with a PaymentIntent of your own: payment_intent.succeeded.
- A trial or a subscription began: customer.subscription.created.
- A subscription renewed: invoice.paid, with
billing_reasonset tosubscription_cycle. - A card failed: invoice.payment_failed.
- A trial is about to end: customer.subscription.trial_will_end.
- Somebody changed plan: customer.subscription.updated, read against
previous_attributes. - Somebody cancelled: customer.subscription.deleted, once the subscription has really ended.
- Somebody left checkout: checkout.session.expired.
- A refund was made: charge.refunded.
A first subscription payment sends several of these at once, so pick one for each email you send. The ones about customers, customer.created and customer.updated, are for knowing who somebody is and not for writing to them.
Handling any of them
Every event reaches your endpoint the same way, and Stripe's rules for it are the same for all twelve.
- Check the signature on every request, using the raw body of the request untouched.
- Return a 2xx before you do any slow work, such as sending the email.
- Keep the ids of the events you have handled. The same event can be delivered more than once, and sometimes two separate events describe the same thing.
- Do not rely on order. Stripe does not promise to deliver events in the order they happened.
- If your endpoint does not answer well, Stripe keeps retrying in live mode for up to three days.
- The shape of the payload follows the API version in use when the event happened. Version 2025-03-31.basil moved a subscription's billing period onto its items and removed the
subscriptionfield from invoices, so check which version your endpoint receives.
Stripe's own pages for these rules are Receive Stripe events in your webhook endpoint and Using webhooks with subscriptions, and the two changes to the API are in its changelog: invoices now say how they were generated and billing periods moved onto subscription items. Each event's page links the Stripe pages it was checked against.
With Kicklace
Connect Stripe under Settings → Connections → Stripe with one restricted key, and Kicklace adds its own webhook to your Stripe account and listens for exactly these twelve events, on a fixed API version, so what it receives does not change when your account's version does. Each one lands on the right person on your Lifecycle map, so what a customer did in Stripe sits beside what they did in your product, and a side road can start from a failed payment, a trial ending, a refund or a cancellation. Payments from Stripe lists what each one becomes.
Kicklace only reads Stripe. It never charges anybody and never changes a customer, a price or a payment. Nothing sends until you switch a sequence on. You can see the map on your own site in the demo, with no sign-up.
Free up to 1,000 contacts.
Join the journey
We're building Kicklace so you can get back to building your own product. We'll email you when there's something new worth showing.