Basic Subscription Recovery
When payment for a subscription auto-renewal fails, Roku's basic subscription recovery feature gives customers a 3-day grace period where they can continue accessing content, while Roku Pay notifies them daily via email to update their method of payment (MOP). Once the 3-day grace period expires, the subscription is canceled. This solution helps the publisher improve the chance of recovering payments and thereby reduce passive cancelations.
Effective October 1, 2024, all apps using Roku Pay must implement Enhanced Subscription Recovery to pass certification. As a result, apps using basic subscription recovery solution must migrate to Enhanced Subscription Recovery.
Overview
When the auto-renewal of a customer's subscription fails, Roku Pay automatically places the subscription in recovery. When a subscription is in recovery, the customer is given a grace period where they may continue accessing content for 3 days. During this 3-day grace period, the customer is notified daily via email to update their MOP.
If Roku receives a payment during the 3-day grace period, it is processed and entitlement is maintained (the billing period also remains the same). If no payment is received by the end of the 3-day grace period, the subscription is canceled.
Email renewal notifications
Roku sends email notifications prompting the customer to update their MOP or manage their subscription online at my.roku.com.

Entitlement checks
Publishers can use the Roku Pay APIs to check whether a subscription is current, on hold, or canceled. The ChannelStore API can be used to check the subscription status client-side upon app launch and then block access to content based on the results; the Roku Pay web service APIs can be used server-side for regular nightly syncs to update the publisher's entitlement service.
ChannelStore API
When customers launch an app, the app should call the ChannelStore getAllPurchases API, as part of the required on-device authentication, to determine whether to block access to content. The getAllPurchases API returns an inDunning flag that can be used along with the status field to get the status of a subscription:
| Subscription state | "inDunning" | "status" |
|---|---|---|
| Current | false | Valid |
| In recovery (3-day grace period) | true | Valid |
| Canceled | false | Invalid |
Roku Pay web service APIs
The publisher should routinely synchronize their entitlement service with the Roku Pay web services to make sure their system has up-to-date entitlement data. Publishers can call the validate-transaction API as part of a nightly batch routine to get the updated status of customers' subscriptions. This API returns an isEntitled flag that can be used along with the expirationDate field and cancelled flag to get the status of a subscription:
| Subscription state | "isEntitled" | "expirationDate" | "cancelled" |
|---|---|---|---|
| Current | true | future date | false |
| In recovery (3-day grace period) | true | current or past date | false |
| Canceled | false | past date | true |
Free trials: When a free trial ends and the customer's method of payment fails, the
is_entitledflag is set to "false", and the subscription is automatically cancelled (there is no grace period in this case).
Push notifications
Roku Pay sends a GraceInitiated push notification when a subscription is put on hold, it sends a GraceRecovered notification when the subscription is recovered (renewed after being put in a grace period):
GraceInitiated
{
"customerId": "9aa37bd6f970578294cea4783af08560",
"transactionType": "GraceInitiated",
"transactionId": "024d4e1fc7b611eeafbe0a58a9feaca8",
"channelId": "3605562",
"productCode": "0fCsu09EGS5C6OHlEUnz_MonthlySub",
"productName": "0fCsu09EGS5C6OHlEUnz_MonthlySub",
"originalTransactionId": "024d4e1fc7b611eeafbe0a58a9feaca8",
"originalPurchaseDate": "2024-01-12T01:45:36Z",
"eventDate": "2024-02-10T01:45:39Z",
"expirationDate": "2024-02-10T01:45:36Z",
"comments": "Subscription is in dunning state",
"responseKey": "163792dbc7b611eeafbe0a58a9feaca8",
"isFreeTrial": false
}
GraceRecovered
"customerId": "9d425957549250dcba71e03dacf426b5",
"transactionType": "GraceRecovered",
"transactionId": "f0864331c7b611eea3c40a58a9fead9c",
"channelId": "3193830",
"productCode": "PPfCfuZMf3TOXBBl3Ttu_MonthlySub",
"productName": "PPfCfuZMf3TOXBBl3Ttu_MonthlySub",
"originalTransactionId": "d4c4da85c7b611eea3c40a58a9fead9c",
"originalPurchaseDate": "2024-01-12T01:51:39Z",
"eventDate": "2024-02-10T01:51:46Z",
"expirationDate": "2024-03-10T01:51:39Z",
"comments": "Subscription recovered from dunning state.",
"responseKey": "d915ab762a3752e7bf112e7903958f52",
"isFreeTrial": false
}