Version
WEBHOOK

coupon.deactivated

A coupon was switched off and stops being offered at checkout.

When this fires

A creator switched a coupon off through the deactivate endpoint. Switching a code off in the dashboard or through the bot does not currently emit this event; those surfaces write through the service layer directly.

This is the safe way to retire a code, and the one Subscriby points creators at when a delete is refused. Switching off stops the code being offered immediately without touching the redemptions already recorded against it.

A checkout already in flight still completes. Switching off blocks new redemptions. A subscriber who already applied the code and is sitting on a payment page still gets their discount; the hold was taken before the switch. Expect a coupon.redeemed to arrive shortly after this event, and do not treat that as an error.

Caveats

  • Expiry does not emit this. A coupon that runs past its expires_at stops applying but its active flag never changes, so no event fires. If you need the expiry moment, schedule against expires_at.
  • Exhaustion does not emit this either. A coupon that runs out of uses emits coupon.exhausted and stays active: true. The two are distinct states: one is a decision, the other an outcome.
  • Nothing is refunded or revoked. Subscribers who already redeemed keep what they paid, and their subscriptions are untouched.

Related events

  • coupon.activated: the paired transition.
  • coupon.exhausted: ran out of uses rather than being switched off.
  • coupon.deleted: the destructive alternative, which stops the code resolving.

Ability to subscribe

A token needs this to subscribe an endpoint to the event.

Header Parameters

SB-Signature*string

t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.

SB-Event-Id*string

The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.

SB-Event-Name*string

The event name, the same as the envelope's type.

Content-Type*string

Always application/json.

User-Agent*string

Always Subscriby-Webhooks/1.0.

Payload

JSONWhat Subscriby posts to your endpoint

The signed JSON envelope posted to your endpoint.

The envelope every event is delivered in.

Responses

2XXAny success status

Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.

defaultAny other status

Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.

How is this guide?

Last updated on