Expiration is not received immediately after grace period ends

  • 1 December 2023
  • 2 replies
  • 106 views

Badge +3

Hi @Michael Fogel @Jens @kristineT ,
As mentioned in the in this thread and also in this doc (https://www.revenuecat.com/docs/event-flows) in the billing issue flow section that if a billing issue is encountered, then the following events happen:-

1. If grace period is enabled, then billing issue and cancellation event is dispatched simultaneously and when the grace period ends, then expiration event is dispatched immediately.
2. If grace period is not enabled, then billing issue, cancellation and expiration is dispatched immediately.

I have been testing the events in the sandbox environment for two products I created in play console in which I enabled grace period in one of them and disabled in the other one and I bought the subscription successfully and then I chose the test card always decline option before renewal to test the billing issue events. I observe that billing issue and cancellation event is dispatched in both scenarios but the expiration event is dispatched exactly after 10 mins (equivalent to 30 days in real transactions as per google docs ) if I don’t enable grace period and is dispatched exactly after 15 mins if I enabled the grace period. My whole concern is that I don’t get any events when the grace period ends. As per docs, an expiration event should have been dispatched immediately when the grace period ends if any but I don’t see it happening in the sandbox environment.

I have attached the screenshot(when grace period is not enabled) and all the screenshot shows the timestamp of the events at the top right corner. The expiration event is sent 10 minutes later after the billing and cancellation event is sent. This 10 minutes is equivalent to 30 days of account being put to hold in real transactions. I have a use case where I need to update the custom claim of the user when the grace period ends but I don’t receive any events for it. Ideally as per docs, expiration event should have been received but it’s not happening. Please look into the issue and let us know if this issue is specific to the sandbox environment only or if this will happen when real transactions are done.


Regards,

Abhishek


2 replies

Userlevel 4
Badge +6

Hi @Abhishek-adora-inc-b08226,

I see you have a support ticket open with one of our agents. I just wanted to make an update here for any developers who might be looking into this issue as well, here is RevenueCat’s current behavior:

  1. RevenueCat will send an expiration webhook at the end of the account hold if grace period is enabled. This reflects Google's model here: https://developer.android.com/google/play/billing/lifecycle/subscriptions#auto-renew Google has a specific state for expired subscriptions after the account hold period ends without recovering the subscription. Google considers a subscription that's in account hold as not expired. It can be recovered at any time during the 30 day holding period and the subscription continues. If the account hold ends (so Google puts the subscription in the expired state) and the customer decides to subscribe again then they will start a new subscription (with a new transaction ID, token, etc.) We follow Google's recommendation and send the expiration webhook at the end of the account hold state when the subscription enters a truly expired state.
  2. RevenueCat's API and SDK will not grant entitlements during the account hold state until the subscription is recovered.

We’re looking into this behavior to consider if this flow still makes the most sense, and can update here with any additional information.

Badge +3

Hi @kaitlin ,

We have a use case where we need to update the user entitlements in our database when the grace period ends and we don’t want this to be done by client. We want our backend server to do this but revenue cat doesn’t send any event after grace period ends. Will it be possible for revenue cat to send a webhook event after grace period ends so that we can use that information as per our need?

Reply