You uploaded via Xcode Organizer or Transporter, got a green checkmark, refreshed App Store Connect 10 minutes later and the build appeared in TestFlight → Builds with status Processing. An hour later it’s still Processing. Three hours later: still Processing. No error email, no rejection, no progress indicator beyond the spinning dot. Your tester needs the build for a sync demo today and you’re starting to wonder whether to wait or re-upload.
Apple’s TestFlight pipeline does several things post-upload: asset extraction, validation, dSYM symbolication, encryption-export classification, App Store Server Notifications registration. Each step has its own failure mode that can park a build in Processing without surfacing an error in the UI. The vast majority resolve themselves in 10-60 minutes, but anything past 2 hours is unusual and warrants action.
Common causes
Ordered by hit rate.
1. Apple-side processing delay (just wait)
The most common case: nothing is wrong, Apple’s pipeline is busy. Median processing time is 15-30 minutes; the 95th percentile is closer to 90 minutes; tail events extend to 4-6 hours during heavy load. WWDC week, days after major iOS releases, and December holidays all stretch the tail.
How to spot it: No specific signal — process of elimination after ruling out the other causes. Check Apple System Status; check developer forums for similar reports in the same window.
2. Missing ITSAppUsesNonExemptEncryption in Info.plist
Apple requires every build to declare whether it uses non-standard cryptography (Export Compliance). Without ITSAppUsesNonExemptEncryption in Info.plist, the build gets stuck in a pseudo-Processing state waiting for you to manually answer the question in App Store Connect.
How to spot it: App Store Connect → TestFlight → your build → look for a yellow “Missing Compliance” banner or “Export Compliance” link asking you to answer questions.
3. dSYM upload incomplete or symbolication failed
Bitcode-enabled builds (legacy) or builds with custom frameworks may require dSYM re-symbolication after upload. A failure here can leave the build in Processing without an explicit rejection.
How to spot it: Xcode → Organizer → your archive → “Download Debug Symbols.” If Apple can’t symbolicate, processing pauses.
4. Build flagged for additional automated review
Adding sensitive entitlements, large new SDKs, or significant binary growth can route the build through extra automated scans. These usually complete within 2 hours but occasionally take longer.
How to spot it: Compare this build’s diff against the previously processed build. Major changes (new entitlements, +50MB IPA size, new third-party SDKs) increase the chance.
5. Bundle ID, version, or build number conflict
Edge case: you upload 1.2.3 (47) while a previous 1.2.3 (47) was uploaded and discarded. Apple may park the new upload without a clear UI message.
How to spot it: App Store Connect → Activity → All Builds. Look for any earlier instance of the same (build_number) within the same version.
6. Apple System Status incident
Real but uncommon: TestFlight ingestion or processing has an active incident, parking all uploads cluster-wide.
How to spot it: Apple Developer System Status — look for TestFlight, App Store Connect, or “Build Processing” incidents.
Information to collect
- Exact upload timestamp from App Store Connect → Activity.
- Build version + build number.
- Whether your build uses encryption (
ITSAppUsesNonExemptEncryptionvalue). - Whether dSYM was generated and is present in the archive.
- Apple System Status snapshot at the time of upload.
Shortest path to fix
Step 1: Wait 60 minutes, then refresh
Hard-refresh App Store Connect (Cmd+Shift+R). Most “stuck” builds simply weren’t given enough time. If you uploaded during a known high-load window, double the wait.
Step 2: Check the uploader’s email
Search the inbox of the Apple ID that uploaded for the last 4 hours. Subjects to look for:
- “App Store Connect: Your build is ready to test” (success).
- “App Store Connect: Your app build is invalid” (silent rejection).
- “App Store Connect: Action required” (often Export Compliance).
Spam folder catches these more often than expected.
Step 3: Resolve Export Compliance
App Store Connect → TestFlight → your build. If you see “Missing Compliance,” click it. Answer the encryption questions:
- Does your app use encryption? Most apps do (HTTPS counts).
- Is the encryption exempt? Standard HTTPS / TLS is exempt.
After answering, processing typically completes in 5-10 minutes.
To eliminate this step in future, add to Info.plist:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
(Use <true/> only if you actually use non-standard crypto; in that case you’ll need year-end annual self-classification reports.)
Step 4: Check Activity log for silent rejection
App Store Connect → Activity → All Builds. Each row shows status. If your build shows “Invalid Binary” or “Failed Processing” rather than Processing, that’s the issue. Open the row to see the specific error.
Step 5: Bump build number and re-upload
If 2+ hours have passed and nothing else explains it:
# Bump CFBundleVersion
agvtool next-version -all
# Archive
xcodebuild -workspace Acme.xcworkspace -scheme Acme \
-archivePath build/Acme.xcarchive archive
# Validate before upload (catches issues earlier)
xcrun altool --validate-app -f build/Acme.ipa \
-t ios -u "$ASC_USER" -p "@keychain:ASC_PASSWORD"
# Upload
xcrun altool --upload-app -f build/Acme.ipa \
-t ios -u "$ASC_USER" -p "@keychain:ASC_PASSWORD"
Use Transporter for important uploads — it surfaces validation errors more clearly than Xcode Organizer.
Step 6: File a Feedback Assistant report if still stuck
For builds genuinely stuck >4 hours with no resolution:
- feedbackassistant.apple.com → New Feedback → App Store Connect.
- Include build version, build number, upload timestamp, and Apple ID.
- Apple Developer Relations occasionally manually unsticks processing.
How to confirm the fix
- Build status transitions from “Processing” to “Ready to Submit” or “Ready to Test.”
- Email arrives confirming the build is available.
- The build appears in the Submit for Review or TestFlight group attachment list.
- No “Missing Compliance” or “Invalid Binary” banner on the build.
If it still fails
- Re-archive with
xcrun altool --validate-appfirst; validation errors caught locally are faster than waiting for Apple to surface them. - Try Transporter (downloadable from App Store) for the next upload — it gives more explicit error messages than Xcode Organizer.
- Check that
Info.plistdeclares all required keys:CFBundleShortVersionString,CFBundleVersion,UIApplicationSceneManifest(for iOS 13+),ITSAppUsesNonExemptEncryption. - Try a smaller test IPA (strip unused frameworks) to rule out size-driven processing tail.
Prevention
- Always set
ITSAppUsesNonExemptEncryptionin Info.plist (true or false as appropriate) so Export Compliance never blocks processing. - Run
xcrun altool --validate-appas a CI pre-upload step; failures surface in seconds rather than hours. - Avoid uploading during Apple’s known high-load windows (WWDC week, day-of major iOS releases).
- Bump build numbers in CI automatically with
agvtool next-version -allto prevent collisions. - Subscribe to Apple Developer notifications and check Apple System Status before any time-sensitive upload.