What is the relationship between releaseChannel and channel in eas.json?


I’m excited to test drive eas update but not having any luck getting it to work yet. One point I am confused about is that parts of the latest docs reference releaseChannel (Using expo-updates - Expo Documentation), yet other parts reference channel (Migrating from Classic Updates to EAS Update - Expo Documentation). How do these two concepts relate? Has one supplanted the other? If so, as of what version of expo-updates was that change made?


Also: these API docs don’t make any mention of channel: there is only releaseChannel - see Build schema for eas.json - Expo Documentation.

Hi Jack,

Thanks for your question! This can be confusing. EAS Update replaces the “releaseChannel” with “channel”. Release Channels were only used for Classic Updates (a.k.a Expo Updates). So either EAS Updates or Classic Updates can still be used (for now). They are alternatives, EAS Updates being the most modern of the two - it’s still in preview meaning it’s only available with our Production and Enterprise plans currently.

I’m not sure about the Build schema for eas.json docs, it seems like “channel” was left out in error, but I’m checking with the experts and will report back.

In the meantime you can read about how EAS Updates works here.

1 Like


I have the Production Plan and am specifically aiming to upgrade from my previous setup with OTA updates to the new EAS stuff.

Can you help me understand why the updates system is not working for me?

My package.json contains these package versions, amongst other things.

"expo": "^44.0.6",
"expo-updates": "~0.11.6",

And my CLIs are

eas-cli: 0.47.0
expo-cli: 5.2.0

In my app.config.js I added the details from eas update:configure

    updates: {
      url: "https://u.expo.dev/....",
      fallbackToCacheTimeout: 0,
    runtimeVersion: {
      policy: "sdkVersion",

I then built using this configuration in eas.json

"production_apk": {
  "channel": "production",
  "android": {
    "buildType": "apk"
  "distribution": "internal"

and the command

eas build --platform=android --profile=production_apk

Then I installed the APK on my Android device

Following this, I changed from text in my codebase and ran

eas update --branch production --message "Testing 123"

This returned update group ID: update group ID : ec80bc2e-1f31-434c-93c1-defaff3b1b32

Running eas channel:view production seems to confirm that the production branch and channel are connected

Name  production
ID    ed8f7193-9469-4888-a234-50327c56e252

Branches pointed at this channel and their most recent update group:
│ branch     │ Update message                                         │ Update runtime version │ Update group ID                      │ Update platforms │
│ production │ "Testing 123" (25 minutes ago by __) │ exposdk:44.0.0         │ ec80bc2e-1f31-434c-93c1-defaff3b1b32 │ android, ios     │

I then downloaded the app to my phone and closed the app multiple times over the course of 10 minutes (while connecting to WIFI). The first two times nothing happened. The third time, opening the app just showed a blank white screen that never goes away. Then the fourth time is exactly the same as the first time: ie. it shows the original text from the version of the app created with eas build and does not contain the updates.

Can someone on the team help me figure out what is going wrong here?

I noticed a possibly related bug in my account:

Even though my Expo version is 44.0.6, the build tool interface says the runtime is “exposdk:44.0.0” (which is wrong) and also that the SDK version is “44.0.0”, which is also wrong.

Plugging in the Android debugger displays an error that seems like a clue: is it possible there is an inconsistency with how the manifest is used in normal development (e.g. in Expo Go) and how it is used in eas update?

03-01 17:48:52.085  4128 10549 E ReactNativeJS: TypeError: null is not an object (evaluating 'o.default.manifest.extra')
03-01 17:48:52.088  4128 10549 I ReactNativeJS: Running "main" with {"rootTag":11}
03-01 17:48:52.088  4128 10496 E AndroidRuntime: FATAL EXCEPTION: expo-updates-error-recovery
03-01 17:48:52.088  4128 10496 E AndroidRuntime: Process: com.REDACTED, PID: 4128
03-01 17:48:52.088  4128 10496 E AndroidRuntime: com.facebook.react.common.JavascriptException: TypeError: null is not an object (evaluating 'o.default.manifest.extra'), stack:

So you’re all set up correctly for EAS Update! However, it looks like you are calling Constants.manifest.extra somewhere (from expo-constants), but since Constants.manifest is null, you’re getting a fatal error when calling .extra on null. This guide instructs you to remove Constants.manifest.extra.

If you’re using Constants.manifest.extra to access environment variables, we have a workaround for the time being here: Using environment variables with EAS Update - Expo Documentation

The expo-updates-error-recovery message is telling you that we caught the error and rolled your project back to a known working update. Referenced here.

In your original post, you mentioned expo-updates. I just want to clarify the difference between that, Classic Updates (a.k.a Expo Updates), and EAS Update.

  • expo-updates is a library that can be used with any update service and is not specific to any of Expo’s services.
  • Classic Updates is an Expo specific service built to send updates from ~2015 - 2021
  • EAS Update is a better Expo specific service built to send updates from 2022 - present

You were right about the docs here btw… “channel" just hasn’t been added yet because EAS Update is still in preview. It will be there eventually.

Ok thanks.

I reckon the team should update the docs on this point because this is a breaking change compared to the official how-tos published by Expo in the past Constants.manifest.extra was frequently recommended. (e.g. pages like this should mention this approach is deprecated with eas update Environment variables in Expo - Expo Documentation )

I’m seeing that my original questions have been marked as promotional/spam by the system. This seems like a mistake. I mention myself in no way and I exclusively link to the Expo official docs.

Another question I had was: Why is that Constants.manifest.extra works both in Expo Go locally and in the output APK of eas build when run on my device.

Yet after running eas update the Constants.manifest becomes blank and bugs occur. What’s happening behind the scenes here? Does the Constants.manifest get overridden after an eas update event?

This topic was automatically closed 20 days after the last reply. New replies are no longer allowed.