TestFlight is the most powerful release-engineering tool Apple gives you, and most indies use it as a glorified file share. Here is the playbook we run for every Tappa release.

The cohort layout

We maintain three TestFlight cohorts per app:

We do not invite the entire user base. We pick public-beta candidates from a Google Form linked from the app's Settings screen, and we curate. A useful beta tester is one who reports clearly, files reproducible bugs, and tells us what the experience felt like.

The release timeline

For a typical monthly release:

  1. Day 0 — Feature freeze. Code goes to Internal cohort.
  2. Days 1–3 — Internal testing. Bugs filed, fixed, re-uploaded.
  3. Day 4 — Friends and Family cohort.
  4. Days 5–7 — Friends and Family testing. Mostly UX feedback now, fewer bugs.
  5. Day 8 — Public Beta.
  6. Days 9–14 — Public Beta in the wild. We watch crash reports, watch reviews-by-version-string, fix anything urgent.
  7. Day 15 — Submit to App Store.
  8. Phased release — 1% day 1, 2% day 2, 5% day 3, 10% day 4, 20% day 5, 50% day 6, 100% day 7. We pause the rollout if anything is wrong.

What we look at

During beta and during the phased rollout, we watch:

What we send to beta testers

A short, plain-language note in TestFlight's release notes:

## What's new in this beta
- Faster export
- New export format: PDF

## What we want you to test
- Try exporting at least one receipt as PDF and reply with how it went.

A specific ask gets specific feedback. "Try out the new build" gets nothing.

Phased release — actually use it

Apple's phased release for iOS is genuinely good and most indies turn it on once and never look at it. We watch the dashboard daily during a rollout. If something looks wrong, we pause. If it gets worse, we pull and ship a fix. The cost of being able to abort a release is enormous; it is the difference between a bad day and a bad week.

Three small habits

  1. Always increment the build number on every TestFlight upload. CI does this automatically. Manual edits introduce confusion.
  2. Never ship to TestFlight on a Friday afternoon. If something breaks, you will be debugging on Saturday.
  3. Keep a RELEASE.md checklist at the top of each release branch. Boring, repeatable, immune to forgetting.

TestFlight is your first defence against shipping a regression to a million users. Use it like one.