eas-update-insights

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

EAS Update Insights

EAS Update 洞察分析

Query the health of published EAS Updates directly from the CLI: launches, failed launches, crash rates, unique users, payload size, the embedded-vs-OTA user split per channel, and the most popular updates per runtime version. The data is the same data that powers the update and channel detail pages on expo.dev; these commands expose it in the terminal in human and JSON form.
直接通过CLI查询已发布EAS Updates的健康状况:启动次数、启动失败次数、崩溃率、独立用户数、负载大小、各渠道中嵌入式与OTA用户的占比,以及各运行时版本下最受欢迎的更新。这些数据与expo.dev上更新和渠道详情页展示的数据一致;通过这些命令可在终端以易读格式和JSON格式查看数据。

When to use this skill

何时使用该功能

Use this when the user wants to assess the health or adoption of a published EAS Update: crash rates, install counts, unique users, bundle size, or the split between embedded and OTA users on a channel.
Example prompts:
  • "How is the latest update doing?"
  • "Is the latest update healthy?"
  • "Is the new release crashing more than the last one?"
  • "How many users are on the latest update vs the embedded build?"
  • "Which update is most popular on production right now?"
  • "How big is our update bundle?"
Also fits: post-publish rollout monitoring and regression detection.
Don't use when the user needs per-user crash detail or device-level reporting; this skill only exposes aggregate EAS metrics.
当用户需要评估已发布EAS Update的健康状况或采用情况时使用:比如查看崩溃率、安装次数、独立用户数、包大小,或是渠道中嵌入式与OTA用户的占比。
示例提问:
  • "最新更新的运行情况如何?"
  • "最新更新是否正常?"
  • "新版本的崩溃率比上一个版本高吗?"
  • "最新更新和嵌入式构建分别有多少用户在使用?"
  • "当前生产环境中最受欢迎的更新是哪一个?"
  • "我们的更新包有多大?"
此外还适用于:发布后的版本推送监控和回归检测。
请勿在用户需要单用户崩溃详情或设备级报告时使用;该功能仅提供聚合的EAS指标。

Prerequisites

前提条件

  • eas-cli
    installed (
    npm install -g eas-cli
    ).
  • Logged in:
    eas login
    .
  • For
    channel:insights
    : run from an Expo project directory (the command resolves the project ID from
    app.json
    ).
    update:insights
    only needs a login.
  • 已安装
    eas-cli
    (执行
    npm install -g eas-cli
    )。
  • 已登录:执行
    eas login
  • 使用
    channel:insights
    命令时:需在Expo项目目录下运行(该命令会从
    app.json
    中解析项目ID)。
    update:insights
    仅需登录即可使用。

Commands at a glance

命令概览

CommandPurpose
eas update:list
Discover recent update groups, their
group
IDs, and branch names
eas update:insights <groupId>
Per-platform launches, failed launches, crash rate, unique users, payload size, daily breakdown
eas update:view <groupId> --insights
Update group details + the same metrics appended
eas channel:insights --channel <name> --runtime-version <version>
Embedded/OTA user counts, most popular updates, cumulative metrics for a channel + runtime
All of these support
--json --non-interactive
for programmatic parsing.
命令用途
eas update:list
查看最近的更新分组、它们的
group
ID以及分支名称
eas update:insights <groupId>
按平台查看启动次数、启动失败次数、崩溃率、独立用户数、负载大小,以及每日数据明细
eas update:view <groupId> --insights
更新分组详情 + 附加上述相同指标
eas channel:insights --channel <name> --runtime-version <version>
嵌入式/OTA用户数量、最受欢迎的更新、渠道+运行时的累计指标
所有命令均支持
--json --non-interactive
参数,以便程序化解析。

Discovering IDs

获取ID

Before querying insights for an update group, you need its
group
ID. Use
eas update:list
with either
--branch <name>
(updates on that branch) or
--all
(updates across all branches). Always pass
--json --non-interactive
when running non-interactively; without a branch/
--all
flag the command will otherwise prompt for a branch selection:
bash
undefined
在查询更新分组的洞察数据前,你需要它的
group
ID。使用
eas update:list
命令,可搭配
--branch <name>
(查看该分支的更新)或
--all
(查看所有分支的更新)参数。非交互式运行时请务必添加
--json --non-interactive
参数;若未指定分支或
--all
参数,命令会提示选择分支:
bash
undefined

