Hangar went through review on the first submission. Speech Route, the Fiverr app where I learned all of this, was rejected at least eight times.

I do not submit now until a short list is done. It is the same list that rejected Speech Route, written as a gate instead of as notes I planned to deal with after Apple replied.

Account and products

The Paid Applications Agreement is signed. Tax and banking on that agreement are complete. This is account-level. I do not debug StoreKit until it is.

Each subscription is actually submittable: display name, description, price, review screenshot. A half-finished product is invisible to StoreKit. The product IDs in the binary match those records exactly.

I test purchases signed in with a sandbox tester, on a phone. My everyday Apple ID is signed out.

If the paywall is still empty after that, Guideline 2.1 will fail it. The fetch is usually not the bug. I wrote that trap down in Why StoreKit Returned No Products.

The paywall screen

I can leave the purchase screen without buying. Close is visible and tappable on a device, including under the notch. If the paywall appears in onboarding, leaving it does not loop back onto the same screen.

The subscription name, the period, and the price are on the screen before anyone taps buy. The price and duration come from StoreKit, not a hardcoded $9.99. The billed amount is louder than any trial headline.

Privacy and terms links open real pages. A file is not a URL. That rejection was Guideline 5.1.1 and it also fails 3.1.2 when the paywall links 404. The close-button write-up is Guideline 3.1.2.

The listing

The same privacy URL is in App Store Connect's Privacy Policy field. Terms exist in the description or as Apple's standard EULA. The app record is filled in — Speech Route's Connect account was empty when I opened it. Screenshots, description, and age rating, including the social media question, are answered.

Signing already matches: certificate, bundle ID, profile, app record. I would rather find that before upload than in a Transporter error.

Why Hangar was boring

On Speech Route I did not own the agreement, the hosted policy, or the missing product metadata. I found out in review. On Hangar I was the client. I ran this list while the binary was still on my machine.

First-try approval was not a personality trait. It was refusing to submit an unfinished store record. I now quote review as a separate piece of work, because on a first subscription app it can take longer than the feature.

If you want the failures in the order they arrived, start with the eight-rejections post. This page is the version I use so they do not arrive again.