📊eas-update-insights
- プラグイン
- expo
- ライセンス
- MIT
- ソース
- GitHub で見る ↗
説明
公開済みの EAS Updates の健全性を確認します。クラッシュ率、インストール数・起動数、ユニークユーザー数、ペイロードサイズ、およびチャンネルごとの組み込みビルドと OTA の利用者割合を取得できます。 次のような場合に使用: - あるアップデートのパフォーマンスを確認したい - ロールアウトが正常に進んでいるか確認したい - 組み込みビルドと OTA それぞれの利用ユーザー数を把握したい - アップデートの健全性を基準に CI をゲートしたい
原文を表示
Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.
ユースケース
- ✓アップデートのパフォーマンス確認
- ✓ロールアウト状況の確認
- ✓組み込みビルドとOTA利用者数の把握
- ✓健全性に基づくCI制御
本文(日本語訳)
EAS Update Insights
公開済みの EAS Update の健全性を CLI から直接クエリできます。 取得できる情報は、起動回数・起動失敗回数・クラッシュ率・ユニークユーザー数・ペイロードサイズ・チャネルごとの組み込みビルド vs OTA ユーザーの内訳・ランタイムバージョンごとの人気 Update などです。 このデータは expo.dev の Update・チャネル詳細ページを動かしているものと同一であり、これらのコマンドはそれをターミナル上で人間が読みやすい形式および JSON 形式で表示します。
このスキルを使うべき場面
次のような場合に使用: 公開済みの EAS Update の健全性や採用状況を確認したいとき — クラッシュ率、インストール数、ユニークユーザー数、バンドルサイズ、チャネル上の組み込みビルドと OTA ユーザーの内訳など。
プロンプト例:
- 「最新の Update の状態はどう?」
- 「最新の Update は健全な状態?」
- 「新しいリリースは前のリリースよりクラッシュが増えている?」
- 「最新の Update に乗っているユーザー数と組み込みビルドのユーザー数は?」
- 「今、production で一番人気の Update はどれ?」
- 「Update バンドルのサイズはどのくらい?」
また、公開後のロールアウト監視やリグレッション検出にも適しています。
次のような場合には使用しないこと: ユーザーごとのクラッシュ詳細やデバイスレベルのレポートが必要な場合。 このスキルが公開するのは EAS の集計メトリクスのみです。
前提条件
eas-cliがインストールされていること(npm install -g eas-cli)- ログイン済みであること:
eas login channel:insightsを使う場合: Expo プロジェクトディレクトリ内で実行すること(コマンドはapp.jsonからプロジェクト ID を解決します)。update:insightsはログインのみで使用可能です。
コマンド一覧
| コマンド | 目的 |
|---|---|
eas update:list |
最近の Update グループ、その group ID、ブランチ名を確認する |
eas update:insights <groupId> |
プラットフォームごとの起動回数・起動失敗回数・クラッシュ率・ユニークユーザー数・ペイロードサイズ・日次内訳 |
eas update:view <groupId> --insights |
Update グループの詳細に同じメトリクスを追記した形で表示 |
eas channel:insights --channel <name> --runtime-version <version> |
チャネル+ランタイムごとの組み込み/OTA ユーザー数・人気 Update・累積メトリクス |
いずれも --json --non-interactive でプログラム的なパースに対応しています。
ID の調べ方
Update グループのインサイトをクエリする前に、その group ID が必要です。
eas update:list に --branch <name>(特定ブランチの Update)または --all(全ブランチの Update)を付けて実行してください。
非インタラクティブ環境では必ず --json --non-interactive を渡してください。
--branch / --all フラグなしで実行すると、ブランチ選択のプロンプトが表示されます。
# 全ブランチの中で最新のグループ ID を取得
eas update:list --all --json --non-interactive | jq -r '.currentPage[0].group'
# 特定ブランチの最新グループ ID を取得
eas update:list --branch production --json --non-interactive | jq -r '.currentPage[0].group'
JSON レスポンスには currentPage 配列が含まれ、Update グループ 1 件につき 1 エントリが格納されます(同一パブリッシュの両プラットフォームは 1 エントリにまとめられます)。
{
"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>
単一の Update グループについて、起動回数・起動失敗回数・クラッシュ率・ユニークユーザー数・起動アセット数・平均ペイロードサイズを プラットフォーム(iOS / Android)ごと に表示します。加えて、起動回数と失敗回数の日次内訳も確認できます。
基本的な使い方
eas update:insights 03d5dfcf-736c-475a-8730-af039c3f4d06
フラグ
| フラグ | 説明 |
|---|---|
--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 出力の構造
トップレベルには groupId・timespan(start・end・daysBack)・platforms[] が含まれます。
platforms[] にはグループが公開されたプラットフォームごとに 1 エントリが入ります。
各プラットフォームエントリは 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— 時系列データ。障害の急増を検知するのに役立ちます。
エラー
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
標準の update:view の出力に、同じプラットフォームごとのインサイトをインラインで追記します。
# 人間が読みやすい形式
eas update:view 03d5dfcf-... --insights
eas update:view 03d5dfcf-... --insights --days 30
# JSON: { updates: [...], insights: {...} } の形式でラップされる
eas update:view 03d5dfcf-... --json --insights
--insights を付けない場合、update:view は従来どおりの動作になります — 既存の利用者向けに JSON の構造変更はありません。
--days / --start / --end フラグは --insights と組み合わせた場合のみ有効です。これらを単独で渡すとエラーになります。
eas channel:insights --channel <name> --runtime-version <version>
チャネルごとに、組み込みビルドを利用しているユーザー数と OTA Update を利用しているユーザー数、および最もトラフィックを集めている Update を表示します。 Expo プロジェクトディレクトリ内で実行する必要があります。
基本的な使い方
eas channel:insights --channel production --runtime-version 1.0.6
フラグ
| フラグ | 説明 |
|---|---|
--channel <name> |
必須。 チャネル名(例: production、staging)。 |
--runtime-version <version> |
必須。 公開時の値と完全一致させること。値は update:list の runtimeVersion で確認。 |
--days <N> |
過去 N 日分を参照。デフォルト: 7。 |
--start / --end |
update:insights と同様の明示的な期間指定。 |
--json / --non-interactive |
機械可読形式で出力。 |
JSON 出力の構造
トップレベルには以下が含まれます:
channel・runtimeVersion・timespan・embeddedUpdateTotalUniqueUsers・otaTotalUniqueUsers・mostPopularUpdates[](各エントリに rank・groupId・message・platform・totalUniqueUsers)・cumulativeMetricsAtLastTimestamp[]、さらにチャート用の uniqueUsersOverTime・cumulativeMetricsOverTime(labels と datasets を持つオブジェクト)。
完全なスキーマとフィールドリファレンスは references/channel-insights-schema.md を参照してください。
重要なフィールド:
embeddedUpdateTotalUniqueUsers— 組み込み(バイナリにバンドルされた)ビルドを利用しているユーザー数。mostPopularUpdates[]—totalUniqueUsersでランク付けされた Update の一覧。注意: サーバーが返す上位 N 件のみが対象です。otaTotalUniqueUsersはそのリストの合計であり、上位 N 件を超えて有効な Update が存在する場合は OTA 全体のリーチが過小計上される可能性があります。uniqueUsersOverTimeとcumulativeMetricsOverTime— チャート描画用の日次データ系列。
エラー
Could not find channel with the name <name>— チャネル名のタイポ、またはアカウントが異なります。- テーブルに「No update launches recorded」/ JSON の
mostPopularUpdatesが空 — そのチャネル+ランタイムでは OTA Update がまだ一度も起動されていません。通常、チャネルがまだ組み込みビルドのみを配信している状態を意味します。
よくあるワークフロー
公開した Update が健全かどうかを確認する
# 1. production の最新パブリッシュのグループ ID を取得
GROUP_ID=$(eas update:list --branch production --json --non-interactive \
| jq -r '.currentPage[0].group')
# 2. 一定時間(数分〜数時間)待って採用が進んだ後、クラッシュ率を確認
eas update:insights "$GROUP_ID" --json --non-interactive \
| jq '.platforms[] | {platform, installs: .totals.installs, crashRate: .totals.crashRatePercent}'
プラットフォーム間での crashRate を比較し、過去のリリースとも対比してください。
急激な上昇や非対称な挙動(iOS が急増しているのに Android は横ばい、またはその逆)が調査のサインです。
2 つのチャネルの採用状況を比較する
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
過去 24 時間のロールアウトリグレッションを検出する
eas update:insights "$GROUP_ID" --days 1 --json --non-interactive \
| jq '.platforms[] | select(.totals.crashRatePercent > 1)'
リリースノート用にグループのメトリクスをまとめる
eas update:view "$GROUP_ID" --insights --days 30
原文(English)を表示
EAS Update Insights
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.
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.
Prerequisites
eas-cliinstalled (npm install -g eas-cli).- Logged in:
eas login. - For
channel:insights: run from an Expo project directory (the command resolves the project ID fromapp.json).update:insightsonly needs a login.
Commands at a glance
| Command | Purpose |
|---|---|
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.
Discovering IDs
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:
# Latest group id across all branches
eas update:list --all --json --non-interactive | jq -r '.currentPage[0].group'
# 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):
{
"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: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.
Basic use
eas update:insights 03d5dfcf-736c-475a-8730-af039c3f4d06
Flags
| Flag | Description |
|---|---|
--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. |
JSON output shape
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 asfailedInstalls / (installs + failedInstalls) * 100. Zero when there are no installs.platforms[].totals.installsanduniqueUsersgive the adoption signal.platforms[].dailyis a time series, useful for spotting a sudden spike in failures.
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 ioswas 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. Runnpm install -g eas-cli@latest.
eas update:view <groupId> --insights
Extends the standard update:view output with the same per-platform insights, inline.
# Human-readable
eas update:view 03d5dfcf-... --insights
eas update:view 03d5dfcf-... --insights --days 30
# JSON: wrapped as { 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 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.
Basic use
eas channel:insights --channel production --runtime-version 1.0.6
Flags
| Flag | Description |
|---|---|
--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. |
JSON output shape
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:
embeddedUpdateTotalUniqueUsersis the count of users running the embedded (binary-bundled) build.mostPopularUpdates[]is updates ranked bytotalUniqueUsers. Caveat: this is the top-N the server returns;otaTotalUniqueUsersis a sum of that list and may undercount total OTA reach if more than top-N updates are active.uniqueUsersOverTimeandcumulativeMetricsOverTimeare daily data series for charting.
Errors
Could not find channel with the name <name>— typo or wrong account.- "No update launches recorded" in the table / empty
mostPopularUpdatesin JSON — no OTA update has been launched for that channel + runtime yet. Usually means the channel is still serving the embedded build only.
Common workflows
Verify the update I just published is healthy
# 1. Grab the latest publish on production
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
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.
Compare adoption between two channels
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
eas update:insights "$GROUP_ID" --days 1 --json --non-interactive \
| jq '.platforms[] | select(.totals.crashRatePercent > 1)'
Summarize group metrics for release notes
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.
Output tips
- Pipe JSON through
jq; payloads are structured for easy filtering. --jsonimplies--non-interactive, but passing both is explicit and scripting-friendly.- Dates in
daily[].dateare UTC ISO timestamps; the human-readable table renders them asYYYY-MM-DD(UTC). - The CLI table labels say "Launches" / "Crashes" while JSON uses
installs/failedInstalls. Same field, different display name.
Limitations
- Unique users across platforms may double-count users who run the same publish on both iOS and Android. The same caveat applies to
otaTotalUniqueUsersin channel insights, which is a sum overmostPopularUpdates. - 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.
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。