Google Play Console model

Stability by app version

Crashes and ANRs ("app not responding") per app version, against how many active devices run that version, so a bad release stands out against its install base.

Grain
one row per day x package x app version code
Built from
  1. 2
    Raw tables
  2. 2
    Staging
  3. 1
    Core
  4. 1
    Analytics
Reads from Google Play Console
stats_crashes_app_versionstats_installs_app_version
Ships as
Weld and dbt SQL, open source on GitHub
core.google_play.stability_by_app_version
1-- core.google_play.stability_by_app_version
2-- Crashes and ANRs ("app not responding") per app version, against how many active
3-- devices run that version, so a bad release stands out against its install base.
4--
5-- Grain: one row per day x package x app version code.
6-- Depends on: staging.google_play.crashes_by_app_version,
7--             staging.google_play.installs_by_app_version
8--
9-- crashes_per_1000_active_installs is a ratio of the day's crashes to the devices
10-- with that version installed and active in the last 30 days. It is a trend
11-- indicator for comparing versions, not Android vitals' crash rate, which Google
12-- computes per daily active user and does not export.
13
14SELECT
15    COALESCE(c.date_day, i.date_day)                    AS date_day,
16    COALESCE(c.package_name, i.package_name)            AS package_name,
17    COALESCE(c.app_version_code, i.app_version_code)    AS app_version_code,
18    COALESCE(c.daily_crashes, 0)                        AS daily_crashes,
19    COALESCE(c.daily_anrs, 0)                           AS daily_anrs,
20    i.installs_on_active_devices,
21    i.daily_device_upgrades,
22    ROUND(SAFE_DIVIDE(c.daily_crashes, NULLIF(i.installs_on_active_devices, 0)) * 1000, 3)
23                                                        AS crashes_per_1000_active_installs,
24    ROUND(SAFE_DIVIDE(c.daily_anrs, NULLIF(i.installs_on_active_devices, 0)) * 1000, 3)
25                                                        AS anrs_per_1000_active_installs
26FROM {{staging.google_play.crashes_by_app_version}} c
27FULL OUTER JOIN {{staging.google_play.installs_by_app_version}} i
28  ON  i.date_day         = c.date_day
29  AND i.package_name     = c.package_name
30  AND i.app_version_code = c.app_version_code

This model and the 3 it depends on. Deploy them together; refs like {{staging.…}} resolve to the matching folders in Weld, and the dbt view uses source() and ref().

Notes

How it counts. And where it stops.

crashes_per_1000_active_installs is a ratio of the day's crashes to the devices with that version installed and active in the last 30 days. It is a trend indicator for comparing versions, not Android vitals' crash rate, which Google computes per daily active user and does not export.

Raw tables it reads

  • raw.google_play.stats_crashes_app_version
  • raw.google_play.stats_installs_app_version

Put Google Play Console in front
of your agents.

Connect Google Play Console, deploy the models, and ask questions in Claude, Cursor or ChatGPT. Free for 14 days, no credit card.