Skip to main content
Sent when a charge reaches a successful state. For a checkout payment, use data.checkout_id or your supplied data.reference to find the order before fulfilling it or granting access. A virtual account deposit has no checkout or order reference; reconcile the sender and amount against your records before marking any order paid. Deduplicate deliveries using the event id.
data.charge_id may be null in some scenarios:
  • Test webhooks: events sent from the webhook test tool are not backed by a real charge.
  • Legacy payments: collections processed before the charge model was introduced may not have an associated charge record.
  • Manual reconciliation: administrative payment confirmations applied outside the standard charge flow do not create a charge.
Always guard against a null charge_id before using it for lookups.
The example below is for an account’s own checkout. Events forwarded to a platform from a connected account also include a top-level account field with the connected account’s ID.

Event fields

string
The event’s unique identifier, prefixed evt_. Use it to deduplicate deliveries.
string
Always collection.succeeded.
string
When the event occurred, in UTC.
string
The account where the event originated. For a connected-account payment, this is the connected account’s ID, not your platform’s ID.
string
Present on an event delivered to a platform from a connected account; contains that connected account’s ID. See Connect events.
string | null
Charge ID for reconciliation and retrieval calls. May be null, see note above.
string | null
Checkout that originated the charge. null for a fixed virtual-account deposit and other payments without a checkout.
string | null
Checkout reference you supplied, when available.
string
The uppercase charge state that triggered this event. SUCCEEDED: the full amount was collected. ACCEPTED: the payment was accepted on terms other than the exact amount requested. OVERPAID: more arrived than was due, with the difference in the overpayment fields below. The payment object returns these states in lowercase, so do not compare the values directly.
string
Original charged amount in data.currency.
string
Customer payment currency code.
string
Amount credited in data.settlement_currency.
string
Currency used for settlement credit.
string | null
Bachs processing fee in data.processing_fee_currency. null when the final settlement value has not yet been determined.
string | null
Currency of data.processing_fee, typically the settlement currency. null when processing_fee is null.
string
Who absorbed the processing fee. Either customer (fee added on top of the charge amount) or merchant (fee deducted from settlement).
array | null
Products purchased in a one-time checkout session. Each item contains product_id, quantity, and amount (present only for custom-priced products). null when no checkout created the charge.
object
The customer who made the payment. id is always present and can be null for a guest or a payment received without a checkout, such as a virtual account deposit. email and name appear only when a checkout collected them.
object | null
How the money moved, keyed by type. For a bank transfer, bank_transfer can include the sender’s details, the interbank session_id, their narration, and the virtual account that received the money. Treat each nested field as optional because the sending bank may omit it. See the payment object for the full shape.
object
Public metadata stored with the charge.
string | null
Why the charge reached this state, when we have something to say. Absent on an ordinary success.
string
Present only when status is OVERPAID: the amount that was due.
string
Present only when status is OVERPAID: the amount that actually arrived.
string
Present only when status is OVERPAID: the difference between the two, which the customer paid on top.