Billing portal events
What data you get for billing_portal.configuration.created, .configuration.updated, and .session.created.
Fires when a merchant's self-serve billing portal configuration is created or updated, or when a customer opens a portal session.
Configuration events
Prop
Type
{
"id": "bpc_01J9ABCDEFGHJKMNPQRSTV",
"object": "billing_portal.configuration",
"name": "Default portal",
"active": true,
"is_default": true,
"features": {
"customer_update": { "enabled": true },
"invoice_history": { "enabled": true },
"payment_method_update": { "enabled": true },
"subscription_cancel": { "enabled": true, "mode": "at_period_end" },
"subscription_update": { "enabled": true }
},
"default_return_url": "https://your-app.example/account"
}.updated uses the identical shape โ you get the full current configuration both
times, not a diff.
Session events
Prop
Type
{
"id": "bps_01J9ABCDEFGHJKMNPQRSTV",
"object": "billing_portal.session",
"configuration": "bpc_01J9ABCDEFGHJKMNPQRSTV",
"customer": "cus_01J8XYZABCDEFGHJKMNPQR",
"return_url": "https://your-app.example/account",
"expires_at": "2026-07-25T17:50:00Z"
}The actual portal link is never included here โ it's a one-time credential, not something sent over a webhook. Capture it from the synchronous API response when you create the session.
Invoice events
What data you get for invoice.created, .finalized, .finalization_failed, .paid, .payment_failed, .payment_action_required, .overdue, .updated, .uncollectible, .void, and .creditnote.updated.
Credit note events
What data you get for credit_note.created, credit_note.updated, and credit_note.canceled.