Quick answer: Upload a build to App Store Connect, test it with up to 100 internal testers (members of your team, no review needed), then add up to 10,000 external testers by email or a public link once the build passes Beta App Review. Builds expire after 90 days. Testers can send screenshot and crash feedback through TestFlight, but most will not, so add automatic crash capture and an in-game report button to the beta build.

TestFlight is the standard way to beta test an iOS game, and it is free with your Apple Developer membership. Getting a build to testers is the easy part. Getting useful information back from a few hundred people playing on devices you do not own is where most betas fall short.

Internal and external testers

Internal testersExternal testers
WhoMembers of your App Store Connect team with an Account Holder, Admin, App Manager, Developer or Marketing roleAnyone with an email invite or your public link
Limit10010,000
ReviewNoneBuilds go through Beta App Review when added to a group
Best forYour team and close collaborators, every buildWider playtests and pre-launch betas

Setting up the beta

  1. Export and upload. Build the Xcode project from Unity, Unreal or Godot, archive it, and upload from Xcode's Organizer or Apple's Transporter app. Answer the export-compliance question, or set ITSAppUsesNonExemptEncryption in your Info.plist so you are not asked every time.
  2. Wait for processing. The build appears under TestFlight in App Store Connect once processed.
  3. Add internal testers and let them install through the TestFlight app.
  4. Create an external group, add the build, fill in the “What to Test” notes, and submit it for Beta App Review.
  5. Invite testers by email or enable a public link. Public links can be limited to a number of testers and to device and OS criteria.

Builds expire 90 days after upload, so long betas need a fresh build at least every three months. If processing stalls, see TestFlight builds stuck in processing and the missing compliance question.

Getting feedback that is actually useful

TestFlight lets testers take a screenshot, mark it up and send it, and after a crash they are offered the chance to share a comment; both appear in the TestFlight section of App Store Connect. In practice only a small share of testers ever do. Plan for the silent majority:

Adding Bugnet to a TestFlight build

Create a free Bugnet project, add the SDK for your engine, and ship it in the beta build. Crashes and errors are filed automatically, testers report everything else from the in-game widget, and repeat reports stack onto one bug, so a hundred testers hitting the same crash shows up as one bug with a count. Run Android testing alongside with a Google Play closed test, and compare beta platforms in the best beta testing platforms for indie games.

Frequently asked questions

How many testers can a TestFlight beta have?

Up to 100 internal testers from your App Store Connect team and up to 10,000 external testers invited by email or a public link.

Do TestFlight builds need review?

Builds for internal testers do not. Builds for external testers go through Beta App Review when you add them to an external group.

How long does a TestFlight build last?

Builds are available for testing for 90 days after upload.

How do I get crash reports from TestFlight testers?

Testers can share crash feedback through TestFlight, but most do not. Add an SDK that captures crashes and errors automatically, and an in-game report button for bugs that do not crash.

Can I use TestFlight for a Unity, Unreal or Godot game?

Yes. Export the Xcode project from the engine, archive it in Xcode and upload it to App Store Connect, then distribute it through TestFlight like any iOS app.

Most testers will never press the feedback button. Capture what happens to them anyway.