Important points regarding transaction updates and subscription/purchase events:
Transaction.updates is primarily designed for new and updated transactions (purchases, successful renewals, refunds, revocations, purchases made on another device, etc.).
When a subscription simply expires (i.e., auto-renewal just didn't go through), Apple often doesn't generate a new transaction. As a result, a dedicated event in Transaction.updates may not arrive at all, or may come with a significant delay.
Many developers confirm this: relying solely on Transaction.updates to detect the moment a subscription expires is unreliable.
The best approach is to use a combination of:
Transaction.updates — mandatory (for new transactions).
Product.SubscriptionInfo.Status.updates — specifically for tracking subscription status changes (including .expired).
Periodic / event-driven calls to refreshAll() — on app launch, when returning from the background, and when opening the paywall.
SubscriptionInfo.Status.updates is the closest thing to an "automatic event on expiration" available on the client side.
Topic:
App & System Services
SubTopic:
StoreKit
Tags: