launchapp-studio/launchpaywall-ios

Production-ready SwiftUI monetization stack & high-conversion paywalls for iOS (Swift 6 + RevenueCat).

0

stars

11

commits

Swift

primary language

Sep 9, 2026

updated

in-app-purchase
ios-template
open-core
open-source
paywall
revenuecat
revenuecatintegration
sign-in-with-apple
storekit2
swift6
swiftui
Browse cluster: Swift macOS Application Development β†’

README

LaunchPaywall iOS

An open-core SwiftUI boilerplate to launch apps with a paywall, subscriptions, and authentication in minutes.

Swift 6 iOS 17+ RevenueCat v5 License: MIT

Overview


demo


LaunchPaywall is an open-core boilerplate that gives you the foundational service layer every subscription app needs: sign-in, purchase management, and a production-ready paywall experience. It is written entirely in Swift 6 with modern SwiftUI syntax (@Observable, @Environment, async/await, @MainActor), so you can focus on your product instead of rewriting the plumbing.

The open-core version includes everything required for a working MVP. Premium templates, additional components, and paywall variants are available in the Pro version (see below).

Features

  • πŸ” Sign in with Apple + native Keychain β€” authentication with AuthenticationServices and secure persistence of the user identifier via the Security API.
  • πŸ’³ RevenueCat v5 integration β€” configuration, Offerings, package purchases, restoring purchases, and identity sync (logIn/logOut).
  • 🎯 Customizable paywall + 3-step onboarding β€” annual/monthly plan selector with a highlighted badge, and paged onboarding persisted with @AppStorage.
  • 🌍 Native multi-language localization (i18n) β€” 6 languages out of the box (English, Spanish, German, French, Italian, Portuguese) powered by the Localizable.xcstrings String Catalog, with English as the source language.
  • πŸ§ͺ Local debug testing mode β€” a #if DEBUG flow with UserDefaults persistence lets you exercise the entire paywall and switch between Free/Pro plans without wiring up real RevenueCat accounts or StoreKit during development.
  • πŸ”¬ Xcode Canvas mocks & structured OSLog telemetry β€” preview initializers (isProMock, isAuthenticatedMock) to preview states without networking, and a lightweight analytics abstraction built on OSLog.

Project structure

LaunchPaywall/
β”œβ”€β”€ LaunchPaywallApp.swift        # Entry point: injects managers and picks onboarding vs. content
β”œβ”€β”€ ContentView.swift            # Main view: Free / Pro states + Sign in with Apple
β”œβ”€β”€ PaywallView.swift            # Customizable paywall (plans, purchase, restore)
β”œβ”€β”€ OnboardingView.swift         # 3-screen paged onboarding
β”œβ”€β”€ Localizable.xcstrings        # String Catalog: 6 languages (en source + es, de, fr, it, pt)
└── Services/
    β”œβ”€β”€ AppConfig.swift          # Centralized configuration (keys and URLs)
    β”œβ”€β”€ AuthManager.swift        # Sign in with Apple + Keychain (@Observable, @MainActor)
    β”œβ”€β”€ SubscriptionManager.swift# RevenueCat v5 (@Observable, @MainActor)
    └── TelemetryService.swift   # Anonymous structured analytics with OSLog

🧩 Modularity & Stripping Down (What you can delete)

LaunchPaywall is built with a highly decoupled architecture. If your app doesn't need certain features, you can easily strip them out without breaking the rest of the flow.

Don't need Authentication? If your app doesn't require user accounts or "Sign in with Apple":

  1. Delete AuthManager.swift and SignInView.swift.
  2. Go to your target's Signing & Capabilities and remove the "Sign in with Apple" capability.
  3. In your main App struct or RootView.swift, simply remove the if authManager.isAuthenticated check and route directly to your Onboarding or Main ContentView.

Don't need Subscriptions (RevenueCat)? If you just want to use the boilerplate for the Onboarding UI and String Catalogs:

  1. Delete SubscriptionManager.swift and the RevenueCat SDK dependency.
  2. Remove the PaywallView.swift or replace its purchase action buttons with standard navigation links.
  3. Clean up the AppConfig.swift file by removing the RevenueCat API Key properties.

