Prices displayed in local currency using store pricing tiers
Why it matters
Hardcoded price strings like "$9.99/month" display the wrong currency and wrong amount to users in other countries — App Store pricing tiers mean a US $9.99 subscription may be priced at £7.99, €9.99, ¥1,500, or A$14.99 depending on the market. Showing a US price to an Australian user who is actually charged A$14.99 is a misrepresentation of the cost that violates both Apple guideline 3.1.1 and consumer protection laws in many jurisdictions. Apple's and Google's IAP SDKs return a localizedPrice string already formatted in the user's local currency — there is no reason to hardcode prices.
Severity rationale
Low because hardcoded prices cause incorrect currency display in non-US markets but are unlikely to trigger rejection on their own — however they do expose the developer to consumer protection complaints.
Remediation
Replace all hardcoded price strings with the localizedPrice (or equivalent) returned by the platform IAP SDK at runtime. Never define a price constant as a string in src/constants/pricing.ts or equivalent.
// RevenueCat — correct
const price = offering?.monthly?.product.priceString; // "$9.99" or "£7.99" etc.
// react-native-iap — correct
const price = product.localizedPrice;
// Never do this:
const price = '$9.99'; // wrong for non-US markets
// Show a loading state while fetching, not a hardcoded fallback:
const displayPrice = price ?? 'Loading...';
Also avoid using prices fetched from your own backend — your backend does not know the user's App Store region or currency, and its pricing may lag behind changes made in App Store Connect.
Detection
- ID:
price-localization - Severity:
low - What to look for: Count all relevant instances and enumerate each. Examine all paywall components and any screen that displays a price. Look for hardcoded price strings:
"$9.99","$49/year","USD 9.99","9.99"as string literals. The correct pattern is to fetch the price from the platform's IAP SDK at runtime — this returns a localized, currency-correct price string in the user's local currency. Forreact-native-iap:product.localizedPrice(e.g.,"£7.99"for UK users). For RevenueCat:package.product.priceString. For StoreKit 2:product.displayPrice(a formatted string) orproduct.price(aDecimal) formatted viaproduct.priceFormatStyle. For Flutterin_app_purchase:productDetails.price. For Adapty:product.localizedPrice. Failure patterns:<Text>$9.99/month</Text>hardcoded in JSX; a price constant defined as a string inconstants/pricing.ts; a price fetched from your own backend rather than from the platform SDK (your backend may not know the user's local currency tier). Also check that the displayed price matches the SDK-fetched price — a common bug is fetchinglocalizedPricebut then displaying a hardcoded fallback if the fetch is slow. - Pass criteria: All price strings displayed to the user come from the platform IAP SDK (or a third-party IAP wrapper SDK) at runtime, not from hardcoded string values or a non-store backend. At least 1 implementation must be verified.
- Fail criteria: Hardcoded price strings displayed to the user; prices fetched from the app's own backend rather than the platform SDK;
localizedPricefetched but a hardcoded fallback used when the fetch is pending. - Skip (N/A) when: No IAP detected in the app.
- Detail on fail:
"PaywallScreen.tsx renders hardcoded string '$9.99/month' — prices must come from the platform IAP SDK to reflect correct local currency and pricing tier"or"MONTHLY_PRICE constant in src/constants/pricing.ts is '$9.99' — this will be wrong for non-US App Store users" - Remediation: Always display prices from the SDK:
// RevenueCat — correct const price = offering?.monthly?.product.priceString; // "$9.99" or "£7.99" etc. // react-native-iap — correct const price = product.localizedPrice; // Never do this: const price = '$9.99'; // wrong — hardcoded
External references
- external · apple-guideline-3.1.1 — Apple App Store Review Guidelines § 3.1.1 — In-App Purchase (localized pricing from platform SDK)
- external · google-play-billing-policy — Google Play Billing Policy — Pricing and currency requirements
Taxons
History
- 2026-04-18·v1.0.0·Initial import from app-store-iap-subscriptions·automated