Skip to content
5 min read Guides iOS

TestFlight Missing Compliance: What It Means and How to Fix It

Last updated

You upload a build, open TestFlight, and where you expected a build ready for testers it says Missing Compliance. Nothing is broken. App Store Connect is waiting for you to answer its export compliance questions about encryption. This guide explains why Apple asks, how to clear the status for one build, and how to stop the question coming back. Apple's wording below is from its own pages as of 29 January 2026. This is a practical guide, not legal advice.

Shipping on Android too? The Google Play version of this guide is Google Play Data Safety Form: A Practical Walkthrough.

The short version

  • Missing Compliance means the build has no answer to the encryption questions yet. Testers cannot get it until you answer.
  • To clear one build: open it in the TestFlight tab, click Manage, and answer the questions, or attach documentation Apple already approved.
  • To clear every future build: add ITSAppUsesNonExemptEncryption to your Info.plist.
  • Apple says encryption built into its operating system, such as HTTPS through URLSession, is typically exempt from documentation, but the call is yours to make.

Why Apple asks about encryption

As of 29 January 2026, Apple's article Complying with Encryption Export Regulations explains it plainly. When you submit to TestFlight or the App Store, you upload your app to a server in the United States. If you distribute outside the U.S. or Canada, the app is subject to U.S. export laws, wherever your company is based. If it uses, accesses, contains, implements or incorporates encryption, that counts as exporting encryption software.

Apple's help page Overview of export compliance adds that France also controls the import and export of encryption apps, and that you are responsible for any misreading of the regulations or any exemption you claim wrongly. Apple asks the questions on behalf of the rules; it does not answer them for you.

Clear it for one build

As of 29 January 2026, the help page Provide export compliance information for beta builds describes the steps:

  1. In App Store Connect, open your app and choose the TestFlight tab.
  2. Find the build that is missing compliance information.
  3. Click Manage beside it and answer the questions, or click Choose File to upload documentation Apple has already approved.
  4. If the answers say no documentation is needed, click Save. The build moves on.

If the answers say documentation is required, App Store Connect sends you to the App Encryption Documentation section to upload it. Apple's help page on uploading app encryption documentation says Apple aims to review complete documentation in about two business days, then gives you a key value for your Info.plist.

Clear it for good with Info.plist

Answering by hand for every build gets old fast. The fix is one key. As of 29 January 2026, Apple's documentation for ITSAppUsesNonExemptEncryption says:

  • Set it to NO if your app, including any third-party libraries you link, uses no encryption or uses encryption that is exempt from export compliance requirements.
  • Set it to YES if your app uses non-exempt encryption. Then you usually also add ITSEncryptionExportComplianceCode, with the code Apple gives you after reviewing your documentation.
  • Without the key, App Store Connect walks you through the questionnaire for every new version you upload.

For the common case, the entry in Info.plist looks like this:

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

And for an app with approved documentation:

<key>ITSAppUsesNonExemptEncryption</key>
<true/>
<key>ITSEncryptionExportComplianceCode</key>
<string>YOUR-CODE-FROM-APPLE</string>

Add the key to every app you upload, and to every flavour of it (beta, staging, production) if each has its own Info.plist. Missing Compliance on one flavour but not another often means one plist was missed.

Which answer is right for your app?

As of 29 January 2026, Apple's reference page Export compliance documentation for encryption sets out three cases:

Your app's encryptionDocumentation in App Store Connect
Limited to the encryption within Apple's operating systemNone
An industry-standard algorithm not provided by Apple's operating systemFrench encryption declaration, if you distribute in France
Proprietary algorithms not accepted by international standards bodiesU.S. CCATS and the French declaration, if you distribute in France

Apple's export regulations article gives the everyday example: using the encryption built into the operating system, such as making HTTPS connections with URLSession, is typically exempt from documentation upload requirements, and proprietary encryption is not. The same article notes that apps using exempt encryption may instead need to file a year-end self-classification report with the U.S. government.

Things that trip teams up

  • Third-party code counts. The key covers everything you link. A new SDK that bundles its own crypto library can change your answer.
  • The answer can change between versions. Adding end-to-end encrypted sync is a different app from the one you declared last year.
  • It is not just TestFlight. The same questions appear when you submit a version to the App Store, so the plist key saves time there too.

A checklist for small teams

  1. Decide your answer once, with whoever owns legal questions in your company, and write down why.
  2. Put the key in your project template so new targets start with it.
  3. Review the answer whenever you add a dependency that does networking, storage or security work.
  4. Add a build-time check so a missing key fails your CI run rather than your TestFlight upload, for example a script step that reads the key from the built Info.plist and stops the run if it is not there.

How FeedbackKit fits in

If you add FeedbackKit, the Swift SDK talks to FeedbackKit's servers over HTTPS with URLSession, the case Apple uses as its example of operating-system encryption. That does not decide the answer for your app; your other code and libraries count too. It does mean adding FeedbackKit is not, by itself, a reason to change the key. Setup is in the Swift docs.

There is also a triage habit worth borrowing. FeedbackKit's statuses include TestFlight, so users who voted for a feature can see when it reaches a beta. Move a request to TestFlight when the build is actually in testers' hands, not when you upload it. A build that sits on Missing Compliance over a weekend is a build nobody can install. Here is how that looks in FeedbackKit, with sample data from a fictional hiking app:

Moving a request into beta

The FeedbackKit admin app moves a request from Pending through Approved and In Progress to TestFlight, with requests sortable by the total MRR of the users behind them.

Once the build is testing, our guides to running a TestFlight beta and handling TestFlight feedback pick up from here. To give your users a place to ask for what goes into the next build, start free.

Keep reading

Collect feedback in your own app

FeedbackKit ships SDKs for Swift, Kotlin, React Native, Flutter and JavaScript, and syncs what your users ask for into the tracker your team already uses.