When a user purchases your subscription SKU, Discord:
Creates an Entitlement for the user (or guild) and the subscription SKU.
Emits an ENTITLEMENT_CREATE event via the Gateway.
Makes the entitlement available via the List Entitlements API endpoint.
Makes the entitlement available on interaction payloads initiated by the entitled user or guild members.
Makes the subscription available via the List Subscriptions API endpoint.
The entitlement is granted indefinitely until the user cancels — ends_at will be null. When a subscription ends, you receive an ENTITLEMENT_UPDATE event with an ends_at timestamp.
Because entitlements don’t update on renewal or cancellation, use subscription events to track the subscription lifecycle.
This is not a complete list of when events may occur. Use the presence of an entitlement to determine if a user has access to your premium features. The Subscription API and related events are intended for reporting and lifecycle management — they should not be used as the source of truth for whether a user has access to your features.
Event
Subscription behavior
Updated fields
SUBSCRIPTION_CREATE
Subscription is created
status is 0 (active) if entitlement granted, or 1 (ending) if not yet granted
When a user purchases a subscription, an entitlement is created representing their access to your premium features.You can use a combination of Gateway events, the Entitlement HTTP API, and interaction payloads to track entitlements and grant features accordingly.
For apps that require background processing or are not solely reliant on interactions, use the List Entitlements endpoint to list active and expired entitlements. Filter by user or guild using the ?user_id=XYZ or ?guild_id=XYZ query parameters.For example, you might store entitlements in a database and check whether a user still has access to a SKU before running a scheduled job.
Entitlements are also included in interaction payloads. Find them in the entitlements field when receiving and responding to interactions. Use this field to check whether the interacting user or their guild is subscribed.
Add a premium button to prompt users to subscribe when they attempt to use a feature that requires a subscription. Send a message with a button using the premium style and a sku_id.
If you offer multiple subscription tiers, users can upgrade or downgrade from your Store page or their App Subscription settings.To support multiple tiers, create multiple subscription SKUs.
When a user upgrades to a same-price or higher-tier subscription, they are charged the difference and the subscription period resets. The current lower-tier entitlement ends immediately.
Event
Trigger
ENTITLEMENT_UPDATE
Current entitlement ends. ends_at is updated with a timestamp.
ENTITLEMENT_CREATE
New entitlement is created for the upgraded SKU.
SUBSCRIPTION_UPDATE
Subscription is updated with new entitlement_ids, sku_ids, current_period_start, current_period_end.
When a user downgrades to a lower-tier subscription, they are not charged immediately. The current plan remains valid until subscription.current_period_end.
Event
Trigger
SUBSCRIPTION_UPDATE
Subscription is updated to reflect the renewal SKU ID in subscription.renewal_sku_ids.
Once the current subscription expires at current_period_end:
Event
Trigger
ENTITLEMENT_UPDATE
Current entitlement ends. ends_at is updated with a timestamp.
ENTITLEMENT_CREATE
New entitlement is created for the downgraded SKU.
SUBSCRIPTION_UPDATE
Subscription is updated with new entitlement_ids, sku_ids, current_period_start, current_period_end.
Entitlements are the source of truth for a user’s access to a specific SKU. The Subscription API is intended for reporting and lifecycle management outside the flow of user interactions.
Use the Subscription API to check on the status of your app’s subscriptions:
Test your implementation by creating and deleting test entitlements. These let you simulate both a subscribed and unsubscribed state for a user or guild without going through the payment flow.
Test entitlements do not have starts_at or ends_at fields — they are valid until deleted.
To test the full payment flow, interact with your Store page or a premium button. Team members associated with your app automatically receive a 100% discount, so you can purchase without a live payment method.After checkout, you will have a live subscription that renews until canceled. You can use it to test subscription renewals. If you cancel, the entitlement remains active until the end of the billing period, shown in the period_ends_at field on the Subscription object.
You can only delete entitlements created via the Create Test Entitlement endpoint. For toggling access during development, use test entitlements.