Skip to main content
Sent when a checkout session finishes successfully: payment, setup, and subscription checkouts all fire it. Use it as the single “the customer is done” signal, then check data.payment_status to see whether a payment was actually collected.
A free checkout (a $0 cart, or a setup-mode checkout that only saves a payment method) also fires checkout.completed, with data.payment_status set to no_payment_required. No charge is created and no collection.succeeded event is sent for it. checkout.completed is the only signal you’ll get.
data.customer_details is additive. If you already branch on data.customer === null, that behavior is unchanged: a checkout with no customer record behind it still sends customer: null, exactly as before. What’s new is that a checkout with no customer record behind it, such as a payment link with a fixed price or one created with customer_creation: if_required, now carries the buyer’s identity on customer_details, where before it sent nothing at all.

Event fields

string
The event’s unique identifier, prefixed evt_. Use it to deduplicate deliveries.
string
Always checkout.completed.
string
When the event occurred, in UTC.
string
Your account’s ID.
string
The checkout session that completed.
string
Always completed.
string
The checkout’s mode: payment, setup, or subscription.
string
Whether a payment was collected at checkout. paid when a charge was made, no_payment_required when nothing was due, which covers a free ($0) checkout, a setup-mode checkout, or a subscription on a free trial (billed at trial end).
string
The checkout amount, as a decimal string. "0" for a free checkout.
string | null
The checkout currency code.
string | null
Checkout reference you supplied, when available.
object | null
The customer record for this checkout, or null when none backs it, such as a checkout created with customer_creation: if_required or a payment link with a fixed price. See customer vs customer_details for the full matrix.
object | null
What the buyer supplied: { email, name }. Present whenever an identity was collected, whether or not it produced a customer record. null only when no identity was collected at all.
object | null
The resulting charge, in the same shape as GET /v1/payments/charges/{charge_id}. null for a free checkout, since no charge is created when nothing is collected.
object | null
{ subscription_id } for a subscription-mode checkout. null for payment and setup modes.
string | null
Where the customer was redirected after completing.
string | null
Where the customer would have been redirected had they canceled.
object
Public metadata stored on the checkout.
string
When the checkout completed, in UTC.
string | null
The checkout’s original expiry time, in UTC.
string
When the checkout session was created, in UTC.