That "Missing Compliance" label in TestFlight is not a rejection; it is an unanswered question. Before testers can install a build, Apple needs to know whether your app uses encryption that requires export documentation, and until you answer, the build sits with Missing Compliance and cannot be tested. You can answer it once per build in App Store Connect, or set a key in your Info.plist so the prompt never appears again. Here is what the status means, which answer applies to most apps, and how to stop seeing it.
Short answer
"Missing Compliance" means TestFlight needs export compliance information about your app's encryption before testers can install the build. Per Apple's export compliance guidance, you can answer the encryption questions in App Store Connect for that build, or add the ITSAppUsesNonExemptEncryption key to your Info.plist to skip the prompt on every upload. Most apps that only use standard encryption, like HTTPS through URLSession, set the key to NO, since that encryption is exempt from documentation requirements. Set it to YES only if your app uses non-exempt or proprietary encryption, which then requires export documentation.
What you should know
- It is a question, not a rejection: the build needs encryption information.
- It blocks testing until answered: testers cannot install until you respond.
- Answer per build or set a key: App Store Connect prompt or Info.plist key.
- Most apps set NO: standard encryption like HTTPS is exempt.
- Set YES for non-exempt encryption: which then needs export documentation.
What does "Missing Compliance" mean?
That Apple has not yet received the export compliance answer for your build. US export regulations require Apple to know whether your app uses encryption that is subject to documentation, so for each build TestFlight asks, and until you answer, the build shows Missing Compliance and is not available to testers. It is purely an information gate, not a quality judgment, so seeing it does not mean anything is wrong with your app. The reason it surprises people is that a build can finish processing and still be unusable in TestFlight simply because this one question is outstanding. Answer it, and the build becomes available to your testers.
How do you clear it?
Two ways: answer per build, or set the Info.plist key once. The table compares them.
| Approach | What you do | Effect |
|---|---|---|
| Answer in App Store Connect | Respond to the encryption questions for the build | Clears it for that build only |
| Set ITSAppUsesNonExemptEncryption | Add the key to Info.plist before building | Skips the prompt on every upload |
The per-build answer is fine if you only upload occasionally, but the Info.plist key is the better fix because it answers the question at the source and you never see the prompt again. To skip it, add the key with the value that matches your encryption: in source view, <key>ITSAppUsesNonExemptEncryption</key> followed by <false/> for the common exempt case. After that, builds upload without the Missing Compliance hold.
When do you set the key to NO versus YES?
It depends on the kind of encryption your app uses. Set it to NO if your app, including any third-party libraries, uses no encryption, or only forms that are exempt from export documentation, which covers the typical case of making HTTPS connections through URLSession, since the encryption built into the operating system is exempt. Set it to YES if your app uses non-exempt or proprietary encryption, in which case you take on the export documentation requirements that go with it. For most apps that simply talk to a backend over HTTPS and do not implement their own cryptography, the answer is NO. If you are unsure whether a library adds non-exempt encryption, that is worth confirming, since the answer must be accurate.
What to watch out for
The first trap is treating Missing Compliance as a build failure, when it is just an unanswered question that holds testing. The second is answering it inaccurately; the encryption declaration is a legal statement, so set it to match what your app and its libraries actually do. The third is forgetting that the Info.plist key is the permanent fix, so you stop answering per upload. Export compliance is about which encryption your app uses, and a pre-submission scan such as PTKD.com (https://ptkd.com) reads the binary against OWASP MASVS and surfaces the network and cryptography usage in your build, which helps you reason about whether any non-exempt encryption is present before you make the declaration. The declaration itself you set in Info.plist or App Store Connect.
What to take away
- "Missing Compliance" means TestFlight needs your app's export compliance answer about encryption before testers can install the build.
- Answer the encryption questions per build in App Store Connect, or add the
ITSAppUsesNonExemptEncryptionkey to Info.plist to skip the prompt permanently. - Most apps set the key to
NO, since standard encryption like HTTPS is exempt; setYESfor non-exempt or proprietary encryption, which needs export documentation. - Make the declaration accurate to what your app and libraries do, and use a pre-submission scan such as PTKD.com to see the cryptography and network usage in your build.




