coupon.deleted
A coupon was removed, carrying its final snapshot.
When this fires
A creator deleted a coupon — from the dashboard, the Telegram bot, or
DELETE /v1/projects/{project}/coupons/{coupon}.
The payload is a snapshot taken before the delete, so this is your last chance to record what the code was. Read it and store what you need; the coupon is gone by the time the webhook lands.
The redemption history goes with it
Deleting removes the code's redemption records too. Subscribers who already
redeemed keep what they paid and their subscriptions are untouched, but your
own reporting loses the attribution. To retire a code and keep the history,
use coupon.deactivated instead — switching off stops new
redemptions immediately and leaves everything else in place.
Required ability
project-coupon:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "coupon.deleted",
"created_at": "2026-12-04T11:22:47Z",
"api_version": "2026-05-01",
"project_id": "prj_01HX...",
"data": {
"coupon": {
"id": "cpn_01HX...",
"code": "BLACKFRIDAY",
"name": "Black Friday 2026",
"discount_type": "percentage",
"discount_value": "25.0000",
"currency_id": null,
"duration": "once",
"max_redemptions": 500,
"max_redemptions_per_user": 1,
"minimum_amount": null,
"starts_at": "2026-11-27T00:00:00+00:00",
"expires_at": "2026-12-01T00:00:00+00:00",
"active": true
}
}
}data.coupon is the same snapshot every coupon.* lifecycle event carries — see
coupon.created for each key. It reflects the coupon's state
immediately before deletion, so active may well be true.
Caveats
- A delete can be refused. If any subscriber holds a live reservation — a checkout in flight with this discount already quoted to a payment provider — Subscriby refuses the delete and asks the creator to switch the code off instead. No event fires in that case, because nothing happened.
- The coupon id is already unresolvable. Do not follow up with
GET /v1/projects/{project}/coupons/{coupon}— it will 404. Everything you get is in this payload. - No counts. As with every lifecycle event, the snapshot omits redemption counts. If you need
a final tally, keep a running total from
coupon.redeemedrather than trying to read one at delete time.
Related events
coupon.deactivated— the non-destructive way to retire a code.coupon.created— the same snapshot shape, at the other end of the life.- Coupon events overview — back to family overview.
How is this guide?