Skip to content
Back to Blog
·8 min read

StoreKit returns no products in App Review or TestFlight: a checklist

Product.products(for:) comes back empty in TestFlight or for the reviewer, but works in Xcode. Check the Paid Apps Agreement, bundle and product IDs, product metadata, the StoreKit configuration file and first-purchase submission, in that order.

When StoreKit returns no products in TestFlight or during App Review, the App Store could not find the product IDs you asked for in the sandbox, so it left them out. Apple documents that Product.products(for:) excludes identifiers that are invalid or that the App Store can't find; it does not throw for them. Both TestFlight and App Review use the sandbox with the products set up in App Store Connect, not your Xcode StoreKit configuration file. So check, in order: an active Paid Apps Agreement with banking and tax complete, a bundle ID that matches the app in App Store Connect, product IDs that match exactly, each product with a price and localizations, and StoreKit Testing switched off when you test against the sandbox.

If the products work when you run from Xcode and vanish everywhere else, the StoreKit configuration file is the first suspect: its data never leaves your Mac.

Why it works in Xcode and not in TestFlight

Apple describes three test environments:

  • StoreKit Testing in Xcode reads products from a StoreKit configuration file. Apple says it works "without requiring a connection to App Store servers", and that the names, IDs and prices in that file "don't upload to App Store Connect, and don't appear in App Store-signed apps."
  • Sandbox uses the in-app purchase data you set up in App Store Connect.
  • TestFlight builds "always run in the sandbox environment."

App Review uses the sandbox too. Apple's App Review help says App Review "evaluates your In-App Purchases in the same sandbox environment you use for testing." So a product that exists only in your StoreKit configuration file, or whose App Store Connect setup is incomplete, is invisible to both your testers and the reviewer.

To see what your configuration file actually contains, open it in the StoreKit config viewer and compare its product IDs with App Store Connect.

The checklist

Work through these in order. The first items block every product at once; the later ones block single products.

1. Paid Apps Agreement active, banking and tax complete

  • The Account Holder must accept the Paid Apps Agreement in the Business section of App Store Connect and provide banking and tax information.
  • Apple: "The agreement must be Active to test In-App Purchases in the sandbox environment." Its App Review help adds that paid in-app purchases "won't function in review until this agreement is active."
  • Apple's sandbox troubleshooting note (TN3186) also lists: an unsigned agreement, a newer version of the agreement waiting to be accepted, an expired agreement, incomplete or outdated banking or tax information, an expired or inactive developer membership, and an unaccepted newer Apple Developer Program License Agreement. After renewing a membership, check whether the agreement and financial details need to be accepted or updated again.

2. Bundle ID and signing

From TN3186, products are not available when:

  • the app's bundle ID doesn't match the bundle ID of an app in App Store Connect;
  • the bundle ID has the In-App Purchase capability disabled in Certificates, Identifiers & Profiles;
  • the app uses a wildcard App ID (you can't test in-app purchases in the sandbox with a wildcard App ID profile);
  • the app is signed with an invalid certificate or provisioning profile.

3. Product IDs match exactly

Apple: "Make sure the bundle identifier and product identifiers in Xcode match those configured for your app and In-App Purchases in App Store Connect." TN3186 asks you to verify each identifier in your list matches the Product ID of an in-app purchase created for that app. In-app purchases are not shared between different apps. Because unmatched IDs are simply left out of the result, a typo shows up as a missing product, not as an error. Compare the set you requested with the IDs that came back and log the difference.

4. Each product has its metadata

  • For the sandbox, Apple's minimum is a reference name, product ID, localized name and price. TN3186 asks you to confirm each product has a price and localizations.
  • In App Store Connect, a product in Prepare for Submission that is missing required metadata must be completed before you can add it for review.
  • If you just created or edited a product, wait: Apple says changes "can take up to one hour" to appear in the sandbox.
  • You do not need App Review approval to test in the sandbox, and Apple says in-app purchases "do not need prior approval from App Review to function in review."

5. StoreKit Testing off when you test against the sandbox

TN3186: if your project contains a StoreKit configuration file, make sure you are testing in the environment you intend, and disable StoreKit Testing in Xcode (in the scheme) to test in the sandbox. Apple says that when you disable it, the app "starts using the data from App Store Connect." Test once this way from Xcode with a Sandbox Apple Account before you upload.

6. Sandbox account and storefront

  • Create Sandbox Apple Accounts in App Store Connect. They only work for apps in the same developer account.
  • For a TestFlight build, sign in with the Sandbox Apple Account in Developer settings to get the sandbox controls.
  • Products are on sale in every region unless you limit them. After changing a sandbox account's region, sign out of the Sandbox Apple Account on the device and sign back in.
  • If you limit products by storefront or device, Apple asks you to say so in the Notes field of App Review Information.

7. First purchases go in with an app version

Apple: "The first consumable, non-consumable, auto-renewable subscription, and non-renewing subscription In-App Purchase of each type must be submitted with a new app version." A new subscription goes in with its subscription group, and the app version, group and every product to review together must be in the same draft submission before you click Submit for Review. Once the first item of a type is approved, later items of that type can go in without a new version, as long as the app has an approved version. For the length limits on product IDs, display names and descriptions, see App Store Connect limits.

What happens if the reviewer sees no products

Guideline 2.1(b) reads: "If you offer in-app purchases in your app, make sure they are complete, up-to-date, visible to the reviewer and functional. If any configured in-app purchase items cannot be found or reviewed in your app, explain the reason in your review notes." An empty paywall or a purchase button that does nothing fails that check. The Guideline 2.1 rejection guide covers reproducing what the reviewer saw on a cold start.

Before you submit, Apple's App Review help asks you to fetch product information with StoreKit before showing it in the app, so what you display matches App Store Connect, and to test in the sandbox; if a product fails to display, follow TN3186.

Apple does not document a separate reason for products that load in your own TestFlight test but not for the reviewer. Its pages say both use the sandbox; if they differ, the storefront and device notes in step 6 are the documented differences to rule out.

FAQ

Why does Product.products(for:) return an empty array?

Apple documents that identifiers that are invalid or that the App Store can't find are left out of the result, so an empty array means none of the requested IDs were found. Errors are thrown only for system-related failures. Check the agreement, bundle ID, product IDs and product metadata.

Does TestFlight use my StoreKit configuration file?

No. TestFlight builds always run in the sandbox, which uses the products you set up in App Store Connect. Apple says the data in a StoreKit configuration file doesn't upload to App Store Connect and doesn't appear in App Store-signed apps.

Do in-app purchases need to be approved before App Review can see them?

No. Apple says in-app purchases do not need prior approval to function in review, and sandbox testing doesn't require submitting them. Your first purchase of each type does need to be submitted together with a new app version.

I just created the product and it still doesn't show. How long should I wait?

Apple says changes to in-app purchase information can take up to one hour to appear in the sandbox. If it is still missing after that, go back to the agreement and ID checks.

Will App Review reject the app if no products load?

Guideline 2.1(b) asks that in-app purchases be complete, up to date, visible to the reviewer and functional. If a configured product can't be found or reviewed in the app, explain why in the review notes.

Sources

All read on 1 November 2026.

Apple's wording and tools change; check the pages above for current behaviour.

Written by

Building local-first Mac & iOS productivity apps at Obelisk Club. About the author →