eas-update-insights

Par expo · skills

Vérifiez l'état de santé des EAS Updates publiées : taux de crash, nombre d'installations/lancements, utilisateurs uniques, taille du payload, et la répartition entre utilisateurs embedded et OTA par channel. À utiliser lorsque l'utilisateur demande comment une update se comporte, si un rollout est sain, combien d'utilisateurs sont sur le build embedded vs OTA, ou souhaite conditionner la CI à la santé d'une update.

npx skills add https://github.com/expo/skills --skill eas-update-insights

Insights des mises à jour EAS

Interrogez la santé des mises à jour EAS publiées directement depuis la CLI : lancements, lancements échoués, taux de crash, utilisateurs uniques, taille de charge utile, répartition des utilisateurs embarqués par rapport à OTA par canal, et les mises à jour les plus populaires par version runtime. Les données sont les mêmes que celles qui alimentent les pages de détails de mise à jour et de canal sur expo.dev ; ces commandes les exposent dans le terminal en format humain et JSON.

Quand utiliser cette skill

Utilisez-la lorsque l'utilisateur souhaite évaluer la santé ou l'adoption d'une mise à jour EAS publiée : taux de crash, nombre d'installations, utilisateurs uniques, taille du bundle, ou la répartition entre utilisateurs embarqués et OTA sur un canal.

Exemples de prompts :

  • « Comment se comporte la dernière mise à jour ? »
  • « La dernière mise à jour est-elle saine ? »
  • « La nouvelle version crash-t-elle plus que la précédente ? »
  • « Combien d'utilisateurs sont sur la dernière mise à jour par rapport au build embarqué ? »
  • « Quelle mise à jour est la plus populaire en production en ce moment ? »
  • « Quelle est la taille de notre bundle de mise à jour ? »

Convient également pour : suivi du déploiement post-publication et détection de régressions.

Ne l'utilisez pas lorsque l'utilisateur a besoin de détails de crash par utilisateur ou de rapports au niveau des appareils ; cette skill n'expose que les métriques EAS agrégées.

Prérequis

  • eas-cli installé (npm install -g eas-cli).
  • Connecté : eas login.
  • Pour channel:insights : exécutez depuis un répertoire de projet Expo (la commande résout l'ID du projet à partir de app.json). update:insights nécessite seulement une connexion.

Commandes en un coup d'œil

Commande Objectif
eas update:list Découvrir les groupes de mises à jour récents, leurs IDs group, et les noms de branches
eas update:insights <groupId> Lancements par plateforme, lancements échoués, taux de crash, utilisateurs uniques, taille de charge utile, ventilation quotidienne
eas update:view <groupId> --insights Détails du groupe de mises à jour + les mêmes métriques ajoutées
eas channel:insights --channel <name> --runtime-version <version> Nombres d'utilisateurs embarqués/OTA, mises à jour les plus populaires, métriques cumulatives pour un canal + runtime

Tous supportent --json --non-interactive pour l'analyse programmatique.

Découvrir les IDs

Avant d'interroger les insights pour un groupe de mises à jour, vous avez besoin de son ID group. Utilisez eas update:list avec soit --branch <name> (mises à jour sur cette branche) soit --all (mises à jour sur toutes les branches). Passez toujours --json --non-interactive lors d'une exécution non-interactive ; sans un flag de branche/--all, la commande vous demandera sinon une sélection de branche :

# Dernier group id sur toutes les branches
eas update:list --all --json --non-interactive | jq -r '.currentPage[0].group'

# Dernier group id sur une branche spécifique
eas update:list --branch production --json --non-interactive | jq -r '.currentPage[0].group'

La réponse JSON contient un tableau currentPage avec une entrée par groupe de mises à jour (les deux plateformes d'une même publication sont regroupées en une seule entrée) :

{
  "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
    }
  ]
}

Les entrées contiennent aussi codeSigningKey et rolloutPercentage, mais uniquement quand ces fonctionnalités sont en use pour le groupe (les valeurs non définies sont omises de la sortie JSON).

