TestFlight Build Stuck in "Processing" — How to Unstick It

Your TestFlight build has shown "Processing" for hours. Here are the 8 real causes and an exact checklist to unstick it, current as of June 2026.

You uploaded via Xcode Organizer or Transporter, got a green checkmark, refreshed App Store Connect 10 minutes later, and the build appeared under 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 demo today and you’re wondering whether to wait or re-upload.

Here’s the key mental model: in 2026 Apple’s pipeline normally finishes in minutes, not hours. So a build that sits in Processing for more than an hour has almost always failed silently or is waiting on you — it is rarely “still working.” Your job is to find out which.

TL;DR

  • Under ~30 minutes: normal. Hard-refresh and wait. Median processing time is roughly 15–30 minutes.
  • Stuck and you see a yellow “Missing Compliance” banner: answer the Export Compliance questions, or set ITSAppUsesNonExemptEncryption in Info.plist so it never asks again. This is the single most common avoidable cause.
  • Stuck with no banner past ~1 hour: check Activity → All Builds and the uploader’s email — it probably failed with “Invalid Binary” rather than truly hanging. A missing or malformed privacy manifest (PrivacyInfo.xcprivacy) is the most common 2024–2026 silent failure.
  • Genuinely stuck past 2 hours with no signal: bump the build number, re-validate, and re-upload via Transporter.

Which bucket are you in?

Match what you see to the most likely cause before you touch anything:

What you observeMost likely causeGo to
Under ~30 min, no bannerNormal Apple-side queueStep 1
Yellow “Missing Compliance” banner on the buildExport Compliance unansweredStep 3
ITMS-91053 / ITMS-91061 email arrivedPrivacy manifest gapStep 5
ITMS-90725 / “must be built with the iOS 26 SDK” emailBuilt on an old Xcode/SDKrebuild on Xcode 26
Activity row says “Invalid Binary” / “Failed”Silent rejection (read the row)Step 4
Same version (build) already existsBuild-number collisionStep 6
No banner, no email, past 2 h, status page cleanTrue processing tailStep 6 then 7

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 (mid-June), the days after a major iOS release, and the December holidays all stretch the tail.

How to spot it: No specific signal — this is what’s left after ruling out the other causes. Check Apple’s System Status and the Apple 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-exempt encryption (Export Compliance). Without ITSAppUsesNonExemptEncryption in Info.plist, the build parks in a pseudo-Processing state waiting for you to answer the question by hand in App Store Connect — and it never resolves on its own.

How to spot it: App Store Connect → TestFlight → your build → look for a yellow “Missing Compliance” banner or an “Export Compliance” link asking you to answer questions.

3. Missing or malformed privacy manifest (the big 2024–2026 cause)

Since May 1, 2024, Apple requires a privacy manifest (PrivacyInfo.xcprivacy) declaring your use of required-reason APIs (e.g. UserDefaults, file timestamp, disk space, system boot time) and a signed manifest for commonly used third-party SDKs. A gap here frequently shows up as a build that processes and then fails — sometimes parking briefly in Processing first, sometimes producing an “ITMS-91053: Missing API declaration” email instead of a clean rejection.

How to spot it: Check the uploader’s email for an ITMS-91053 or ITMS-91061 (“Missing privacy manifest”) message. In Xcode, Product → Archive, then in the Organizer use the privacy report to confirm every required-reason API and SDK is covered.

4. dSYM upload incomplete or symbolication failed

Builds with custom or binary frameworks may require dSYM handling after upload. A failure here can leave the build in Processing without an explicit rejection.

How to spot it: Xcode → Organizer → your archive → right-click → “Show in Finder” → confirm dSYMs exist inside the .xcarchive. If Apple can’t match symbols, processing can pause.

5. 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: Diff this build against the last one that processed cleanly. Major changes — new entitlements, +50 MB IPA size, a new third-party SDK — raise the odds.

6. 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 an earlier instance of the same (build_number) within the same version.

7. Apple System Status incident

