Skip to content

Commit 8c2bda1

Browse files
committed
feat(content): further monetization updates with new functionality
1 parent 2f6e891 commit 8c2bda1

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed
-17.7 KB
Loading
581 Bytes
Loading

guide/docs/popular-topics/monetization.mdx

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,41 @@ Monetization is limited to **verified** apps/bots.
1010

1111
:::
1212

13-
Premium Apps offer developers the ability to monetize their application through monthly recurring subscriptions, natively on Discord.
14-
This allows you to e.g. restrict specific commands or other functionality to premium users/guilds.
13+
Premium Apps offer developers the ability to monetize their application through either **monthly recurring subscriptions** or **one-time purchases**, natively on Discord.
14+
This allows you to e.g. limit specific commands or other functionality to premium users/guilds.
1515

1616
Not all applications are eligible - your app must be verified, part of a developer team, and use [slash commands](/interactions/slash-commands) or the privileged `Message Content` intent, among other things.
1717

1818
## Initial setup
1919

2020
To get started, visit the [official documentation](https://discord.com/developers/docs/monetization/overview) to see the full list of requirements, and configure your app for monetization by following the steps outlined there.
2121

22-
## Retrieving entitlements
22+
## Entitlements
2323

24-
Entitlements represent access to the premium functionality of your application. These can be granted to users or guilds, depending on how you set up monetization in the previous step, and contain a start/end date.
24+
Entitlements represent access to the premium functionality of your application. These can be granted to users or guilds, depending on the type of SKU you set up in the previous step.
2525

2626
In [interactions](/interactions) (e.g. slash commands), the entitlements for the invoking user/guild are easily accessible using <DocsLink reference="disnake.Interaction.entitlements" />.
2727

2828
Outside of interactions, you can fetch entitlements using <DocsLink reference="disnake.Client.entitlements">Client.entitlements()</DocsLink>, optionally only fetching entitlements of a specific user or guild. Note that this may include expired entitlements, unless you pass the `exclude_ended` parameter.
2929

3030
To check whether an entitlement is still active, you can use <DocsLink reference="disnake.Entitlement.is_active">Entitlement.is_active()</DocsLink>.
3131

32-
## Premium interactions
32+
### Premium interactions
3333

3434
This is usually the main way to provide premium functionality.
35-
Application commands are not preemptively marked as "premium-only" - instead, you may respond to interactions with a new response type: <DocsLink reference="disnake.InteractionResponse.require_premium" />.
36-
37-
This will display an ephemeral message to the invoking user, prompting them to upgrade:
35+
Commands are not preemptively marked as "premium-only" - instead, you may respond with a premium button, prompting users to upgrade/purchase a specific SKU:
3836

3937
```python
38+
sku_id = 1234432112344321
39+
40+
4041
@bot.slash_command()
4142
async def command(inter: disnake.ApplicationCommandInteraction):
42-
if not inter.entitlements:
43-
await inter.response.require_premium()
43+
if not any(e.sku_id == sku_id for e in inter.entitlements):
44+
await inter.response.send(
45+
content="Upgrade now to get access to this feature!",
46+
components=[disnake.ui.Button(sku_id=sku_id)],
47+
)
4448
return # skip remaining code
4549
...
4650
```
@@ -53,17 +57,40 @@ async def command(inter: disnake.ApplicationCommandInteraction):
5357
/>
5458
</p>
5559

56-
## Events
60+
### Events
5761

58-
Whenever users subscribe or renew a subscription with your app, you will receive an <DocsLink reference="disnake.on_entitlement_create" /> or <DocsLink reference="disnake.on_entitlement_update" /> event respectively.
59-
In the case of renewals, the <DocsLink reference="disnake.Entitlement.ends_at">ends_at</DocsLink> attribute of the entitlement you receive from the event will reflect the new expiry date.
62+
Whenever users make a purchase in your app, you will receive an <DocsLink reference="disnake.on_entitlement_create" /> event. For subscriptions, entitlements are granted indefinitely until the user decides to cancel their subscription, in which case you will receive a <DocsLink reference="disnake.on_entitlement_update" /> event when the subscription ends.
63+
Note that entitlement events are not emitted immediately when a subscription is canceled, only at the end of the subscription period. In this case, the entitlement's <DocsLink reference="disnake.Entitlement.ends_at">ends_at</DocsLink> attribute reflects the date indicating when the subscription (and entitlement) ended.
6064

6165
:::note
6266
While an <DocsLink reference="disnake.on_entitlement_delete" /> event also exists, it will not fire when a subscription expires; it only occurs e.g. in case of refunds or due to manual removal by Discord.
6367
:::
6468

65-
## Testing entitlements
69+
## Subscriptions
70+
71+
Subscriptions are used for products with recurring monthly payments. These should not be used to determine access to premium features, they are only meant for lifecycle management purposes.
72+
73+
Similarly to entitlements, you will receive an <DocsLink reference="disnake.on_subscription_create" /> event whenever a subscription is created. An <DocsLink reference="disnake.on_subscription_update" /> event is emitted when a user cancels their subscription; canceled subscriptions remain valid until the end of the subscription period. Further details about subscription lifecycles can be found in the [official documentation](https://discord.com/developers/docs/monetization/implementing-app-subscriptions#supporting-subscriptions).
74+
75+
To obtain the subscriptions of a user to a particular SKU, you can use <DocsLink reference="disnake.SKU.subscriptions" />.
76+
77+
### Testing subscriptions
6678

67-
You can create test entitlements using <DocsLink reference="disnake.Client.create_entitlement" /> and delete them using <DocsLink reference="disnake.Entitlement.delete" />, which allows you to test your implementation in various subscription states. These entitlements do not expire and therefore have no start/end date.
79+
For subscription SKUs, you can create test entitlements using <DocsLink reference="disnake.Client.create_entitlement" /> and delete them using <DocsLink reference="disnake.Entitlement.delete" />, which allows you to test your implementation in various subscription states. These entitlements do not expire and therefore have no start/end date.
6880

6981
If you want to test the full payment flow, you can go through the same upgrade steps as any other user of your application would - all members of the app's associated team automatically receive a 100% discount on the subscription. Note that you cannot delete these entitlements, unlike the test entitlements mentioned before.
82+
83+
## One-time purchases
84+
85+
One-time purchases can be durable (i.e. permanent) or consumable.
86+
Just like subscriptions, access to these items is represented by entitlements, which you can receive in entitlement events or interactions.
87+
88+
Users may only have one unconsumed entitlement for an SKU at a time. To consume an entitlement, use <DocsLink reference="disnake.Entitlement.consume" /> and process/store the state of the item in your application where applicable.
89+
90+
For further lifecycle details and other considerations, visit the [official documentation](https://discord.com/developers/docs/monetization/implementing-one-time-purchases#how-onetime-purchases-work) for one-time purchases.
91+
92+
### Testing one-time purchases
93+
94+
Unlike subscriptions, one-time purchases may only be tested through the Application Test Mode, not via test entitlements.
95+
To test one-time purchases without being charged, [enable Application Test Mode](https://discord.com/developers/docs/monetization/implementing-one-time-purchases#using-application-test-mode) for your app and visit the app's store page.
96+
Entitlements tied to one-time purchases made this way will have a `type` of <DocsLink reference="disnake.EntitlementType.test_mode_purchase">test_mode_purchase</DocsLink>.

0 commit comments

Comments
 (0)