Product.products(for:) returns wrong storefront/currency on TestFlight while purchase sheet resolves correctly

App: com.playatrium.mobile

Issue: StoreKit 2's Product.products(for:) returns USD pricing regardless of account region on TestFlight builds. Account/device confirmed UK at every layer I can check:

  • App Store Connect developer account region: UK
  • Personal Apple ID Media & Purchases country/region: UK
  • Device region: UK
  • No .storekit configuration file present in the project
  • In-App Purchase capability confirmed enabled on the App ID

The native purchase sheet, for the SAME product in the SAME app session, correctly resolves and displays GBP, and purchases complete successfully with correct entitlement grants on our server. So the purchase flow itself resolves the storefront correctly — only the catalog/pricing query does not.

Console.app shows the account object with storefront = (null) at the moment of the catalog query:

account = <ACAccount: ... storefront = (null)>

and the resulting request falls back to /catalog/us/ with locale es-MX, rather than the correct territory.

I've seen a few threads here with similar symptoms (products returning empty or wrong-region data on TestFlight specifically, working fine via local StoreKit config in the simulator) but haven't found a clear explanation or fix. Anyone know why Storefront.current / the catalog query would fail to resolve correctly on TestFlight while Product.purchase() resolves fine in the same session?

Update: built a minimal, dependency-free StoreKit 2 project (same bundle ID, same team, zero third-party code) to isolate this from my main app. Storefront.current itself resolves incorrectly: countryCode: "USA", id: "143444", with locale fixed to es_MX@currency=usd — despite the Apple ID's Media & Purchases region being set to UK. This confirms the storefront resolution failure happens at the StoreKit/OS layer, not in app code.

Update with a decisive data point: I ran a real (non-cancelled) sandbox purchase through the minimal repro project. The resulting Transaction.storefrontCountryCode = "GBR" and Transaction.currency = "GBP" — correct. But Storefront.current, called immediately after and again 3 seconds later in the same process, still returns countryCode "USA", id "143444". This shows StoreKit has the correct storefront information available (it used it to process the transaction correctly) but Storefront.current and the product catalog query are not returning it. This looks like an internal inconsistency between StoreKit's transaction-processing path and its storefront-reporting API, not an account or device configuration issue.

Product.products(for:) returns wrong storefront/currency on TestFlight while purchase sheet resolves correctly
 
 
Q