Webhook event types

This page lists event types accepted by merchant-public WebhookEndpoints. Availability still depends on whether the source product can emit the event.

How to read this catalog

Each type has an implementation status inside the platform:

StatusMeaning
ImplementedThe internal projection is emitted by normal payment flows.
Flow-dependentEmitted internally only when a payment reaches the corresponding state.
DormantProjection/routing code exists, but its source product is unavailable.

Internal routing

Each merchant-public endpoint has an enabled_events allow-list. Use an exact type below or the * wildcard.

Stripe-shaped types (16)

TypeWhen it firesdata.objectStatus
payment_intent.succeededa payment is authorized and capturedPaymentIntentImplemented
payment_intent.payment_faileda payment attempt is declined or errorsPaymentIntentImplemented
payment_intent.requires_actiona payment needs customer action (e.g. 3DS)PaymentIntentImplemented
charge.refundeda refund succeedsChargeImplemented
payment_intent.canceleda payment is canceled before capturePaymentIntentFlow-dependent
payment_intent.amount_capturable_updatedan authorization is held for later capture (manual capture)PaymentIntentFlow-dependent
payment_intent.processinga payment enters async processing — bank debits; cards do not rest herePaymentIntentFlow-dependent
refund.faileda refund fails at the connectorRefundFlow-dependent
charge.dispute.createda dispute is openedDisputeDormant
charge.dispute.updateda dispute is challenged or updatedDisputeDormant
charge.dispute.closeda dispute is resolved (won, lost, or expired)DisputeDormant
mandate.updateda mandate becomes active or is revokedMandateDormant
payout.paida payout completesPayoutDormant
payout.faileda payout failsPayoutDormant
payout.createda payout is created and processingPayoutDormant
payout.canceleda payout is canceledPayoutDormant

A few types collapse several states

Some Stripe types intentionally cover more than one underlying platform state — branch on a field of data.object, not on a finer-grained type:

  • payment_intent.succeeded covers both a one-step sale and a captured authorization.
  • charge.dispute.closed covers a dispute that was won, lost, or expired — read the dispute’s status to tell which.
  • mandate.updated covers a mandate becoming active or being revoked — read the mandate’s status.

Example bodies — implemented internal projections

The data.object is always a clean public shape. See delivery safety. Abbreviated examples:

1// payment_intent.succeeded
2{ "type": "payment_intent.succeeded",
3 "data": { "object": {
4 "object": "payment_intent", "id": "pi_…", "status": "succeeded",
5 "amount": 4242, "currency": "usd", "latest_charge": "ch_…" } } }
6
7// payment_intent.payment_failed
8{ "type": "payment_intent.payment_failed",
9 "data": { "object": {
10 "object": "payment_intent", "id": "pi_…", "status": "requires_payment_method",
11 "last_payment_error": { "code": "card_declined", "decline_code": "generic_decline",
12 "message": "Your card was declined." } } } }
13
14// payment_intent.requires_action
15{ "type": "payment_intent.requires_action",
16 "data": { "object": {
17 "object": "payment_intent", "id": "pi_…", "status": "requires_action",
18 "next_action": { "type": "redirect_to_url" } } } }
19
20// charge.refunded — data.object is a Charge, not a Refund
21{ "type": "charge.refunded",
22 "data": { "object": {
23 "object": "charge", "id": "ch_…", "amount": 4242, "amount_refunded": 4242,
24 "refunded": true, "payment_intent": "pi_…" } } }

For Dormant types, the example body will be published when the source resource ships; the data.object will be the public Stripe shape of that resource.

These shapes are internal implementation evidence. See the webhook migration boundary before planning a public integration.

Platform-native types (9 hs.*)

Internal projections with no Stripe equivalent use a stable hs.<snake_case> name rather than being dropped. Their data.object is the platform resource shape. This naming is not a merchant-public delivery promise.

TypeWhen it firesStatus
hs.payment_cancelled_post_capturea payment is cancelled after captureFlow-dependent
hs.payment_partially_authorizeda payment is partially authorizedFlow-dependent
hs.payment_expireda payment expires before completionFlow-dependent
hs.dispute_accepteda dispute is acceptedDormant
hs.dispute_cancelleda dispute is cancelledDormant
hs.invoice_paidan invoice is paidDormant
hs.payout_initiateda payout is initiatedDormant
hs.payout_expireda payout expiresDormant
hs.payout_reverseda payout is reversedDormant

The internal * wildcard

The platform routing model recognizes * as a merchant-public subscription to every event type that the merchant and mode are allowed to receive.