---
title: "What does the App Store notification DID_RENEW mean?"
description: "DID_RENEW means the subscription renewed for a new period. With subtype BILLING_RECOVERY an expired subscription that failed to renew now renewed. Extend access."
url: https://revenuedot.app/docs/notifications/apple-did-renew
---

# What does the App Store notification DID_RENEW mean?

The App Store notification DID_RENEW means an auto-renewable subscription renewed successfully for a new period.

## Quick facts

| | |
|---|---|
| Notification | `notificationType` `DID_RENEW` |
| Where | App Store Server Notifications v2 (`responseBodyV2DecodedPayload`) |
| Sent by | The App Store server, to your notification URL |
| What Apple says | The subscription renewed. With subtype BILLING_RECOVERY, a subscription that previously failed to renew has now renewed. With no subtype, an active subscription auto-renewed. |

## What triggers it

- Without a subtype, the active subscription auto-renewed for a new transaction period.
- Subtype `BILLING_RECOVERY`: the expired subscription that had failed to renew has renewed after the billing retry.
- Apple says to give the customer access to the subscription's content or service.

## What your server should do

1. Verify the `signedPayload` with Apple's App Store Server Library (`SignedDataVerifier.verifyAndDecodeNotification`) before you act on anything in it.
2. Read the new `expiresDate` from `signedTransactionInfo` and extend access to it.
3. If you showed a billing warning, remove it when the subtype is `BILLING_RECOVERY`.
4. Answer HTTP 200 (any code from 200 to 206) once you have stored the notification. Apple retries other answers five times, at 1, 12, 24, 48 and 72 hours after the previous attempt, so make your handler safe to run twice (the payload carries a `notificationUUID`).

## Example

```javascript
// Run on the decoded payload, after you verified Apple's signature.
const notification = {"notificationType":"DID_RENEW","data":{"environment":"Sandbox","bundleId":"com.example.app"}};

function decide(n) {
  if (n.notificationType !== "DID_RENEW") return "ignore";
  return n.subtype === "BILLING_RECOVERY" ? "extend access, clear the billing warning" : "extend access";
}

console.log(decide(notification));
```

*Run-checked: `npm run check:snippets` runs this snippet with Node and compares its output with `extend access` (checked 2026-10-03).*

## How RevenueDot handles it

RevenueDot verifies Apple's signature, checks the bundle ID, stores the notification and answers 200. A purchase RevenueDot has not seen is applied only when the app's **Track new purchases from server-to-server notifications** setting is on. `DID_RENEW` clears the billing issue on the stored purchase (a type override in the server code) and applies the new transaction. A new period gives a `RENEWAL` event, with `is_trial_conversion: true` when the previous period was a free trial. Recovering a failed payment is reported as `RENEWAL`, never as `UNCANCELLATION`.

## Related

- [What does the App Store notification SUBSCRIBED mean?](https://revenuedot.app/docs/notifications/apple-subscribed.md)
- [What does the App Store notification DID_FAIL_TO_RENEW mean?](https://revenuedot.app/docs/notifications/apple-did-fail-to-renew.md)
- [What does the App Store notification DID_RENEW with subtype BILLING_RECOVERY mean?](https://revenuedot.app/docs/notifications/apple-did-renew-billing-recovery.md)
- [Which webhook events does RevenueDot send?](https://revenuedot.app/docs/api/webhook-events.md)
- [Set up App Store notifications in RevenueDot](https://revenuedot.app/docs/guides/app-store.md)

## Source

- [Apple: notificationType](https://developer.apple.com/documentation/appstoreservernotifications/notificationtype)
- [Apple: Responding to App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications/responding-to-app-store-server-notifications)
- [Apple: app-store-server-library-node (SignedDataVerifier)](https://github.com/apple/app-store-server-library-node)
- [RevenueDot server: stores/apple/notifications.ts (how the notification is applied)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/stores/apple/notifications.ts)
- [RevenueDot server: stores/apple/map.ts (how the transaction becomes a stored purchase)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/stores/apple/map.ts)
- [RevenueDot core: events.ts (how a change becomes a webhook event)](https://github.com/revenuedot/revenuedot/blob/main/packages/core/src/events.ts)

Checked: 2026-10-03
