Skip to main content

Base structure

Every webhook shares the same envelope:

Event types

Charges and payouts both create transactions, so a charge integration will mostly see transaction_created and transaction_updated. Payout flows also emit the payout_* pair — see Sending payouts for those payloads.

Transaction types

The type field inside data tells you what kind of movement the transaction represents:
Refund status updates include originalTransactionId in data, linking the refund back to the deposit it reverses.

Status values

pending is not a resting state — it means “still in flight”. Only successful means money moved. Do not release value on pending, and do not treat a stepRequired webhook as a failure.

Fields inside data

transaction_updated carries the richest payload. Optional fields appear only when relevant:

Reading events safely

Retries and network conditions mean a successful update can arrive before the transaction_created event. Key on transactionId and treat terminal statuses as final — never let a late pending overwrite a successful.
Optional fields are omitted, not sent as null. Read defensively rather than assuming a shape.
New event types may be added. Return 2xx for events you do not recognise rather than erroring, which would trigger pointless retries.

Transaction events in detail

Full example payloads for every transaction event.