12 min read

What it actually takes to ship your first iOS app

A designer and a product engineer shipped their first iOS app in five months. The real stack, the four App Store rejections, and what it costs to run.

iOSSwiftUIIndieLaunch

The fourth rejection email arrived on a Tuesday. Our in-app purchases hadn’t been submitted for review — which was news to me, because I’d built all seven of them, priced them, written the review notes and screenshotted every one. I stupidly just hadn’t attached them to the version.

The code was the easy part.

This is the write-up of building Deep Core — my first iOS app, and the first product I’ve designed, built and marketed end to end. My partner Michele is a product designer. I’m a product engineer. Neither of us had shipped to the App Store before.

Five months. 279 commits, not that anyone cares. 148 automated tests. Four rejections. Roughly €30 a month to run, but keep in mind these costs scale to more apps and new ideas. Here’s everything, including the parts that went wrong.

What we built, and why

Deep Core is a guided breathing app. Not meditation — the drills that switch on the deep stabiliser muscles around your spine. Five exercises, five minutes, hands-free, free.

The insight the whole product rests on is that most training targets the visible outer core. The deep stabilisers — transverse abdominis, pelvic floor, multifidus, diaphragm — respond to a forceful exhale, not to crunches. That distinction is the reason the app exists, and it’s the one screen we rewrote the most: explaining a mechanism honestly, without drifting into promising medical outcomes.

Deep Core home screen with a daily streak tracker and five listed exercises
The Science screen explaining which deep core muscles each exercise activates
Home and the Science screen. Beanie, top right, is the best part of the app — and he wasn't my idea.

The split: a designer and an engineer

Michele owned the brand, the illustrations, every screen, and Beanie — the small orange bean who lives on the home screen and quietly guilts you into showing up. I owned the architecture, the code, the infrastructure and the release.

The thing that surprised me was the speed. A design question that would normally be a ticket, a review cycle and a follow-up thread was instead a thirty-second conversation. We could go from “this transition feels wrong” to a fixed build in an evening, because the person who drew it and the person who shipped it were the same two people, in the same room, with no handoff artefact in between.

The other advantage: nothing got lost in translation. When a Lottie animation didn’t behave the way it did in After Effects, we debugged it together rather than trading screenshots across a boundary. Most of the polish in the app exists because that loop was short enough to afford it. Aside from all of that, it is just fun working with your partner on something, together.

The stack, and why

LayerChoiceWhy
AppSwift 5.9, SwiftUI, CombineNative, one platform, small team. No cross-platform tax for a two-person build.
Project filexcodegenproject.yml is the source of truth and the .xcodeproj is generated. Kills merge conflicts, and stops Xcode silently editing settings behind your back.
AnimationLottie (dotLottie)The designer exports straight from After Effects. No engineer in the middle re-implementing motion.
PersistenceUserDefaults + Codable, iCloud KVSNo server, no accounts to breach, and progress survives a reinstall.
PurchasesRevenueCatEntitlements without hand-writing StoreKit receipt validation. Free under $2.5k/month revenue.
AnalyticsPostHog, EU-hostedBehind a first-party reverse proxy, consent-gated. Feature flags shipped the paid surfaces dark.
WebsiteAstro → S3 + CloudFrontStatic, fast, cheap. CodeBuild deploys on a git tag.
EmailButtondownSimple and developer-friendly. The waitlist promised exactly one email.
VoiceElevenLabsThe same voice coaches in-app and narrates the ads, so the app sounds like its own marketing.

Feature flags earned their keep

The app shipped with tips and cosmetics fully built but switched off behind PostHog flags. Going from “free app” to “selling” was a config change, not a resubmission — which, given how long review takes, is worth a great deal.

Marketing was a build problem too

The genuine surprise of this project: shipping the app was maybe half the work.

  • The website. Astro, deployed on semver tags. A single LAUNCH_STATE constant flips every CTA across the site from waitlist-capture to App Store button. It’s the one thing that went perfectly on launch day.
  • Email. A Buttondown waitlist whose signup form promised “one email when Deep Core launches”. A good constraint: you get exactly one shot, so you write it properly.
  • Video. Storyboarded as stills first, then animated. ElevenLabs for voice and Higgsfield AI for the video generation and image generation. A real timesaver.
The Deep Core marketing website landing page
The Astro site. One constant flips every CTA from waitlist to App Store.

The four rejections

Every one was on me. None were code. All of them were things I didn’t know a week earlier.

  1. 2.3.2 — Duplicate promotional images. We used the same artwork on all three tip products. That field is optional, but identical images across products is not allowed. Lesson: optional fields still get reviewed.
  2. 2.3.4 — App preview. We submitted our lovely animated brand video. An App Preview must be screen capture of the app itself. Lesson: the preview is a demo, not an advert.
  3. 5.1.1(v) — Account deletion. We offered “Disconnect Apple Account”, which unlinks but keeps data. Apple requires actual deletion, in-app, without extra steps. Our data is entirely local, so the fix was small — but the requirement is absolute. Lesson: if you support sign-in, you must support deletion.
  4. 2.1(b) — IAPs never submitted. Built, priced, screenshotted, and never attached to the version. In-app purchases must be submitted with a version, and your first consumable and first non-consumable each have to ship alongside a new binary. Lesson: “Ready to Submit” does not mean submitted.

What it costs

  • Apple Developer Program: $99/year — the only non-negotiable.
  • Running costs: roughly €30/month — Lottie, the domain, hosting. PostHog and RevenueCat are both free at our scale.
  • Apple’s cut: 30% drops to 15% under the Small Business Program. Apply early — it roughly halves the platform tax at small scale.
  • Break-even: a handful of sales a month. Realistic, which is the point.

The honest note: at €2–5 lifetime value, paid acquisition doesn’t pay back. Growth has to be organic, and that single fact shaped the entire marketing plan.

Where AI actually helped (and where it didn’t)

Genuinely useful: storyboarding and prompt-writing for the videos; debugging (the feature-flag nil-versus-false bug above); keeping documentation in sync with reality; drafting the endless App Store metadata; and reading Apple’s documentation faster than I could on my own.

Not useful: design taste — Beanie exists because a designer drew him. Deciding what to build. And anything where being wrong was expensive and hard to verify.

It compressed the research and the admin, which is most of what shipping actually is. It didn’t make the decisions and it didn’t have as much fun doing it.

What I’d do differently

  • Read the App Store Review Guidelines properly before the first submission, not after the first rejection.
  • Apply for the Small Business Program on day one.
  • Treat store metadata as a deliverable with its own deadline, not an afterthought.
  • Set up the website’s launch switch early. We did, and it’s the one thing that went perfectly.

Where it is now

Deep Core is live on the App Store, free, with five exercises and no account required. There’s a website, and we’re documenting the build across the usual channels.

What’s next: more exercises, a proper progression path, and the paid tier that is already built and sitting behind a flag waiting for enough people to justify turning it on.

Beanie, the orange bean mascot, looking proud
Beanie approves.

If you’re about to submit your first app: the code is the easy part, the guidelines are worth reading twice, and “Ready to Submit” really doesn’t mean submitted. Ask me anything.

About to submit your first app, or just want to compare notes? Ask me anything.