StoreKit setup

Fix In-App Purchases that do not load during App Review

A blank paywall can come from code, configuration, product status, storefront availability, network assumptions, or an already-premium test account. Treat it as a commerce integration failure, not only as a UI bug.

Quick answer

Compare the product identifiers in the submitted build with App Store Connect, confirm product metadata and status, test loading on a clean device, and make sure the reviewer account can see the purchase path. AppReviewReady interpretation: keep a StoreKit evidence table because the same symptom can require either a binary fix or an App Store Connect configuration fix.

01

Compare the runtime product list to App Store Connect

Start by writing down every product identifier hard-coded or remotely configured in the release build. Then compare that list with App Store Connect product records, localizations, review screenshots, pricing, tax category, availability, and submission status.

Do not trust a staging dashboard or a local StoreKit configuration file as proof for the submitted app. The reviewer exercises the archived candidate against Apple's commerce environment. A typo, wrong bundle, incomplete localization, or product left out of submission can all look like the same empty paywall.

02

Interpret product status before changing code

  • A product that is not ready for review may not be available to the review flow you expect.
  • A product attached to the wrong app, group, or bundle identifier will not become visible because the UI retries.
  • A subscription group or price change can create state that the tester account must handle.
  • A storefront availability mismatch can hide a product even when the identifier is correct.
  • A reviewer account already granted entitlement can bypass the paywall and obscure the loading test.
03

Instrument the failure without exposing private data

Add release-safe diagnostics around product request start, product identifiers requested, empty response, error code, storefront, and entitlement state. Avoid logging personal data or transaction secrets. The goal is to distinguish no products returned, products returned but not displayed, and products displayed but purchase failed.

AppReviewReady interpretation: keep diagnostics available behind a support-safe mode or server-side event during review. A screenshot of a spinner is weak evidence; a timestamped product request with identifiers and result is actionable.

04

Run the reviewer purchase path on a clean account

  1. Install the exact submitted candidate or a build from the same archive settings.
  2. Use a fresh sandbox tester or StoreKit test account state that has no hidden premium entitlement.
  3. Open the paywall, wait for products, verify localized price and period, and start a purchase.
  4. Complete purchase, relaunch, restore, expire or revoke entitlement, and confirm the UI reacts correctly.
  5. Repeat with poor network conditions only after the normal path succeeds, so fallback behavior does not mask setup failure.
05

Reply with the failing layer and proof

If the fix is configuration-only, say so and identify the changed product record. If the app code changed, submit the corrected build. Avoid resubmitting a new binary to hide an incomplete product record, because the same record can still fail.

Copy-ready frameworkAdapt every bracketed field
IAP loading fix:
Products affected: [IDs and reference names]
Root cause layer: [identifier, product status, metadata, storefront, code, entitlement state]
Correction made: [App Store Connect config or build change]
Verification: [device/OS, account state, products returned, purchase/restore result]
Reviewer path: [screen and expected product names]
Sources

Primary references checked for this guide

Policy statements above are grounded in the linked Apple documentation. Operational recommendations are AppReviewReady's interpretation and should be tested against your app and the current guideline text.

Put it to work

Decode the commerce rejection

Map the rejection message to product status, paywall copy, or StoreKit behavior.

Open the tool