Skip to content

Investigate TestFlight CHE storefront returning USD product metadata #503

Description

@hyochan

Discussed in #494

Originally posted by kaischoene September 28, 2026
Hi OpenIAP / expo-iap maintainers,

We would appreciate guidance on a TestFlight price/storefront mismatch. We have read the legacy expo-iap issue #126 and the sandbox currency FAQ. We are not assuming this is an SDK bug.

Environment

  • Physical iPhone 17 Pro, iOS 26.6 beta.
  • TestFlight app version 0.1.0, build 17.
  • Expo 57.0.25, React Native 0.86.3, expo-iap 5.3.2.
  • The installed expo-iap package pins OpenIAP Apple 3.2.1. We have not independently verified the resolved Podfile.lock from the cloud build.
  • Two auto-renewable monthly subscriptions, referred to below as A and B (actual product identifiers omitted).

Observations

App Store Connect was checked read-only on September 28, 2026. Both subscriptions have Switzerland as their only selected sales territory. Current prices for new subscribers are CHF 49.00 (A) and CHF 89.00 (B).

State Storefront before/after fetch A displayPrice / currency B displayPrice / currency
Before signing out of Media & Purchases USA / USA $59.99 / USD $99.99 / USD
After Media & Purchases sign-out and app restart CHE / CHE $59.99 / USD $99.99 / USD

The controlled test signed out only under Media & Purchases, not iCloud, with an existing Swiss sandbox tester configured under Developer settings. Prices and territory configuration were not changed.

In the earlier state, Apple's purchase sheet for A showed EUR 69.99 and the normal Media & Purchases account, with the test-only/no-charge notice. The purchase was not confirmed. There is no purchase-sheet observation in the later CHE state: our app blocks purchase initiation when the Swiss storefront is paired with non-CHF product data.

Diagnostic path already checked

Our read-only diagnostic calls the exported expo-iap.fetchProducts({ skus, type: 'subs' }) function directly and displays displayPrice and currency from that call's return value. It does not read useIAP().subscriptions, persisted UI product state, or a fallback price. It checks getStorefront() before and after the request.

The numeric price field was not recorded in this diagnostic. We have not run an independent native Product.products(for:) probe outside expo-iap/OpenIAP, so we cannot establish whether the mismatch originates in StoreKit or elsewhere in the SDK path. We have not verified production behavior.

Questions

  1. Does the documented TestFlight USD-metadata limitation also explain this case where getStorefront() is already consistently CHE after sign-out/restart, but the direct product response remains USD?
  2. What is the recommended way to test the localized Swiss purchase flow without substituting a hard-coded CHF price or broadly disabling our price-consistency guard? Is there a supported refresh procedure or different test setup?
  3. Is there a relevant known fix for this SDK version? If further evidence is needed, which minimal additional fields or native comparison would you recommend before we build another diagnostic binary?

No purchases were confirmed during these checks. Thank you for helping us distinguish a known sandbox limitation from an actionable SDK issue.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions