Skip to main content
Question

In the Android sandbox environment, there is a delay in the CANCELLATION callback; the callback is only received after the subscription expires.

  • May 19, 2026
  • 3 replies
  • 29 views

Forum|alt.badge.img

In the Android sandbox environment, the CANCELLATION callback is delayed until the subscription expires. However, in iOS, the CANCELLATION callback works without issue and is invoked after automatic renewal (subscription) is canceled.

3 replies

Forum|alt.badge.img
  • Author
  • New Member
  • May 19, 2026

I also noticed that on iOS, the CANCELLATION webhook has a slight delay of about 1 to 2 minutes. Is this normal in the sandbox environment?


Forum|alt.badge.img
  • Author
  • New Member
  • May 19, 2026

Platform Server Notifications are now enabled, and Android users can receive Cancellation web hook callbacks. However, there is a delay of approximately 1-2 minutes when receiving the callbacks on both iOS and Android.
Another question is: if I cancel my subscription on Android or iOS, can I then restore it by calling `Purchases.purchasePackage`? Currently, on iOS, I can restore my subscription using `Purchases.purchasePackage`, which triggers the `Uncancellation` callback. However, on Android, I cannot use `Purchases.purchasePackage` to restore my subscription; it triggers the `EXPIRATION` callback, causing my user's subscription to expire on our backend.


chris_perriam
RevenueCat Staff
Forum|alt.badge.img+6

Regarding the 1–2 min delay: that's within normal range for sandbox. Configuring Server Notifications for all stores is the best way to ensure that RevenueCat dispatches event as quickly as possible. We’ll process each subscription change as soon as we receive it from the store.

Regarding the Android "uncancel" behavior: this is a real difference between StoreKit and Google Play Billing, not an SDK issue.

  • iOS: purchasePackage on a cancelled-but-active sub re-enables auto-renew on the same transaction. This results in an UNCANCELLATION event.
  • Android: Google Play has no equivalent. purchasePackage issues a new purchase token that replaces the old one, so RevenueCat fires EXPIRATION (old token) followed by INITIAL_PURCHASE or RENEWAL (new token). The user isn't actually losing access, they just have a brand-new subscription.

To get a true UNCANCELLATION on Android, you can resubscribe to the existing subscription via Google's subscriptions center here:

https://play.google.com/store/account/subscriptions?sku=<PRODUCT_ID>&package=<APP_PACKAGE_NAME>

Tapping Resubscribe there should preserve the original purchase token and trigger UNCANCELLATION, matching iOS.

I’d recommend ensuring that your backend is handling entitlements correctly for INITIAL_PURCHASE and RENEWAL events too (not just UNCANCELLATION) otherwise a valid Android resubscribe shows as expired (which is what you're seeing). See the Resubscribe Flow.

Let me know if there’s anything I can clarify further. Happy to help!