Real but uncommon: TestFlight ingestion or processing has an active incident, parking uploads cluster-wide.

How to spot it: Apple Developer System Status — look for TestFlight, App Store Connect, or “Build Processing” incidents.

8. Built on an outdated Xcode / SDK (newly enforced in 2026)

Since April 28, 2026, App Store Connect rejects any upload not built with Xcode 26 / the iOS 26 SDK or later. This normally bounces at upload as ITMS-90725 rather than parking in Processing, but a stale CI runner that still has Xcode 16 around can produce a build that ingests and then fails, looking briefly like a hang. (Note: the SDK version is the build SDK — your Deployment Target can still be a much older iOS so the app keeps running on old devices.)

How to spot it: Check the uploader’s email for an ITMS-90725 / “must be built with the iOS 26 SDK” message, and confirm your build machine’s Xcode with xcodebuild -version.

Information to collect first

  • Exact upload timestamp from App Store Connect → Activity.
  • Build version + build number.
  • Whether your build uses encryption (ITSAppUsesNonExemptEncryption value).
  • Whether a PrivacyInfo.xcprivacy manifest is present and complete.
  • Whether dSYMs are present in the .xcarchive.
  • The Apple System Status snapshot at the time of upload.

Shortest path to fix

Step 1: Wait 30–60 minutes, then hard-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. App Store Connect also caches stale state in the browser — the hard refresh alone resolves a surprising number of “greyed-out build” reports.

Step 2: Check the uploader’s email

Search the inbox (and spam folder) 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; open it for the reason.
  • “App Store Connect: Action required” — usually Export Compliance.
  • Anything containing ITMS-91053 / ITMS-91061 — a privacy-manifest problem (see cause 3).
  • Anything containing ITMS-90725 or “must be built with the iOS 26 SDK” — your build machine is on an outdated Xcode (see cause 8); rebuild on Xcode 26.

Step 3: Resolve Export Compliance

App Store Connect → TestFlight → your build. If you see “Missing Compliance,” click it and answer the encryption questions:

  • Does your app use encryption? Most apps do — HTTPS counts.
  • Is the encryption exempt? Standard HTTPS / TLS handled by the OS is exempt. If you only call URLSession/HTTPS, use Sign in with Apple or Apple Pay, or reach Firebase / Supabase / Stripe over system TLS, the answer is yes, exempt.

After answering, processing typically completes in 5–10 minutes.

To eliminate this step in future, add to Info.plist:

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

Set it to <false/> (the App Store Connect answer is “No”) when you only use exempt/OS-provided encryption. Use <true/> only if you ship non-standard crypto — and in that case you’ll owe a year-end annual self-classification report.

Step 4: Check the Activity log for a silent rejection

App Store Connect → Activity → All Builds. Each row shows a status. If your build shows “Invalid Binary” or “Failed Processing” rather than Processing, that’s the issue — open the row for the specific error. This is where most “stuck for hours” builds turn out to have failed, not hung.

Step 5: Fix the privacy manifest if that’s the cause

If you got an ITMS-91053/91061 email, add or complete PrivacyInfo.xcprivacy. For each required-reason API you use, add the API category and an approved reason under NSPrivacyAccessedAPITypes. For third-party SDKs on Apple’s list, update to a vendor version that ships its own signed manifest, then re-archive.

Step 6: Bump the build number and re-upload

If 2+ hours have passed and nothing else explains it:

# Bump CFBundleVersion
agvtool next-version -all

# Archive (Xcode 26 / iOS 26 SDK or later is required to upload as of April 28, 2026)
xcodebuild -workspace Acme.xcworkspace -scheme Acme \
  -archivePath build/Acme.xcarchive archive

# Validate before upload (catches issues in seconds, not hours)
xcrun altool --validate-app -f build/Acme.ipa \
  -t ios --apiKey "$ASC_KEY_ID" --apiIssuer "$ASC_ISSUER_ID"

# Upload
xcrun altool --upload-app -f build/Acme.ipa \
  -t ios --apiKey "$ASC_KEY_ID" --apiIssuer "$ASC_ISSUER_ID"

