Coupons & Discounts
Create coupons and apply them to subscriptions to offer percentage or fixed-amount discounts.
Coupons let you define reusable discount configurations that can be applied to subscriptions. When a coupon is applied to a subscription, it creates a discount that reduces the bill amount for one or more billing cycles.
How coupons work
A coupon defines the discount rules — what type of reduction, how much, and for how long. When you apply a coupon to a subscription, a discount is created on that subscription using the coupon's configuration.
- Create a coupon — define the discount type, value, duration, and optional limits.
- Apply to a subscription — apply the coupon to an active or trialing subscription to create a discount.
- Bills are reduced — subsequent bills are automatically reduced by the discount amount.
- Discount expires — the discount ends based on the coupon's duration setting.
Discount types
Coupons support two discount types:
| Type | Description | Value format |
|---|---|---|
percentage | Reduces the bill amount by a percentage. | 20 = 20%, 100 = 100%. |
fixed_amount | Reduces the bill amount by a fixed currency value. | 5.00 = 5.00 in the coupon's currency (e.g. £5.00 for GBP). |
Percentage example
A 20% discount coupon:
{
"name": "Summer Sale 20%",
"discount_type": "percentage",
"value": 20,
"duration": "repeating",
"duration_in_cycles": 3
}Fixed amount example
A £5.00 discount coupon:
{
"name": "£5 Off",
"discount_type": "fixed_amount",
"value": 5.00,
"currency": "GBP",
"duration": "once"
}
Currency matchingFor
fixed_amountcoupons, thecurrencyfield is required and must match the subscription's price currency when applied.
Duration
The duration controls how many billing cycles the discount applies for once it is active on a subscription:
| Duration | Description | duration_in_cycles |
|---|---|---|
once | Applies to a single billing cycle. | Must be null. |
repeating | Applies for a set number of billing cycles. | Required, must be greater than 0. |
forever | Applies indefinitely until manually removed. | Must be null. |
Redemption limits
You can optionally set max_redemptions to limit how many times a coupon can be applied across all subscriptions. Once the limit is reached, the coupon can no longer be applied to new subscriptions. Existing discounts already using the coupon are not affected.
Coupon lifecycle
| Status | Description |
|---|---|
active | The coupon is available to be applied to subscriptions. |
expired | The coupon has reached its max_redemptions limit and can no longer be applied. |
archived | The coupon has been archived via the API and can no longer be applied. |
To archive a coupon, submit a DELETE request to the /coupons/{coupon_id} endpoint. For more information, see the archive coupon API reference.
Applying a coupon to a subscription
To apply a coupon, submit a POST request to the /subscriptions/{subscription_id}/discount endpoint with the coupon_id:
{
"coupon_id": "01JCX5Y8K9M3N4P6Q7R8S9T0UV"
}Rules
- Only one discount can be active per subscription at a time.
- The subscription must be in
activeortrialingstatus. - The coupon must be in
activestatus and not have reached itsmax_redemptionslimit. - For
fixed_amountcoupons, the coupon's currency must match the subscription's price currency.
Scheduled activation
You can schedule a discount to take effect at a future date by providing effective_from:
{
"coupon_id": "01JCX5Y8K9M3N4P6Q7R8S9T0UV",
"effective_from": "2026-01-01T00:00:00Z"
}The discount is created immediately on the subscription but only begins reducing bill amounts from the specified date.
Removing a discount
To remove a discount from a subscription, submit a DELETE request to the /subscriptions/{subscription_id}/discount endpoint. Removing a discount does not decrement the coupon's redemption count.
Viewing discounts
The discount is returned as part of the subscription response. By default, only the coupon_id is included. Use the expand query parameter to include the full discount details:
GET /subscriptions/{subscription_id}?expand=discount response:
{
"id": "01HNY4G8G5ZMAXQB8T0Z1Y1ZMW",
"status": "active",
"customer": {
"id": "c3e06b6f-bb52-4b2c-81a3-899860652240"
},
"discount": {
"coupon_id": "01JCX5Y8K9M3N4P6Q7R8S9T0UV",
"discount_type": "percentage",
"value": 20,
"remaining_cycles": 2,
"applied_at": "2025-11-01T09:00:00Z",
"effective_from": "2025-11-01T09:00:00Z",
"end_date": null
}
}Updated 9 days ago