Latest group id across all branches

Latest group id across all branches

eas update:list --all --json --non-interactive | jq -r '.currentPage[0].group'
eas update:list --all --json --non-interactive | jq -r '.currentPage[0].group'

Latest group id on a specific branch

Latest group id on a specific branch

eas update:list --branch production --json --non-interactive | jq -r '.currentPage[0].group'

The JSON response has a `currentPage` array with one entry per update group (both platforms of the same publish are collapsed into one entry):

```json
{
  "currentPage": [
    {
      "branch": "production",
      "message": "\"Fix checkout crash\" (1 week ago by someone)",
      "runtimeVersion": "1.0.6",
      "group": "03d5dfcf-736c-475a-8730-af039c3f4d06",
      "platforms": "android, ios",
      "isRollBackToEmbedded": false
    }
  ]
}
Entries also carry
codeSigningKey
and
rolloutPercentage
, but only when those features are in use for the group (undefined values are omitted from the JSON output).
When called with
--branch <name>
, the response also includes
name
(the branch name) and
id
(the branch ID) at the top level.
eas update:list --branch production --json --non-interactive | jq -r '.currentPage[0].group'

JSON响应包含`currentPage`数组,每个条目对应一个更新分组(同一发布的两个平台会合并为一个条目):

```json
{
  "currentPage": [
    {
      "branch": "production",
      "message": "\"Fix checkout crash\" (1 week ago by someone)",
      "runtimeVersion": "1.0.6",
      "group": "03d5dfcf-736c-475a-8730-af039c3f4d06",
      "platforms": "android, ios",
      "isRollBackToEmbedded": false
    }
  ]
}
条目还包含
codeSigningKey
rolloutPercentage
字段,但仅当该分组使用这些功能时才会显示(未定义的值不会出现在JSON输出中)。
当使用
--branch <name>
参数时,响应的顶层还会包含
name
(分支名称)和
id
(分支ID)字段。

eas update:insights <groupId>

eas update:insights <groupId>

Shows launches, failed launches, crash rate, unique users, launch asset count, and average payload size for a single update group, broken down per platform (iOS, Android), plus a daily breakdown of launches and failures.
显示单个更新分组的启动次数、启动失败次数、崩溃率、独立用户数、启动资源数量和平均负载大小,按平台(iOS、Android)拆分,同时提供启动和失败情况的每日明细。

Basic use

基础用法

bash
eas update:insights 03d5dfcf-736c-475a-8730-af039c3f4d06
bash
eas update:insights 03d5dfcf-736c-475a-8730-af039c3f4d06

Flags

参数

FlagDescription
--days <N>
Look back N days. Default: 7. Mutually exclusive with
--start
/
--end
.
--start <iso-date>
/
--end <iso-date>
Explicit time range, e.g.
--start 2026-04-01 --end 2026-04-15
.
--platform <ios|android>
Filter to a single platform. Omit to see all platforms in the group.
--json
Machine-readable output. Implies
--non-interactive
.
--non-interactive
Required when scripting.
参数描述
--days <N>
查看过去N天的数据。默认值:7。与
--start
/
--end
参数互斥。
--start <iso-date>
/
--end <iso-date>
指定时间范围,例如
--start 2026-04-01 --end 2026-04-15
--platform <ios|android>
筛选单个平台。省略则查看分组内的所有平台。
--json
机器可读格式输出。隐含
--non-interactive
参数。
--non-interactive
脚本运行时必填。

JSON output shape

JSON输出结构

Top level:
groupId
,
timespan
(
start
,
end
,
daysBack
), and
platforms[]
with one entry per platform the group was published to. Each platform entry has
updateId
,
totals
(
uniqueUsers
,
installs
,
failedInstalls
,
crashRatePercent
),
payload
(
launchAssetCount
,
averageUpdatePayloadBytes
), and a
daily[]
time series of
{ date, installs, failedInstalls }
.
For the complete schema and field reference, see references/update-insights-schema.md.
Fields that matter for health assessment:
  • platforms[].totals.crashRatePercent
    , computed as
    failedInstalls / (installs + failedInstalls) * 100
    . Zero when there are no installs.
  • platforms[].totals.installs
    and
    uniqueUsers
    give the adoption signal.
  • platforms[].daily
    is a time series, useful for spotting a sudden spike in failures.
