Free cheatsheet

The Real Fix for IAP 2.1(b) "App Completeness" Rejection

No PDF. No email course. Just the actual cause — and the one App Store Connect step that clears it.

Who this is for: Indie iOS devs whose paid app keeps getting rejected for Guideline 2.1(b) — App Completeness ("we were unable to review the in-app purchases"). If you fixed your StoreKit code and it still bounces — usually within ~30 minutes — the problem is not your code. It's that the in-app purchase was never actually submitted for review alongside the build.

What this fixed (real apps)

Same root cause every time: an IAP stuck in Ready to Submit while the build went to review without it.

The Fix (in App Store Connect)

Your IAP has to be submitted with the app version. Apple's first IAP for an app can only be submitted on a version, not on its own. In ASC:

App Store Connect → your app → the version you're submitting
  → "In-App Purchases and Subscriptions" section
  → "Add for Review" / "Select an In-App Purchase"
  → tick your IAP → submit it together with the version

After that, the IAP state moves from Ready to Submit to Waiting for Review. If it's still Ready to Submit when you submit the build, Apple's automated check rejects 2.1(b) — often within 30 minutes.

The Hidden Trap (this is the one that wastes days)

You cannot do this step with the App Store Connect API. The reviewSubmissionItems endpoint only accepts appStoreVersion, appCustomProductPageVersion, and appEvent — every in-app-purchase relationship name (inAppPurchase, inAppPurchaseV2, etc.) returns 409 ENTITY_ERROR.RELATIONSHIP.UNKNOWN.

3-Step Fix Process

1
Check the IAP state first — In ASC, open the in-app purchase. If its status is Ready to Submit (not Waiting for Review / Approved), that is why review fails. Code changes won't move this state.
2
Attach the IAP to the version — On the version page, in "In-App Purchases and Subscriptions", use "Add for Review" and tick the IAP, then submit the version with the IAP. (Make sure the IAP has its review screenshot + review note filled in, or it can't be added.)
3
Verify the state changed — Confirm the IAP now reads Waiting for Review. Via API you can read (not write) it: GET /v2/inAppPurchases/{id} and check attributes.state.

Get the full 5-point rejection checklist

Enter your email — I'll send the complete checklist plus the exact ASC API call to verify your IAP state. No spam, no drip sequence.

Sent! Check your inbox for the full checklist.

Or: Email me directly — I respond to every email within 4 hrs JST Mon-Fri.

Free 15-min call — IAP specific See full iOS Audit Sprint