Skip to content

Ship

Stores, deployment, testing, release processes, and production issues.

App Store age rating 4+ next to a not-a-diagnosis note

Article

BrainHD’s Attention Check Is Not a Diagnosis

BrainHD is built for ADHD brains. It includes an optional attention self-check. That check is not a diagnosis. I put that on the App Store listing on purpose.

1 min readShip

  • BrainHD
  • ADHD
  • App Store
A green upload next to a rejected review status

Article

Transporter Was Green. Review Was Not.

Signing and upload are not approval. Speech Route left my machine and still failed 2.1, 3.1.2, and 5.1.1. I treat a successful upload as the start of review, not the end of the job.

1 min readShip

  • App Store
  • iOS
Two product ID strings that differ by one character

Article

A Product ID That Is Almost Right Still Returns Nothing

On Speech Route the identifiers matched. When they do not — a typo, a prefix, a different bundle — StoreKit still succeeds and returns []. I check the string before I debug the request.

1 min readShip

  • App Store
  • StoreKit
  • Subscriptions
A reviewer phone next to a hidden Xcode console

Article

Reviewers Do Not See Your StoreKit Logs

Guideline 2.1 is what the reviewer sees: a paywall with nothing to buy. They do not see that your fetch returned []. I stopped debugging Xcode first on empty IAP.

1 min readShip

  • App Store
  • StoreKit
  • Subscriptions
A paywall price with and without a billing period

Article

$9.99 Without “Per Month” Fails 3.1.2

Apple's paywall list wants length with price. $9.99 fails. $9.99 per month passes. I take both from StoreKit so the period cannot drift from the product.

1 min readShip

  • App Store
  • Paywall
  • StoreKit
An onboarding loop that returns to the paywall

Article

Leaving the Paywall Cannot Drop You Back Onto the Paywall

Guideline 3.1.2 is not only a close button. If the paywall appears in onboarding, dismiss has to land somewhere that is not the same purchase screen again. I test that path on a device.

1 min readShip

  • App Store
  • Paywall
  • Subscriptions
A timeline with review sitting after the feature

Article

I Quote App Review as a Separate Line Now

Speech Route's subscription feature was not the long part. Review was. I now quote App Store review as its own work before I agree a date.

1 min readShip

  • App Store
  • Subscriptions
A paywall privacy link next to a 404 page

Article

A Privacy Link That 404s Counts as Missing

Guideline 3.1.2 wants functional links. A 404, an empty in-app browser, or no URL because you still have a file — Speech Route failed that. I open the paywall links on a phone before I submit.

1 min readShip

  • App Store
  • Paywall
  • Subscriptions
Terms of Use shown on a paywall and in App Store Connect

Article

Terms of Use Have to Exist Twice

Privacy is not the only document. Terms of Use need a working paywall link and a listing link or Apple's standard EULA. Speech Route had neither a hosted policy nor terms as URLs.

1 min readShip

  • App Store
  • Paywall
  • Subscriptions
A checklist of listing items the client has to provide

Article

The Client Sent Code. Review Wanted a Listing.

Speech Route stalled on information I did not own: banking, a hosted privacy page, product metadata. I now list those as client deliverables before I quote a submit date.

1 min readShip

  • App Store
  • Subscriptions
Four matching bundle ID fields

Article

The Bundle ID Had to Be the Same in Four Places

Certificate, identifier, profile, and the App Store Connect record all have to name the same app. On a first Mac I did not know those were four names. Builds failed before review started.

1 min readShip

  • App Store
  • iOS
App description with a standard EULA link

Article

I Linked Apple's Standard EULA From the Description

You do not need a custom contract if you use Apple's standard Terms of Use and link them from the listing. Speech Route had no terms URL at all. I decide standard vs custom before I build the paywall.

1 min readShip

  • App Store
  • Paywall
  • Subscriptions
An empty App Store Connect app list

Article

App Store Connect Was Empty When I Opened It

Speech Route had no app record when I opened App Store Connect. You cannot fetch subscriptions for an app that does not exist yet. Filling the record is submission work, not leftover metadata.

1 min readShip

  • App Store
  • StoreKit
  • iOS
A calendar spanning a review round trip

Article

Each Rejection Was Days, Not an Afternoon

Speech Route's eight rejections were not eight hours of coding. Each one was a review queue. I now treat a missing URL or an empty paywall as days on the calendar.

1 min readShip

  • App Store
  • App Review
A phone sign-in screen labelled sandbox instead of a personal Apple ID

Article

I Was Signed Into the Simulator With the Wrong Apple ID

StoreKit returns nothing if you are signed in with your regular Apple ID. On Speech Route I checked the sandbox and still wasted time, because the empty list looks the same as a broken fetch.

2 min readShip

  • App Store
  • StoreKit
  • Subscriptions
An unsigned Paid Applications Agreement next to an empty paywall

Article

StoreKit Was Fine. The Paid Applications Agreement Wasn't.

On Speech Route, subscription products existed and still returned nothing. The Paid Applications Agreement — tax and banking included — has to be complete before StoreKit will load a single product.

2 min readShip

  • App Store
  • StoreKit
  • Subscriptions
A crossed-out hardcoded $9.99 next to a price loaded from StoreKit

Article

I Stopped Hardcoding $9.99 on the Paywall

A hardcoded paywall price is wrong in most storefronts and can fail review if it does not match what Apple charges. After Speech Route I read price and duration from StoreKit, not from a string in the UI.

2 min readShip

  • App Store
  • StoreKit
  • Subscriptions
A checked list of App Store Connect and paywall items before submit

Article

I Don't Submit Until This List Is Done

Speech Route was rejected eight times. Hangar passed on the first try. The difference was finishing App Store Connect, the paywall, and the privacy URL before I pressed submit — not a friendlier reviewer.

2 min readShip

  • App Store
  • StoreKit
  • Subscriptions
Two URLs with www and without, an arrow collapsing them into one

Article

www or Not: Picking One Host and Making Google Agree

Google ranks canonical signals by strength: redirects and rel=canonical are strong, sitemap inclusion is weak, and they stack. This site picked the bare domain, redirects www to it, sends a canonical on every page, and lists only the apex in the sitemap. Here is how that maps to Google's document, and the three things Google says not to use.

3 min readShip

  • SEO
  • Canonical
  • Vercel
An App Store product page with a 13+ badge and a Social Media descriptor

Article

Apple Now Asks Every App Whether It Has a Social Feed

Since September the age rating questionnaire in App Store Connect requires an answer about social media capabilities. Say yes and your app gets a Social Media descriptor and a 13+ rating. Here is the definition, the under-13 exception, and the other September changes.

3 min readShip

  • App Store
  • App Review
  • Age Ratings
Hangar marked approved on the first App Store submission

Article

Hangar Went Live on the First Submission

Hangar passed App Review on the first submission. The pre-review checks I run now: paywall, Guideline 2.1, and a hosted privacy URL.

4 min readShip

  • App Store
  • Hangar
  • iOS

Back to home