SKPaymentQueue.default().storefront?.countryCode returns "USA" only in TestFlight

Hi everyone,

I'm encountering an issue where the storefront country code returns "USA" unexpectedly in TestFlight builds, and I'd appreciate any insights from the community.

Issue Description

When executing SKPaymentQueue.default().storefront?.countryCode in our TestFlight builds, the property returns USA. However, we expect it to return JPN because both the Sandbox test user account and the Apple Account region configured on the device are set to Japan.

Behavior Across Environments

  • Xcode Debug & Ad Hoc Builds: Returns JPN as expected.
  • TestFlight Builds: Returns USA unexpectedly.

Related Threads

I've noticed several threads reporting similar issues without a clear resolution:

Questions

  1. Is this USA value a known TestFlight/Sandbox-specific limitation or bug?
  2. Will production users in Japan correctly receive JPN (and see JPY prices) once the app is approved and published on the App Store?
  3. Is there any workaround or project configuration fix required on our side prior to App Store submission?

Has anyone experienced this recently or confirmed the behavior in the production environment after release?

Thanks!

Update — confirmed with additional diagnostics

Since posting, we added temporary diagnostic logging to the app and reproduced the issue on the affected device. Sharing the findings in case they help others hitting the same problem, and to add data for Apple's investigation:

  1. Both the legacy API and StoreKit 2 return the same wrong value

We logged SKPaymentQueue.default().storefront (StoreKit 1) and await Storefront.current (StoreKit 2) side by side, at the same point in the app, on the same TestFlight build/session:

  • StoreKit 1: countryCode = USA, identifier = 143462
  • StoreKit 2: countryCode = USA, identifier = 143462

So this is not limited to the deprecated API — Storefront.current shows the identical wrong result on the affected device.

  1. The storefront identifier is correct; only countryCode is wrong

143462 is Apple's storefront identifier for Japan (JP) — and it matches exactly what a normal, unaffected device on the same build reports. So the storefront the device is actually associated with is correctly Japan. Only the countryCode string field is wrong (USA instead of JPN), on both APIs, at the same time.

  1. This produces real USD product data, not just a wrong label

SKProduct.priceLocale / Product (StoreKit 2) for the same product IDs come back with currency = USD, locale = en_US@currency=USD, e.g. a subscription priced at price = 10.99, localizedPrice = "$10.99". On an unaffected device with the same build, the same product IDs return currency = JPY, localizedPrice = "¥1,200". So this isn't only a diagnostic-field oddity — the product catalog itself is being resolved against the wrong storefront, and the app displays USD as a direct consequence.

  1. Environment
  • Affected device: iOS 18.7.2, TestFlight build
  • Unaffected device (same build, same app version): correct JPN / JPY on both APIs
  • Both the "Media & Purchase" Apple Account and the App Store Connect sandbox tester are set to Japan and have not been changed
  1. Related report

This looks consistent with another open report: Storefront Country Code Inaccuracy on iOS 18 (thread 787109) (https://developer.apple.com/forums/thread/787109), which describes the same iOS 18+ regression across both StoreKit 1 and StoreKit 2, and references FB20541419 for a similar case (French account unexpectedly returning the US storefront).

We're happy to share full diagnostic logs (product IDs, prices, storefront identifiers/country codes at each step from product fetch through purchase sheet) if that would help Apple engineering reproduce this.

Related Reports & Support Cases

  • Apple Developer Support Case: 20000146075908
SKPaymentQueue.default().storefront?.countryCode returns "USA" only in TestFlight
 
 
Q