Expo

Get Started
Feature Preview

Internal distribution

Uploading your app to TestFlight and Google Play beta can be time consuming and limiting (e.g. TestFlight can only have one active build at a time). You can skip these services entirely by building binaries that can be downloaded and installed to physical devices directly from a web browser.
EAS Build can help you with this by providing sharable URLs for your builds with instructions on how to get them running, so you can share a single URL with a teammate that'll include all of the information they need to test the app.
😅
Installing an app on iOS is a bit trickier than on Android, but it's possible thanks to ad hoc and enterprise provisioning profiles. We'll talk more about this later in this doc.

Setting up internal distribution

The following three steps will guide you through adding internal distribution to a project that is already set up to build with EAS Build. It will only take a few minutes in total to: configure the project, add a couple of test iOS devices to a provisioning profile, and start builds for Android and iOS.

1. Configure a build profile

Open up eas.json and add a new build profile for iOS and/or Android.
{
  "builds": {
    "android": {
      "preview": {
        "distribution": "internal",
        "workflow": "generic"
      }
    },
    "ios": {
      "preview": {
        "distribution": "internal",
        "workflow": "generic"
      }
    }
  }
}
If you override the gradleCommand on Android, you should ensure that it produces an apk rather than an aab, so it is directly installable to an Android device.

Android does not restrict distribution of applications the operating system is capable of installing any compatible apk file. As a result, configuring app signing credentials for internal distribution is no different from other types of builds. The main benefit of using internal distribution in this case is to have an easily shareable URL to provide to testers for downloading the app.

Apple restricts distribution of applications on iPhones and iPads, so we will need to build the app with an ad-hoc provisioning profile that explicitly lists the devices that the application can run on.
An alternative to ad hoc provisioning is enterprise provisioning, but this is expensive ($299 USD per year from Apple) and not yet supported by EAS Build internal distribution (support is planned and coming soon).

Apps signed with an ad hoc provisioning profile can be installed by any iOS device whose unique identifier (UDID) is registered with the provisioning profile.
Setting up ad hoc provisioning consists of two steps. In the first step, you'll register devices that you want to be able to install your app. Run the following command to generate a URL (and QR code, for convenience) that you can open on your devices, and then follow the instructions on the registration page.
# Register Apple Devices for internal distributioneas device:create
You can register new devices at any time, but builds that were created before the device was registered will not run on newly registered devices; only builds that are created after the device is registered will be installable.
The next step is to generate or update the provisioning profile. When you proceed to running a build, you will be guided through this process.
Are you using manual local credentials? Make sure to point your credentials.json to an ad hoc provisioning profile that you generate through the Apple Developer portal. Beware that EAS CLI does only a limited validation of your local credentials, and you will have to handle device UDID registration manually. Read more about using local credentials.

Now that we have set up our build profile and app signing, running a build for internal distribution is just like any other build.
# Create iOS and Android builds for internal distributioneas build --profile preview --platform all
If you choose to let EAS CLI manage your ad hoc provisioning profile, we will show you the list of all devices registered so far. You will then be prompted to confirm you want to proceed with those devices.
When the build completes, you will be given a URL that you can share with your team to download and install the app.