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
- 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?
- 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?
- 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.
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
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).
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 displaysdisplayPriceandcurrencyfrom that call's return value. It does not readuseIAP().subscriptions, persisted UI product state, or a fallback price. It checksgetStorefront()before and after the request.The numeric
pricefield was not recorded in this diagnostic. We have not run an independent nativeProduct.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
getStorefront()is already consistently CHE after sign-out/restart, but the direct product response remains USD?No purchases were confirmed during these checks. Thank you for helping us distinguish a known sandbox limitation from an actionable SDK issue.