Use an App Store Connect API key (--apiKey/--apiIssuer) rather than an Apple ID password — app-specific passwords are being phased out and key-based auth is the supported CI path. For important manual uploads, prefer Transporter (free on the Mac App Store): it surfaces validation errors more clearly than Xcode Organizer.

Step 7: File a Feedback Assistant report if still stuck

For builds genuinely stuck past 4 hours with no resolution:

  • feedbackassistant.apple.com → New Feedback → App Store Connect.
  • Include build version, build number, upload timestamp, and the 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.”
  • An email arrives confirming the build is available.
  • The build appears in the Submit for Review list or in a TestFlight group’s build attachment list.
  • No “Missing Compliance,” “Invalid Binary,” or privacy-manifest banner on the build.

If it still fails

  1. Re-archive and run xcrun altool --validate-app first; locally caught validation errors are far faster than waiting for Apple to surface them.
  2. Switch to Transporter for the next upload — it gives more explicit error messages than Xcode Organizer.
  3. Confirm Info.plist declares all required keys: CFBundleShortVersionString, CFBundleVersion, UIApplicationSceneManifest (iOS 13+), and ITSAppUsesNonExemptEncryption.
  4. Confirm PrivacyInfo.xcprivacy exists and the Xcode privacy report shows no missing declarations.
  5. Try a smaller test IPA (strip unused frameworks) to rule out a size-driven processing tail.

Prevention

  • Always set ITSAppUsesNonExemptEncryption in Info.plist (true or false as appropriate) so Export Compliance never blocks processing.
  • Ship and maintain PrivacyInfo.xcprivacy; check Xcode’s privacy report on every release and keep third-party SDKs on manifest-shipping versions.
  • Run xcrun altool --validate-app as a CI pre-upload step; failures surface in seconds.
  • Build with Xcode 26 / iOS 26 SDK or later — required for all App Store Connect uploads since April 28, 2026. (A build still on the old Xcode 16 / iOS 18 SDK will now be rejected at upload, not stuck in Processing.)
  • Avoid uploading during Apple’s known high-load windows (WWDC week, day-of major iOS releases).
  • Auto-bump build numbers in CI with agvtool next-version -all to prevent collisions.

FAQ

How long should TestFlight processing actually take in 2026? Usually 15–30 minutes, occasionally up to ~90 minutes during load. Past an hour with no movement, treat it as a likely silent failure rather than slow processing and start checking the Activity log and email.

My build is greyed out but says it processed — what gives? That’s almost always stale browser state or you’re looking at a different build. Hard-refresh App Store Connect, then use the per-build “Manage” flow under the TestFlight tab to confirm the actual status of that specific row.

What’s ITSAppUsesNonExemptEncryption and which value do I pick? It’s the Info.plist Boolean that pre-answers the Export Compliance question. Set it to NO (<false/>) if you only use OS-provided/exempt encryption like HTTPS, Sign in with Apple, or Apple Pay. Set YES only if you ship custom, non-standard cryptography.

Why did my build fail with ITMS-91053? You’re missing a required-reason API declaration in your privacy manifest. Add the relevant entries to NSPrivacyAccessedAPITypes in PrivacyInfo.xcprivacy, or update the third-party SDK that triggered it to a version shipping its own signed manifest.

Should I just re-upload immediately? No. Re-uploading the same build number guarantees a conflict. Diagnose first (Activity log + email), and if you must re-upload, bump the build number with agvtool next-version -all.

Do I need Xcode 26 now, and will an old build get stuck because of it? Yes — since April 28, 2026 every upload must be built with Xcode 26 / the iOS 26 SDK or later. A build compiled on an older Xcode is normally rejected at upload (ITMS-90725), not stuck in Processing, but a stale CI runner can make it look like a hang. Updating the build SDK does not change which devices can install the app; that is controlled by your Deployment Target, which you can keep low.

Tags: #Troubleshooting #App Store #App review #TestFlight