subscription.activated
A paid subscription is acquired — fires once, at first activation.
This is the paid-acquisition event. If you only subscribe to one subscription
event for a paying audience, subscribe to this one — not
subscription.created, which never fires for paid checkouts.
When this fires
On the first successful payment for a subscription, across every payment provider — Stripe, PayPal, Paystack, Razorpay, Skrill, CeyPay, and CoinPayments. It covers both recurring subscriptions and one-time (non-recurring) passes.
It fires once per subscription, at acquisition. It is not a general "became active" signal:
| Transition | Event actually emitted |
|---|---|
| First paid checkout | subscription.activated |
| Recurring renewal charge | subscription.renewed |
| Paused → resumed | subscription.unpaused |
Cancelled → reinstated before ends_at | subscription.reactivated |
| Past-due → collected | subscription.renewed |
| Trial → paying | member.converted |
| Access code / cardless trial | subscription.created |
A Stripe subscription that begins in a trial still emits subscription.activated at acquisition, because the provider creates the subscription at that moment. The later trial-to-paid transition emits member.converted only.
Required ability
project-subscription:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "subscription.activated",
"created_at": "2026-05-18T10:05:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"subscription_id": "5b7e2d40-1a86-4c39-97f2-e83d0b16c5a4",
"plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
"subscriber_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
"provider": "stripe"
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always subscription.activated for this event. |
created_at | ISO 8601 timestamp | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | string UUID | Project this event belongs to. |
data.subscription_id | string UUID | Subscription identifier. |
data.plan_id | string UUID | Plan the subscription is on. |
data.subscriber_id | string UUID | Subscriber's project-scoped user id. |
data.provider | string | One of stripe, paypal, paystack, razorpay, skrill, ceypay, coinpayments. |
data.provider is never access_code on this event — code redemptions emit subscription.created instead.
Caveats
- Once per subscription. Stripe and PayPal de-duplicate with a persistent guard key; the remaining providers emit only on the non-renewal branch of their payment handler. Renewals never re-emit it.
- To capture every acquisition path — paid, comped code, and cardless trial — subscribe to both
subscription.activatedandsubscription.created, then de-duplicate ondata.subscription_id. - Paid acquisitions do not emit
member.joined. That event is access-code-only. Usesubscription.activatedas the paid-audience join signal. payment.succeededfires for the same charge and carries the amount, currency, and external payment id, which this event does not.- The
POST /v1/webhook-endpoints/{endpoint}/testendpoint sends a syntheticsubscription.createdpayload, neversubscription.activated. Testing an endpoint does not exercise this event.
Related events
subscription.created— the zero-payment acquisition equivalent.payment.succeeded— the charge behind this activation.subscription.renewed— every subsequent cycle.member.converted— trial-to-paying transition.- Subscription events overview — back to family overview.
How is this guide?