顶层字段:
groupId
timespan
(包含
start
end
daysBack
),以及
platforms[]
数组,每个条目对应分组发布的一个平台。每个平台条目包含
updateId
totals
(包含
uniqueUsers
installs
failedInstalls
crashRatePercent
)、
payload
(包含
launchAssetCount
averageUpdatePayloadBytes
),以及
daily[]
时间序列数组,每个元素为
{ date, installs, failedInstalls }
完整的架构和字段参考,请查看references/update-insights-schema.md
健康评估的关键字段:
  • platforms[].totals.crashRatePercent
    ,计算公式为
    failedInstalls / (installs + failedInstalls) * 100
    。当没有安装量时该值为0。
  • platforms[].totals.installs
    uniqueUsers
    反映用户采用情况。
  • platforms[].daily
    时间序列可用于发现失败次数的突然飙升。

Errors

错误信息

  • Could not find any updates with group ID: "<id>"
    — group doesn't exist or you lack access.
  • Update group "<id>" has no ios update (available platforms: android)
    --platform ios
    was used but the group wasn't published for iOS.
  • EAS Update insights is not supported by this version of eas-cli. Please upgrade ...
    — the server deprecated a field the CLI relies on. Run
    npm install -g eas-cli@latest
    .
  • Could not find any updates with group ID: "<id>"
    — 分组不存在或你无访问权限。
  • Update group "<id>" has no ios update (available platforms: android)
    — 使用了
    --platform ios
    参数,但该分组未针对iOS发布。
  • EAS Update insights is not supported by this version of eas-cli. Please upgrade ...
    — 服务器已弃用CLI依赖的某个字段。请执行
    npm install -g eas-cli@latest
    升级。

eas update:view <groupId> --insights

eas update:view <groupId> --insights

Extends the standard
update:view
output with the same per-platform insights, inline.
bash
undefined
在标准
update:view
输出的基础上,附加相同的按平台洞察数据。
bash
undefined

Human-readable

易读格式输出

eas update:view 03d5dfcf-... --insights eas update:view 03d5dfcf-... --insights --days 30
eas update:view 03d5dfcf-... --insights eas update:view 03d5dfcf-... --insights --days 30

JSON: wrapped as { updates: [...], insights: {...} }

JSON格式输出:包装为 { updates: [...], insights: {...} }

eas update:view 03d5dfcf-... --json --insights

Without `--insights`, `update:view` behaves exactly as before — no JSON shape change for existing consumers. The `--days` / `--start` / `--end` flags only apply when `--insights` is set; passing them alone errors.
eas update:view 03d5dfcf-... --json --insights

未添加`--insights`参数时,`update:view`的行为与之前完全一致 — 不会改变现有消费者依赖的JSON结构。`--days` / `--start` / `--end`参数仅在添加`--insights`时生效;单独使用这些参数会报错。

eas channel:insights --channel <name> --runtime-version <version>

eas channel:insights --channel <name> --runtime-version <version>

Shows, per channel, how many users are on the embedded build vs over-the-air updates and which updates are pulling the most traffic. Must be run from an Expo project directory.
按渠道显示使用嵌入式构建与OTA更新的用户数量,以及流量最高的更新。必须在Expo项目目录下运行。

Basic use

基础用法

bash
eas channel:insights --channel production --runtime-version 1.0.6
bash
eas channel:insights --channel production --runtime-version 1.0.6

Flags

参数

FlagDescription
--channel <name>
Required. The channel name (e.g.
production
,
staging
).
--runtime-version <version>
Required. Match exactly what was published. Check
runtimeVersion
values in
update:list
.
--days <N>
Look back N days. Default: 7.
--start
/
--end
Explicit time range, like
update:insights
.
--json
/
--non-interactive
Machine-readable output.
参数描述
--channel <name>
必填。渠道名称(例如
production
staging
)。
--runtime-version <version>
必填。需与发布时的版本完全匹配。可通过
update:list
查看
runtimeVersion
的值。
--days <N>
查看过去N天的数据。默认值:7
--start
/
--end
指定时间范围,与
update:insights
用法相同。
--json
/
--non-interactive
机器可读格式输出。