Quand appelée avec --branch <name>, la réponse inclut aussi name (le nom de la branche) et id (l'ID de la branche) au niveau supérieur.

eas update:insights <groupId>

Affiche lancements, lancements échoués, taux de crash, utilisateurs uniques, nombre d'actifs de lancement, et taille de charge utile moyenne pour un seul groupe de mises à jour, ventilés par plateforme (iOS, Android), plus une ventilation quotidienne des lancements et des échecs.

Utilisation basique

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

Flags

Flag Description
--days <N> Remonter N jours. Par défaut : 7. Mutuellement exclusif avec --start/--end.
--start <iso-date> / --end <iso-date> Plage de temps explicite, ex. --start 2026-04-01 --end 2026-04-15.
--platform <ios\|android> Filtrer une seule plateforme. Omettez pour voir toutes les plateformes du groupe.
--json Sortie lisible par machine. Implique --non-interactive.
--non-interactive Requis lors de scripts.

Forme de sortie JSON

Niveau supérieur : groupId, timespan (start, end, daysBack), et platforms[] avec une entrée par plateforme pour laquelle le groupe a été publié. Chaque entrée de plateforme a updateId, totals (uniqueUsers, installs, failedInstalls, crashRatePercent), payload (launchAssetCount, averageUpdatePayloadBytes), et une série temporelle daily[] de { date, installs, failedInstalls }.

Pour le schéma complet et la référence des champs, voir references/update-insights-schema.md.

Champs importants pour l'évaluation de la santé :

  • platforms[].totals.crashRatePercent, calculé comme failedInstalls / (installs + failedInstalls) * 100. Zéro quand il n'y a pas d'installations.
  • platforms[].totals.installs et uniqueUsers donnent le signal d'adoption.
  • platforms[].daily est une série temporelle, utile pour détecter un pic soudain d'échecs.

Erreurs

  • Could not find any updates with group ID: "<id>" — le groupe n'existe pas ou vous n'avez pas accès.
  • Update group "<id>" has no ios update (available platforms: android)--platform ios a été utilisé mais le groupe n'a pas été publié pour iOS.
  • EAS Update insights is not supported by this version of eas-cli. Please upgrade ... — le serveur a déprécié un champ sur lequel la CLI dépend. Exécutez npm install -g eas-cli@latest.

eas update:view <groupId> --insights

Étend la sortie standard update:view avec les mêmes insights par plateforme, en ligne.

# Lisible par humain
eas update:view 03d5dfcf-... --insights
eas update:view 03d5dfcf-... --insights --days 30

# JSON : enveloppé comme { updates: [...], insights: {...} }
eas update:view 03d5dfcf-... --json --insights

Sans --insights, update:view se comporte exactement comme avant — pas de changement de forme JSON pour les consommateurs existants. Les flags --days / --start / --end s'appliquent seulement quand --insights est défini ; les passer seuls produit une erreur.

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

Affiche, par canal, combien d'utilisateurs sont sur le build embarqué par rapport aux mises à jour over-the-air et quelles mises à jour attirent le plus de trafic. Doit être exécutée depuis un répertoire de projet Expo.

Utilisation basique

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

Flags

Flag Description
--channel <name> Requis. Le nom du canal (ex. production, staging).
--runtime-version <version> Requis. Doit correspondre exactement à ce qui a été publié. Vérifiez les valeurs runtimeVersion dans update:list.
--days <N> Remonter N jours. Par défaut : 7.
--start / --end Plage de temps explicite, comme update:insights.
--json / --non-interactive Sortie lisible par machine.

Forme de sortie JSON

Niveau supérieur : channel, runtimeVersion, timespan, embeddedUpdateTotalUniqueUsers, otaTotalUniqueUsers, mostPopularUpdates[] (chacun avec rank, groupId, message, platform, totalUniqueUsers), cumulativeMetricsAtLastTimestamp[], plus les objets en forme de graphique uniqueUsersOverTime et cumulativeMetricsOverTime avec labels et datasets.

Pour le schéma complet et la référence des champs, voir references/channel-insights-schema.md.

Champs importants :

  • embeddedUpdateTotalUniqueUsers est le nombre d'utilisateurs exécutant le build embarqué (regroupé dans le binaire).
  • mostPopularUpdates[] sont les mises à jour classées par totalUniqueUsers. Attention : c'est le top-N que le serveur retourne ; otaTotalUniqueUsers est une somme de cette liste et peut sous-estimer la portée OTA totale si plus de top-N mises à jour sont actives.
  • uniqueUsersOverTime et cumulativeMetricsOverTime sont des séries de données quotidiennes pour les graphiques.

Erreurs

  • Could not find channel with the name <name> — typo ou mauvais compte.
  • « No update launches recorded » dans le tableau / mostPopularUpdates vide en JSON — aucune mise à jour OTA n'a été lancée pour ce canal + runtime. Habituellement cela signifie que le canal ne sert que le build embarqué.

Workflows courants

Vérifier que la mise à jour que je viens de publier est saine

# 1. Récupérez la dernière publication sur production
GROUP_ID=$(eas update:list --branch production --json --non-interactive \
  | jq -r '.currentPage[0].group')

# 2. Donnez-lui un peu de temps d'adoption (minutes à heures), puis vérifiez le taux de crash
eas update:insights "$GROUP_ID" --json --non-interactive \
  | jq '.platforms[] | {platform, installs: .totals.installs, crashRate: .totals.crashRatePercent}'

Comparez le crashRate entre plateformes et par rapport aux versions précédentes ; les pics soudains ou les comportements asymétriques (iOS en spike pendant qu'Android est plat, ou vice versa) sont le signal pour enquêter.

Comparer l'adoption entre deux canaux

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

Détecter une régression du déploiement dans les 24 dernières heures

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

Résumer les métriques du groupe pour les notes de publication

eas update:view "$GROUP_ID" --insights --days 30

Détails du groupe lisibles par humain plus 30 jours de lancements/échecs par plateforme — approprié pour coller dans un changelog ou un examen d'incident.

Conseils de sortie

  • Passez JSON dans jq ; les charges utiles sont structurées pour un filtrage facile.
  • --json implique --non-interactive, mais passer les deux est explicite et adapté aux scripts.
  • Les dates dans daily[].date sont des timestamps ISO UTC ; le tableau lisible par humain les rend sous forme YYYY-MM-DD (UTC).
  • Les étiquettes du tableau de la CLI disent « Launches » / « Crashes » tandis que JSON utilise installs / failedInstalls. Même champ, nom d'affichage différent.

Limitations

  • Utilisateurs uniques entre plateformes peuvent double-compter les utilisateurs qui exécutent la même publication sur iOS et Android. Le même avertissement s'applique à otaTotalUniqueUsers dans les insights de canal, qui est une somme sur mostPopularUpdates.
  • Les publications fraîches peuvent afficher des zéros pendant une courte période tandis que le pipeline de métriques rattrape.
  • Les installations sont des téléchargements, pas des lancements : le champ installs / « Launches » compte les utilisateurs qui ont téléchargé le manifeste et l'actif de lancement. Une exécution confirmée ne s'enregistre que lors du prochain contrôle de mise à jour de l'utilisateur (généralement jusqu'à 24h plus tard, selon la politique de mise à jour de l'application). Les métriques accusent donc un léger décalage par rapport à l'état du monde réel.
  • Les crashes sont auto-signalés : failedInstalls / « Crashes » compte les mises à jour qui ont erré lors de l'installation/lancement et ont été signalées lors du prochain contrôle de mise à jour. Les crashs qui ne déclenchent pas une requête de mise à jour (ex. suppression de processus avant récupération) n'apparaîtront pas.

Skills similaires