Home Pricing Explore Download Docs Create a project

Docs/Publishing

Publishing to Google Play

FlutterGo can build, sign, and upload your Android app to Google Play for you. You click Deploy in the project toolbar, answer a short wizard, and FlutterGo does the rest, automated end to end.

The recommended method is GitHub Actions: FlutterGo pushes your app to your own private GitHub repository, stores your credentials as encrypted Actions secrets, and runs the build on a GitHub-hosted runner. You don't need any local build tools. A Native (this machine) option builds and uploads directly from your machine instead.

Deploy pipeline, Deploy button, push to repo, GitHub Actions build, stores

One button; the build runs in your GitHub repository via GitHub Actions.

What you need#

  • A Google Play developer account (one-time $25 registration fee) and your app created in the Play Console.
  • A Play service-account JSON file with the Google Play Android Developer API enabled and release permission in Play Console. (Create it in Google Cloud, then invite it in Play Console, then Users and permissions.)
  • Your project connected (or ready to connect) to GitHub, the recommended deploy method runs in your repository. See Save your code to GitHub.
  • Deploy automation is a paid FlutterGo feature. Your code always stays yours in your GitHub repo; only the automated store deploy needs an upgrade.
  • Optional: your own upload keystore (.jks / .p12). No keystore? FlutterGo can generate one for you (covered below).

How to do it#

Step 1, Open the deploy wizard#

Click Deploy in the project toolbar. The wizard Deploy to the App Stores opens with steps across the top: Method, then Connect GitHub, then Repository, then App details, then Credentials, then Review & deploy.

Step 2, Choose how to deploy#

Pick a method card:

  • GitHub Actions (Recommended), "One-click GitHub connect, then we create the repo, push code, enable the workflow, and deploy on a cloud macOS runner."
  • Native (this machine), "Build + upload directly from here via the store APIs."

Click Continue.

Tip: GitHub Actions runner minutes may incur GitHub charges on private repositories, depending on your GitHub plan.

Step 3, Connect GitHub (GitHub Actions method)#

If GitHub isn't connected yet, click Connect GitHub. A GitHub window opens; authorize the FlutterGo app. The wizard shows "Waiting for authorization…" and then "Connected to \<your account\>". If you connected before, this step is skipped automatically.

Step 4, Choose a repository#

Pick one of two cards:

  • Use existing repository, choose from the Installed repositories list (repos granted to the FlutterGo GitHub App). Click Refresh repositories if yours is missing.
  • Create a new repository, type a Repository name (lowercase, hyphen-separated, must be private), use Create empty repo on GitHub →, then click Verify repository.

If your project is already linked to a repo, it is pre-selected ("Using owner/repo @ branch").

Important: On a personal GitHub account, create the empty private repo on GitHub first and grant FlutterGo access, then verify. Organizations can auto-create the repo during deploy.

Step 5, App & release details#

On App details:

  1. Platform, pick Android · Google Play (or Both to ship Google Play and TestFlight in one run).
  2. Release track, see the table below.
  3. Version (build name), e.g. 1.0.0; Build number, e.g. 1. If left empty, the values from your pubspec.yaml are used.
  4. Release notes / What to test, text shown to your testers.
  5. Staged rollout %, appears only when the track is Production.

Step 6, Credentials: package name and service account#

On Credentials:

  1. Package name, your Android application id, e.g. com.fluttergo.myapp. It is pre-filled from your project's build files; if you change it here, FlutterGo writes it back into the project so the build ships the right id.
  2. Play service-account JSON, upload the JSON file. A green check confirms it loaded.

The wizard reminds you: "Need a Play service-account JSON with the Google Play Android Developer API enabled and release permission in Play Console."

Tip: In GitHub Actions mode your credentials become encrypted repository secrets (for example PLAY_SERVICE_ACCOUNT_JSON). In Native mode they are used once and never saved.

Step 7, Signing keystore: upload or generate#

Google Play requires every build to be signed with the same upload key. In the Upload keystore (.jks / .p12), for signing on CI section you have two options:

  • Upload your own keystore file, then paste your key.properties contents (storePassword, keyPassword, keyAlias, storeFile) in the textarea. The wizard confirms "Keystore ready. Using your uploaded signing key."
  • Click ✨ Generate keystore for me. FlutterGo creates an upload key and key.properties automatically and saves them into your project under android/.

