coupon.activated
A coupon was switched on and is being offered at checkout again.
When this fires
A creator switched a coupon on — from the dashboard, the Telegram bot, or
POST /v1/projects/{project}/coupons/{coupon}/activate.
This is the availability flip, kept out of coupon.updated on purpose: an automation
that cares whether a discount is live wants one event to subscribe to, not a diff of the active
key on every save.
Switched on is not the same as redeemable
active: true is one of four conditions. A coupon still will not apply if it
is outside its starts_at / expires_at window, if every use is already
spoken for, or if the buyer has hit their own per-subscriber cap. Check the
window and the caps in the payload before announcing a live sale.
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.activated",
"created_at": "2026-11-27T00:00:31Z",
"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. active is always true here.
Caveats
- This is not scheduled. It fires when a person flips the switch. A coupon whose
starts_atsimply arrived does not emit this — nothing changed on the row. If you need the moment a code becomes redeemable, schedule againststarts_at. - Re-activating a switched-off coupon does not reset its counts. Redemptions taken before it
was switched off still count against
max_redemptions, so a code that was exhausted before is still exhausted after. - Idempotent flips still emit. Activating an already-active coupon over the API emits this
again. De-dup on the event
id.
Related events
coupon.deactivated— the paired transition.coupon.updated— a terms change, which deliberately excludes this flip.- Coupon events overview — back to family overview.
How is this guide?