Summary
After setting a single auto-renewable subscription product (not the app) to
"Developer Removed from Sale" in App Store Connect, the next scheduled renewal
for an existing active subscriber failed with DID_FAIL_TO_RENEW v2 and
expirationIntent = 5 ("expired for some other reason"). I expected
expirationIntent = 4 ("product wasn't available for purchase at the time of
renewal"), since the product was, in fact, not available for purchase.
I would like to confirm whether 5 is the documented/expected value for this
scenario, and how to deterministically distinguish "developer removed product
from sale" from other renewal failures using the notification payload.
Reproduction / observed sequence
- Day 15: Changed product
annual_promo(auto-renewable subscription) status from "Approved" to "Developer Removed from Sale" in App Store Connect. The app itself remained Approved and on sale. Other subscription products in the same group remained Approved. - Day 16: An existing active subscriber on that product had a scheduled automatic renewal date.
- Result: Renewal did not occur. We received a
DID_FAIL_TO_RENEWv2 notification. - Payload (relevant fields):
JWSRenewalInfoDecodedPayload.expirationIntent = 5JWSRenewalInfoDecodedPayload.autoRenewStatus = 0
Questions
- Is
expirationIntent = 5the correct/expected value when a renewal fails because the developer removed the product from sale? Or should it have been4("product wasn't available for purchase at the time of renewal")? - If
5is intentional, what is the engineering rationale for not using4in this scenario? - Given that
expirationIntent = 5is documented as a catch-all ("some other reason"), which other fields in theDID_FAIL_TO_RENEWpayload (e.g.,subtype,autoRenewStatus,gracePeriodExpiresDate,signedTransactionInfo) should we inspect to deterministically classify the failure cause and isolate "developer removed product from sale" from billing failure / customer cancel / price-increase not accepted / etc.?
Context
- I'm aware of the docs page In-App Purchase statuses and Set availability for an auto-renewable subscription, but they describe the status semantics, not the resulting notification payload.
- Product has been reverted to "Approved" to avoid further impact on subscribers while this is clarified.
Thanks in advance.