Deploy your FlutterFlow app to web via the Publish icon, iOS via Settings → App Details with your Apple Developer account, and Android by first manually uploading an AAB to Google Play Console Internal Testing before using one-click deploy. Always complete the pre-deploy checklist: Firestore Rules deployed, API keys in Secrets, and app tested on physical devices before submitting for review.
The complete FlutterFlow deployment reference for web, iOS, and Android
Getting your app from FlutterFlow into users' hands requires different steps for each platform. Web deployment is instant through the Publish icon. iOS requires an Apple Developer account, a signing certificate, and provisioning profile configured in Settings → App Details. Android has a well-known first-deploy trap: FlutterFlow's one-click deploy only works after you have manually uploaded the very first AAB to Google Play Console's Internal Testing track. This tutorial is the definitive step-by-step reference covering all three platforms, custom domain setup, and the pre-deploy checklist to avoid common rejection reasons.
Prerequisites
- A completed FlutterFlow project tested in Test Mode with no critical errors
- Apple Developer Program membership ($99/year) for iOS deployment
- Google Play Console developer account ($25 one-time fee) for Android deployment
- A privacy policy URL hosted at a public URL (required by both stores)
- App icons prepared: 1024×1024 PNG for iOS, 512×512 PNG for Android (no alpha/transparency)
Step-by-step guide
Complete the pre-deploy checklist
Complete the pre-deploy checklist
Before touching deployment settings, verify your app is production-ready. In FlutterFlow's Firestore panel, check that your security rules are deployed to production — click Deploy to Firebase to push any rule changes. Open Settings → API Calls and confirm all API keys are stored in Settings → Secrets (Environment Variables), not hardcoded in API headers. Run your app in Test Mode and click through every screen on both iOS simulator and Android emulator. Check the FlutterFlow Issues panel (bottom toolbar) for any unresolved errors shown in red. Set your app version in Settings → App Details → Version (e.g., 1.0.0) and Build Number (e.g., 1) — the build number must increment with every submission. Add a meaningful App Name, a short Description, and your Privacy Policy URL in Settings → App Details.
Expected result: No red issues in FlutterFlow, Firestore Rules deployed, all secrets in Secrets panel, version and build number set.
Publish to web with a custom domain
Publish to web with a custom domain
Click the Publish icon in the top-right toolbar (the rocket/globe icon). In the Publish panel, set your Page Title (appears in browser tab), Description (for search engines), and upload an OG Image (1200×630 PNG for social link previews). Under Access Controls, choose Public or Private (password-protected). Click the Review Security section and address any warnings. Click Publish. Your app gets a free flutterflow.app subdomain immediately. For a custom domain: go to Settings → Custom Domain → Add Domain, enter your domain (e.g., app.yourdomain.com), copy the provided CNAME record, add it in your domain registrar's DNS settings, then click Verify. DNS propagation takes 10-60 minutes. Click Update in the Publish panel whenever you make changes — web deployments are not automatic.
Expected result: Your app is live at your FlutterFlow subdomain and optionally at your custom domain within an hour.
Configure App Details for iOS and generate your signing certificate
Configure App Details for iOS and generate your signing certificate
Go to Settings → App Details. Set the Bundle ID in reverse-domain format (e.g., com.yourcompany.appname) — this must exactly match the App ID you create in Apple Developer Portal and cannot be changed after your first submission. Upload your App Icon: a 1024×1024 PNG with no alpha channel (App Store rejects transparent icons). Set Minimum iOS Version (16.0 recommended for maximum compatibility). In Apple Developer Portal (developer.apple.com), create an App ID matching your Bundle ID with the capabilities your app uses (Push Notifications, Sign in with Apple, etc.). Create a Distribution Certificate and download it. Create an App Store provisioning profile using that certificate. In FlutterFlow → Settings → App Details → iOS → one-click deploy section, enter your Apple ID and the app's App Store Connect Apple ID. FlutterFlow handles code signing automatically if you have connected your Apple Developer account.
Expected result: Bundle ID is set, App Icon uploaded, Distribution Certificate and provisioning profile created in Apple Developer Portal.
Deploy to iOS App Store
Deploy to iOS App Store
In FlutterFlow, go to Settings → App Details → iOS Deploy section. Click Deploy to App Store. FlutterFlow builds an IPA, signs it with your certificate, and uploads it directly to App Store Connect (this takes 5-15 minutes). Log in to App Store Connect (appstoreconnect.apple.com), navigate to My Apps → your app → TestFlight. Wait for the build to finish processing (usually 5-20 minutes). In the App Store tab, fill in: App Description, Keywords (100 char limit, comma-separated), Support URL, Screenshots for every required device size (iPhone 6.7-inch is mandatory, iPad if applicable). Set your Age Rating, Pricing (free or paid), and Categories. Under App Privacy, answer the data collection questions. Click Submit for Review. First-time reviews take 1-3 days; subsequent reviews are typically 24 hours.
Expected result: Build appears in TestFlight, metadata is complete, and the app is submitted for App Store review.
Manually upload the first AAB to Google Play Console
Manually upload the first AAB to Google Play Console
The most common FlutterFlow Android deployment failure: FlutterFlow's one-click Google Play deploy shows error 'Only releases with status draft may be created on tracks with no previous releases' because you have never uploaded an AAB to this app's Play Console. You MUST manually upload the first build. In FlutterFlow → Settings → App Details → Android, click Download AAB to download a signed Android App Bundle. In Google Play Console (play.google.com/console), click Create app, fill in the app name, select language, app type (app or game), and agree to policies. Navigate to Testing → Internal Testing → Create new release. Upload the AAB file. Add release notes. Click Save, then Review release, then Start rollout to Internal Testing. Once the Internal Testing release is live (usually immediate), FlutterFlow's one-click Android deploy will work for all future releases.
Expected result: First AAB is live in Internal Testing track. FlutterFlow one-click Android deploy now works for subsequent releases.
Complete the Google Play Store listing and submit for review
Complete the Google Play Store listing and submit for review
In Google Play Console, go to your app → Store presence → Main store listing. Fill in the App Name (max 50 chars), Short Description (max 80 chars), Full Description (max 4000 chars), and App Icon (512×512 PNG, no alpha). Upload Feature Graphic (1024×500 PNG) and Screenshots for Phone (at least 2, max 8), and optionally Tablet. Navigate to Store presence → Store settings to set Category, Tags, and Contact Details (email and website required). Go to App content → Privacy policy and enter your hosted privacy policy URL. Complete the App content → Data safety form — answer questions about data collection, sharing, and security practices. Incomplete Data Safety forms cause review rejection. Click Send changes. Navigate to Production → Create new release. Promote your Internal Testing release or upload a new AAB. Review and rollout.
Expected result: Store listing is complete with all required assets, data safety form submitted, and app is in production review queue.
Complete working example
1PRE-DEPLOY CHECKLIST:2☐ Firestore Security Rules deployed (FlutterFlow → Firestore → Deploy)3☐ All API keys in Settings → Secrets (not hardcoded in API headers)4☐ App tested in Test Mode on iOS simulator + Android emulator5☐ No red errors in FlutterFlow Issues panel6☐ Version: 1.0.0, Build Number: 1 (increment on every submit)7☐ Privacy Policy URL hosted publicly8☐ App Icon: 1024x1024 PNG, no alpha channel910WEB DEPLOYMENT:11├── Publish icon (top-right) → set Title, Description, OG Image12├── Access Controls: Public or Private13├── Click Publish → gets flutterflow.app subdomain14├── Custom Domain: Settings → Custom Domain → Add Domain15│ ├── Add CNAME record in DNS registrar16│ └── Verify (10-60 min propagation)17└── Click Update to push future changes (not automatic)1819iOS DEPLOYMENT:20├── Settings → App Details21│ ├── Bundle ID: com.yourcompany.appname (permanent)22│ ├── App Icon: 1024x1024 PNG (no transparency)23│ └── Minimum iOS: 16.024├── Apple Developer Portal25│ ├── Create App ID matching Bundle ID26│ ├── Create Distribution Certificate27│ └── Create App Store Provisioning Profile28├── FlutterFlow → Deploy to App Store (5-15 min build)29└── App Store Connect30 ├── TestFlight → wait for processing (5-20 min)31 ├── App Store tab → Screenshots (6.7-inch required)32 ├── Description, Keywords (100 chars), Support URL33 ├── Age Rating, Privacy questionnaire34 └── Submit for Review (1-3 days first review)3536ANDROID DEPLOYMENT — FIRST TIME:37├── FlutterFlow → Download AAB (first time only)38├── Google Play Console → Create app39├── Testing → Internal Testing → Create new release40├── Upload AAB → Save → Review → Start rollout41└── After Internal Testing release is live:42 └── FlutterFlow one-click Android deploy now works4344ANDROID DEPLOYMENT — SUBSEQUENT RELEASES:45├── FlutterFlow → Settings → Android → Deploy to Play Store46└── Increment Build Number each time4748GOOGLE PLAY STORE LISTING:49├── App Name (50 chars), Short Desc (80), Full Desc (4000)50├── Icon: 512x512 PNG (no alpha)51├── Feature Graphic: 1024x500 PNG52├── Screenshots: 2-8 for Phone, optional Tablet53├── Privacy Policy URL (required)54├── Data Safety form (required — rejection if incomplete)55└── Category, Tags, Contact EmailCommon mistakes when deploying Your FlutterFlow App to the App Store and Google Play
Why it's a problem: First Google Play deploy fails because the first AAB must be manually uploaded to Internal Testing
How to avoid: Download the AAB from FlutterFlow → Settings → Android → Download AAB. Upload it manually in Google Play Console → Testing → Internal Testing → Create new release. Once that release is live, all future deploys via FlutterFlow one-click work without issue.
Why it's a problem: Submitting without a complete Google Play Data Safety form
How to avoid: Complete every question in the Data Safety form before submitting for review. If your app uses Firebase Analytics, Firebase Auth, or Firestore, you collect user data and must declare it. Answer honestly — false declarations lead to account suspension.
Why it's a problem: Using the same Build Number for a new submission
How to avoid: Increment the Build Number in Settings → App Details before every deploy. Many developers use sequential integers (1, 2, 3) or a date-based format (20260315, 20260316). The Version (1.0.0) only changes for user-visible releases; Build Number increments every submission.
Best practices
- Always test on a physical iOS device and physical Android device before submitting — simulators do not catch camera, biometrics, push notification, or performance issues
- Use TestFlight and Google Play Internal Testing for at least one round of beta testing before production submission to catch store-specific issues
- Prepare all App Store and Play Store screenshots before starting the deployment process — store listing is the most time-consuming part of submission
- Keep your Privacy Policy URL live and accessible at all times — Apple and Google periodically re-check it and can remove your app if it goes down
- Increment Build Number on every build, even test builds uploaded to TestFlight or Internal Testing
- Configure custom domains for web before giving the URL to users — the default flutterflow.app subdomain looks unprofessional and cannot be SEO-optimized
- Set up App Store Connect and Google Play Console accounts before building your app — account approvals can take 1-7 days and should not block your launch
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I am deploying a FlutterFlow app to the iOS App Store and Google Play Store for the first time. Walk me through the complete checklist: what to prepare in FlutterFlow Settings → App Details, how to create a Distribution Certificate and provisioning profile in Apple Developer Portal, how to upload the first Android AAB manually to Google Play Console Internal Testing, and what metadata is required to avoid rejection by both stores.
Check my FlutterFlow project for deployment readiness: are there any missing app icons, unset bundle IDs, API keys hardcoded in API headers instead of Secrets, or Firestore rules that haven't been deployed? List everything I need to fix before submitting to the App Store and Google Play.
Frequently asked questions
Do I need to export code to deploy to the App Store or Google Play from FlutterFlow?
No. FlutterFlow's one-click deploy handles the entire build and submission process without you needing to export code, use Xcode, or run terminal commands. The only exception is if you use custom native code or Swift/Kotlin packages that require post-export configuration in Xcode or Android Studio.
Why does my first Android deployment say 'Only releases with status draft may be created'?
This is the most common Android deployment error for new apps. FlutterFlow's one-click deploy uses the Google Play Developer API, which cannot create the very first release for a new app. You must manually download the AAB from FlutterFlow and upload it to Google Play Console → Internal Testing track first. After that, all future one-click deploys work normally.
How long does Apple App Store review take?
First-time submissions typically take 1-3 business days. Subsequent updates are usually reviewed within 24 hours. Expedited review is available in the App Store Connect Resolution Center if you have a critical bug fix or time-sensitive launch. About 40% of submissions are approved immediately, but common rejection reasons include incomplete metadata, broken functionality, and missing privacy policy.
Can I update my web app without republishing?
No. Every change you make in FlutterFlow requires you to click the Publish icon and then click Update to push the latest version to the web. Unlike some platforms, FlutterFlow web deployments are not automatically published when you save changes. iOS and Android updates also require re-submission through their respective stores.
What is the difference between Version and Build Number in FlutterFlow?
Version (e.g., 1.2.0) is the user-visible version shown on the App Store and Play Store listing. Build Number (e.g., 47) is an internal number that must increase with every submission — both stores reject submissions where the Build Number is not higher than the previous one. You can submit multiple builds with the same Version but each must have a unique and higher Build Number.
Can RapidDev help with my App Store or Google Play submission?
Yes. If you are hitting code signing errors, rejection notices from Apple or Google, or need help setting up TestFlight distribution or Google Play tracks, RapidDev can manage the submission process end-to-end including metadata, screenshots, and compliance requirements.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation