Skip to main content

Subscription Webhook Events

A subscription emits an event at each stage of its lifecycle:

Using subscription.updated for Real-Time Sync

The subscription.updated webhook fires whenever any subscription field changes, allowing you to keep your application state in sync without polling:
Subscribe to subscription.updated to get real-time notifications about any subscription changes, eliminating the need to poll the API for updates.

Webhook Payload Schema

Subscription payload sent on a webhook. It carries every field of SubscriptionResponse, plus the grace-period deadline.

addons
Addon Cart Response Item · object[]
required

Addons associated with this subscription

billing
object
required

Billing address details for payments

brand_id
string
required

Brand id this subscription belongs to

cancel_at_next_billing_date
boolean
required

Indicates if the subscription will cancel at the next billing date

created_at
string<date-time>
required

Timestamp when the subscription was created

credit_entitlement_cart
object[]
required

Credit entitlement cart settings for this subscription

currency
enum<string>
required

Currency used for the subscription payments

Available options:
AED,
ALL,
AMD,
ANG,
AOA,
ARS,
AUD,
AWG,
AZN,
BAM,
BBD,
BDT,
BGN,
BHD,
BIF,
BMD,
BND,
BOB,
BRL,
BSD,
BWP,
BYN,
BZD,
CAD,
CHF,
CLP,
CNY,
COP,
CRC,
CUP,
CVE,
CZK,
DJF,
DKK,
DOP,
DZD,
EGP,
ETB,
EUR,
FJD,
FKP,
GBP,
GEL,
GHS,
GIP,
GMD,
GNF,
GTQ,
GYD,
HKD,
HNL,
HRK,
HTG,
HUF,
IDR,
ILS,
INR,
IQD,
JMD,
JOD,
JPY,
KES,
KGS,
KHR,
KMF,
KRW,
KWD,
KYD,
KZT,
LAK,
LBP,
LKR,
LRD,
LSL,
LYD,
MAD,
MDL,
MGA,
MKD,
MMK,
MNT,
MOP,
MRU,
MUR,
MVR,
MWK,
MXN,
MYR,
MZN,
NAD,
NGN,
NIO,
NOK,
NPR,
NZD,
OMR,
PAB,
PEN,
PGK,
PHP,
PKR,
PLN,
PYG,
QAR,
RON,
RSD,
RUB,
RWF,
SAR,
SBD,
SCR,
SEK,
SGD,
SHP,
SLE,
SLL,
SOS,
SRD,
SSP,
STN,
SVC,
SZL,
THB,
TND,
TOP,
TRY,
TTD,
TWD,
TZS,
UAH,
UGX,
USD,
UYU,
UZS,
VES,
VND,
VUV,
WST,
XAF,
XCD,
XOF,
XPF,
YER,
ZAR,
ZMW
customer
object
required

Customer details associated with the subscription

has_payment_method
boolean
required

Whether a payment method is on file. False while a card-optional subscription waits for the customer to add one.

metadata
Metadata · object
required

Additional custom data associated with the subscription

meter_credit_entitlement_cart
object[]
required

Meter credit entitlement cart settings for this subscription

meters
object[]
required

Meters associated with this subscription (for usage-based billing)

next_billing_date
string<date-time>
required

Timestamp of the next scheduled billing. Indicates the end of current billing period

on_demand
boolean
required

Wether the subscription is on-demand or not

payment_frequency_count
integer<int32>
required

Number of payment frequency intervals

payment_frequency_interval
enum<string>
required

Time interval for payment frequency (e.g. month, year)

Available options:
Day,
Week,
Month,
Year
previous_billing_date
string<date-time>
required

Timestamp of the last payment. Indicates the start of current billing period

product_id
string
required

Identifier of the product associated with this subscription

quantity
integer<int32>
required

Number of units/items included in the subscription

recurring_pre_tax_amount
integer<int32>
required

Amount charged before tax for each recurring payment in the currency's smallest unit (cents for USD, yen for JPY, fils for KWD)

status
enum<string>
required

Current status of the subscription

Available options:
pending,
active,
on_hold,
paused,
cancelled,
failed,
expired,
past_due
subscription_id
string
required

Unique identifier for the subscription

subscription_period_count
integer<int32>
required

Number of subscription period intervals

subscription_period_interval
enum<string>
required

Time interval for the subscription period (e.g. month, year)

Available options:
Day,
Week,
Month,
Year
tax_inclusive
boolean
required

Indicates if the recurring_pre_tax_amount is tax inclusive

trial_period_days
integer<int32>
required

Number of days in the trial period (0 if no trial)

cancellation_comment
string | null

Free-text cancellation comment, if any

cancellation_feedback
null | enum<string>

Customer-supplied churn reason, if any

Available options:
too_expensive,
missing_features,
switched_service,
unused,
customer_service,
low_quality,
too_complex,
other
cancelled_at
string<date-time> | null

Cancelled timestamp if the subscription is cancelled

cancelled_by
null | object

The caller that cancelled the subscription or scheduled its cancel. null when no caller is known, for example when the system cancelled the subscription.

custom_field_responses
object[] | null

Customer's responses to custom fields collected during checkout

customer_business_name
string | null

Business / legal name associated with the tax id (B2B). When set this is used on the invoice in place of the customer's personal name.

discount_cycles_remaining
integer<int32> | null

DEPRECATED: Use discounts[].cycles_remaining instead.

discount_id
string | null

DEPRECATED: Use discounts instead. Returns the first discount's ID if present.

discounts
object[] | null

All stacked discounts applied, ordered by position

expires_at
string<date-time> | null

Timestamp when the subscription will expire

paused_at
string<date-time> | null

Timestamp when the subscription was paused, if it currently is (or is OnHold due to an unresolved pause settlement). null otherwise.

payment_method_id
string | null

Saved payment method id used for recurring charges

scheduled_change
null | object

Scheduled plan change details, if any

tax_id
string | null

Tax identifier provided for this subscription (if applicable)

trial_amount
integer<int32> | null

Per-unit trial amount after discounts, snapshotted at subscription creation (price currency minor units, pre-quantity, pre-tax). Null for a free trial or no trial.

past_due_ends_at
string<date-time> | null

Time when the grace period ends. The subscription moves to on_hold or to cancelled at this time.

Read in the same query as the rest of the payload, so it always comes from the row snapshot that produced status. It is set whenever the subscription sits in a window at that moment. A delayed event of another type therefore carries the deadline too, next to a past_due status.

Last modified on September 25, 2026