did_change_renewal_status

Learn about the DID_CHANGE_RENEWAL_STATUS App Store Server Notification V2. Fired when a customer toggles auto-renew on or off.

App Store Server Notifications V2Subscriptions
did_change_renewal_status

The DID_CHANGE_RENEWAL_STATUS notification fires when a customer changes their auto-renew preference — either turning it off (signaling intent to cancel) or turning it back on (re-enabling auto-renewal).


When does it fire?


This notification triggers in two scenarios:


  • Auto-renew disabled (subtype AUTO_RENEW_DISABLED) — the customer turned off auto-renewal, meaning the subscription will expire at the end of the current period
  • Auto-renew enabled — the customer re-enabled auto-renewal before the subscription expires

Payload highlights


The signed renewal info shows the new auto-renew status, the current product ID, and the expiration date. This lets you know exactly when the subscription will end if auto-renew stays off.


How Yeethook helps


This is an early warning signal for churn. When a customer disables auto-renew, you have a window before expiration to take action. Yeethook delivers this notification to your team's channel immediately, giving your retention team time to respond.


Common use cases


  • Detect churn risk early when subscribers disable auto-renew
  • Trigger win-back campaigns before subscriptions expire
  • Track the ratio of disabled vs. re-enabled auto-renewals
  • Monitor the effectiveness of retention efforts

Example payload

The decoded body for a customer switching auto-renew off. Note that status is still 1 (Active): the subscription keeps working until the paid period runs out, so this notification is a churn signal rather than a cancellation.

{
  "notificationType": "DID_CHANGE_RENEWAL_STATUS",
  "subtype": "AUTO_RENEW_DISABLED",
  "notificationUUID": "0a3d81f7-52c9-4b18-8e64-7f2a5c93d01b",
  "version": "2.0",
  "signedDate": 1789371244000,
  "data": {
    "appAppleId": 1234567890,
    "bundleId": "com.example.app",
    "bundleVersion": "142",
    "environment": "Production",
    "signedTransactionInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6...",
    "signedRenewalInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6...",
    "status": 1
  }
}

What it looks like in Slack

Warning

Auto-renew disabled

Product
com.example.app.pro.monthly
Transaction
2000000798765432
Expires
2026-11-12T09:34:13.000Z
Auto-renew
Off
Subscription status
Active
Environment
Production

The same event arrives with different values depending on what changed. Yeethook rewrites the headline to match:

  • AUTO_RENEW_ENABLED→ Auto-renew re-enabled

Questions about did_change_renewal_status

Should I remove access as soon as auto-renew is disabled?

No. The customer has paid through the current period, so keep the entitlement until the expiresDate in the transaction. If they never turn auto-renew back on, EXPIRED arrives at that date with subtype VOLUNTARY, and that is the event to act on.

What is the difference between DID_CHANGE_RENEWAL_STATUS and DID_CHANGE_RENEWAL_PREF?

Status tracks the on/off switch, reported as autoRenewStatus in signedRenewalInfo. Preference tracks which product the subscription will renew into, reported as autoRenewProductId. A customer can change one without touching the other.

Which field confirms auto-renew is actually off?

autoRenewStatus inside data.signedRenewalInfo: 0 for off, 1 for on. Yeethook renders it as an Auto-renew row showing Off or On, which is worth checking because the subtype and the field are set independently by Apple.

Do I get a notification if the customer changes their mind?

Yes. Re-enabling before the period ends sends another DID_CHANGE_RENEWAL_STATUS with subtype AUTO_RENEW_ENABLED, which Yeethook posts as a success-level "Auto-renew re-enabled" message. No EXPIRED follows in that case.

Get this event in Slack or Discord

Connect Yeethook to receive did_change_renewal_status notifications in your team's Slack or Discord channels.

Get Started Free