← Back to Blog
Flutter11 min read

Flutter App Store Submission Checklist: Everything Before You Hit Submit

by LaunchPilot Team·

Submitting a Flutter app to the App Store involves two very different categories of work: technical configuration in Xcode and App Store Connect, and marketing assets — your metadata, screenshots, and listing copy. Miss something in either category and you're looking at a rejection and a delay.

This checklist covers both. Work through it before every submission — first launch or update — and you'll avoid the most common rejection reasons.

Before You Open Xcode

The marketing side of your submission is often left to the last minute. Don't. These assets take time to do well, and a strong listing is the difference between a download and a pass.

App Store Metadata

  • App name (up to 30 characters) — includes your primary keyword, not just your brand name
  • Subtitle (up to 30 characters) — covers a secondary use case or audience keyword
  • Promotional text (up to 170 characters) — filled and relevant; this can be updated without a new build
  • Description — opens with a benefit-led statement in the first 255 characters; uses bullet points for features; includes primary keywords naturally for Google indexing
  • Keywords field (up to 100 characters, comma-separated) — no spaces after commas; no words already in your name or subtitle; all 100 characters used
  • Category — primary and secondary category selected correctly
  • Support URL — live and functional
  • Privacy Policy URL — live, accessible without login, covers all data collection

App Store Screenshots

  • 6.9" iPhone screenshots at 1320 × 2868 px — required; Apple uses these for all other iPhone sizes if no other sets are provided
  • 13" iPad screenshots at 2064 × 2752 px — required if your app supports iPad
  • Screenshots use device mockups + headline + background (not bare UI)
  • First screenshot leads with your strongest value proposition
  • 4–6 screenshots per device size
  • PNG format, sRGB or P3 color space, no alpha channel

App Preview Video (Optional but High-Impact)

  • 15–30 seconds, shows real in-app experience
  • No external footage, logos, or App Store assets in the video
  • Correct resolution for the target display size

Xcode Configuration

Bundle Identifier and Version

  • Bundle identifier matches exactly what's registered in App Store Connect
  • Version number (CFBundleShortVersionString) incremented from the previous release — e.g. 1.0.0 → 1.1.0
  • Build number (CFBundleVersion) incremented — must be higher than any previously uploaded build for this version
  • Version and build numbers match in both your pubspec.yaml and the Xcode project settings

In Flutter, your version is set in pubspec.yaml:

version: 1.1.0+42

This sets version to 1.1.0 and build number to 42. Run flutter build ios after updating.

Signing and Capabilities

  • Distribution certificate is valid and not expired (check in Keychain Access and Apple Developer portal)
  • Provisioning profile is a Distribution profile, covers your bundle ID, and is not expired
  • Automatic signing is configured correctly in Xcode, or manual signing uses the correct profile
  • All capabilities your app uses (Push Notifications, iCloud, Sign in with Apple, etc.) are enabled in both the Xcode project and the App ID in the Apple Developer portal

Build Settings

  • Deployment target set to the minimum iOS version you support (check this supports all device categories you've listed)
  • Architectures includes arm64 (required for modern devices and App Store submission)
  • Enable Bitcode — as of Xcode 14 and later, bitcode is deprecated and should be disabled
  • Strip debug symbols — enabled for Release configuration
  • Swift and Objective-C bridging headers are not referencing any debug-only code paths

Flutter-Specific Build Steps

  • Run flutter clean before your final build to clear cached artifacts
  • Run flutter pub get to ensure all dependencies are up to date
  • Run flutter build ios --release to generate the release build
  • Open the generated Runner.xcworkspace in Xcode (not Runner.xcodeproj)
  • Select Any iOS Device (arm64) as the build target — not a simulator
  • Product → Archive to create the archive

App Store Connect Configuration

App Information

  • App name in App Store Connect matches your Xcode bundle name
  • Age rating is correctly set — complete the questionnaire honestly; incorrect ratings are a rejection reason
  • Price is set (including free)
  • Availability — countries and regions correctly configured
  • App Review Information — demo account credentials provided if your app requires login

Privacy

  • App Privacy questionnaire in App Store Connect is complete and accurate
  • Every data type your app collects is disclosed — check your third-party SDKs carefully (analytics, crash reporting, ads)
  • Privacy manifest (PrivacyInfo.xcprivacy) is included if you use any required reason APIs — Apple has been enforcing this since 2024
  • ATT (App Tracking Transparency) prompt implemented if you use any advertising identifiers

In-App Purchases and Subscriptions (If Applicable)

  • All IAPs are created in App Store Connect with correct pricing
  • Subscription groups are configured correctly
  • Sandbox testing completed for all purchase flows

Testing Before Submission

Device Testing

  • Tested on a physical device running the minimum supported iOS version
  • Tested on the largest supported screen size (iPhone 16 Pro Max or equivalent)
  • Tested on iPad if your app supports it
  • All major user flows tested end-to-end on a clean install (not an upgrade from a previous build)

Flutter-Specific Tests

  • flutter test passes with no failures
  • flutter analyze shows no errors (warnings are acceptable, errors are not)
  • No debugPrint or development-only code paths reachable in the release build
  • Any dart:developer or flutter_driver imports removed or properly guarded with kDebugMode

App Review Guidelines Check

Common Flutter app rejection reasons:

  • Broken demo account — if you provide demo credentials for App Review, they must work
  • Placeholder content — any "Lorem ipsum" text or dummy data visible in the app
  • Requesting excessive permissions — only request permissions you actively use, and only when needed
  • Poor iPad support — if you haven't disabled iPad, Apple will test on iPad. Make sure it works or restrict to iPhone only
  • Missing privacy manifest — required for apps using certain APIs since iOS 17

The Submission

  • Upload the archive via Xcode → Distribute App → App Store Connect
  • Wait for the build to appear in App Store Connect (usually 5–30 minutes)
  • Select the build for your version in the "Build" section
  • Complete all metadata, screenshots, and privacy info
  • Submit for review

Apple's review time is currently 24–48 hours for most apps. Expedited review is available in rare circumstances (critical bug fixes) via the App Review request form.


Managing Metadata Across Multiple Flutter Apps

If you maintain more than one Flutter app, keeping metadata, screenshots, and keyword sets organized across projects becomes its own challenge. Most developers fall back to scattered documents or copy-pasting between Notion pages — which leads to stale descriptions, mismatched keywords, and screenshots from the wrong version going live.

LaunchPilot was built for exactly this: it detects your Flutter project automatically, stores your App Store metadata and screenshot designs per project, and lets you push updates to App Store Connect directly. When you're prepping a submission, your metadata checklist is already filled in — you're just reviewing and updating, not hunting for files.

Download LaunchPilot and try it on your next Flutter release.

What to Read Next

With your submission done, the next step is optimizing your listing for discovery. Read our guides on App Store keyword research and how to write an App Store description that converts to make sure your listing is as strong as your build.

Start Managing Your App Marketing Today

Download LaunchPilot and take control of your App Store listings, screenshots, and ad campaigns — all in one place.