On Speech Route I did check the sandbox account. I still spent hours in the wrong file.

That is the useful part of the story, not a plot where I forgot to sign in. StoreKit's empty list does not tell you which of five unfinished things is wrong. A regular Apple ID in the simulator produces the same [] as an unsigned Paid Applications Agreement or a product missing its screenshot.

Guideline 2.1 still sees an empty paywall. The reviewer is not signed into your Xcode session. You are, and if that session is the wrong account, you will debug a fetch that is working.

Sandbox is not your everyday Apple ID

Purchases in development go through a sandbox tester you create in App Store Connect. Settings → App Store on the device or simulator, sign out of the personal account, run the app, and sign in with the sandbox tester when StoreKit asks.

Signed in with the Apple ID you use for the App Store as a customer, product requests fail closed. You get an empty list. It looks like the identifiers are wrong. It looks like the network failed. It is the same shape I described in Why StoreKit Returned No Products.

I now treat "which account is on this device" as step one of the paywall test, not as a footnote after the Swift is "done."

Why Speech Route still confused me

The sandbox was not the cause of that first empty paywall. The account and the products were unfinished. Checking sandbox and seeing [] anyway is what sent me back into the request.

That is the trap. You can do the right sign-in and still have nothing to buy, because sandbox only reveals products that exist. It does not create them. It does not sign the agreement. It does not fill in a review screenshot.

So the check is not "did I remember sandbox?" The check is: sandbox tester signed in, then if the list is still empty, stop blaming the fetch.

What I do on a device now

I create the sandbox tester before I write the paywall. I sign out of the personal Apple ID on the hardware I will test, not only in the simulator. I run the purchase sheet once, on a phone, because a reviewer is on a phone.

If products load in sandbox and the paywall is still empty for review, the problem has moved: dismissal, price, duration, links — Guideline 3.1.2 — not StoreKit. If they never load, I go back to App Store Connect. The eight rejections that made this order a habit are in the first-submission post.