{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-210", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/210", "wordCount": 2031, "segments": [{"start": 7.0, "text": "Hello, I'm Sam, and I'm an engineer on the StoreKit team."}, {"start": 12.0, "text": "The App Store provides a safe and trusted marketplace"}, {"start": 15.0, "text": "for people around the world to discover your apps."}, {"start": 18.0, "text": "By leveraging the App Store APIs,"}, {"start": 20.0, "text": "you can offer digital goods and services to customers,"}, {"start": 24.0, "text": "while letting the App Store commerce platform facilitate transactions"}, {"start": 27.0, "text": "and end-to-end payment processing."}, {"start": 30.0, "text": "I'll cover new features in this session to help you merchandise products"}, {"start": 33.0, "text": "and grow your apps business."}, {"start": 35.0, "text": "First, I'll share how to expand pricing options for your subscription products,"}, {"start": 40.0, "text": "Then, I'll discuss updates coming to the offer code redemption API,"}, {"start": 45.0, "text": "And finally, I'll review the enhanced App Store Connect submission experience"}, {"start": 49.0, "text": "coming to In-App Purchases."}, {"start": 51.0, "text": "I'll start with updates to subscription pricing."}, {"start": 54.0, "text": "iOS 26.5 introduced monthly subscriptions with a 12-month commitment."}, {"start": 59.0, "text": "With this new pricing capability,"}, {"start": 61.0, "text": "you can offer customers an option to pay monthly for annual subscriptions."}, {"start": 66.0, "text": "Billing plans can be added to both new and existing,"}, {"start": 69.0, "text": "one-year, auto-renewable subscriptions for your app in App Store Connect."}, {"start": 74.0, "text": "By providing customers with the option to pay upfront or monthly,"}, {"start": 78.0, "text": "you can reach a larger customer base"}, {"start": 80.0, "text": "and allow the customer to choose which billing plan best suits their needs."}, {"start": 84.0, "text": "Once you compile your app against the 26.5 SDK,"}, {"start": 87.0, "text": "customers in available markets can subscribe to the new billing plan"}, {"start": 91.0, "text": "inside your app on devices running iOS, iPadOS, macOS, tvOS, or visionOS 26.4."}, {"start": 99.0, "text": "I'll show you how it works by setting up a new billing plan for the SKDemo app."}, {"start": 104.0, "text": "This app uses StoreKit to merchandise and sell In-App Purchase products."}, {"start": 108.0, "text": "You can download the sample code project in the Resources"}, {"start": 110.0, "text": "for this session to follow along."}, {"start": 113.0, "text": "Here, I have the SKDemo app set up in App Store Connect,"}, {"start": 116.0, "text": "and I navigated to the Subscriptions section."}, {"start": 119.0, "text": "I want to offer customers more affordable options"}, {"start": 122.0, "text": "for the SKDemo+ subscription,"}, {"start": 124.0, "text": "so I'll select a product with a one-year duration."}, {"start": 128.0, "text": "Then, under monthly with a 12-month commitment availability,"}, {"start": 131.0, "text": "I'll choose Set Up Availability."}, {"start": 133.0, "text": "And then follow the steps to configure the billing plan."}, {"start": 136.0, "text": "Once created, subscription offers can be configured for each billing plan type."}, {"start": 141.0, "text": "For example, I added a free trial only for the customers"}, {"start": 145.0, "text": "who subscribe to a 12-month commitment."}, {"start": 148.0, "text": "Now that I have new subscription pricing configured for SKDemo in App Store Connect,"}, {"start": 152.0, "text": "I can merchandise the new payment option to customers with StoreKit."}, {"start": 157.0, "text": "PricingTerms is a new property available on SubscriptionInfo"}, {"start": 160.0, "text": "for merchandising billing plan information."}, {"start": 163.0, "text": "The PricingTerms array lists all available billing plans for a given product."}, {"start": 168.0, "text": "Every auto-renewable subscription carries at least one billing plan in this array"}, {"start": 172.0, "text": "with a default billingPlanType of .upFront."}, {"start": 175.0, "text": "Because I configured a monthly subscription"}, {"start": 177.0, "text": "with a 12-month commitment for SKDemo+,"}, {"start": 180.0, "text": "a second object is returned in the PricingTerms array."}, {"start": 183.0, "text": "This billing plan uses a billingPlanType of .monthly,"}, {"start": 187.0, "text": "which only applies to monthly subscriptions with a 12-month commitment."}, {"start": 191.0, "text": "To merchandise pricing terms in my app, I'll use StoreKit views."}, {"start": 196.0, "text": "The StoreKit views APIs handle the work"}, {"start": 198.0, "text": "of loading product metadata from the App Store and adjusting layout,"}, {"start": 202.0, "text": "so your store automatically adapts to feel at home across all platforms."}, {"start": 207.0, "text": "I'll show you how it works in code."}, {"start": 209.0, "text": "I'll start by adding the new SwiftUI view modifier,"}, {"start": 212.0, "text": ".preferredSubscriptionPricingTerms"}, {"start": 214.0, "text": "and attach it to my existing SubscriptionStoreView."}, {"start": 218.0, "text": "I'll then filter for the .pricingTerms with a .monthly .billingPlanType."}, {"start": 222.0, "text": "And now, my subscription store is updated"}, {"start": 225.0, "text": "and ready to merchandise the monthly subscription with a 12-month commitment."}, {"start": 229.0, "text": "If you want to customize the SubscriptionStoreView further,"}, {"start": 232.0, "text": "check out \"Meet StoreKit for SwiftUI\" from WWDC23,"}, {"start": 236.0, "text": "and learn how StoreKit views can match your app"}, {"start": 238.0, "text": "with custom icons, backgrounds, and any other changes."}, {"start": 242.0, "text": "To merchandise the commitment plan in custom store UI in your app,"}, {"start": 246.0, "text": "fetch products with the Product API."}, {"start": 248.0, "text": "And filter for .pricingTerms with a .monthly .billingPlanType."}, {"start": 252.0, "text": "Then, obtain the monthly and totalCommitmentPrice and display in the UI."}, {"start": 257.0, "text": "Note, that billing plan metadata is only returned when available"}, {"start": 260.0, "text": "in the customer's storefront."}, {"start": 263.0, "text": "To make the purchase,"}, {"start": 264.0, "text": "pass the new .billingPlanType purchase option and handle the result."}, {"start": 269.0, "text": "Before a customer subscribes to a commitment plan for the first time,"}, {"start": 273.0, "text": "new messaging is included with a disclosure sheet."}, {"start": 276.0, "text": "The App Store automatically presents this sheet,"}, {"start": 278.0, "text": "and it's displayed once per Apple Account."}, {"start": 281.0, "text": "The sheet includes information about the number of payments"}, {"start": 284.0, "text": "required to fulfill the commitment, along with cancellation guidance."}, {"start": 288.0, "text": "When a subscription is active,"}, {"start": 290.0, "text": "the App Store also automatically provides new UI for customers"}, {"start": 294.0, "text": "to manage their monthly subscription with a 12-month commitment."}, {"start": 297.0, "text": "Here, customers can see all available plans"}, {"start": 301.0, "text": "and check the number of remaining payments"}, {"start": 302.0, "text": "along with when their billing commitment renews."}, {"start": 305.0, "text": "You can present the .manageSubscriptionsSheet"}, {"start": 308.0, "text": "directly inside your app"}, {"start": 309.0, "text": "using the .manageSubscriptionsSheet API in SwiftUI."}, {"start": 312.0, "text": "Or in UIKit call the showManageSubscriptions API."}, {"start": 317.0, "text": "To retrieve the active subscription information in your app,"}, {"start": 320.0, "text": "you can use new fields on Transaction that provide billing plan-specific metadata."}, {"start": 325.0, "text": "For Transactions with an .upfront billingPlanType,"}, {"start": 328.0, "text": "commitmentInfo is nil."}, {"start": 330.0, "text": "For transactions with a .monthly billingPlanType,"}, {"start": 332.0, "text": "commitmentInfo returns the progress,"}, {"start": 334.0, "text": "price and expiration for the 12-month commitment."}, {"start": 338.0, "text": "You can use these fields from the latest transaction"}, {"start": 340.0, "text": "to check customer entitlements"}, {"start": 342.0, "text": "or build your own commitment progress indicator."}, {"start": 345.0, "text": "Always use the latest transaction to get an accurate expirationDate."}, {"start": 350.0, "text": "Similarly, you can retrieve the renewalBillingPlanType"}, {"start": 353.0, "text": "and commitmentInfo on RenewalInfo,"}, {"start": 355.0, "text": "for information on the renewal of the overall commitment."}, {"start": 358.0, "text": "These new fields are available starting with OS 26.4."}, {"start": 363.0, "text": "Once you've added logic to merchandise and unlock content for the new billing plan,"}, {"start": 367.0, "text": "you can start testing with StoreKit Testing in Xcode."}, {"start": 370.0, "text": "Starting with Xcode 26.5, open your StoreKit configuration file"}, {"start": 375.0, "text": "and select a one-year, auto-renewable subscription."}, {"start": 378.0, "text": "Then, using the new Billing Plan picker,"}, {"start": 381.0, "text": "choose Monthly with a 12-month commitment to create a billing plan."}, {"start": 385.0, "text": "This creates new fields to configure pricing"}, {"start": 387.0, "text": "for the monthly subscription with a 12-month commitment."}, {"start": 390.0, "text": "Similar to App Store Connect,"}, {"start": 392.0, "text": "offers can be uniquely created for each billing plan type, here in Xcode."}, {"start": 397.0, "text": "Once configured, test your purchase flow with the transaction manager"}, {"start": 401.0, "text": "and verify commitmentInfo in the Transaction inspector."}, {"start": 405.0, "text": "To learn more about best practices and setting up StoreKit Testing in Xcode,"}, {"start": 409.0, "text": "check out \"What's new in Storekit 2 and Storekit Testing in Xcode\" from WWDC23."}, {"start": 415.0, "text": "If your app uses the App Store Server APIs or App Store Server Notifications V2,"}, {"start": 420.0, "text": "you can leverage new capabilities for customers"}, {"start": 422.0, "text": "who subscribe to a monthly subscription with a 12-month commitment."}, {"start": 426.0, "text": "There are new fields available"}, {"start": 427.0, "text": "in the signed transaction and renewal info objects"}, {"start": 430.0, "text": "that provide additional information about the commitment plan."}, {"start": 433.0, "text": "Subscription notifications continue to provide updates"}, {"start": 436.0, "text": "on the subscription lifecycle,"}, {"start": 438.0, "text": "such as monthly renewals, throughout the 12-month commitment."}, {"start": 442.0, "text": "The Retention Messaging API also supports this new payment option"}, {"start": 445.0, "text": "for auto-renewable subscriptions."}, {"start": 447.0, "text": "Check out our WWDC26 session"}, {"start": 450.0, "text": "\"Explore Retention Messaging in App Store Connect\""}, {"start": 453.0, "text": "to learn how this server-to-server API can help with your customer retention strategy."}, {"start": 458.0, "text": "I'll now show you a transaction payload example from the server"}, {"start": 461.0, "text": "for one billing period purchase of a 12-month commitment."}, {"start": 465.0, "text": "This decoded JWSTransaction includes new fields"}, {"start": 468.0, "text": "that correspond to the ones I covered earlier in StoreKit."}, {"start": 471.0, "text": "Use these fields to detect billing period purchases"}, {"start": 474.0, "text": "and understand where they live in the context of the overall commitment."}, {"start": 479.0, "text": "The signed renewal info object contains similar fields"}, {"start": 482.0, "text": "which reflect the renewal preferences of the customer"}, {"start": 485.0, "text": "after the current commitment ends."}, {"start": 487.0, "text": "Accordingly, they are only present in the renewal info"}, {"start": 490.0, "text": "when the subscription is currently in a commitment."}, {"start": 493.0, "text": "In this example, the customer changed their subscription"}, {"start": 496.0, "text": "to renew into a different BILLED_UPFRONT plan"}, {"start": 498.0, "text": "once their commitment completes."}, {"start": 501.0, "text": "To learn more about handling renewals"}, {"start": 502.0, "text": "and other events throughout the 12-month commitment,"}, {"start": 505.0, "text": "check out the developer documentation for"}, {"start": 507.0, "text": "\"Managing the life cycle of monthly subscriptions with a 12-month commitment.\""}, {"start": 512.0, "text": "In addition to new pricing capabilities available on annual subscriptions,"}, {"start": 515.0, "text": "I'm excited to share that there is another new feature"}, {"start": 518.0, "text": "to expand your subscription offerings."}, {"start": 521.0, "text": "Bundles and Suites."}, {"start": 523.0, "text": "Offering subscription Bundles and Suites is another way"}, {"start": 526.0, "text": "you can provide customers with more value in their subscriptions across apps."}, {"start": 531.0, "text": "Let's review the difference between Bundles and Suites."}, {"start": 534.0, "text": "A Bundle is a group of subscriptions which can be purchased individually"}, {"start": 538.0, "text": "but are sold together in a single purchase and offered at a better price"}, {"start": 542.0, "text": "than purchasing all of the subscriptions individually."}, {"start": 546.0, "text": "A Suite is a group of subscriptions which only exist in the context of the Suite."}, {"start": 551.0, "text": "These subscriptions cannot be purchased individually,"}, {"start": 554.0, "text": "but together typically provide service to a related set of apps."}, {"start": 558.0, "text": "You can start testing the API for Bundles and Suites in Xcode 27,"}, {"start": 562.0, "text": "and more details on this program are coming later in 2026."}, {"start": 566.0, "text": "Shifting gears to offer codes."}, {"start": 569.0, "text": "Offer codes can be added to a consumable, non-consumable,"}, {"start": 573.0, "text": "auto-renewable subscription, or non-renewing subscription product"}, {"start": 576.0, "text": "and allow you to provide free or discounted In-App Purchases"}, {"start": 579.0, "text": "to customers for a specific duration."}, {"start": 582.0, "text": "To learn how to configure offer codes in App Store Connect,"}, {"start": 585.0, "text": "check out \"Implement App Store Offers\" from WWDC24."}, {"start": 590.0, "text": "Customers can redeem offer codes directly within your app,"}, {"start": 593.0, "text": "when you present this sheet using the OfferCodeRedemption API."}, {"start": 597.0, "text": "Similar to creating a purchase, the API now returns a verificationResult"}, {"start": 601.0, "text": "when the redemption completes."}, {"start": 603.0, "text": "The API also accepts a set of RedeemOption values that configure the code redemption."}, {"start": 609.0, "text": "If the redemption succeeds,"}, {"start": 611.0, "text": "you receive a transaction object in the verificationResult."}, {"start": 614.0, "text": "If the redemption fails,"}, {"start": 616.0, "text": "you receive an error that describes why the redemption failed."}, {"start": 620.0, "text": "A UIKit variation of the updated redemption API is available as well"}, {"start": 624.0, "text": "using presentOfferCodeRedeemSheet."}, {"start": 627.0, "text": "You can now test redeeming offer codes in Xcode 27"}, {"start": 630.0, "text": "with the new redemption API on all applicable product types."}, {"start": 634.0, "text": "When you're ready to submit an app to the App Store,"}, {"start": 637.0, "text": "you can utilize the enhanced submission experience"}, {"start": 639.0, "text": "for In-App Purchases in App Store Connect."}, {"start": 642.0, "text": "This includes the ability to group multiple products as review items"}, {"start": 646.0, "text": "into a single App Review submission."}, {"start": 649.0, "text": "In-App Purchase products can now be combined with other review items"}, {"start": 652.0, "text": "including in-app events, custom product pages,"}, {"start": 655.0, "text": "and product page optimizations."}, {"start": 657.0, "text": "After submission, you can check the status from App Review"}, {"start": 660.0, "text": "in a centralized view for all review items."}, {"start": 663.0, "text": "These enhancements help keep your submission workflow organized"}, {"start": 666.0, "text": "and consistent across all review item types"}, {"start": 669.0, "text": "by unifying the submission process."}, {"start": 672.0, "text": "I'll go through an example of the enhanced submission flow"}, {"start": 675.0, "text": "using the SKDemo app in App Store Connect."}, {"start": 678.0, "text": "When I have an In-App Purchase product ready to submit to App Review,"}, {"start": 681.0, "text": "I can add to an in-draft submission with the Add for Review drop-down."}, {"start": 685.0, "text": "Then, I can view all of the review items in a submission"}, {"start": 688.0, "text": "by clicking on the in-progress draft."}, {"start": 691.0, "text": "To add a large group of products to a submission,"}, {"start": 693.0, "text": "I'll go to my list of In-App Purchase products"}, {"start": 696.0, "text": "and select each one that I would like reviewed together."}, {"start": 699.0, "text": "Then, I'll click Add for Review and select the in-progress submission."}, {"start": 704.0, "text": "In addition to the App Store Connect website,"}, {"start": 706.0, "text": "the enhanced submission experience is coming to the App Store Connect API."}, {"start": 711.0, "text": "reviewSubmissions is expanding to support In-App Purchase, subscription,"}, {"start": 715.0, "text": "and subscription group resources."}, {"start": 717.0, "text": "The reviewSubmissions API collection will enable you"}, {"start": 720.0, "text": "to automate your tasks for all review items through a single interface."}, {"start": 725.0, "text": "The existing resources for In-App Purchase,"}, {"start": 727.0, "text": "subscription, and subscription group will be deprecated"}, {"start": 731.0, "text": "in favor of the reviewSubmission and reviewSubmissionItems resources,"}, {"start": 735.0, "text": "so start migrating today."}, {"start": 737.0, "text": "Check out \"What's New in App Store Connect\" from WWDC22"}, {"start": 741.0, "text": "for a deep dive on the mechanics of review items"}, {"start": 743.0, "text": "and submitting to App Review."}, {"start": 746.0, "text": "These new features for In-App Purchases equip you with more ways"}, {"start": 749.0, "text": "to grow your customer base and provide great value to customers."}, {"start": 753.0, "text": "Before we conclude, here are some next steps to get you on your way."}, {"start": 757.0, "text": "Start by adding new billing plans"}, {"start": 759.0, "text": "to offer customers the flexibility of a monthly subscription"}, {"start": 762.0, "text": "while still securing a long-term commitment"}, {"start": 764.0, "text": "for your annual subscription products."}, {"start": 767.0, "text": "Update offer code redemption call sites across your app"}, {"start": 770.0, "text": "to take advantage of the extended redemption API."}, {"start": 773.0, "text": "Begin testing these new features today in Xcode 27 and sandbox."}, {"start": 779.0, "text": "When you're ready, submit your updated In-App Purchase products"}, {"start": 782.0, "text": "with the enhanced App Review experience."}, {"start": 785.0, "text": "Thank you for joining me and being part of the Apple Developer community."}, {"start": 789.0, "text": "I hope these features will drive your In-App Purchases"}, {"start": 792.0, "text": "to reach even more people,"}, {"start": 794.0, "text": "so you can focus on creating great apps and games that people will love."}]}