eas-update-insights
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseEAS 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
前提条件
- installed (
eas-cli).npm install -g eas-cli - Logged in: .
eas login - For : run from an Expo project directory (the command resolves the project ID from
channel:insights).app.jsononly needs a login.update:insights
- 已安装(执行
eas-cli)。npm install -g eas-cli - 已登录:执行。
eas login - 使用命令时:需在Expo项目目录下运行(该命令会从
channel:insights中解析项目ID)。app.json仅需登录即可使用。update:insights
Commands at a glance
命令概览
| Command | Purpose |
|---|---|
| Discover recent update groups, their |
| Per-platform launches, failed launches, crash rate, unique users, payload size, daily breakdown |
| Update group details + the same metrics appended |
| Embedded/OTA user counts, most popular updates, cumulative metrics for a channel + runtime |
All of these support for programmatic parsing.
--json --non-interactive| 命令 | 用途 |
|---|---|
| 查看最近的更新分组、它们的 |
| 按平台查看启动次数、启动失败次数、崩溃率、独立用户数、负载大小,以及每日数据明细 |
| 更新分组详情 + 附加上述相同指标 |
| 嵌入式/OTA用户数量、最受欢迎的更新、渠道+运行时的累计指标 |
所有命令均支持参数,以便程序化解析。
--json --non-interactiveDiscovering IDs
获取ID
Before querying insights for an update group, you need its ID. Use with either (updates on that branch) or (updates across all branches). Always pass when running non-interactively; without a branch/ flag the command will otherwise prompt for a branch selection:
groupeas update:list--branch <name>--all--json --non-interactive--allbash
undefined在查询更新分组的洞察数据前,你需要它的 ID。使用命令,可搭配(查看该分支的更新)或(查看所有分支的更新)参数。非交互式运行时请务必添加参数;若未指定分支或参数,命令会提示选择分支:
groupeas update:list--branch <name>--all--json --non-interactive--allbash
undefinedLatest 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 and , but only when those features are in use for the group (undefined values are omitted from the JSON output).
codeSigningKeyrolloutPercentageWhen called with , the response also includes (the branch name) and (the branch ID) at the top level.
--branch <name>nameideas 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
}
]
}条目还包含和字段,但仅当该分组使用这些功能时才会显示(未定义的值不会出现在JSON输出中)。
codeSigningKeyrolloutPercentage当使用参数时,响应的顶层还会包含(分支名称)和(分支ID)字段。
--branch <name>nameideas update:insights <groupId>
eas update:insights <groupId>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-af039c3f4d06bash
eas update:insights 03d5dfcf-736c-475a-8730-af039c3f4d06Flags
参数
| Flag | Description |
|---|---|
| Look back N days. Default: 7. Mutually exclusive with |
| Explicit time range, e.g. |
| Filter to a single platform. Omit to see all platforms in the group. |
| Machine-readable output. Implies |
| Required when scripting. |
| 参数 | 描述 |
|---|---|
| 查看过去N天的数据。默认值:7。与 |
| 指定时间范围,例如 |
| 筛选单个平台。省略则查看分组内的所有平台。 |
| 机器可读格式输出。隐含 |
| 脚本运行时必填。 |
JSON output shape
JSON输出结构
Top level: , (, , ), and with one entry per platform the group was published to. Each platform entry has , (, , , ), (, ), and a time series of .
groupIdtimespanstartenddaysBackplatforms[]updateIdtotalsuniqueUsersinstallsfailedInstallscrashRatePercentpayloadlaunchAssetCountaverageUpdatePayloadBytesdaily[]{ date, installs, failedInstalls }For the complete schema and field reference, see references/update-insights-schema.md.
Fields that matter for health assessment:
- , computed as
platforms[].totals.crashRatePercent. Zero when there are no installs.failedInstalls / (installs + failedInstalls) * 100 - and
platforms[].totals.installsgive the adoption signal.uniqueUsers - is a time series, useful for spotting a sudden spike in failures.
platforms[].daily
顶层字段:、(包含、、),以及数组,每个条目对应分组发布的一个平台。每个平台条目包含、(包含、、、)、(包含、),以及时间序列数组,每个元素为。
groupIdtimespanstartenddaysBackplatforms[]updateIdtotalsuniqueUsersinstallsfailedInstallscrashRatePercentpayloadlaunchAssetCountaverageUpdatePayloadBytesdaily[]{ date, installs, failedInstalls }完整的架构和字段参考,请查看references/update-insights-schema.md。
健康评估的关键字段:
- ,计算公式为
platforms[].totals.crashRatePercent。当没有安装量时该值为0。failedInstalls / (installs + failedInstalls) * 100 - 和
platforms[].totals.installs反映用户采用情况。uniqueUsers - 时间序列可用于发现失败次数的突然飙升。
platforms[].daily
Errors
错误信息
- — group doesn't exist or you lack access.
Could not find any updates with group ID: "<id>" - —
Update group "<id>" has no ios update (available platforms: android)was used but the group wasn't published for iOS.--platform ios - — the server deprecated a field the CLI relies on. Run
EAS Update insights is not supported by this version of eas-cli. Please upgrade ....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)参数,但该分组未针对iOS发布。--platform ios - — 服务器已弃用CLI依赖的某个字段。请执行
EAS Update insights is not supported by this version of eas-cli. Please upgrade ...升级。npm install -g eas-cli@latest
eas update:view <groupId> --insights
eas update:view <groupId> --insightseas update:view <groupId> --insights
eas update:view <groupId> --insightsExtends the standard output with the same per-platform insights, inline.
update:viewbash
undefined在标准输出的基础上,附加相同的按平台洞察数据。
update:viewbash
undefinedHuman-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>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.6bash
eas channel:insights --channel production --runtime-version 1.0.6Flags
参数
| Flag | Description |
|---|---|
| Required. The channel name (e.g. |
| Required. Match exactly what was published. Check |
| Look back N days. Default: 7. |
| Explicit time range, like |
| Machine-readable output. |
| 参数 | 描述 |
|---|---|
| 必填。渠道名称(例如 |
| 必填。需与发布时的版本完全匹配。可通过 |
| 查看过去N天的数据。默认值:7。 |
| 指定时间范围,与 |
| 机器可读格式输出。 |
JSON output shape
JSON输出结构
Top level: , , , , , (each with , , , , ), , plus chart-shaped and objects with and .
channelruntimeVersiontimespanembeddedUpdateTotalUniqueUsersotaTotalUniqueUsersmostPopularUpdates[]rankgroupIdmessageplatformtotalUniqueUserscumulativeMetricsAtLastTimestamp[]uniqueUsersOverTimecumulativeMetricsOverTimelabelsdatasetsFor the complete schema and field reference, see references/channel-insights-schema.md.
Fields that matter:
- is the count of users running the embedded (binary-bundled) build.
embeddedUpdateTotalUniqueUsers - is updates ranked by
mostPopularUpdates[]. Caveat: this is the top-N the server returns;totalUniqueUsersis a sum of that list and may undercount total OTA reach if more than top-N updates are active.otaTotalUniqueUsers - and
uniqueUsersOverTimeare daily data series for charting.cumulativeMetricsOverTime
顶层字段:、、、、、(每个条目包含、、、、)、,以及用于图表展示的和对象,包含和字段。
channelruntimeVersiontimespanembeddedUpdateTotalUniqueUsersotaTotalUniqueUsersmostPopularUpdates[]rankgroupIdmessageplatformtotalUniqueUserscumulativeMetricsAtLastTimestamp[]uniqueUsersOverTimecumulativeMetricsOverTimelabelsdatasets完整的架构和字段参考,请查看references/channel-insights-schema.md。
关键字段:
- 是运行嵌入式(二进制打包)构建的用户数量。
embeddedUpdateTotalUniqueUsers - 按
mostPopularUpdates[]排序的更新。注意:这是服务器返回的前N个更新;totalUniqueUsers是该列表的总和,如果有超过N个活跃更新,可能会低估OTA的总覆盖用户数。otaTotalUniqueUsers - 和
uniqueUsersOverTime是每日数据序列,用于生成图表。cumulativeMetricsOverTime
Errors
错误信息
- — typo or wrong account.
Could not find channel with the name <name> - "No update launches recorded" in the table / empty in JSON — no OTA update has been launched for that channel + runtime yet. Usually means the channel is still serving the embedded build only.
mostPopularUpdates
- — 名称输入错误或账号不正确。
Could not find channel with the name <name> - 表格中显示"No update launches recorded" / JSON中为空 — 该渠道+运行时版本尚未有OTA更新被启动。通常意味着渠道仍仅提供嵌入式构建。
mostPopularUpdates
Common workflows
常见工作流
Verify the update I just published is healthy
验证刚发布的更新是否正常
bash
undefinedbash
undefined1. Grab the latest publish on production
1. 获取production分支的最新发布分组
GROUP_ID=$(eas update:list --branch production --json --non-interactive
| jq -r '.currentPage[0].group')
| jq -r '.currentPage[0].group')
GROUP_ID=$(eas update:list --branch production --json --non-interactive
| jq -r '.currentPage[0].group')
| 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}'
| 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}'
| 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]
}'
donebash
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]
}'
doneDetect 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 30Human-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 ; payloads are structured for easy filtering.
jq - implies
--json, but passing both is explicit and scripting-friendly.--non-interactive - Dates in are UTC ISO timestamps; the human-readable table renders them as
daily[].date(UTC).YYYY-MM-DD - The CLI table labels say "Launches" / "Crashes" while JSON uses /
installs. Same field, different display name.failedInstalls
- 将JSON输出通过处理;负载结构便于筛选。
jq - 隐含
--json参数,但同时添加两者更明确且适合脚本运行。--non-interactive - 中的日期为UTC ISO时间戳;易读格式表格中显示为
daily[].date(UTC时区)。YYYY-MM-DD - 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 in channel insights, which is a sum over
otaTotalUniqueUsers.mostPopularUpdates - Fresh publishes may show zeros for a short period while the metrics pipeline catches up.
- Installs are downloads, not launches: the / "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.
installs - Crashes are self-reported: / "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.
failedInstalls
- 跨平台独立用户数可能会重复统计同时在iOS和Android上运行同一发布的用户。渠道洞察中的也存在同样问题,它是
otaTotalUniqueUsers列表的总和。mostPopularUpdates - 刚发布的更新可能在短时间内显示数据为0,因为指标处理流程需要时间同步。
- 安装量指下载量,而非启动量:/ "Launches"字段统计的是下载了清单和启动资源的用户数量。确认用户实际运行更新需要等到用户下一次检查更新时(通常最多24小时后,取决于应用的更新策略)。因此指标会略微滞后于实际情况。
installs - 崩溃数据为自上报:/ "Crashes"统计的是安装/启动过程中出错并在下次检查更新时上报的更新。如果崩溃未触发更新请求(例如进程在恢复前被终止),则不会被统计。
failedInstalls