{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-309", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/309", "wordCount": 2314, "segments": [{"start": 7.0, "text": "Selling auto-renewable subscriptions on the App Store can be rewarding."}, {"start": 11.0, "text": "It can also be challenging to reach customers at critical moments,"}, {"start": 15.0, "text": "such as when they're considering canceling a subscription."}, {"start": 18.0, "text": "That moment is an ideal time to remind your customers"}, {"start": 21.0, "text": "of the value they'll receive from your subscription service."}, {"start": 25.0, "text": "I'm Tori, an engineer on the App Store server team,"}, {"start": 28.0, "text": "and in this video, I'll share how you can retain subscribers"}, {"start": 31.0, "text": "with Retention Messaging in App Store Connect,"}, {"start": 34.0, "text": "a new feature built to help you connect with your customers."}, {"start": 38.0, "text": "First, I'll share an overview of Retention Messaging,"}, {"start": 41.0, "text": "and how to set it up in App Store Connect."}, {"start": 44.0, "text": "Then, I'll discuss how real-time Retention Messaging"}, {"start": 47.0, "text": "works alongside Retention Messaging in App Store Connect."}, {"start": 51.0, "text": "Here in my Exercise app is an example"}, {"start": 53.0, "text": "of a customer canceling an active subscription."}, {"start": 56.0, "text": "The cancellation page displays messaging to the customer"}, {"start": 59.0, "text": "with the impact of canceling."}, {"start": 62.0, "text": "For this subscription, the App Store informs the customer"}, {"start": 64.0, "text": "that their family will no longer have access to this subscription"}, {"start": 68.0, "text": "if they proceed with the cancellation."}, {"start": 70.0, "text": "Here is an opportunity"}, {"start": 72.0, "text": "to provide messaging or offers to the customer."}, {"start": 75.0, "text": "Retention Messaging enables you to do just that."}, {"start": 79.0, "text": "Retention Messaging helps you add value to the cancellation flow"}, {"start": 82.0, "text": "by showing a compelling value proposition message to your customers"}, {"start": 87.0, "text": "when they are considering canceling their subscription."}, {"start": 90.0, "text": "You can use Retention Messaging to remind customers"}, {"start": 93.0, "text": "of the benefits of your subscription"}, {"start": 95.0, "text": "or provide them an offer to entice them to remain subscribed."}, {"start": 99.0, "text": "Retention Messaging supports three different views:"}, {"start": 102.0, "text": "a message only, a message and an image, or a message and an offer."}, {"start": 107.0, "text": "You can see what these three different views look like with my Exercise app."}, {"start": 111.0, "text": "Here, the message is prominently displayed to the customer."}, {"start": 114.0, "text": "I can add an image to add some visual appeal."}, {"start": 118.0, "text": "Or I can offer the customer three months free for their current subscription,"}, {"start": 122.0, "text": "Yoga+ to provide an extra incentive to stay subscribed."}, {"start": 126.0, "text": "Save rate is the % of subscribers who keep their subscription"}, {"start": 130.0, "text": "after reaching the cancel confirmation page in manage subscriptions."}, {"start": 134.0, "text": "Subscriptions that have adopted Retention Messaging"}, {"start": 137.0, "text": "experience an average save rate increase of +1.4 points"}, {"start": 141.0, "text": "equivalent to an 82% increase,"}, {"start": 144.0, "text": "with promotional offer messages achieving the highest observed save rate"}, {"start": 148.0, "text": "at +5.5 points equivalent to a 223% increase."}, {"start": 154.0, "text": "Note that we have observed varying results across developers."}, {"start": 158.0, "text": "I'll show you how to set up Retention Messaging in App Store Connect."}, {"start": 163.0, "text": "With Retention Messaging in App Store Connect,"}, {"start": 165.0, "text": "you can configure retention messages for your app,"}, {"start": 168.0, "text": "which you can map to any of your subscriptions."}, {"start": 171.0, "text": "You can select an image to provide alongside a message from Asset Library."}, {"start": 175.0, "text": "You can configure retention offers"}, {"start": 177.0, "text": "to provide to your customer alongside a message."}, {"start": 180.0, "text": "And, App Store Connect API will also support Retention Messaging,"}, {"start": 185.0, "text": "allowing you to set up retention messages and retention offers through the API."}, {"start": 190.0, "text": "To learn more about Asset Library, check out the session"}, {"start": 193.0, "text": "\"Enhance your presence on the App Store\" from WWDC26."}, {"start": 199.0, "text": "Let's review how this works."}, {"start": 201.0, "text": "In App Store Connect, on the Subscriptions page,"}, {"start": 203.0, "text": "a new area prompts me to get started with Retention Messaging."}, {"start": 208.0, "text": "When I tap the Get Started button..."}, {"start": 210.0, "text": "a modal appears for me to name the retention message."}, {"start": 214.0, "text": "This message is for my yoga subscriptions, so I'll call this Yoga Message,"}, {"start": 218.0, "text": "then tap the Create button."}, {"start": 221.0, "text": "A new view shows where I can edit the message text, the image"}, {"start": 225.0, "text": "and applicable subscriptions and offers on the left."}, {"start": 228.0, "text": "On the right is a live preview of my retention message"}, {"start": 231.0, "text": "which updates as I edit."}, {"start": 234.0, "text": "A retention message must always contain message text,"}, {"start": 237.0, "text": "but the image and offer are both optional."}, {"start": 240.0, "text": "I'll continue creating a retention message for the Yoga+ subscription,"}, {"start": 244.0, "text": "starting with the text."}, {"start": 245.0, "text": "I will create a message in English,"}, {"start": 247.0, "text": "but you can select other localizations as well."}, {"start": 251.0, "text": "I'll type \"Launching Next Month: Guided Yoga into the text box\"."}, {"start": 255.0, "text": "Wow!"}, {"start": 256.0, "text": "The preview updated right away with the title."}, {"start": 259.0, "text": "I'll keep going and add a description,"}, {"start": 262.0, "text": "Don't miss out on guided yoga classes, new metrics targeted for yoga, and more."}, {"start": 267.0, "text": "Again, notice how the preview on the right immediately updates."}, {"start": 272.0, "text": "Now I want to see how this looks with an image."}, {"start": 274.0, "text": "I already have an image in my Asset Library, so I'll choose that."}, {"start": 278.0, "text": "Our preview is looking really good now!"}, {"start": 282.0, "text": "Now I need to select the Yoga+ subscription"}, {"start": 284.0, "text": "so that all my customers with the Yoga+ subscription see this message."}, {"start": 289.0, "text": "The Yoga+ subscription is selected now."}, {"start": 291.0, "text": "You can also select other subscriptions"}, {"start": 293.0, "text": "as a retention message can be associated with many subscriptions."}, {"start": 298.0, "text": "Finally, I want to add some offer options for my eligible customers."}, {"start": 302.0, "text": "I have some retention offers already set up, so I'll select those."}, {"start": 306.0, "text": "Here are all the offers that could appear with this message"}, {"start": 308.0, "text": "along with their eligibility and availability."}, {"start": 312.0, "text": "The App Store will automatically choose the best offer for eligible customers,"}, {"start": 316.0, "text": "so you can select multiple offers for a single subscription with confidence."}, {"start": 321.0, "text": "It's also important to note that when the customer is eligible for an offer,"}, {"start": 325.0, "text": "the image will be replaced by an offer."}, {"start": 329.0, "text": "If you want to see how other offers appear,"}, {"start": 331.0, "text": "you can select a different offer from the offer dropdown."}, {"start": 334.0, "text": "You can also select no offer from the dropdown"}, {"start": 337.0, "text": "to see what the preview looks like without an offer."}, {"start": 340.0, "text": "Let's pivot to testing."}, {"start": 341.0, "text": "Testing in sandbox verifies your subscription implementation"}, {"start": 345.0, "text": "before proceeding to production."}, {"start": 347.0, "text": "I'm happy to share that retention messages are fully testable in sandbox."}, {"start": 352.0, "text": "You can test retention messages when canceling your subscription in sandbox."}, {"start": 357.0, "text": "If you configured a retention offer,"}, {"start": 360.0, "text": "you can also verify offer related fields are properly configured"}, {"start": 364.0, "text": "in the signed transaction or renewal info."}, {"start": 368.0, "text": "We are also introducing retention offers, a new offer type for retention messages."}, {"start": 373.0, "text": "The signed transaction and renewal info are updated"}, {"start": 376.0, "text": "with a new offerType value of 5 to indicate a retention offer was redeemed."}, {"start": 381.0, "text": "Other offer related fields such as: offer identifier, offer discount type,"}, {"start": 385.0, "text": "and offer period will also appear as expected."}, {"start": 389.0, "text": "By setting up Retention Messaging in App Store Connect,"}, {"start": 391.0, "text": "you are taking a significant step toward retaining your subscribers"}, {"start": 394.0, "text": "at a critical moment in the subscription lifecycle."}, {"start": 398.0, "text": "If you want to more directly interact with your customer"}, {"start": 400.0, "text": "when they are about to cancel their subscription,"}, {"start": 403.0, "text": "you can take this one step further with real-time Retention Messaging."}, {"start": 408.0, "text": "With real-time Retention Messaging,"}, {"start": 410.0, "text": "you set up an endpoint to provide a real-time message preference"}, {"start": 413.0, "text": "in response to a server-to-server HTTP request from the App Store."}, {"start": 419.0, "text": "With the Retention Messaging API, you can configure message and image pairs"}, {"start": 423.0, "text": "to show to customers in the cancellation flow."}, {"start": 427.0, "text": "When you receive a real-time call from the App Store,"}, {"start": 429.0, "text": "you can tell the App Store which of these messages you want to show to the customer,"}, {"start": 434.0, "text": "or when Retention Messaging in App Store Connect is configured,"}, {"start": 437.0, "text": "you can also indicate one of the messages from App Store Connect as your preference."}, {"start": 443.0, "text": "I can create the same views for the Yoga+ subscription"}, {"start": 446.0, "text": "using real-time Retention Messaging"}, {"start": 448.0, "text": "as I can when using retention messages in App Store Connect."}, {"start": 453.0, "text": "However, real-time Retention Messaging also supports a message"}, {"start": 456.0, "text": "with a switch plan format,"}, {"start": 458.0, "text": "so you can offer your customer a different plan"}, {"start": 460.0, "text": "within the same subscription group as an alternative to canceling."}, {"start": 464.0, "text": "For the Yoga+ subscription,"}, {"start": 466.0, "text": "I chose to offer an annual subscription as a switch plan."}, {"start": 471.0, "text": "Real-time Retention Messaging is powered by the Retention Messaging API,"}, {"start": 475.0, "text": "a server-to-server driven set of endpoints for managing your messages and images."}, {"start": 480.0, "text": "Using the Retention Messaging API in both sandbox and production,"}, {"start": 484.0, "text": "I can configure the URL for the Exercise App's endpoint,"}, {"start": 488.0, "text": "set up messages for the exercise app,"}, {"start": 491.0, "text": "choose default messages for each subscription in the exercise app,"}, {"start": 495.0, "text": "and upload and manage the Exercise App's images."}, {"start": 499.0, "text": "In the Sandbox environment only,"}, {"start": 501.0, "text": "the Retention Messaging API supports Performance testing,"}, {"start": 504.0, "text": "and provides endpoints to initiate a performanceTest and check results."}, {"start": 509.0, "text": "Passing a performance test is required"}, {"start": 511.0, "text": "before using real-time Retention Messaging in production."}, {"start": 515.0, "text": "When the App Store sends a request for real-time Retention Messaging,"}, {"start": 519.0, "text": "we will send the originalTransactionId to help identify the subscription,"}, {"start": 523.0, "text": "the customer's locale to identify the desired localization,"}, {"start": 527.0, "text": "plus a requestIdentifier for tracking, as well as other information."}, {"start": 532.0, "text": "When responding to a real-time request,"}, {"start": 534.0, "text": "you can choose one of three response formats."}, {"start": 537.0, "text": "Respond with a message to show a message or message with an image"}, {"start": 541.0, "text": "by providing a messageIdentifier."}, {"start": 544.0, "text": "I chose a messageIdentifier that indicates a message about my yoga subscription"}, {"start": 548.0, "text": "that is paired with a corresponding image."}, {"start": 551.0, "text": "Respond with an alternateProduct to offer the customer a switch plan"}, {"start": 555.0, "text": "in the same subscription group by providing a messageIdentifier and productId."}, {"start": 560.0, "text": "I chose to offer an annual tier of Yoga+ as a switch plan."}, {"start": 565.0, "text": "Or respond with a promotional offer to give the customer an offer"}, {"start": 569.0, "text": "by providing a messageIdentifier and a promotionalOfferSignature."}, {"start": 573.0, "text": "I chose to provide my promotionalOffer for 3 months free of Yoga+."}, {"start": 578.0, "text": "More information on what to provide in each of these scenarios,"}, {"start": 582.0, "text": "other supported scenarios, and the rest of the API"}, {"start": 585.0, "text": "can be found in our documentation linked in this session's resources."}, {"start": 590.0, "text": "Real-time Retention Messaging requires a fast, responsive server."}, {"start": 594.0, "text": "To ensure a great customer experience,"}, {"start": 596.0, "text": "you'll need to pass a performance test in sandbox before going live to production."}, {"start": 601.0, "text": "That said, your server may not always respond in time."}, {"start": 605.0, "text": "If it doesn't, the App Store will display fallback messaging to the customer."}, {"start": 610.0, "text": "Real-time Retention Messaging always prioritizes your real-time response."}, {"start": 614.0, "text": "If that's unavailable or malformed,"}, {"start": 616.0, "text": "the App Store will first fall back"}, {"start": 618.0, "text": "to your App Store Connect Retention Messaging preference,"}, {"start": 621.0, "text": "including any eligible offers."}, {"start": 623.0, "text": "If App Store Connect messaging is not configured for your subscription,"}, {"start": 627.0, "text": "the App Store will then fallback to default messaging"}, {"start": 630.0, "text": "configured with the Retention Messaging API."}, {"start": 633.0, "text": "Get started in sandbox for setting up real-time Retention Messaging."}, {"start": 637.0, "text": "First, set up all your test messages and images in sandbox."}, {"start": 641.0, "text": "When that is completed,"}, {"start": 642.0, "text": "set up your endpoint to begin receiving requests"}, {"start": 646.0, "text": "when a tester tries to cancel their subscription."}, {"start": 649.0, "text": "After you are satisfied with your testing in sandbox,"}, {"start": 651.0, "text": "start a performance test."}, {"start": 654.0, "text": "When your performance test passes,"}, {"start": 656.0, "text": "then set up messages and images in production"}, {"start": 659.0, "text": "followed by your production endpoint."}, {"start": 662.0, "text": "At this point you are ready to begin responding to requests from the App Store."}, {"start": 666.0, "text": "Remember to always keep your production messages and images up to date."}, {"start": 671.0, "text": "IOS 26.5 introduced monthly subscriptions with a 12-month commitment."}, {"start": 677.0, "text": "For this new billing plan type the real-time Retention Messaging API"}, {"start": 681.0, "text": "is also updated to support this plan type as a switch plan."}, {"start": 685.0, "text": "Simply provide the billingPlanType field with your alternateProduct selection"}, {"start": 689.0, "text": "in your response to the App Store"}, {"start": 691.0, "text": "to offer this plan to your customers using Retention Messaging."}, {"start": 695.0, "text": "For more information on monthly subscriptions with a 12-month commitment,"}, {"start": 699.0, "text": "check out the WWDC26 session \"What's new in Apple In-App Purchase.\""}, {"start": 706.0, "text": "Real-time Retention Messaging is a powerful tool"}, {"start": 708.0, "text": "and it performs best with a fast, responsive server."}, {"start": 712.0, "text": "Let's compare it with Retention Messaging in App Store Connect"}, {"start": 716.0, "text": "to help you find the right fit for your use case."}, {"start": 720.0, "text": "The key difference between Retention Messaging in App Store Connect"}, {"start": 723.0, "text": "and real-time Retention Messaging is decisioning."}, {"start": 726.0, "text": "Once Retention Messaging is set up for your subscription in App Store Connect,"}, {"start": 731.0, "text": "the App Store will show the message and any applicable offer to the customer"}, {"start": 735.0, "text": "without any further interaction with you."}, {"start": 737.0, "text": "With real-time Retention Messaging,"}, {"start": 740.0, "text": "you choose what you want to show to each customer in real time."}, {"start": 744.0, "text": "Both Retention Messaging in App Store Connect"}, {"start": 747.0, "text": "and real-time Retention Messaging allow you to configure messages and images"}, {"start": 752.0, "text": "though the mechanisms for doing that differ."}, {"start": 755.0, "text": "With Retention Messaging in App Store Connect,"}, {"start": 758.0, "text": "this can be done through App Store Connect or the App Store Connect API."}, {"start": 762.0, "text": "For real-time Retention Messaging,"}, {"start": 764.0, "text": "this must be done server-to-server through the Retention Messaging API."}, {"start": 769.0, "text": "Both frameworks also support offers,"}, {"start": 771.0, "text": "with App Store Connect requiring specific retention offers"}, {"start": 774.0, "text": "linked to your subscriptions,"}, {"start": 776.0, "text": "while real-time Retention Messaging allows you to leverage promotional offers"}, {"start": 780.0, "text": "so you can choose the offer you want to deliver in real time."}, {"start": 784.0, "text": "A signature is still required for promotional offers"}, {"start": 787.0, "text": "used in retention messages."}, {"start": 789.0, "text": "App Store Connect Retention Messaging supports three views:"}, {"start": 793.0, "text": "message, image or offer."}, {"start": 795.0, "text": "Real-time Retention Messaging supports those same three views,"}, {"start": 799.0, "text": "and also supports a switch plan view."}, {"start": 802.0, "text": "Retention Messaging in App Store Connect is an ideal choice"}, {"start": 805.0, "text": "if you don't have a server,"}, {"start": 807.0, "text": "or if you want to be able to configure your retention messages"}, {"start": 810.0, "text": "and then let the App Store choose what to display to the customer."}, {"start": 814.0, "text": "App Store Connect messages are tied to specific subscriptions."}, {"start": 819.0, "text": "If you have a server and want to choose which message is shown to each customer,"}, {"start": 823.0, "text": "consider real-time Retention Messaging."}, {"start": 826.0, "text": "Also consider real-time Retention Messaging"}, {"start": 828.0, "text": "if you want to take more control of offers and eligibility using promotional offers."}, {"start": 835.0, "text": "Real-time Retention Messaging builds on top"}, {"start": 837.0, "text": "of Retention Messaging in App Store Connect."}, {"start": 839.0, "text": "You should always consider setting up Retention Messaging in App Store Connect"}, {"start": 843.0, "text": "even when using real-time Retention Messaging for fallback messaging."}, {"start": 848.0, "text": "Retention Messaging in App Store Connect is a wonderful way to provide value"}, {"start": 852.0, "text": "to your customers in the subscription cancellation flow and is open to all."}, {"start": 856.0, "text": "Real-time Retention Messaging builds on top"}, {"start": 859.0, "text": "off Retention Messaging in App Store Connect."}, {"start": 861.0, "text": "If you are interested in real-time Retention Messaging,"}, {"start": 864.0, "text": "please fill out the interest form"}, {"start": 866.0, "text": "linked in this session's Resources to request access."}, {"start": 870.0, "text": "Let's recap what I covered and how you can make the most of Retention Messaging."}, {"start": 875.0, "text": "Consider the types of Retention Messaging you want to set up in App Store Connect."}, {"start": 880.0, "text": "To go further, explore the real-time Retention Messaging API documentation"}, {"start": 885.0, "text": "to determine if it's a good fit for your app."}, {"start": 888.0, "text": "If you wish to pursue real-time Retention Messaging,"}, {"start": 891.0, "text": "submit the interest form to request access."}, {"start": 894.0, "text": "Thanks for joining me!"}, {"start": 895.0, "text": "I've loved teaching you about Retention Messaging,"}, {"start": 898.0, "text": "and I look forward to have you"}, {"start": 911.0, "text": "use retention messages in your app."}]}