Release build
sign, build, publish.
The pre-release checklist, Android signing, the build commands for Google Play and the App Store, and the optional web demo.
01Before the first release
- Your own Firebase project, deployed, with
flutterfire configuredone (Firebase setup) - Your own application id and bundle id (Rebranding)
- Your own AdMob app ids in
AndroidManifest.xmlandInfo.plist, and the test-id test removed (Ads) - Ad network unit ids and the verification secret in the console; the callback URL set in the network; one real video credited
- UMP consent messages published in AdMob → Privacy & messaging
- App Check registered and enforced;
ENFORCE_APP_CHECKistrue - Privacy policy, terms and rewards rules URLs in console → Legal; Status page without warnings
- Android release signing set up (below)
- If you build with a non-default region:
--dart-define=FUNCTIONS_REGION=…on every build
02Version number
app/pubspec.yaml has version: 3.0.0+300: 3.0.0 is the version users see, 300 the build number. Raise the build number for every upload; both stores refuse a number they have already seen.
03Android signing
The package signs release builds with the debug key so flutter run --release works out of the box (app/android/app/build.gradle.kts, buildTypes.release). Google Play refuses debug-signed apps, so create your own upload key.
- Create the keyKeep the file and the passwords safe and outside git. Losing them means you cannot update the app without Google's help.
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload - Create
app/android/key.propertiesstorePassword=<password> keyPassword=<password> keyAlias=upload storeFile=<absolute path to upload-keystore.jks> - Use it in
app/android/app/build.gradle.ktsFollow Flutter's "Build and release an Android app" guide (Kotlin DSL): loadkey.properties, add asigningConfigs { create("release") { … } }block and setsigningConfig = signingConfigs.getByName("release")inbuildTypes.releaseinstead of the debug one. - Fingerprints to FirebaseAdd the SHA-1 and SHA-256 of your upload key, and of the app signing key shown in Play Console → Setup → App signing, in Firebase Project settings. Google sign-in and Play Integrity need them.
04Build for Google Play
cd app
flutter build appbundle # add --dart-define=FUNCTIONS_REGION=... if not us-central1
Upload app/build/app/outputs/bundle/release/app-release.aab to Play Console, first to Internal testing. Test sign-in, a rewarded video, the wheel, a quiz and account deletion on the internal build before you promote it.
05Build for the App Store
- SigningOpen
app/ios/Runner.xcworkspacein Xcode → Runner → Signing & Capabilities. Choose your team. Add Sign in with Apple, Push Notifications, Background Modes → Remote notifications and In-App Purchase. Minimum Deployments is already 15.0. - Build
cd app flutter build ipa - UploadUpload
app/build/ios/ipa/*.ipawith Apple's Transporter app or from Xcode's Organizer, then test through TestFlight.
06Store listing
- Describe the app as a rewards or loyalty app with points and badges. Never "earn money", "get paid" or "cash out".
- Answer the content rating questionnaire, the Data safety form (Play) and the App Privacy section (Apple) truthfully.
- Give reviewers a way in: guest sign-in works without an account.
07Optional: host the web demo
The web target is meant for demo mode (simulated ads, in-memory backend): the ad SDKs and store purchases do not run on the web. It is useful as a public preview, not as the product.
cd app
flutter build web --dart-define=DEMO_MODE=true # output in app/build/web, any static host
08The console in production
Run it over HTTPS, keep ADMIN_SECRET_KEY and the data/ folder (or your Postgres) backed up, and give team members the lowest role they need. See Deploy options.