App Store

    How do I delete old builds from TestFlight?

    A 2026 TestFlight Builds table in App Store Connect showing the Expire Build action and several builds marked expired, with no option to delete a build record

    The honest answer is the one most guides skip: you cannot truly delete a build from TestFlight. App Store Connect has no delete button for builds. What you can do is expire a build, which stops testers from installing it, and every build expires on its own after 90 days anyway. So "delete old builds" really means "expire the ones you do not want tested and let the rest age out." Here is exactly how that works and why the old builds stay listed.

    Short answer

    You cannot delete a build from TestFlight; App Store Connect does not provide a delete option for builds. Instead you expire a build, which stops internal and external testers from installing it, and builds also expire automatically 90 days after upload. Per Apple's guidance on stopping testing, you expire a build by selecting it in the Builds table and clicking Expire Build. The build record remains visible in App Store Connect marked as expired, since there is no way to remove it entirely. So the practical goal is to expire the builds you do not want available and accept that the history stays.

    What you should know

    • No true delete: App Store Connect has no button to delete a build.
    • Expire is the action: expiring a build stops testers from installing it.
    • 90-day auto-expiry: every build becomes unavailable 90 days after upload.
    • Records remain: expired builds still show in the list, marked expired.
    • New builds get a fresh 90 days: each upload starts its own expiry clock.

    Can you actually delete a TestFlight build?

    No. There is no function in App Store Connect to permanently delete a build, so the list of builds you have uploaded is effectively a history you cannot prune. Developers regularly ask for this, but the only control Apple exposes is expiration, which changes a build's availability to testers rather than removing it. The build, its number, and its upload date stay in the Builds table even after it expires. So if your goal was a clean, empty build list, that is not achievable today, and the realistic aim is to manage which builds are installable, not to erase the record of past uploads.

    Expire vs delete

    The two are easy to conflate, so the table draws the line.

    ActionWhat it doesAvailable?
    Expire a buildStops testers installing it; marks it expiredYes, manually or after 90 days
    Auto-expiryBuild becomes unavailable 90 days after uploadYes, automatic
    Stop testing a groupRemoves a build from a specific tester groupYes
    Delete a buildRemoves the build record entirelyNo, not supported

    The takeaway is that expiration is the lever you have, and it controls availability, not existence. An expired build is still there in your history; it simply can no longer be installed.

    How to expire a build

    Use the Expire Build action in the Builds table. Open your app in App Store Connect, go to the TestFlight tab, and find the build in the Builds table; clicking the build string or icon opens it, where Expire Build immediately stops internal and external testers from installing that build. This is useful when a build has a bug you do not want testers using, or when you want to push everyone onto your latest build. If you would rather just stop a build for one audience, removing it from a specific tester group is the narrower option. Either way, the build remains recorded, now flagged as expired, and any build you do nothing with will expire on its own at the 90-day mark.

    What to watch out for

    The first trap is expecting a tidy build list; since builds cannot be deleted, expired entries accumulate, and that is normal rather than a problem to solve. The second is confusing expiring a build with removing the app or its data, which it does not do. The third is letting an important test build silently hit its 90-day expiry, which can interrupt testers, so upload a fresh build before the old one ages out if testing must continue. Build housekeeping is unrelated to your app's security, so it sits apart from a pre-submission scan such as PTKD.com (https://ptkd.com), which reads the compiled IPA against OWASP MASVS; what matters there is that the specific build you promote to release was scanned, not how many expired builds linger in the list.

    What to take away

    • You cannot delete a build from TestFlight; App Store Connect has no delete option, so the build history stays.
    • Expiring a build stops testers from installing it, and every build also expires automatically 90 days after upload.
    • Expired builds remain listed and marked expired; expiration controls availability, not existence.
    • Upload a fresh build before an important one hits its 90-day expiry, and scan the exact build you promote to release with a pre-submission scan such as PTKD.com.
    • #testflight
    • #delete-build
    • #expire-build
    • #app-store-connect
    • #beta-testing
    • #build-management
    • #ios

    Frequently asked questions

    How do I delete old builds from TestFlight?
    You cannot delete them. App Store Connect provides no option to remove a build record. The closest action is to expire a build, which stops testers from installing it, and builds also expire automatically 90 days after upload. The build still appears in the Builds table marked expired. So managing TestFlight builds means controlling which are installable through expiration, not erasing the history of what you uploaded.
    How do I expire a TestFlight build?
    Open your app in App Store Connect, go to the TestFlight tab, and find the build in the Builds table. Click the build string or icon to open it, then click Expire Build. That immediately stops internal and external testers from installing that build. It is useful when a build has a bug or when you want everyone on your latest build. The build remains listed afterward, now flagged as expired.
    Do TestFlight builds expire on their own?
    Yes. Every build becomes unavailable to testers 90 days after it is uploaded, and each new upload starts its own 90-day clock. So even if you do nothing, old builds age out automatically. The thing to watch is an important test build silently expiring mid-cycle, which interrupts testers, so upload a fresh build before the old one reaches 90 days if testing needs to continue.
    What is the difference between expiring and deleting a build?
    Expiring changes a build's availability, stopping testers from installing it, while the build record remains in App Store Connect marked expired. Deleting would remove the record entirely, and that is not supported. So expiration controls whether a build can be installed, not whether it exists. An expired build stays in your history, which is why the build list accumulates expired entries you cannot clear.
    Can I clean up my TestFlight build list?
    Not really. Because builds cannot be deleted, expired entries stay in the Builds table, and there is no way to prune them to an empty list. This is expected behavior rather than a fault. The practical approach is to expire builds you do not want tested and let others age out at 90 days, accepting that the upload history remains visible in App Store Connect.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free