1 Hour Guide1 Hour Guide
Remaining:60 min
โ† Back to Tutorials
๐Ÿ’ฐ Side Hustleโ€ข60 minโ€ขIntermediateโ€ขJun 30, 2026

Ship an iOS MVP in 1 Hour

Ship a runnable v1 in 60 minutes: SwiftUI + RevenueCat + PostHog. Core action only, 4-step onboarding, basic paywall, key events instrumented.

#indie-app#ios#swiftui#mvp#revenuecat

๐Ÿ“š Indie App Playbook ยท Part 3 of 7 Series overview: Indie App Playbook

An MVP isn't a rough version of a big product โ€” it's a small product that validates exactly one core hypothesis.

In one hour you won't ship a full version, but strangers will complete the core action in 30 seconds and you'll see in the data exactly where they drop off.

๐ŸŽฏ What you'll ship

  • A TestFlight-ready v1 (minimal but complete)
  • The core path: launch โ†’ onboarding โ†’ core action โ†’ paywall
  • 6 must-have events instrumented
  • A real build you can send to your first 50 users

โฑ๏ธ Time blocks

0โ€“10min
Scaffold: SwiftUI project + dependencies
10โ€“25min
Core action: 5 screens, main path works
25โ€“40min
Onboarding + paywall
40โ€“50min
Wire RevenueCat + PostHog
50โ€“60min
Submit TestFlight

๐Ÿ“‹ Prerequisites

  • Xcode 16+, free Apple Developer account
  • Outputs from Part 2: Pick Your App Niche: โ‰ค 5 core features + positioning line
  • Free RevenueCat + PostHog accounts

Step 1: Scaffold (0โ€“10 min)

New project

File โ†’ New Project โ†’ iOS โ†’ App
Interface: SwiftUI
Language: Swift
Storage: None (UserDefaults is enough)

Dependencies

File โ†’ Add Package Dependencies:

https://github.com/RevenueCat/purchases-ios
https://github.com/PostHog/posthog-ios

Only these two. Don't add Firebase / Mixpanel / Amplitude โ€” they slow compile.

Structure

YourApp/
  App.swift           // @main + register RC/PH
  ContentView.swift   // Top router
  Onboarding/         // 4-step flow
  Core/               // Core action screens
  Paywall/            // Paywall
  Analytics.swift     // Event wrapper

Step 2: Core action (10โ€“25 min)

Mindset: The user completes one key task within 30 seconds of opening. Cut everything else.

5 screens

Max 5 screens:

  1. Launch / Onboarding entry
  2. Core action input (the one critical interaction)
  3. Result page (the moment the user sees value)
  4. Paywall (appears after value is felt)
  5. Settings / History (minimal)

SwiftUI skeleton

struct ContentView: View {
    @AppStorage("hasOnboarded") var hasOnboarded = false

    var body: some View {
        if !hasOnboarded {
            OnboardingFlow()
        } else {
            MainTabView()
        }
    }
}

Don't do

  • โŒ User accounts (Apple ID / device-local is enough for v1)
  • โŒ Backend API (full local in v1, fewer network deps)
  • โŒ Multi-language (do your main market first)
  • โŒ iPad layout (unless iPad is the core scenario)

Step 3: Onboarding + paywall (25โ€“40 min)

4โ€“5 step onboarding

Not a product manual โ€” a funnel from ad promise โ†’ paywall trigger:

  1. Welcome: restate the ad's core promise ("Never get sunburned again")
  2. Pain echo: 3 lines of "do you also..." so users nod along
  3. Value demo: one GIF or 3-step illustration showing how the app solves it
  4. Permissions (if needed): notifications / location / camera, each with a "we'll only..." explainer
  5. Paywall: right after, while emotion is primed

Paywall template

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ [One-line value prop]       โ”‚
โ”‚ Unlock streak tracking.     โ”‚
โ”‚ Miss a day = back to zero.  โ”‚
โ”‚                             โ”‚
โ”‚ โœ“ Unlimited streaks         โ”‚
โ”‚ โœ“ History export            โ”‚
โ”‚ โœ“ Widget                    โ”‚
โ”‚                             โ”‚
โ”‚ [ Yearly  $29.99/yr ]       โ”‚
โ”‚ [ Monthly $4.99/mo ]        โ”‚
โ”‚                             โ”‚
โ”‚ Start 7-day free trial      โ”‚
โ”‚                             โ”‚
โ”‚ Restore | Terms | Privacy   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Must-have:

  • Clear price, clear trial length, clear post-trial billing
  • No fake countdowns / fake "limited time" pressure
  • Restore Purchase is required (review will reject otherwise)
  • Close button so users can skip

Step 4: Wire RevenueCat + PostHog (40โ€“50 min)

RevenueCat (5 min)

Create project at app.revenuecat.com, grab API key, in App.swift:

import RevenueCat

@main
struct YourApp: App {
    init() {
        Purchases.configure(withAPIKey: "appl_xxxxxx")
    }
    var body: some Scene { ... }
}

In App Store Connect, create subscription products (yearly + monthly), and create a sandbox tester account.

PostHog (5 min)

import PostHog

let config = PostHogConfig(apiKey: "phc_xxx", host: "https://us.i.posthog.com")
PostHogSDK.shared.setup(config)

6 must-have events

EventFires when
app_openedApp launch
onboarding_completedFinishes onboarding
core_action_doneUser completes one core action
paywall_shownPaywall appears
trial_startedUser taps trial
purchase_completedReal payment success

Wrap in Analytics.swift:

enum Event: String {
    case appOpened = "app_opened"
    case onboardingCompleted = "onboarding_completed"
    case coreActionDone = "core_action_done"
    case paywallShown = "paywall_shown"
    case trialStarted = "trial_started"
    case purchaseCompleted = "purchase_completed"
}

func track(_ event: Event, properties: [String: Any]? = nil) {
    PostHogSDK.shared.capture(event.rawValue, properties: properties)
}

Rule: instrument everything you might need later. Missing > wrong.


Step 5: TestFlight (50โ€“60 min)

Checklist

  • App name, icon, subtitle filled
  • At least 3 screenshots at 6.7"
  • Privacy policy URL (Termly / a public Notion page works)
  • Support URL (Notion page is fine)
  • App Privacy nutrition labels filled (what data, with whom)
  • Review notes: test account, subscription test path
  • Build version 1.0 (1)

TestFlight, not App Store

Don't submit to App Store directly for v1. Flow:

  1. Xcode โ†’ Product โ†’ Archive
  2. Upload to App Store Connect
  3. In TestFlight tab, enable Internal Testing
  4. Invite yourself + the first 50 users from Part 1

TestFlight needs no review โ€” fast iteration. Only submit to App Store after the first 50 users have given feedback.

โœ…

Checkpoint

End of 60 minutes you should have:

  • โœ… A runnable TestFlight build
  • โœ… Core action completable in 30 seconds
  • โœ… 6 key events visible in PostHog
  • โœ… Paywall completes sandbox subscription

No data = it doesn't exist. Next: build the App Store page so real users can find you.


๐Ÿ“š Further reading

Series navigation

๐Ÿ“š Indie App Playbook ยท Part 3 of 7

โ†’
App Store + ASO in 1 Hour
60 minutes to a complete App Store page: name, subtitle, keywords, first two screenshots, subscription disclosure, review notes. Get users to tap from search results.
60 min