Step 8, Download the signing backup (generated keystores only)#

If FlutterGo generated your keystore, a panel appears: "Save your signing files, required once." Click Download signing backup (required). You receive the keystore file, key.properties, and a password backup file. The Continue button stays disabled until you download the backup at least once.

Important: Keep this backup somewhere safe. Google Play needs the same upload key for every update, and FlutterGo cannot recover it for you later. Losing the keystore can lock you out of updating your app.

Step 9, Review & deploy#

The Review & deploy step summarizes Method, Repository, Platform, Track, and Version. Click Deploy. The progress panel walks through:

  1. Push project files to GitHub
  2. Set encrypted Actions secrets
  3. GitHub Actions, build & upload to store

Links to the 📦 Repository and the ▶ GitHub Actions run appear so you can watch the live logs on GitHub. You can click Run in background and keep working, progress stays visible in the toolbar.

Success: When the run finishes you'll see "Deployment finished successfully." Your build appears in the Play Console on the track you chose.

Release tracks#

Track (wizard label)Who sees itTypical use
Internal testingUp to 100 testers you inviteFirst smoke tests, fastest review
Closed testing (alpha)Invited groups / email listsPrivate beta with a bigger group
Open testing (beta)Anyone who joins from the Play listingPublic beta before launch
ProductionEveryone on Google PlayThe real release, supports Staged rollout %

Tip: Staged rollout % (Production only) releases to a percentage of users first, e.g. 10. Leave it blank for a full 100% release.

Important: Promoting to Production publishes to real users and triggers Google's review. Start on Internal testing for your first deploy.

What happens during the run#

  • FlutterGo pushes your latest code to your repository first (a safe-point push), so the build uses the source of truth.
  • A workflow file .github/workflows/fluttergo-deploy.yml is committed to your repo.
  • Your credentials are stored as encrypted GitHub Actions secrets, never as plain files in the repo.
  • The runner executes flutter pub get, decodes the keystore, runs flutter build appbundle --release, and uploads the .aab to Google Play on your chosen track.

Troubleshooting#

Problem: The deploy fails during the GitHub Actions build. Possible causes: Compile error in release mode; wrong keystore or key.properties; missing permissions. Solution:

  1. Click the ▶ GitHub Actions run link and read the failed step, the wizard also shows the failed step name and a log excerpt.
  2. Click Fix with agent, FlutterGo builds a repair prompt from the failure log and the agent fixes the project.
  3. Click Deploy again.

Problem: Upload to Google Play is rejected. Possible causes: The app doesn't exist in Play Console yet; the service account lacks release permission; wrong package name. Solution:

  1. Create the app in Play Console with the same package name first.
  2. In Play Console, then Users and permissions, confirm the service account can manage releases.
  3. Check the Package name field matches your Play Console app exactly.

Problem: "Continue" is disabled on the Credentials step. Possible causes: Missing package name, service-account JSON, or keystore; generated-keystore backup not downloaded. Solution:

  1. Confirm each field shows its green check.
  2. If you generated a keystore, click Download signing backup (required).

Problem: Deploy button says the feature isn't active on my plan. Possible causes: Deploy automation is a paid feature. Solution:

  1. Upgrade in Settings, then Billing. Your code access is never gated, only the automated deploy.

FAQ#

How much does Google Play cost? A one-time $25 registration fee for the developer account. FlutterGo deploy automation is part of paid FlutterGo plans.

Do I need Android Studio or a local SDK? No. With the GitHub Actions method everything builds on a cloud runner.

Where are my credentials stored? GitHub Actions mode: as encrypted Actions secrets in your own repository. Native mode: used once in memory and never saved.

What if I lose my keystore? That's serious, Google Play requires the same upload key for every update, and FlutterGo cannot recover it. Always keep the downloaded signing backup safe (ideally in a password manager or secure drive).

Can I ship Android and iOS at the same time? Yes, choose Both on the App details step. You pick an Android track and an iOS track, and one run ships to both stores.

Can I change the package name later? You can edit it in the wizard; FlutterGo writes it back into the project's build files. But once published, Google Play permanently ties your app to its package name, choose carefully before the first release.

Where to go next#

Did this page miss something? Tell us and we will fix it.