Installation

  1. Clone the repository

    git clone https://github.com/launchapp-studio/launchpaywall-ios.git
    cd launchpaywall-ios
    
  2. Open the project in Xcode 26.5+

    open LaunchPaywall.xcodeproj
    
  3. Resolve dependencies

    Xcode automatically downloads the RevenueCat package via Swift Package Manager (https://github.com/RevenueCat/purchases-ios, v5.x).

  4. Replace the keys in Services/AppConfig.swift

    enum AppConfig {
        static let revenueCatAPIKey = "appl_YOUR_REVENUECAT_PUBLIC_KEY"
        static let telemetryDeckAppID = "YOUR_TELEMETRYDECK_APP_ID"
        static let entitlementID = "pro_access" // must match your entitlement in RevenueCat
        static let privacyPolicyURL = URL(string: "https://github.com/launchapp-studio/launchpaywall-ios/blob/main/PRIVACY.md")!
        static let termsOfServiceURL = URL(string: "https://github.com/launchapp-studio/launchpaywall-ios/blob/main/TERMS.md")!
    }
    
  5. Enable "Sign in with Apple"

    In the LaunchPaywall target β†’ Signing & Capabilities β†’ add the Sign in with Apple capability.

  6. (Optional) Test purchases in the simulator

    Add a StoreKit Configuration File (.storekit) with the same Product IDs as RevenueCat and select it in Edit Scheme β†’ Run β†’ Options β†’ StoreKit Configuration. See the detailed instructions in the header of SubscriptionManager.swift. During development you can also use the built-in #if DEBUG toggle to switch between Free/Pro without any store setup.

  7. Build and run on an iOS 17+ simulator or a real device.


πŸ’‘ Ready for App Store submission?
Follow our step-by-step Launch Checklist to set up your Apple Developer capabilities, StoreKit products, and RevenueCat entitlements.


πŸ”„ Reusing Onboarding in Existing Apps (Paywall Pre-Sell)

OnboardingView is modular and can be embedded into existing apps to serve as a pre-sell sequence right before triggering your paywall:

// Default boilerplate onboarding with a completion callback
OnboardingView {
    showPaywall = true
}

// Or fully custom pages tailored to your app
OnboardingView(
    pages: [
        OnboardingPage(symbol: "sparkles", title: "Discover Pro", description: "Unlock advanced features."),
        OnboardingPage(symbol: "bolt.fill", title: "Boost Productivity", description: "Save hours every week.")
    ],
    onComplete: {
        showPaywall = true
    }
)

⭐ LaunchPaywall Pro

Need more layout variations and styling controls?

πŸ‘‰ Join the Pro Waitlist to lock in an early launch discount.

  • Multiple Paywall Layouts: Feature lists, single-card, and multi-tier options.
  • Theme Customization: Parametric font styles, colors, and border controls.
  • Lifetime Access: One-time purchase with full source code ("as-is", no subscription) including all future Pro updates.

⭐ Star and watch this repository to be notified as soon as it launches.


Made with ❀️ by LaunchApp Studio

Contributors

launchapp-studio/launchpaywall-ios

Production-ready SwiftUI monetization stack & high-conversion paywalls for iOS (Swift 6 + RevenueCat).

0

stars

11

commits

Swift

primary language

Sep 9, 2026

updated

in-app-purchase
ios-template
open-core
open-source
paywall
revenuecat
revenuecatintegration
sign-in-with-apple
storekit2
swift6
swiftui
Browse cluster: Swift macOS Application Development β†’

README

LaunchPaywall iOS

An open-core SwiftUI boilerplate to launch apps with a paywall, subscriptions, and authentication in minutes.

Swift 6 iOS 17+ RevenueCat v5 License: MIT

Overview


demo


LaunchPaywall is an open-core boilerplate that gives you the foundational service layer every subscription app needs: sign-in, purchase management, and a production-ready paywall experience. It is written entirely in Swift 6 with modern SwiftUI syntax (@Observable, @Environment, async/await, @MainActor), so you can focus on your product instead of rewriting the plumbing.

The open-core version includes everything required for a working MVP. Premium templates, additional components, and paywall variants are available in the Pro version (see below).

Features

  • πŸ” Sign in with Apple + native Keychain β€” authentication with AuthenticationServices and secure persistence of the user identifier via the Security API.
  • πŸ’³ RevenueCat v5 integration β€” configuration, Offerings, package purchases, restoring purchases, and identity sync (logIn/logOut).
  • 🎯 Customizable paywall + 3-step onboarding β€” annual/monthly plan selector with a highlighted badge, and paged onboarding persisted with @AppStorage.
  • 🌍 Native multi-language localization (i18n) β€” 6 languages out of the box (English, Spanish, German, French, Italian, Portuguese) powered by the Localizable.xcstrings String Catalog, with English as the source language.
  • πŸ§ͺ Local debug testing mode β€” a #if DEBUG flow with UserDefaults persistence lets you exercise the entire paywall and switch between Free/Pro plans without wiring up real RevenueCat accounts or StoreKit during development.
  • πŸ”¬ Xcode Canvas mocks & structured OSLog telemetry β€” preview initializers (isProMock, isAuthenticatedMock) to preview states without networking, and a lightweight analytics abstraction built on OSLog.

Project structure

LaunchPaywall/
β”œβ”€β”€ LaunchPaywallApp.swift        # Entry point: injects managers and picks onboarding vs. content
β”œβ”€β”€ ContentView.swift            # Main view: Free / Pro states + Sign in with Apple
β”œβ”€β”€ PaywallView.swift            # Customizable paywall (plans, purchase, restore)
β”œβ”€β”€ OnboardingView.swift         # 3-screen paged onboarding
β”œβ”€β”€ Localizable.xcstrings        # String Catalog: 6 languages (en source + es, de, fr, it, pt)
└── Services/
    β”œβ”€β”€ AppConfig.swift          # Centralized configuration (keys and URLs)
    β”œβ”€β”€ AuthManager.swift        # Sign in with Apple + Keychain (@Observable, @MainActor)
    β”œβ”€β”€ SubscriptionManager.swift# RevenueCat v5 (@Observable, @MainActor)
    └── TelemetryService.swift   # Anonymous structured analytics with OSLog

🧩 Modularity & Stripping Down (What you can delete)

LaunchPaywall is built with a highly decoupled architecture. If your app doesn't need certain features, you can easily strip them out without breaking the rest of the flow.

Don't need Authentication? If your app doesn't require user accounts or "Sign in with Apple":

  1. Delete AuthManager.swift and SignInView.swift.
  2. Go to your target's Signing & Capabilities and remove the "Sign in with Apple" capability.
  3. In your main App struct or RootView.swift, simply remove the if authManager.isAuthenticated check and route directly to your Onboarding or Main ContentView.

Don't need Subscriptions (RevenueCat)? If you just want to use the boilerplate for the Onboarding UI and String Catalogs:

  1. Delete SubscriptionManager.swift and the RevenueCat SDK dependency.
  2. Remove the PaywallView.swift or replace its purchase action buttons with standard navigation links.
  3. Clean up the AppConfig.swift file by removing the RevenueCat API Key properties.

Installation

  1. Clone the repository

    git clone https://github.com/launchapp-studio/launchpaywall-ios.git
    cd launchpaywall-ios
    
  2. Open the project in Xcode 26.5+

    open LaunchPaywall.xcodeproj
    
  3. Resolve dependencies

    Xcode automatically downloads the RevenueCat package via Swift Package Manager (https://github.com/RevenueCat/purchases-ios, v5.x).

  4. Replace the keys in Services/AppConfig.swift

    enum AppConfig {
        static let revenueCatAPIKey = "appl_YOUR_REVENUECAT_PUBLIC_KEY"
        static let telemetryDeckAppID = "YOUR_TELEMETRYDECK_APP_ID"
        static let entitlementID = "pro_access" // must match your entitlement in RevenueCat
        static let privacyPolicyURL = URL(string: "https://github.com/launchapp-studio/launchpaywall-ios/blob/main/PRIVACY.md")!
        static let termsOfServiceURL = URL(string: "https://github.com/launchapp-studio/launchpaywall-ios/blob/main/TERMS.md")!
    }
    
  5. Enable "Sign in with Apple"

    In the LaunchPaywall target β†’ Signing & Capabilities β†’ add the Sign in with Apple capability.

  6. (Optional) Test purchases in the simulator

    Add a StoreKit Configuration File (.storekit) with the same Product IDs as RevenueCat and select it in Edit Scheme β†’ Run β†’ Options β†’ StoreKit Configuration. See the detailed instructions in the header of SubscriptionManager.swift. During development you can also use the built-in #if DEBUG toggle to switch between Free/Pro without any store setup.

  7. Build and run on an iOS 17+ simulator or a real device.


πŸ’‘ Ready for App Store submission?
Follow our step-by-step Launch Checklist to set up your Apple Developer capabilities, StoreKit products, and RevenueCat entitlements.


πŸ”„ Reusing Onboarding in Existing Apps (Paywall Pre-Sell)

OnboardingView is modular and can be embedded into existing apps to serve as a pre-sell sequence right before triggering your paywall:

// Default boilerplate onboarding with a completion callback
OnboardingView {
    showPaywall = true
}

// Or fully custom pages tailored to your app
OnboardingView(
    pages: [
        OnboardingPage(symbol: "sparkles", title: "Discover Pro", description: "Unlock advanced features."),
        OnboardingPage(symbol: "bolt.fill", title: "Boost Productivity", description: "Save hours every week.")
    ],
    onComplete: {
        showPaywall = true
    }
)

⭐ LaunchPaywall Pro

Need more layout variations and styling controls?

πŸ‘‰ Join the Pro Waitlist to lock in an early launch discount.

  • Multiple Paywall Layouts: Feature lists, single-card, and multi-tier options.
  • Theme Customization: Parametric font styles, colors, and border controls.
  • Lifetime Access: One-time purchase with full source code ("as-is", no subscription) including all future Pro updates.

⭐ Star and watch this repository to be notified as soon as it launches.


Made with ❀️ by LaunchApp Studio

Contributors

Languages

Swift

100.0%