JSON output shape

JSON输出结构

Top level:
channel
,
runtimeVersion
,
timespan
,
embeddedUpdateTotalUniqueUsers
,
otaTotalUniqueUsers
,
mostPopularUpdates[]
(each with
rank
,
groupId
,
message
,
platform
,
totalUniqueUsers
),
cumulativeMetricsAtLastTimestamp[]
, plus chart-shaped
uniqueUsersOverTime
and
cumulativeMetricsOverTime
objects with
labels
and
datasets
.
For the complete schema and field reference, see references/channel-insights-schema.md.
Fields that matter:
  • embeddedUpdateTotalUniqueUsers
    is the count of users running the embedded (binary-bundled) build.
  • mostPopularUpdates[]
    is updates ranked by
    totalUniqueUsers
    . Caveat: this is the top-N the server returns;
    otaTotalUniqueUsers
    is a sum of that list and may undercount total OTA reach if more than top-N updates are active.
  • uniqueUsersOverTime
    and
    cumulativeMetricsOverTime
    are daily data series for charting.
顶层字段:
channel
runtimeVersion
timespan
embeddedUpdateTotalUniqueUsers
otaTotalUniqueUsers
mostPopularUpdates[]
(每个条目包含
rank
groupId
message
platform
totalUniqueUsers
)、
cumulativeMetricsAtLastTimestamp[]
,以及用于图表展示的
uniqueUsersOverTime
cumulativeMetricsOverTime
对象,包含
labels
datasets
字段。
完整的架构和字段参考,请查看references/channel-insights-schema.md
关键字段:
  • embeddedUpdateTotalUniqueUsers
    是运行嵌入式(二进制打包)构建的用户数量。
  • mostPopularUpdates[]
    totalUniqueUsers
    排序的更新。注意:这是服务器返回的前N个更新;
    otaTotalUniqueUsers
    是该列表的总和,如果有超过N个活跃更新,可能会低估OTA的总覆盖用户数。
  • uniqueUsersOverTime
    cumulativeMetricsOverTime
    是每日数据序列,用于生成图表。

Errors

错误信息

  • Could not find channel with the name <name>
    — typo or wrong account.
  • "No update launches recorded" in the table / empty
    mostPopularUpdates
    in JSON — no OTA update has been launched for that channel + runtime yet. Usually means the channel is still serving the embedded build only.
  • Could not find channel with the name <name>
    — 名称输入错误或账号不正确。
  • 表格中显示"No update launches recorded" / JSON中
    mostPopularUpdates
    为空 — 该渠道+运行时版本尚未有OTA更新被启动。通常意味着渠道仍仅提供嵌入式构建。

Common workflows

常见工作流

Verify the update I just published is healthy

验证刚发布的更新是否正常

bash
undefined
bash
undefined

1. Grab the latest publish on production

1. 获取production分支的最新发布分组

GROUP_ID=$(eas update:list --branch production --json --non-interactive
| jq -r '.currentPage[0].group')
GROUP_ID=$(eas update:list --branch production --json --non-interactive
| jq -r '.currentPage[0].group')

2. Give it some adoption time (minutes to hours), then check crash rate

2. 等待一段时间(几分钟到几小时)让用户采用,然后检查崩溃率

eas update:insights "$GROUP_ID" --json --non-interactive
| jq '.platforms[] | {platform, installs: .totals.installs, crashRate: .totals.crashRatePercent}'

Compare the `crashRate` across platforms and against previous releases; sudden spikes or asymmetric behaviour (iOS spiking while Android is flat, or vice versa) is the signal to investigate.
eas update:insights "$GROUP_ID" --json --non-interactive
| jq '.platforms[] | {platform, installs: .totals.installs, crashRate: .totals.crashRatePercent}'

对比各平台的`crashRate`以及与之前版本的差异;崩溃率突然飙升或平台间表现不一致(iOS飙升而Android平稳,反之亦然)是需要排查的信号。

Compare adoption between two channels

对比两个渠道的用户采用情况

