Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2026 App ServicesApp Store, Distribution & Marketing

WWDC26 · 15 min · App Services / App Store, Distribution & Marketing

Explore Retention Messaging in App Store Connect

Discover how you can use the power of Retention Messaging to reach subscribers before they cancel. Learn how to configure this feature in App Store Connect and add subscription offers, as well as leverage the Retention Messaging API to deliver real-time messaging and alternative options that encourage people to stay subscribed to your app or game.

Watch at developer.apple.com ↗

Transcript all transcripts

Chapters

  • 0:00 — Introduction
  • 2:38 — Retention Messaging in App Store Connect
  • 6:38 — Real-time Retention Messaging
  • 11:46 — Retention Messaging comparison

Code shown on screen · 6 snippets

Signed transaction updates json · at 6:08 ↗
// Signed transaction updates

{
    "bundleId": "com.example.app",
    "productId": "Yoga_summer_2026",
    "type": "Auto-Renewable Subscription",
    "transactionReason": "RENEWAL",
    "inAppOwnershipType": "PURCHASED",
    "quantity": 1,
    "price": 0,
    "currency": "USD",
    "offerType": 5, // retention offer
    "offerIdentifier": "Yoga_2026_cancel_free_3m",
    "offerDiscountType": "FREE_TRIAL",
    "offerPeriod": "P3M", 
    "transactionId": "1000098916194"
    "originalTransactionId": "1000011859217",
    "appAccountToken": "23a91ca7-06f3-425f-bff6-820904b510a9",
    ...
}
Retention Messaging API markdown · at 7:50 ↗
// Retention Messaging API: https://api.storekit.apple.com/inApps/v1/messaging

// URL configuration
PUT /realtime/url
GET /realtime/url
DELETE /realtime/url

// Message configuration
PUT /message/{messageIdentifier}
DELETE /message/{messageIdentifier}
GET /message/list
PUT /default/{productId}/{locale}
DELETE /default/{productId}/{locale}
GET /default/{productId}/{locale}

// Image configuration
PUT /image/{imageIdentifier}
DELETE /image/{imageIdentifier}
GET /image/list

// Performance testing - Sandbox only
POST /performanceTest // initiate test
GET /performanceTest/result/{requestId} // get results
Real-time requests json · at 8:34 ↗
// Real-time requests

// Request from the App Store
{
    "originalTransactionId": "123456789",
    "appAppleId": 6745974591,
    "productId": "Yoga_summer_2026",
    "userLocale": "en-US",
    "requestIdentifier": "c03248af-dd76-4e9b-9c1e-4489cd19a768",
    "environment": "Production", // or Sandbox
    "signedDate": 1780920000000
}
Real-time requests with message json · at 8:57 ↗
// Real-time requests

// Request from the App Store
{
    "originalTransactionId": "123456789",
    "appAppleId": 6745974591,
    "productId": "Yoga_summer_2026",
    "userLocale": "en-US",
    "requestIdentifier": 
        "c03248af-dd76-4e9b-9c1e-4489cd19a768",
    "environment": "Production", // or Sandbox
    "signedDate": 1780920000000
}

// Your response
{
    "message": {
        "messageIdentifier": 
            "551ee7c0-c097-418e-9dd5-2a98533a7390"
    }
}
Real-time request with alternate product json · at 9:11 ↗
// Real-time requests

// Request from the App Store
{
    "originalTransactionId": "123456789",
    "appAppleId": 6745974591,
    "productId": "Yoga_summer_2026",
    "userLocale": "en-US",
    "requestIdentifier": 
        "c03248af-dd76-4e9b-9c1e-4489cd19a768",
    "environment": "Production", // or Sandbox
    "signedDate": 1780920000000
}

// Your response
{
    "alternateProduct": {
        "messageIdentifier":
            "ed7f25fc-5741-46a3-8502-062e0fb8afd0",
        "productId": "Yoga_summer_2026_annual"
    }
}
Real-time request with promotional offer json · at 9:24 ↗
// Real-time requests

// Request from the App Store
{
    "originalTransactionId": "123456789",
    "appAppleId": 6745974591,
    "productId": "Yoga_summer_2026",
    "userLocale": "en-US",
    "requestIdentifier":"c03248af-dd76-4e9b-9c1e-4489cd19a768",
    "environment": "Production", // or Sandbox
    "signedDate": 1780920000000
}

// Your response
{
    "promotionalOffer": {
        "messageIdentifier": 
            "80135e2b-ae15-4ec4-8c5c-9ecc8045c0dc",
        "promotionalOfferSignatureV2": "eyJhbGciOiJFUzI…"
    }
}

Resources