Events Catalog
Every webhook event Tonder sends, grouped as in the dashboard, with the payload format of each group.
Each event is named <operation>_<status> and travels in the payload's event_type field. The
groups below match the endpoint form in Developers › Webhooks, and each group has a fixed
payload format. Which groups apply to you depends on how you integrated Tonder; the format is not
chosen per endpoint. The conceptual model is in the
Webhooks model.
Formats
| Characteristic | Short (API Direct · Lite SDK 2.0 · Frictionless · Hosted Checkout 2.0) | Long (mobile SDK · Legacy) |
|---|---|---|
| Root structure | Top-level fields | Everything inside data{} |
| Status | status: Pending / Success | transaction_status: Pending / Success |
| Event indicator | event_type: payment_Pending | event: created / confirmed |
| Order reference | client_reference | metadata.external_id / order_id |
Payments — API Direct (Short)
API Direct payments and refunds. Hosted Checkout 2.0 processes payments through the Direct API, so a payment made on the hosted page sends these events too.
event_type | Meaning |
|---|---|
payment_Pending | An API Direct payment changed to Pending. |
payment_Processing | An API Direct payment changed to Processing. |
payment_Authorized | An API Direct payment changed to Authorized. |
payment_Captured | An API Direct payment changed to Captured. |
payment_Completed | An API Direct payment changed to Completed. |
payment_Success | An API Direct payment changed to Success. |
payment_Declined | An API Direct payment changed to Declined. |
payment_Failed | An API Direct payment changed to Failed. |
payment_Cancelled | An API Direct payment changed to Cancelled. |
payment_Expired | An API Direct payment changed to Expired. |
payment_Returned | An API Direct payment changed to Returned. |
refund_Pending | An API Direct refund changed to Pending. |
refund_Success | An API Direct refund changed to Success. |
refund_Declined | An API Direct refund changed to Declined. |
refund_Failed | An API Direct refund changed to Failed. |
refund_Cancelled | An API Direct refund changed to Cancelled. |
A payment goes through only the states its method and flow use, so subscribe to the ones your
integration acts on. On SPEI Success, the payload adds sender info: sender_name, sender_clabe,
sender_bank, among others. Argentina's QR and bank-transfer payments use these same events; their
payer fields are listed in Argentina.
A payment_Success event:
{
"id": "bf370a48-ffcf-4fbe-bab9-ecb791b0b684",
"event_type": "payment_Success",
"operation_type": "payment",
"status": "Success",
"amount": "500.00",
"currency": "MXN",
"country": "MX",
"client_reference": "ORD-001",
"transaction_id": "1464",
"payment_method_type": "card",
"decline_code": null,
"decline_reason": null,
"created": "2026-10-20T18:52:10Z",
"metadata": { "external_id": "ORD-001" },
"action": "MODIFY"
}idis the transaction id the API returned when you created the payment (/process/); use it to match the webhook to your order.client_referenceandmetadataare the values you sent when creating the transaction.- Payloads can also carry fields that identify the institution that processed the transaction. Don't build logic on them.
There are no session-level webhooks: session.created, session.completed and session.expired
are not sent. Follow a session with the payment events or with
Get a session.
Checkout sessions — Hosted & SDK (Long)
Events from earlier integrations — SDK 1.0, the previous Hosted Checkout flow and the withdrawals
API v1/v2. The legacy_ prefix identifies them, and the payloads are in
Legacy webhooks.
event_type | Meaning |
|---|---|
legacy_payment_Pending | A Hosted / SDK payment changed to Pending. |
legacy_payment_Success | A Hosted / SDK payment changed to Success. |
legacy_payment_Declined | A Hosted / SDK payment changed to Declined. |
legacy_payment_Expired | A Hosted / SDK payment changed to Expired. |
legacy_payment_Failed | A Hosted / SDK payment changed to Failed. |
legacy_deposit_created | A SPEI deposit was created. |
legacy_deposit_confirmed | A SPEI deposit was confirmed. |
legacy_deposit_expired | A SPEI deposit expired. |
legacy_refund_Pending | A refund changed to Pending. |
legacy_refund_Success | A refund changed to Success. |
legacy_refund_Failed | A refund changed to Failed. |
legacy_withdrawal_Pending | A withdrawal changed to Pending. |
legacy_withdrawal_Processing | A withdrawal changed to Processing. |
legacy_withdrawal_SentToProvider | A withdrawal was sent to the executing institution. |
legacy_withdrawal_OnHold | A withdrawal changed to OnHold. |
legacy_withdrawal_Success | A withdrawal changed to Success. |
legacy_withdrawal_Failed | A withdrawal changed to Failed. |
legacy_withdrawal_Declined | A withdrawal changed to Declined. |
legacy_withdrawal_Returned | A withdrawal changed to Returned. |
legacy_withdrawal_Canceled | A withdrawal changed to Canceled. |
Withdrawals (Long)
event_type | Meaning |
|---|---|
withdrawal_Pending | A withdrawal changed to Pending. |
withdrawal_Success | A withdrawal changed to Success. |
withdrawal_Declined | A withdrawal changed to Declined. |
withdrawal_Failed | A withdrawal changed to Failed. |
withdrawal_Canceled | A withdrawal changed to Canceled. |
withdrawal_Returned | A withdrawal changed to Returned. |
withdrawal_Canceled is spelled with one L, unlike payment_Cancelled and refund_Cancelled.
Match the event names exactly. Without Webhooks 2.0, withdrawals emit five events and none for a
cancellation.
A withdrawal sends the pending event and then its terminal one; withdrawal_Returned comes on top,
when the receiving bank returns the funds after Success. The payload comes in one of two formats,
set by your account's configuration: a flat
payload with the same shape as the Short payment format (status: Pending, transfer_method_type
instead of payment_method_type), or an extended payload that nests the full withdrawal record
under withdrawal{} with the status in the internal names (PAID_FULL). Both, with examples, in
Withdrawals.
Other
event_type | Meaning |
|---|---|
endpoint.test | A test event sent from the dashboard with Send test. It arrives even if the endpoint doesn't subscribe to it. |
The catalog through the API
GET /v1/event-types returns the catalog with each event's description, plus the retry policy —
see Webhooks API.
Use metadata.external_id as your correlation key — it's present in both formats and across all
events.
