subscription.canceled
Overview of the subscription.canceled webhook
When a subscription.canceled
event is triggered, FastSpring sends a webhook payload with details about the canceled subscription. This webhook typically fires when a customer cancels through their account management portal, when you select Deactivate at Next Period in the FastSpring app, or when you cancel via the API without including billingPeriod=0
.
Webhook behavior
Fires when:
- A customer cancels a subscription via the customer portal
- You select Deactivate at Next Period in the FastSpring app
- You cancel a subscription using the API and omit
billingPeriod=0
Does not fire when:
- You select Deactivate Now in the FastSpring app
- You cancel a subscription using the API and include
billingPeriod=0
- You cancel a managed subscription
This page includes:
- A full sample payload for the
subscription.canceled
webhook - A detailed table listing every payload property, including name, type, and description
- Notes on when this webhook is triggered and which fields appear based on Webhook Expansion
Browse the table sections below or use the quick links to jump to a specific group of fields.
Tip: Not all fields are always included. Refer to the Payload properties table to understand when a field appears.
Webhook payload example (expansion enabled)
When a subscription.canceled
event is triggered, the webhook sends the following JSON payload:
{
"id": "subSCR1pt10nAbc123-456XYZ",
"quote": "QUOT1234ABC5678XYZ",
"subscription": "subSCR1pt10nAbc123-456XYZ",
"active": true,
"state": "canceled",
"changed": 1751328000000,
"changedValue": 1751328000000,
"changedInSeconds": 1751328000,
"changedDisplay": "7/31/25",
"live": true,
"currency": "USD",
"account": {
"id": "acctAbCdEfG123-XyZ456",
"account": "acctAbCdEfG123-XyZ456",
"contact": {
"first": "John",
"last": "Doe",
"email": "[email protected]",
"company": "Example Corp",
"phone": "+1 5550001000"
},
"language": "en",
"country": "US",
"lookup": {
"global": "acctPublicID789_XYZ"
},
"url": "https://examplestore.test.onfastspring.com/account"
},
"product": {
"product": "example-subscription-annual",
"parent": "example-parent-product",
"display": {
"en": "Example Subscription - Annual"
},
"description": {
"summary": {
"en": "This is the summary description for Example Subscription - Annual."
},
"action": {
"en": "Buy Now"
},
"full": {
"en": "This is the long description for Example Subscription - Annual."
}
},
"image": "https://cdn.example.com/images/subscription-annual.png",
"fulfillments": {
"example-subscription-monthly_file_0": {
"fulfillment": "example-subscription-monthly_file_0",
"name": "File Download (installer.exe)",
"applicability": "NON_REBILL_ONLY",
"display": {
"en": "Download Installer"
},
"url": "https://cdn.example.com/files/installer.exe",
"size": 24576,
"behavior": "PREFER_EXPLICIT",
"previous": []
}
},
"format": "digital",
"pricing": {
"trial": 7,
"interval": "month",
"intervalLength": 1,
"intervalCount": 1,
"quantityBehavior": "allow",
"quantityDefault": 1,
"price": {
"USD": 100
},
"dateLimitsEnabled": false,
"reminderNotification": {
"enabled": true,
"interval": "week",
"intervalLength": 1
},
"overdueNotification": {
"enabled": true,
"interval": "week",
"intervalLength": 1,
"amount": 4
},
"cancellation": {
"interval": "week",
"intervalLength": 1
}
}
},
"sku": "sub-annual-001",
"display": "Example Subscription - Annual",
"quantity": 1,
"adhoc": false,
"autoRenew": true,
"price": 100,
"priceDisplay": "$100.00",
"priceInPayoutCurrency": 100,
"priceInPayoutCurrencyDisplay": "$100.00",
"discount": 0,
"discountDisplay": "$0.00",
"discountInPayoutCurrency": 0,
"discountInPayoutCurrencyDisplay": "$0.00",
"subtotal": 110,
"subtotalDisplay": "$110.00",
"subtotalInPayoutCurrency": 110,
"subtotalInPayoutCurrencyDisplay": "$110.00",
"next": 1782864000000,
"nextValue": 1782864000000,
"nextInSeconds": 1782864000,
"nextDisplay": "7/31/26",
"end": 1814486400000,
"endValue": 1814486400000,
"endInSeconds": 1814486400,
"endDisplay": "7/31/27",
"canceledDate": 1814486400000,
"canceledDateValue": 1814486400000,
"canceledDateInSeconds": 1814486400,
"canceledDateDisplay": "7/31/27",
"deactivationDate": 1814572800000,
"deactivationDateValue": 1814572800000,
"deactivationDateInSeconds": 1814572800,
"deactivationDateDisplay": "8/1/27",
"sequence": 1,
"periods": 12,
"remainingPeriods": 11,
"begin": 1751328000000,
"beginValue": 1751328000000,
"beginInSeconds": 1751328000,
"beginDisplay": "7/31/25",
"intervalUnit": "year",
"intervalLength": 1,
"nextChargeCurrency": "USD",
"nextChargeDate": 1782864000000,
"nextChargeDateValue": 1782864000000,
"nextChargeDateInSeconds": 1782864000,
"nextChargeDateDisplay": "7/31/26",
"nextChargePreTax": 110,
"nextChargePreTaxDisplay": "$110.00",
"nextChargePreTaxInPayoutCurrency": 110,
"nextChargePreTaxInPayoutCurrencyDisplay": "$110.00",
"nextChargeTotal": 110,
"nextChargeTotalDisplay": "$110.00",
"nextChargeTotalInPayoutCurrency": 110,
"nextChargeTotalInPayoutCurrencyDisplay": "$110.00",
"nextNotificationType": "PAYMENT_REMINDER",
"nextNotificationDate": 1782259200000,
"nextNotificationDateValue": 1782259200000,
"nextNotificationDateInSeconds": 1782259200,
"nextNotificationDateDisplay": "7/25/26",
"trialReminder": {
"intervalUnit": "day",
"intervalLength": 3
},
"paymentReminder": {
"intervalUnit": "week",
"intervalLength": 1
},
"paymentOverdue": {
"intervalUnit": "week",
"intervalLength": 1,
"total": 4,
"sent": 0
},
"cancellationSetting": {
"cancellation": "AFTER_LAST_NOTIFICATION",
"intervalUnit": "week",
"intervalLength": 1
},
"fulfillments": {
"example-subscription-annual_file_1": [
{
"display": "installer.exe",
"size": 24576,
"file": "https://cdn.example.com/files/installer.exe",
"type": "file"
}
]
},
"instructions": [
{
"product": "example-subscription-annual",
"type": "regular",
"periodStartDate": 1751328000000,
"periodStartDateValue": 1751328000000,
"periodStartDateInSeconds": 1751328000,
"periodStartDateDisplay": "7/31/25",
"periodEndDate": 1782864000000,
"periodEndDateValue": 1782864000000,
"periodEndDateInSeconds": 1782864000,
"periodEndDateDisplay": "7/31/26",
"intervalUnit": "year",
"intervalLength": 1,
"discountPercent": 0,
"discountPercentValue": 0,
"discountPercentDisplay": "0%",
"discountTotal": 0,
"discountTotalDisplay": "$0.00",
"discountTotalInPayoutCurrency": 0,
"discountTotalInPayoutCurrencyDisplay": "$0.00",
"unitDiscount": 0,
"unitDiscountDisplay": "$0.00",
"unitDiscountInPayoutCurrency": 0,
"unitDiscountInPayoutCurrencyDisplay": "$0.00",
"price": 100,
"priceDisplay": "$100.00",
"priceInPayoutCurrency": 100,
"priceInPayoutCurrencyDisplay": "$100.00",
"priceTotal": 100,
"priceTotalDisplay": "$100.00",
"priceTotalInPayoutCurrency": 100,
"priceTotalInPayoutCurrencyDisplay": "$100.00",
"unitPrice": 100,
"unitPriceDisplay": "$100.00",
"unitPriceInPayoutCurrency": 100,
"unitPriceInPayoutCurrencyDisplay": "$100.00",
"total": 100,
"totalDisplay": "$100.00",
"totalInPayoutCurrency": 100,
"totalInPayoutCurrencyDisplay": "$100.00"
}
]
}
Navigate this webhook
The subscription.canceled
webhook payload includes dozens of fields. Use the cards below to jump to a specific section of the property reference.
Subscription Metadata
Timestamps
Subscription Settings
Account Object
Product Object
Pricing
Subscription Details (Root-level)
Rebill and Expiration
Next Charge Details
Cancellation and Deactivation
Billing Schedule
Notification Settings
Add-ons Array
Setup Fee Object
Fulfillments Object
Instructions Array
Payload properties
All fields below are included in the subscription.canceled
webhook payload. Fields are grouped into categories for easier navigation.
Name | Type | Description |
---|---|---|
Subscription Metadata | ||
id | string | Unique identifier for the subscription instance |
quote | string | Quote ID associated with the originating order when applicable |
subscription | string | Legacy subscription identifier matching id for backward compatibility |
active | boolean | Whether the subscription is currently active |
state | string | Current subscription state such as active , overdue , deactivated , trial , or canceled |
Timestamps | ||
changed | integer | Time of the most recent update in milliseconds since epoch |
changedValue | integer | Duplicate of changed for backward compatibility |
changedInSeconds | integer | Time of the most recent update in seconds since epoch |
changedDisplay | string | Human-readable display of the most recent update time |
Subscription Settings | ||
live | boolean | Whether the subscription was created in live mode |
currency | string | Three-letter ISO currency code for the subscription |
Account Object | ||
account | object | Customer account object containing ID, contact information, language, country, and account lookup values |
account.id | string | FastSpring-generated customer account ID |
account.account | string | Duplicate of account.id for backward compatibility |
account.contact.first | string | First name of the customer |
account.contact.last | string | Last name of the customer |
account.contact.email | string | Email address of the customer |
account.contact.company | string | Company name of the customer when provided |
account.contact.phone | string | Phone number of the customer when provided |
account.language | string | Two-letter ISO code for the customer’s preferred language |
account.country | string | Two-letter ISO country code for the customer |
account.lookup.global | string | Globally unique public ID used to look up the account in customer-facing portals |
account.url | string | Customer-facing account management URL |
Product Object | ||
product.pricing.trial | string | Trial configuration for the product when applicable |
product | string | Identifier or path of the subscription product |
parent | string | Identifier of the parent product when applicable |
display.en | string | Localized display name of the product in English |
description.summary.en | string | Short summary description of the product in English |
description.action.en | string | Call-to-action text for the product in English |
description.full.en | string | Long-form description of the product in English |
image | string | URL of the product image |
offers | array | List of add-on offers related to the product |
offers.type | string | Type of offer such as addon |
offers.display.en | string | Display name of the offer in English |
offers.items | array | Identifiers of products included in the offer |
fulfillments | object | One or more fulfillment items keyed by dynamic identifiers |
fulfillments.fulfillment | string | Unique identifier for the fulfillment item |
fulfillments.name | string | Name or label of the fulfillment |
fulfillments.applicability | string | Applicability of the fulfillment such as NON_REBILL_ONLY |
fulfillments.display.en | string | Buyer-facing display name of the fulfillment in English |
fulfillments.url | string | Download URL for a file-based fulfillment |
fulfillments.size | integer | File size in bytes for a downloadable fulfillment |
fulfillments.behavior | string | Delivery behavior such as PREFER_EXPLICIT |
fulfillments.previous | array | Array of previously used fulfillment items |
format | string | Product format such as digital |
Pricing | ||
interval | string | Time unit for the billing interval such as month or year |
intervalLength | integer | Number of units per billing interval |
intervalCount | integer | Total number of billing intervals when applicable |
quantityBehavior | string | How quantity is handled for the subscription |
quantityDefault | integer | Default quantity value when the product is added |
price.USD | number | Price of the product in USD |
dateLimitsEnabled | boolean | Whether time-based restrictions are enabled for pricing |
setupFee.price.USD | number | Setup fee amount in USD |
setupFee.title.en | string | Localized display label for the setup fee |
reminderNotification.enabled | boolean | Whether renewal reminders are enabled |
reminderNotification.interval | string | Time unit for the reminder interval |
reminderNotification.intervalLength | integer | Number of interval units before the charge when the reminder is sent |
overdueNotification.enabled | boolean | Whether overdue notifications are enabled |
overdueNotification.interval | string | Time unit between overdue notifications |
overdueNotification.intervalLength | integer | Interval length between overdue notifications |
overdueNotification.amount | integer | Total number of overdue notifications to send |
cancellation.interval | string | Time unit used with intervalLength to determine cancellation timing |
cancellation.intervalLength | integer | Number of interval units after which the subscription is canceled |
Subscription Details (Root-level) | ||
sku | string | Internal SKU for the subscription product |
display | string | Display name of the subscription product |
quantity | integer | Quantity of the subscription product |
adhoc | boolean | Whether the subscription is managed outside standard checkout flows |
autoRenew | boolean | Whether the subscription renews automatically |
price | number | Base price of the subscription product |
priceDisplay | string | Formatted base price |
priceInPayoutCurrency | number | Base price converted to your disbursement currency |
priceInPayoutCurrencyDisplay | string | Formatted base price in your disbursement currency |
discount | number | Total discount amount applied to the subscription |
discountDisplay | string | Formatted discount amount |
discountInPayoutCurrency | number | Discount amount in your disbursement currency |
discountInPayoutCurrencyDisplay | string | Formatted discount amount in your disbursement currency |
subtotal | number | Subtotal including price and setup fees before taxes |
subtotalDisplay | string | Formatted subtotal |
subtotalInPayoutCurrency | number | Subtotal in your disbursement currency |
subtotalInPayoutCurrencyDisplay | string | Formatted subtotal in your disbursement currency |
Rebill and Expiration | ||
next | integer | Timestamp in milliseconds for the next scheduled rebill |
nextValue | integer | Duplicate of next for backward compatibility |
nextInSeconds | integer | Timestamp in seconds for the next scheduled rebill |
nextDisplay | string | Formatted date for the next scheduled rebill |
end | integer | Timestamp in milliseconds for the subscription end date |
endValue | integer | Duplicate of end for backward compatibility |
endInSeconds | integer | Subscription end date in seconds |
endDisplay | string | Formatted subscription end date |
Next Charge Details | ||
nextChargeCurrency | string | Three-letter ISO currency code for the next scheduled charge |
nextChargeDate | integer | Next charge date timestamp in milliseconds |
nextChargeDateValue | integer | Duplicate of nextChargeDate for backward compatibility |
nextChargeDateInSeconds | integer | Next charge date timestamp in seconds |
nextChargeDateDisplay | string | Formatted next charge date |
nextChargePreTax | number | Total pre-tax amount for the next scheduled charge |
nextChargePreTaxDisplay | string | Formatted pre-tax charge amount |
nextChargePreTaxInPayoutCurrency | number | Pre-tax charge amount in your disbursement currency |
nextChargePreTaxInPayoutCurrencyDisplay | string | Formatted pre-tax charge amount in your disbursement currency |
nextChargeTotal | number | Total charge amount for the next scheduled charge |
nextChargeTotalDisplay | string | Formatted total charge amount |
nextChargeTotalInPayoutCurrency | number | Total charge amount in your disbursement currency |
nextChargeTotalInPayoutCurrencyDisplay | string | Formatted total charge amount in your disbursement currency |
Cancellation and Deactivation | ||
canceledDate | integer | Timestamp in milliseconds when the subscription was canceled |
canceledDateValue | integer | Duplicate of canceledDate for backward compatibility |
canceledDateInSeconds | integer | Cancellation timestamp in seconds |
canceledDateDisplay | string | Formatted cancellation date |
deactivationDate | integer | Timestamp in milliseconds when the subscription was deactivated |
deactivationDateValue | integer | Duplicate of deactivationDate for backward compatibility |
deactivationDateInSeconds | integer | Deactivation timestamp in seconds |
deactivationDateDisplay | string | Formatted deactivation date |
Billing Schedule | ||
sequence | integer | Current billing period number |
periods | integer | Total number of expected billing periods |
remainingPeriods | integer | Number of rebills remaining before expiration |
begin | integer | Activation timestamp in milliseconds |
beginValue | integer | Duplicate of begin for backward compatibility |
beginInSeconds | integer | Activation timestamp in seconds |
beginDisplay | string | Formatted activation date |
intervalUnit | string | Time unit for rebills such as month or year |
intervalLength | integer | Number of units per billing cycle |
Notification Settings | ||
nextNotificationType | string | Type of next scheduled notification such as PAYMENT_REMINDER |
nextNotificationDate | integer | Next notification timestamp in milliseconds |
nextNotificationDateValue | integer | Duplicate of nextNotificationDate for backward compatibility |
nextNotificationDateInSeconds | integer | Next notification timestamp in seconds |
nextNotificationDateDisplay | string | Formatted next notification date |
trialReminder | object | Configuration for a pre-trial-end reminder when a free trial is used |
trialReminder.intervalUnit | string | Time unit for the trial reminder interval |
trialReminder.intervalLength | integer | Number of interval units before trial end to send the reminder |
paymentReminder | object | Interval settings for pre-billing reminders |
paymentReminder.intervalUnit | string | Time unit for reminder intervals such as week |
paymentReminder.intervalLength | integer | Number of time units before rebill to send a reminder |
paymentOverdue | object | Settings for overdue payment notifications |
paymentOverdue.intervalUnit | string | Time unit between overdue reminders |
paymentOverdue.intervalLength | integer | Number of time units between overdue reminders |
paymentOverdue.total | integer | Total number of overdue reminders to send |
paymentOverdue.sent | integer | Number of overdue reminders already sent |
cancellationSetting | object | Rules for automatic cancellation after reminders |
cancellationSetting.cancellation | string | Cancellation trigger such as AFTER_LAST_NOTIFICATION |
cancellationSetting.intervalUnit | string | Time unit used to delay cancellation |
cancellationSetting.intervalLength | integer | Number of time units to wait before cancellation |
Add-ons Array | ||
addons | array | List of optional add-on products included with the subscription |
addons.product | string | Identifier of the add-on product |
addons.sku | string | SKU of the add-on product |
addons.display | string | Display name of the add-on product |
addons.quantity | integer | Quantity of the add-on product |
addons.price | number | Unit price of the add-on |
addons.priceDisplay | string | Formatted unit price of the add-on |
addons.priceInPayoutCurrency | number | Unit price of the add-on in your disbursement currency |
addons.priceInPayoutCurrencyDisplay | string | Formatted unit price of the add-on in your disbursement currency |
addons.discount | number | Total discount applied to the add-on |
addons.discountDisplay | string | Formatted discount applied to the add-on |
addons.discountInPayoutCurrency | number | Discount applied to the add-on in your disbursement currency |
addons.discountInPayoutCurrencyDisplay | string | Formatted discount applied to the add-on in your disbursement currency |
addons.subtotal | number | Total cost of the add-on after discounts |
addons.subtotalDisplay | string | Formatted subtotal of the add-on |
addons.subtotalInPayoutCurrency | number | Subtotal for the add-on in your disbursement currency |
addons.subtotalInPayoutCurrencyDisplay | string | Formatted subtotal for the add-on in your disbursement currency |
addons.discounts | array | List of discount objects applied to the add-on |
Setup Fee Object | ||
setupFee | object | Object containing setup fee information |
setupFee.price | number | Setup fee amount |
setupFee.title | string | Display label for the setup fee |
Fulfillments Object | ||
fulfillments.license | string | License key or keys associated with the subscription |
fulfillments.display | string | Display name of the fulfillment |
fulfillments.size | integer | File size in bytes when applicable |
fulfillments.file | string | Download URL for the fulfillment file |
fulfillments.type | string | Type of fulfillment such as file or license |
Instructions Array | ||
instructions | array | Array of billing instruction objects for each rebill period |
instructions.product | string | Product identifier for this billing period |
instructions.type | string | Instruction type such as regular , trial , or discounted |
instructions.trialType | string | Trial type for the period such as PAID , FREE_WITH_PAYMENT , or FREE_WITHOUT_PAYMENT |
instructions.periodStartDate | integer | Instruction period start timestamp in milliseconds |
instructions.periodStartDateValue | integer | Duplicate of instructions.periodStartDate for backward compatibility |
instructions.periodStartDateInSeconds | integer | Instruction period start timestamp in seconds |
instructions.periodStartDateDisplay | string | Formatted instruction period start date |
instructions.periodEndDate | integer | Instruction period end timestamp in milliseconds |
instructions.periodEndDateValue | integer | Duplicate of instructions.periodEndDate for backward compatibility |
instructions.periodEndDateInSeconds | integer | Instruction period end timestamp in seconds |
instructions.periodEndDateDisplay | string | Formatted instruction period end date |
instructions.intervalUnit | string | Time unit for the billing interval |
instructions.intervalLength | integer | Number of units per instruction interval |
instructions.discountPercent | number | Percentage discount applied during the period |
instructions.discountPercentValue | number | Raw discount percentage value |
instructions.discountPercentDisplay | string | Formatted discount percentage |
instructions.discountTotal | number | Total discount applied during the period |
instructions.discountTotalDisplay | string | Formatted total discount |
instructions.discountTotalInPayoutCurrency | number | Total discount in your disbursement currency |
instructions.discountTotalInPayoutCurrencyDisplay | string | Formatted discount total in your disbursement currency |
instructions.unitDiscount | number | Unit-level discount amount |
instructions.unitDiscountDisplay | string | Formatted unit-level discount |
instructions.unitDiscountInPayoutCurrency | number | Unit-level discount in your disbursement currency |
instructions.unitDiscountInPayoutCurrencyDisplay | string | Formatted unit-level discount in your disbursement currency |
instructions.price | number | Base price for the instruction period before discounts |
instructions.priceDisplay | string | Formatted base price for the period |
instructions.priceInPayoutCurrency | number | Base price in your disbursement currency |
instructions.priceInPayoutCurrencyDisplay | string | Formatted base price in your disbursement currency |
instructions.priceTotal | number | Total price after discounts before tax |
instructions.priceTotalDisplay | string | Formatted total price after discounts |
instructions.priceTotalInPayoutCurrency | number | Total price after discounts in your disbursement currency |
instructions.priceTotalInPayoutCurrencyDisplay | string | Formatted total price after discounts in your disbursement currency |
instructions.unitPrice | number | Price per unit after discounts |
instructions.unitPriceDisplay | string | Formatted price per unit after discounts |
instructions.unitPriceInPayoutCurrency | number | Unit price after discounts in your disbursement currency |
instructions.unitPriceInPayoutCurrencyDisplay | string | Formatted unit price after discounts in your disbursement currency |
instructions.total | number | Total charge for the instruction period before tax |
instructions.totalDisplay | string | Formatted total charge for the period |
instructions.totalInPayoutCurrency | number | Total charge in your disbursement currency |
instructions.totalInPayoutCurrencyDisplay | string | Formatted total charge in your disbursement currency |