You have downloaded the SubZero subscription manager template and want to see it running before you change anything. This SubZero setup guide takes you from the zip file to a signed release build, and it points out the places where buyers usually lose an afternoon. There is no server, account or licence key to set up. SubZero stores everything in a local Hive database on the device, so the only setup is your Flutter toolchain.
Before you start
Check these on your machine first:
- Flutter 3.44 or later on the stable channel, which includes Dart 3.12. Run
flutter --versionto check. - Android builds: the latest stable Android Studio, Android SDK 36 and JDK 17.
- iOS builds: a Mac with Xcode and CocoaPods. The deployment target is iOS 13.0.
- Windows only: turn on Developer Mode (Settings > Privacy & security > For developers) so Flutter can link plugins.
There is no .env file and no Firebase project. The project ships with Google's AdMob test IDs, so it runs as it is. If you only want the five-minute path, the official SubZero Quick Setup guide covers it on one page.
Step 1: Get the project running
Unzip the download and open a terminal in the folder that contains
pubspec.yaml.Install the packages and check the project is healthy:
flutter pub get flutter analyze flutter testStart an emulator or connect a phone, then run:
flutter devices flutter run
You should see the onboarding, then the Dashboard in the dark theme. The generated Riverpod files (*.g.dart) are already included, so you don't need build_runner for a first run.
Test on Android or iOS, not in Chrome. The web build exists for the live demo, and notifications, backup and restore, PDF export and ads are switched off there.
Step 2: Rebrand in AppConfig
Most branding sits in one file: lib/core/config/app_config.dart. It holds the app name, tagline, company, support email, version, file prefix and brand colours. The About screen, privacy text, PDF report, backup file names and theme all read from it.
Two pitfalls here:
- Use hot restart, not hot reload. These values are constants, so hot reload won't show the change and you'll think the edit failed.
- Keep
AppConfig.versionequal to the version name inpubspec.yaml. The template ships asversion: 1.5.0+3. If the two drift apart, the app shows one version and the store shows another.
AppConfig does not cover native settings. The name under the icon is android:label in android/app/src/main/AndroidManifest.xml and CFBundleDisplayName in ios/Runner/Info.plist. For the icon and splash, replace assets/icons/icon.png (1024 x 1024 px) and assets/icons/splash.png, then regenerate:
dart run flutter_launcher_icons
dart run flutter_native_splash:create
Step 3: Change the package ID
The default ID is com.stacklynlabs.subzero on every platform. Change it before you create any store listing or AdMob app, because both are tied to the ID you register. The SubZero-specific part is moving MainActivity.kt out of android/app/src/main/kotlin/com/stacklynlabs/subzero/ into the folder that matches your new ID. The full find-and-replace, Xcode and verification steps are in changing your app's package name.
Step 4: Edit local data safely
Editing the 25 quick-add templates in lib/core/constants/subscription_templates.dart is safe. Saved subscriptions keep their own name, price, colour and category, so a template change never touches existing user data.
Adding a field to SubscriptionModel is where data gets corrupted:
- Use the next unused
@HiveFieldnumber, which is 9, and make the field nullable or give it a default. - Edit
subscription_model.g.dartby hand. The Hive adapter is not produced bybuild_runner, so running it will not add your field to the adapter'sreadandwritemethods. - Add the field to the backup map in
lib/core/services/backup_service.dart.
Never change or reuse an existing typeId or @HiveField number. Users who update the app would load their old records with the wrong fields.
Step 5: Add your AdMob IDs
- Put your real AdMob App ID in
AndroidManifest.xmlandInfo.plist. The guide warns the app crashes on launch without a valid App ID. - Replace the release-branch placeholders in
lib/core/services/ad_service.dartwith your Ad Unit IDs. Debug builds keep using Google's test IDs. - In AdMob, publish a consent message and assign it to your app. The consent form only loads for a registered app.
Don't use your real ad units while developing. Google can treat that as invalid traffic.
Step 6: Build a signed release
SubZero 1.5.0 reads android/key.properties automatically. Create an upload keystore, copy android/key.properties.example to android/key.properties and fill it in. In this template, a relative storeFile path is resolved from android/app/, so either put the keystore there or use an absolute path. Raise the number after + in pubspec.yaml for every Play upload, then build:
flutter build appbundle --release
flutter build ipa --release
If Gradle prints WARNING: android/key.properties not found, the bundle was signed with the debug key and Google Play will reject it. Keystore creation, Play App Signing and the iOS upload are covered step by step in Flutter release build signing for Android and iOS.
Getting from here to a store-ready build touches Dart constants, Gradle, the Android manifest, Info.plist, Xcode signing and the AdMob console, and a mistake in any of them often shows up only as a build error or a store rejection. If you'd rather hand that part off, our Flutter app reskinning service does the rebrand, package ID and signed builds for you.
Troubleshooting
"The current Dart SDK version is X, requires ^3.9.2". Your Flutter is too old. Run flutter upgrade, then flutter doctor.
"Building with plugins requires symlink support". Windows only. Turn on Developer Mode.
Android build fails with Java errors. Install JDK 17 and point Flutter at it with flutter config --jdk-dir "path/to/jdk17".
"Namespace not specified" or a package mismatch after changing the ID. Check namespace and applicationId in android/app/build.gradle.kts, and make sure the MainActivity.kt folder and its package line match the new ID.
The app crashes on launch after you added AdMob. The App ID in the manifest or Info.plist is missing or invalid.
Reminders don't appear. Reminders fire at 9:00 AM local time, one day before the billing date. Allow notifications, and on Android 12+ allow "Alarms & reminders". Some Android brands delay alarms through battery optimisation, so set the app to "Unrestricted".
CocoaPods error on iOS. Run flutter clean && flutter pub get, then cd ios && pod repo update && pod install && cd ...
Where to get help
The SubZero Complete Setup guide covers the parts this article skips: fonts, the full data model, consent testing and the store checklist. CHANGELOG.md in the project root lists every change by version.
If you are still stuck, email support@stacklynlabs.com with your flutter --version output, your platform and the full error message.