bash
for channel in production staging; do
  echo "--- $channel ---"
  eas channel:insights --channel "$channel" --runtime-version 1.0.6 --json --non-interactive \
    | jq '{
        channel,
        embedded: .embeddedUpdateTotalUniqueUsers,
        ota: .otaTotalUniqueUsers,
        topUpdate: .mostPopularUpdates[0]
      }'
done
bash
for channel in production staging; do
  echo "--- $channel ---"
  eas channel:insights --channel "$channel" --runtime-version 1.0.6 --json --non-interactive \
    | jq '{
        channel,
        embedded: .embeddedUpdateTotalUniqueUsers,
        ota: .otaTotalUniqueUsers,
        topUpdate: .mostPopularUpdates[0]
      }'
done

Detect a rollout regression in the last 24 hours

检测过去24小时内的版本推送回归问题

bash
eas update:insights "$GROUP_ID" --days 1 --json --non-interactive \
  | jq '.platforms[] | select(.totals.crashRatePercent > 1)'
bash
eas update:insights "$GROUP_ID" --days 1 --json --non-interactive \
  | jq '.platforms[] | select(.totals.crashRatePercent > 1)'

Summarize group metrics for release notes

为发布说明汇总分组指标

bash
eas update:view "$GROUP_ID" --insights --days 30
Human-readable group details plus 30 days of launches/failures per platform — suitable for pasting into a changelog or incident review.
bash
eas update:view "$GROUP_ID" --insights --days 30
易读格式的分组详情加上30天内各平台的启动/失败数据 — 适合粘贴到变更日志或事件回顾中。

Output tips

输出技巧

  • Pipe JSON through
    jq
    ; payloads are structured for easy filtering.
  • --json
    implies
    --non-interactive
    , but passing both is explicit and scripting-friendly.
  • Dates in
    daily[].date
    are UTC ISO timestamps; the human-readable table renders them as
    YYYY-MM-DD
    (UTC).
  • The CLI table labels say "Launches" / "Crashes" while JSON uses
    installs
    /
    failedInstalls
    . Same field, different display name.
  • 将JSON输出通过
    jq
    处理;负载结构便于筛选。
  • --json
    隐含
    --non-interactive
    参数,但同时添加两者更明确且适合脚本运行。
  • daily[].date
    中的日期为UTC ISO时间戳;易读格式表格中显示为
    YYYY-MM-DD
    (UTC时区)。
  • CLI表格中的标签为"Launches" / "Crashes",而JSON中使用
    installs
    /
    failedInstalls
    。两者指代同一字段,仅显示名称不同。

Limitations

局限性

  • Unique users across platforms may double-count users who run the same publish on both iOS and Android. The same caveat applies to
    otaTotalUniqueUsers
    in channel insights, which is a sum over
    mostPopularUpdates
    .
  • Fresh publishes may show zeros for a short period while the metrics pipeline catches up.
  • Installs are downloads, not launches: the
    installs
    / "Launches" field counts users who downloaded the manifest and launch asset. A confirmed run only registers on the user's next update check (typically up to 24h later, depending on the app's update policy). So metrics lag the real-world state slightly.
  • Crashes are self-reported:
    failedInstalls
    / "Crashes" counts updates that errored during install/launch and were reported on the next update check. Crashes that don't trigger an update request (e.g. process kill before recovery) won't appear.
  • 跨平台独立用户数可能会重复统计同时在iOS和Android上运行同一发布的用户。渠道洞察中的
    otaTotalUniqueUsers
    也存在同样问题,它是
    mostPopularUpdates
    列表的总和。
  • 刚发布的更新可能在短时间内显示数据为0,因为指标处理流程需要时间同步。
  • 安装量指下载量,而非启动量
    installs
    / "Launches"字段统计的是下载了清单和启动资源的用户数量。确认用户实际运行更新需要等到用户下一次检查更新时(通常最多24小时后,取决于应用的更新策略)。因此指标会略微滞后于实际情况。
  • 崩溃数据为自上报
    failedInstalls
    / "Crashes"统计的是安装/启动过程中出错并在下次检查更新时上报的更新。如果崩溃未触发更新请求(例如进程在恢复前被终止),则不会被统计。