npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rawdash/connector-google-play-console

v0.28.2

Published

Rawdash connector for Google Play Console - syncs Play Developer Reporting API daily app vitals (crash rate, ANR rate, ratings, error counts) into the six-shape storage model

Readme

@rawdash/connector-google-play-console

npm version license

Sync daily Android app vitals from the Play Developer Reporting API (crash rate, ANR rate, error counts) plus user review ratings from the Android Publisher API.

Install

npm install @rawdash/connector-google-play-console

Authentication

Authenticate against the Play Developer Reporting API and the Android Publisher API with a Google service account JSON key. The service account must be linked to your Play Console developer account.

  1. In Google Cloud, create a service account at IAM & Admin -> Service Accounts and download a JSON key.
  2. Enable both the "Google Play Developer Reporting API" and the "Google Play Android Developer API" on the Cloud project.
  3. In Google Play Console open Setup -> API access, link the same Cloud project, then invite the service account email and grant it at least the "View app information and download bulk reports" permission for the app you want to sync.
  4. For the gplay_installs_* resources, grant bucket access inside Play Console, not Google Cloud IAM: the install reports live in a Google-managed Cloud Storage bucket provisioned for your developer account. In Play Console -> Users & permissions, give the service account the account-level "View app information and download bulk reports" permission set to Global (changes can take a few hours to propagate), then copy the bucket id from the Download reports page (the Cloud Storage URI starts with gs://pubsite_prod_...) into installsBucketId.
  5. Store the service account JSON as a secret and reference it as serviceAccountJson: secret("GPLAY_SA_JSON").
  6. Set packageName to the reverse-DNS application id of the app (e.g. com.example.app).

Configuration

| Field | Type | Required | Description | | -------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | packageName | string | Yes | Reverse-DNS application id of the Android app (e.g. com.example.app). Visible in the Play Console URL and on Google Play under "About". | | serviceAccountJson | secret | Yes | Contents of the JSON key file for a Google service account that has been granted access to your Play Console developer account with at least the "View app information and download bulk reports" permission. Create one at Google Cloud -> IAM & Admin -> Service Accounts. | | lookbackDays | number | No | How many calendar days to fetch on a full sync. Defaults to 30. The Play Developer Reporting API exposes daily metrics with a typical 2-3 day reporting lag. | | reviewLimit | number | No | How many of the most-recent user reviews to emit as gplay_app_ratings samples. Defaults to 200. Reviews are fetched then ranked newest-first before this cap is applied. The Android Publisher reviews API only surfaces reviews from roughly the past week, so this is a rolling sample, not a full history. | | installsBucketId | string | No | Cloud Storage bucket id that holds your Play Console reports (e.g. pubsite_prod_rev_01234567890987654321), shown via "Copy Cloud Storage URI" on the Play Console Download reports page. Required only for the gplay_installs_* resources, which read the monthly stats/installs CSV reports. The bucket is Google-managed; the service account is granted access through Play Console (Users & permissions -> "View app information and download bulk reports", set to Global), not Google Cloud IAM. |

Resources

  • apps (entity) - Android app the connector is syncing. One entity per configured packageName, derived from the connector config; the Play Store listing title is only reachable through an Android Publisher edit and is not fetched.
    • package_name: Reverse-DNS application id (e.g. com.example.app).
  • gplay_crash_rate_by_day (metric) - Daily crash rate reported by the Play Developer Reporting API. Primary value is the crashRate metric (fraction of distinct users that experienced a crash).
    • Endpoint: POST /v1beta1/apps/{packageName}/crashRateMetricSet:query
    • Unit: crashRate
    • Granularity: day
    • Dimensions: date, package_name
  • gplay_anr_rate_by_day (metric) - Daily ANR (Application Not Responding) rate. Primary value is the anrRate metric (fraction of distinct users that experienced an ANR).
    • Endpoint: POST /v1beta1/apps/{packageName}/anrRateMetricSet:query
    • Unit: anrRate
    • Granularity: day
    • Dimensions: date, package_name
  • gplay_error_count_by_day (metric) - Daily count of error reports (crashes + ANRs + handled errors) from the Play Developer Reporting API.
    • Endpoint: POST /v1beta1/apps/{packageName}/errorCountMetricSet:query
    • Unit: reports
    • Granularity: day
    • Dimensions: date, package_name
  • gplay_app_ratings (metric) - Rolling per-review star ratings sampled from the most-recent user reviews via the Android Publisher reviews API (default 200, configurable via reviewLimit). Each sample carries one review with its star rating (1-5) as the value.
    • Endpoint: GET /androidpublisher/v3/applications/{packageName}/reviews
    • Unit: stars
    • Dimensions: package_name, review_id, reviewer_language, device, app_version_name, android_os_version
    • Not the lifetime average shown on the Play Store. The reviews API only returns reviews from roughly the past week, so this is a rolling sample; average over a time window downstream for a smoothed rating.
  • gplay_installs_overview_by_day (metric) - Daily install statistics for the app from the Play Console monthly installs report (stats/installs overview CSV). Primary value is Daily Device Installs; uninstalls, upgrades, active-device installs and user-keyed counts are carried as additional attributes.
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_overview.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
  • gplay_installs_by_country (metric) - Daily install statistics broken down by country/region from the Play Console monthly installs report (stats/installs country CSV).
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_country.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name, country
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
  • gplay_installs_by_app_version (metric) - Daily install statistics broken down by app version code from the Play Console monthly installs report (stats/installs app_version CSV).
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_app_version.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name, app_version_code
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
  • gplay_installs_by_device (metric) - Daily install statistics broken down by device from the Play Console monthly installs report (stats/installs device CSV).
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_device.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name, device
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
  • gplay_installs_by_os_version (metric) - Daily install statistics broken down by Android OS version from the Play Console monthly installs report (stats/installs os_version CSV).
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_os_version.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name, android_os_version
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
  • gplay_installs_by_language (metric) - Daily install statistics broken down by language from the Play Console monthly installs report (stats/installs language CSV).
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_language.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name, language
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
  • gplay_installs_by_carrier (metric) - Daily install statistics broken down by carrier from the Play Console monthly installs report (stats/installs carrier CSV).
    • Endpoint: GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_carrier.csv
    • Unit: installs
    • Granularity: day
    • Dimensions: date, package_name, carrier
    • Measures: daily_device_installs, daily_device_uninstalls, daily_device_upgrades, current_device_installs, active_device_installs, current_user_installs, total_user_installs, daily_user_installs, daily_user_uninstalls
    • Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.

Example

import {
  defineConfig,
  defineDashboard,
  defineMetric,
  secret,
} from '@rawdash/core';

const googlePlayConsole = {
  name: 'googlePlayConsole',
  connectorId: 'google-play-console',
  config: {
    packageName: 'com.example.app',
    serviceAccountJson: secret('GPLAY_SA_JSON'),
    lookbackDays: 30,
  },
};

export default defineConfig({
  connectors: [googlePlayConsole],
  dashboards: {
    mobile: defineDashboard({
      widgets: {
        crashRate: {
          kind: 'timeseries',
          title: 'Daily crash rate',
          window: '30d',
          metric: defineMetric({
            connector: googlePlayConsole,
            shape: 'metric',
            name: 'gplay_crash_rate_by_day',
            fn: 'avg',
          }),
        },
      },
    }),
  },
});

Rate limits

The Play Developer Reporting API enforces a per-project quota (default 60 requests per minute); 429 responses are retried with exponential backoff.

Limitations

  • Daily vitals (crash rate, ANR rate, error counts) have a 2-3 day reporting lag on the Play Developer Reporting API; incremental syncs refetch the trailing 3 days. Metric days are reported on the America/Los_Angeles calendar, the only timezone the API supports for daily aggregation.
  • gplay_app_ratings is a rolling sample of recent reviews from the Android Publisher reviews API (default 200, configurable via reviewLimit). Each sample carries one review with its star rating (1-5) as the value; this is not the lifetime average shown on the Play Store, and the reviews API only surfaces reviews from roughly the past week.
  • The apps entity carries only the configured package name; the Play Store listing title is available solely through an Android Publisher edit, which this connector does not create.
  • The gplay_installs_* resources read the monthly stats/installs CSV reports from your Play Console Cloud Storage bucket, not the Reporting API; they require installsBucketId plus the account-level "View app information and download bulk reports" permission granted to the service account in Play Console (the bucket is Google-managed; access is not configured through Google Cloud IAM). Files are published monthly (with daily rows) and a few days in arrears, so the current month fills in over time and the most recent days lag. Earnings/financial reports remain out of scope.

Links

License

Apache-2.0