TestFlight: storefront CHE but direct fetchProducts returns USD — safe way to test localized subscriptions? #494
Replies: 2 comments 1 reply
|
@kaischoene Great write-up. Here is how I would separate "sandbox limitation" from "SDK issue". 1. Why the storefront and the product currency can disagree in TestFlight
2. The minimal native comparison before another diagnostic build To rule the SDK in or out, log the same product natively right next to the expo-iap call: let products = try await Product.products(for: ["<product id A>"])
for p in products {
print(p.id, p.displayPrice, p.price, p.priceFormatStyle.currencyCode, p.priceFormatStyle.locale.identifier)
}
print(await Storefront.current?.countryCode ?? "nil")If 3. Testing the Swiss flow without a hard-coded price or turning off your guard
This keeps your production safety check intact. TestFlight still gets you through the purchase flow, and the |
|
Created #503 from this discussion to track the investigation; the cause is still unconfirmed. Thanks @selmancanklnc for suggesting the native comparison. @kaischoene, please compare native One clarification: |
Uh oh!
There was an error while loading. Please reload this page.
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.
All reactions