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:
Internal routing
Each merchant-public endpoint has an enabled_events allow-list. Use an exact
type below or the * wildcard.
Stripe-shaped types (19)
Charge events
charge.succeeded, charge.captured, charge.failed and charge.updated are published by the
payment event of the same moment. Their id is that event’s id plus a suffix
(_chs, _chc, _chf, _chu) and never changes, so deduplicate on it.
charge.succeeded has balance_transaction: null, as at Stripe; for an automatic
capture, charge.updated follows with the txn_ and previous_attributes
{balance_transaction: null}. charge.pending is never sent: no Fluveo payment
creates a pending Charge. The Charge is
the GET /v1/charges/{id} body without the shopper’s name, email, phone or
address. amount_captured, captured, amount_refunded and refunded keep
their values from when the event happened.
These four types are sent for US Stripe Connect stores only; a BR store cannot
subscribe to them. On a US Stripe Connect store every refund also sends
refund.created once, when it is created. Its Refund keeps the processor’s
status at that moment, so it can say succeeded while GET /v1/refunds/{id}
still reads pending until Fluveo’s books confirm it. A later status change of the refund sends
charge.refund.updated (and refund.updated when it is not a failure; a failure sends refund.failed),
with previous_attributes. A metadata update (POST /v1/refunds/{id}) sends charge.refund.updated and
refund.updated with previous_attributes {metadata: ...}.
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.succeededcovers both a one-step sale and a captured authorization.charge.dispute.closedcovers a dispute that was won, lost, or expired — read the dispute’sstatusto tell which.mandate.updatedcovers a mandate becoming active or being revoked — read the mandate’sstatus.
Example bodies — implemented internal projections
The data.object is always a clean public shape. See delivery
safety. Abbreviated examples:
Payment events never carry next_action; retrieve the PaymentIntent to read it.
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. The three hs.payment_* types carry the same
PaymentIntent object as payment_intent.* (object: "payment_intent", a pi_
id, no shopper fields); each of the other six carries a named public object too:
on webhook endpoints, never the stored customer’s personal data (the legacy
profile URL is never sent to; events go only to webhook endpoints). This naming
is not a merchant-public delivery
promise.
The Invoice carries exactly object, id, subscription, customer,
payment_intent, amount_due, currency and status (draft, open, paid
or void); never the subscription’s payment or billing details.
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.
Hidden from the public API
Each item below is hidden because it does not follow the Stripe parity ADR (ADR 0004 as amended). The hidden public /v1 registry lists every
hidden item. Public /v1 answers a hidden operation as an unknown URL, refuses a hidden request
parameter or value with Stripe’s invalid_request_error, and omits a hidden response key.
- the query parameter
objectofGET /v1/events(HIDE0-047) - the query parameter
payment_intentofGET /v1/events(HIDE0-048)