renewal_extension

Learn about the RENEWAL_EXTENSION App Store Server Notification V2. Fired when a batch renewal-date extension completes or fails.

App Store Server Notifications V2Other
renewal_extension

The RENEWAL_EXTENSION notification reports the result of a batch request to extend subscription renewal dates. Unlike RENEWAL_EXTENDED, which fires for a single subscriber, this type covers the whole job.


When does it fire?


This notification triggers after you call Apple's extend-renewal-date APIs for many subscribers:


  • SUMMARY — the App Store finished extending eligible subscribers. The payload includes succeeded and failed counts.
  • FAILURE — the App Store could not extend the renewal date for a specific subscriber.

Payload highlights


The SUMMARY subtype uses the summary object rather than data. That object includes succeededCount, failedCount, requestIdentifier, and storefront country codes. Yeethook reads those fields so the message shows the batch result instead of coming up empty.


How Yeethook helps


Batch extensions are used for outages and goodwill credits. Yeethook posts the summary counts to Slack or Discord so you can see how many subscribers were extended without opening the App Store Server API response.


Common use cases


  • Confirm a mass renewal extension finished
  • See how many subscribers failed to extend
  • Pair the summary with individual RENEWAL_EXTENDED events

Example payload

The SUMMARY subtype replaces data with a top-level summary object, so the counts are in plain view rather than inside a JWS. requestIdentifier is the only value that ties the result back to the API call you made.

{
  "notificationType": "RENEWAL_EXTENSION",
  "subtype": "SUMMARY",
  "notificationUUID": "e4a71f38-6dc9-4b52-80e1-27b6f9c34d05",
  "version": "2.0",
  "signedDate": 1790840437000,
  "summary": {
    "requestIdentifier": "fdc4b2e0-9a53-4c81-b7d6-0e58a1734f92",
    "environment": "Production",
    "appAppleId": 1234567890,
    "bundleId": "com.example.app",
    "productId": "com.example.app.pro.monthly",
    "storefrontCountryCodes": ["USA", "GBR", "DEU"],
    "succeededCount": 1842,
    "failedCount": 7
  }
}

What it looks like in Slack

Info

Batch renewal extension complete

Request ID
fdc4b2e0-9a53-4c81-b7d6-0e58a1734f92
Succeeded
1842
Failed
7
Storefronts
USA, GBR, DEU
Product
com.example.app.pro.monthly
Environment
Production

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

  • FAILURE→ Batch renewal extension failed
  • (no subtype)→ Batch renewal extension result

Questions about renewal_extension

How do I match a summary back to the request I made?

On requestIdentifier, which is the value returned when you call the mass extend-renewal-date endpoint. It is the only join key in the payload, so log it at call time or the counts arrive with no way to attribute them to a specific batch.

What does the FAILURE subtype contain?

It reports a single subscriber the extension could not be applied to, and it uses the data object with signedTransactionInfo rather than summary. That is why Yeethook shows product and transaction rows for FAILURE but succeeded and failed counts for SUMMARY.

Why is the Storefronts row sometimes missing?

storefrontCountryCodes only appears when you scoped the request to particular storefronts. Extending for all active subscribers omits the array entirely, and Yeethook drops the row instead of printing an empty value.

Get this event in Slack or Discord

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

Get Started Free