---
title: TestFlight job type for Workflows
authors: Ash Wu
published: September 18, 2025
---

## Using the TestFlight job

To distribute a build to TestFlight groups, add a job with `type: testflight` to your workflow:

```yaml
name: Distribute to TestFlight

jobs:
  testflight_distribution:
    name: Distribute to TestFlight
    type: testflight
    params:
      build_id: ${{ needs.build_ios.outputs.build_id }}
      internal_groups: ['QA Team']
      external_groups: ['Public Beta']
      changelog: "Bug fixes and performance improvements"
```

The TestFlight job requires an iOS build created with `distribution: store`. You'll need to have your Apple Developer account configured for TestFlight submissions.

## Development builds with TestFlight

One useful pattern we've found is distributing [development builds](https://docs.expo.dev/develop/development-builds/introduction/) through TestFlight. This approach eliminates the need to manage ad hoc provisioning profiles across your team's iOS devices, which simplifies your team's process for distributing development builds.

## Examples

You can distribute to both internal and external TestFlight groups with a detailed changelog:

```yaml
name: Full TestFlight Distribution

jobs:
  build_ios:
    name: Build iOS
    type: build
    params:
      platform: ios
      profile: production

  testflight:
    name: Distribute to TestFlight
    needs: [build_ios]
    type: testflight
    params:
      build_id: ${{ needs.build_ios.outputs.build_id }}
      internal_groups: ['QA Team', 'Internal Testers']
      external_groups: ['Public Beta', 'Partner Testing']
      changelog: |
        What's new in this release:
        - Performance improvements
        - Bug fixes for login flow
        - Updated user interface
      submit_beta_review: true
```

For external groups, the job automatically submits your build for Beta App Review unless you explicitly set `submit_beta_review: false`. This ensures your app can be distributed automatically to external testers once Apple's review is complete.

You can also upload builds with just a changelog. This way, the build will only get added to internal groups with "auto-distribute" enabled:

```yaml
testflight:
  name: Upload with Changelog
  type: testflight
  params:
    build_id: ${{ needs.build_ios.outputs.build_id }}
    changelog: "Latest development build with bug fixes"
```

Learn more about the TestFlight job type in our [pre-packaged jobs documentation](https://docs.expo.dev/eas/workflows/pre-packaged-jobs/#testflight).