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.

