I want to set a grace period for an iOS app subscription

I want to set a grace period for an iOS app subscription



### What you want to do

I want to set a grace period for an iOS app subscription.

Can I set a grace period as a billing product for iOS apps?



### Detailed explanation of what you want to achieve

1) Charge subscription (automatic renewal) with iOS app.

2) The credit card settlement is set as the settlement method, and the credit card expires.

3) The automatic renewal date of the subscription is reached, and automatic renewal is not possible due to invalidity of Kureka



→ In 3), I want to set a grace period and maintain my subscription status.

Replies

Apple will inform the user that their card has expired 24 hours before renewal. Your app can check the intention-to-renew of the user before expiration. If that intention is not ‘cancel’ then it can continue the subscription after it expires for a few days.

Post not yet marked as solved Up vote reply of PBK Down vote reply of PBK

From the docs (emphasis mine):


Handle Lapsed Subscriptions


The App Store renews the subscription slightly before it expires, to prevent any lapse in the subscription. However, lapses are still possible. For example, if the user’s payment information is no longer valid, the first renewal attempt fails. Billing-related issues trigger the subscription to enter a billing retry state where the App Store attempts to renew the subscription for up to 60 days. You can check the

expiration_intent
and
is_in_billing_retry_period
values to monitor the retry status of the subscription. During this period, your app may optionally offer a grace period to the user and show them a message in the app to update their payment information. Additionally, your app can deep link customers to the payment details page within App Store on their device by opening this URL


The user can also cancel their subscription by disabling auto-renew and intentionally letting their subscription lapse. This action triggers the App Store to send your server a status update notification of type

DID_CHANGE_RENEWAL_STATUS
. Your server can parse the
auto_renew_status
and the
auto_renew_status_change_date
to determine the current renewal status of the subscription.

You can also check the

expiration_intent
field in the receipt to further validate the reason for the subscription to lapse. Make sure your app's subscription logic can handle different values of
expiration_intent
along with
expires_date
to show the appropriate message to the user.


If you're asking how to use your own process, instead, I can imagine using a pending renew to trigger a trial period, but I can also imagine that causing issues with the overall process so I would not recommend DIY in this example.

I'm looking into this.


rich kubota - rkubota@apple.com

developer technical support CoreOS/Hardware/MFI

It turns out that the answer to this question can be found in the article "Reducing Involuntary Subscriber Churn"

<https://developer.apple.com/documentation/storekit/in-app_purchase/reducing_involuntary_subscriber_churn?language=objc>


I refer you to the section "Enable Billing Grace Period".


If you choose to enable Billing Grace Period, ensure that you provide full service for the subscription throughout the grace period. You can check the grace_period_expires_date_ms field in the responseBody.Pending_renewal_info array of the receipt to determine the end of this grace period duration.


To see the explanation of the grace_period_expires_date_ms field, I refer you to the declaration of the Object - responseBody.Pending_renewal_info

<https://developer.apple.com/documentation/appstorereceipts/responsebody/pending_renewal_info>


The presence of the "grace_period_expires_date" fields indicates that the subscription is in a grace period where billing retry is in effect. Once the billing has been resolved, the "grace_period_expires_date" fields will no longer be present. I've asked that the developer documentation be updated to explain the different scenarios which will exist in the "pending_renewal_info" field depending on the billing retry outcome.


rich kubota - rkubota@apple.com

developer technical support CoreOS/Hardware/MFI

All good info, Rich - thanks for the research/response.


Ken

Rich,


How can we test the grace period in the sandbox? I have it turned on for the products in App Store Connect, but I have not seen the grace_period fields appear in the receipt response when testing a sandbox tester subscription that has expired.


Tom

The grace period field does not appear in a sandbox test as there is no support in the sandbox for the subscription to enter billing retry. This field is present only in the production appStoreReceipt. If the grace_period_expires_date_ms field is present, check that the current date is not past this date and continue to provide service - you can also alert the user that they need to check their billing process to ensure continued service.


If the field disappears either the subscription has renewed in which case there is a record with an expires_date field that is later than the current date - in addition, the auto_renew_status field will be 1. In the case that the subscription has failed to renew, the auto_renew_status field will be 0 and the is_in_billing_retry_period field will be 0.


If you would like to see grace period support in the sandbox environment, that would be an enhancement request -

You can submit such requests using the Apple Developer feedback assistant web page -

<https://feedbackassistant.apple.com>


rich kubota - rkubota@apple.com

developer technical support CoreOS/Hardware/MFI

Post not yet marked as solved Up vote reply of rich Down vote reply of rich
  • This doesn't seem to match the current documentation here. Should we expect this to work now?

Add a Comment