# Event types

Weav sends a signed POST whenever something you need to know about happens. Set where it goes with [PUT /v1/webhook-endpoint](https://docs.weavpayments.com/reference/webhooks/set-webhook-endpoint); see [Where each webhook goes](https://docs.weavpayments.com/reference/webhooks/set-webhook-endpoint#where-each-webhook-goes).

| Event | When | data key |
| --- | --- | --- |
| `PAYMENT_COMPLETED` | The customer paid. | `payment` |
| `PAYMENT_FAILED` | The payment expired or was declined. | `payment` |
| `PAYMENT_CANCELLED` | The payment was canceled. | `payment` |
| `PAYMENT_REVERSED` | A completed payment was reversed after a chargeback, and the amount came off your balance. | `payment`, `reversal` |
| `PAYMENT_REFUNDED` | Weav recorded a refund, partial or full. `payment.status` says which. | `payment`, `refund` |
| `CHECKOUT_COMPLETED` | A checkout was paid. `checkout.payment` is the payment that paid it. | `checkout` |
| `CHECKOUT_EXPIRED` | A checkout ran out without being paid. A payment still in progress keeps it open until that payment ends. | `checkout` |
| `PAYMENT_METHOD_SAVED` | Your customer saved their card and their bank confirmed it. It's `ACTIVE`: you can charge it. | `payment_method` |
| `PAYMENT_METHOD_FAILED` | The bank's check failed, or the save link ran out. | `payment_method` |
| `PAYMENT_METHOD_REMOVED` | A saved card was removed. It can't be charged again. | `payment_method` |
| `WITHDRAWAL_COMPLETED` | A withdrawal reached your bank. | `withdrawal` |
| `WITHDRAWAL_FAILED` | A withdrawal failed and the amount was returned to your balance. | `withdrawal` |

## Delivery

- Your URL must use HTTPS. Weav verifies your TLS certificate.
- Webhooks come from two fixed addresses, `18.136.62.102` and `18.139.176.153`. See [IP addresses](https://docs.weavpayments.com/webhooks/ip-addresses).
- A delivery succeeds only when your endpoint answers with a `2xx` within 10 seconds. Anything else is retried, for about 7 days. See [Retries](https://docs.weavpayments.com/retries#when-weav-retries-a-webhook).
- When retries run out, the delivery waits in the dashboard for you to repost it.
- The dashboard shows every attempt, with its status code, response and duration.
- **The same event can arrive twice.** Use the resource's `reference_id` to make sure you handle it only once.
- **Events can arrive out of order.** Trust the `status` in the body, or read the resource again.

> **Note:** Reply right away and do the work in a queue. A handler that runs longer than 10 seconds counts as failed, and you'll receive the same event again.
