Approved non-consumable IAP still returns an empty product list in TestFlight and macOS sandbox after 24+ hours

I’m seeing an App Store Connect / StoreKit product-availability issue for a universal iOS + macOS app.

Product ID:
com.vincentchu.VideoAtlas.pro.lifetime

The product is a one-time, non-consumable lifetime purchase.

Current state:

  • Both iOS and macOS apps are approved.
  • The IAP status is Approved.
  • I waited more than 24 hours after IAP approval before retesting.
  • The IAP is configured for the universal app, is available in 175 storefronts, and has an effective price.
  • Paid Applications agreement, tax, and banking are active; this account already has other paid apps.
  • In-App Purchase capability is enabled for both targets.
  • The product ID exactly matches the App Store Connect product ID.
  • Production schemes have StoreKit Configuration: None.
  • iOS is tested from TestFlight, so it uses StoreKit sandbox.
  • macOS is tested from a development-signed build against sandbox, also with no local StoreKit configuration.

The app uses StoreKit 2:

let products = try await Product.products(
    for: ["com.vincentchu.VideoAtlas.pro.lifetime"]
)

The call does not throw an error, but returns an empty array on both platforms:

StoreKit product request completed
productIDs=com.vincentchu.VideoAtlas.pro.lifetime
returnedCount=0
returnedProducts=
StoreKit returned no products for requested productIDs=
com.vincentchu.VideoAtlas.pro.lifetime
As a result, the app cannot retrieve Product.displayPrice or offer the purchase.

I have already followed "TN3186: Troubleshooting In-App Purchases availability in the sandbox", including checks for product identifier, bundle identifier, IAP capability, provisioning/signing, StoreKit configuration, sandbox testing, paid-app agreements, IAP approval, pricing, and storefront availability.

Since this is an empty result rather than an error, and it persists more than 24 hours after approval on both TestFlight and macOS sandbox, is there an additional App Store Connect-side configuration or Apple-side issue that could cause an approved non-consumable IAP not to be returned by Product.products(for:)?

Thanks.

Approved non-consumable IAP still returns an empty product list in TestFlight and macOS sandbox after 24+ hours
 
 
Q