payment_intent.succeeded: what it means and what to email
Stripe sends payment_intent.succeeded when a payment completes, subscription renewals included. What it means, who gets a receipt, and which email to send.
- Sent
- Each time a payment completes, including every subscription payment
- Stripe emails
- A receipt, once you turn on Stripe's email for successful payments
- Kicklace
- A purchase for the amount received
What it means
A PaymentIntent, the object Stripe uses to collect a payment, has finished collecting it. This is the lowest-level version of "somebody paid". One-time payments made with Checkout or a Payment Link send it, and so do payments you take with a PaymentIntent of your own. So does every subscription invoice, because Stripe collects an invoice's payment with a PaymentIntent of its own.
Since it fires for every kind of payment, one purchase can announce itself several times. A first subscription payment sends this event, invoice.paid and, if it came through Checkout, checkout.session.completed. Choose one of them for each email you send, or the customer gets three thank-yous.
When Stripe sends it
Once for each PaymentIntent that succeeds. A payment method that confirms later, such as ACH Direct Debit, stays in processing until the bank confirms it, so the event comes later too, and Stripe's receipts wait for that confirmation.
Delivery follows the usual rules: the same event can arrive more than once, and Stripe promises no order, so keep the ids of the events you have handled.
Does Stripe email the customer?
A receipt, if you turn it on. The Successful payments toggle under Payments in Stripe's Customer emails settings emails a receipt for a payment that succeeds, and nothing is sent for a payment that fails or is declined.
If you pass receipt_email on a payment in live mode, Stripe sends a receipt to that address whatever your email settings say.
The email to send
For a one-time purchase, a short thank-you within a few minutes that says what they bought and where to start. For a subscription payment, send nothing from this event: invoice.paid knows whether it was the first invoice or a renewal, and this event does not.
Subject: Your [thing they bought] is ready
Hi {{first_name}},
Thanks for buying [thing]. [Say how to start, or where to find it.]
If anything isn't working, reply to this email and it comes to me.
[Your name]
Fields worth reading
amount_receivedandcurrency: what was collected, in the smallest unit of the currency.customer: the Stripe customer id, when there is one. Look the customer up for their email.receipt_email: the address a receipt goes to. It is often empty, so do not rely on it to tell you who paid.latest_charge: the charge, for the receipt link and for any refund later.metadataanddescription: whatever you put on the payment when you made it, such as your own order id.
The PaymentIntent does not carry its invoice. To find the invoice a PaymentIntent paid, Stripe's docs list the invoice payments for that PaymentIntent.
if (event.type === "payment_intent.succeeded") {
const payment = event.data.object;
const amount = payment.amount_received; // smallest unit, so 4900 is 49.00
const customerId = payment.customer; // an id, or null
}
To see a real payload, run stripe trigger payment_intent.succeeded in a sandbox and read the event it sends.
What Kicklace does
With Stripe connected, the event lands on the person as a purchase, purchase, for the amount received, and the first one moves them to Paying on your Lifecycle map. Kicklace finds the person by the email on the event or by the Stripe customer id it already knows.
A subscription's payment can also arrive as invoice.paid and, from Checkout, as checkout.session.completed. They are one purchase, keyed by the invoice. Before API version 2025-03-31.basil a payment names its invoice, so Kicklace keys it that way at once. Since then it does not, so Kicklace asks Stripe which invoice the payment belongs to, with the restricted key you pasted, before it lands one. A payment no invoice has is a purchase of its own, keyed by its payment. If Stripe cannot be reached the event is sent back to be tried again, and with no key to ask with a subscription's payment can land twice.
Nothing sends until you switch a sequence on, and before you do Kicklace shows who would have got it over the last 30 days.
Write yours from your URL. Paste your site's address into the welcome email generator and it writes the thank-you email in your site's voice, ready to copy, with no sign-up.
Sources
Checked against Stripe’s docs on .
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.