Skip to main content
Google Play is Google’s distribution platform for Android apps. The Play Console publishes everything behind your app’s performance — installs and uninstalls, ratings and reviews, store listing conversion, subscriptions, estimated sales and the earnings you are actually paid — as monthly report files in a private Cloud Storage bucket belonging to your developer account. This source reads those reports.

Configuring Google Play as a Source

In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the Google Play option from the list of connectors. Click Next and you’ll be prompted to add your access.

1. Add account access

Google Play does not expose an API for these numbers: they are only published as report files, and access to them is granted to a Google Cloud service account that you invite into your Play Console developer account. Prepare it before starting the setup:
1

Create a service account in Google Cloud

In the Google Cloud console, create a service account and, under its Keys tab, add a key of type JSON. Save the file that is downloaded — Google does not let you download it again.
2

Invite the service account into Play Console

In Play Console, open Users and permissions, click Invite new users and enter the service account’s email address (it ends in .iam.gserviceaccount.com).
3

Grant it permission to download reports

On the Account permissions tab of the invitation, turn on View app information and download bulk reports. Add View financial data, orders, and cancellation survey responses as well if you want the sales and earnings tables — without it, those two tables stay empty.
4

Copy the Cloud Storage URI

In Play Console, open Download reports and use the Copy Cloud Storage URI button. It looks like gs://pubsite_prod_rev_0000000000000000000.
The following configurations are available:
  • Service account credentials (JSON file): The JSON key file you downloaded from Google Cloud. The credential is used read-only — the source only lists and downloads report files.
  • Cloud Storage URI: The location you copied from the Download reports page.
  • Application IDs: (Optional) Restrict the sync to specific apps, one application id per entry, such as com.example.app. Leave it empty to load every app in the developer account.
  • Start Date: (Optional) The earliest month to load. Google publishes one report file per month, so any date inside a month loads that whole month. Leave it empty to load all the history kept in the bucket.
Once you’re done, click Next.
Google captures report data daily but publishes it three to seven days later, and the earnings report only once a month, typically by the fifth of the following month. A source created today will show the most recent days as missing until Google publishes them.

2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones. Each of the installs, ratings and crashes reports comes in two versions: an overview, with one row per day, and a by dimension version, with the same metrics split by country, device, language, app version, carrier or OS version. The overview is not the sum of the breakdown — Google reports values it could not attribute only in the overview — so selecting both and adding them together counts the same activity twice.
Tip: The stream can be found more easily by typing its name.
Select the streams and click Next.

3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.
  • Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
  • Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
  • Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
  • Sync Type: you can choose between INCREMENTAL and FULL_TABLE.
    • Incremental: every time the extraction happens, we’ll get only the new data - which is good if, for example, you want to keep every record ever fetched.
    • Full table: every time the extraction happens, we’ll get the current state of the data - which is good if, for example, you don’t want to have deleted data in your catalog.
Once you are done configuring, click Next.

4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. Google rewrites the current month’s report files once a day, so a daily trigger matches how often new data actually exists. Optionally, you can define some additional settings:
  • Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
  • Determine when to execute an Additional Full Sync. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.
Once you are ready, click Next to finalize the setup.

5. Check your new source

You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.
For you to be able to see it on your Catalog, you need at least one successful source run.

How Google Play publishes this data

These are Google’s own rules, not Nekt’s, and they shape what you can expect to see:
  • One file per app, per month. A month’s file is rewritten in place as days are added, and Google restates days that were already published when late data arrives. The source tracks when each file was last rewritten and re-reads exactly the files that changed, so corrections update the existing rows instead of duplicating them.
  • Data appears three to seven days after it is captured. The earnings report is generated once a month, typically by the fifth of the following month.
  • Sales and earnings never match exactly. Estimated sales is what buyers were charged; earnings is the reconciled statement of what Google pays you, after fees, taxes and currency conversion. Only earnings carries the payout figure.
  • Store performance starts in March 2021. The reports it replaced, Retained installers and Buyers 7-day, hold no data after August 2021 and are not read by this source.
  • Permissions decide which tables fill. Sales and earnings need the financial data permission on the service account; without it those tables stay empty while every other table loads normally.
  • Search terms are thresholded. Google only names a search term in the store performance report once it is above its own reporting threshold; everything below is grouped.
Every row also carries the report month, the report file it was read from, its position inside that file and when Google last rewrote it, so any number in your catalog can be traced back to its source file.

Streams and Fields

Available streams

The table below lists every stream, its slug (the exact identifier to pass when creating the source via API) and a short description.
Every stream replicates incrementally on source_file_modified_at, the moment Google last rewrote the report file the row came from.

Fields by stream

Below you’ll find the main data streams from Google Play and their corresponding fields:
Daily install activity for each app, one row per day.Key Fields:
  • date - Day the metrics were measured
  • package_name - Application id of the app, such as com.example.app
  • daily_device_installs - Devices that newly installed the app on this day
  • daily_device_uninstalls - Devices that uninstalled the app on this day
  • daily_device_upgrades - Devices that upgraded to a new version on this day
  • current_device_installs - Devices that had the app installed at the end of the day
  • active_device_installs - Devices with the app installed that were active in the last 30 days
  • daily_user_installs - User accounts that installed the app for the first time on this day
  • daily_user_uninstalls - User accounts that removed the app from every device they own
  • current_user_installs - User accounts with the app installed on at least one device
  • total_user_installs - User accounts that have ever installed the app
The install metrics above, split by one dimension per row.Key Fields:
  • date - Day the metrics were measured
  • package_name - Application id of the app
  • dimension - Which breakdown the row belongs to: country, device, language, app_version, carrier or os_version
  • dimension_value - Value of that breakdown, such as the country or the device model
  • daily_device_installs - Devices that newly installed the app on this day
  • active_device_installs - Devices with the app installed that were active in the last 30 days
  • current_user_installs - User accounts with the app installed on at least one device
How your app is rated, per day and optionally per breakdown.Key Fields:
  • date - Day the ratings were measured
  • package_name - Application id of the app
  • daily_average_rating - Average of the ratings submitted on this day, empty when nobody rated
  • total_average_rating - Average of every rating accumulated so far, the score shown on the store listing
  • dimension / dimension_value - Breakdown and its value, on the by dimension stream only
Stability as reported by users who opted in to sharing crash data.Key Fields:
  • date - Day the errors were reported
  • package_name - Application id of the app
  • daily_crashes - Crashes reported on this day
  • daily_anrs - Application Not Responding errors reported on this day
  • dimension / dimension_value - Breakdown and its value, on the by dimension stream only
The store listing funnel, per country.Key Fields:
  • date - Day the visits were measured
  • package_name - Application id of the app
  • country_region - Country or region the visitors were in
  • store_listing_visitors - Users who viewed the store listing, counted once per user
  • store_listing_acquisitions - Users who first installed the app after viewing the listing
  • store_listing_conversion_rate - Acquisitions divided by visitors, as a fraction between 0 and 1
The same funnel, attributed to what brought the visitor in.Key Fields:
  • date - Day the visits were measured
  • package_name - Application id of the app
  • traffic_source - Channel the visitor arrived through, such as Play Store search or third-party referrers
  • search_term - Search term that led to the listing, when it is above Google’s reporting threshold
  • utm_source - utm_source tag on the store listing link, when the link carried one
  • utm_campaign - utm_campaign tag on the store listing link, when the link carried one
  • store_listing_visitors - Users who viewed the store listing
  • store_listing_acquisitions - Users who first installed the app after viewing the listing
  • store_listing_conversion_rate - Acquisitions divided by visitors
Subscription counts per product, base plan, offer and country.Key Fields:
  • date - Day the counts refer to
  • package_name - Application id of the app
  • product_id - Identifier of the subscription product, as declared in Play Console
  • country - Country the subscribers are billed in
  • base_plan_id - Base plan the counts refer to, empty for older subscriptions
  • offer_id - Offer the subscriber signed up through, when one applied
  • new_subscriptions - Subscriptions started on this day
  • canceled_subscriptions - Subscriptions cancelled on this day, which stay active until the paid period ends
  • active_subscriptions - Subscriptions active at the end of the day
Every review left on your apps, with your replies.Key Fields:
  • review_id - Identifier of the review, taken from the review link
  • package_name - Application id of the reviewed app
  • star_rating - Rating the user gave, 1 to 5
  • review_title - Title of the review, empty for reviews left after Play dropped titles
  • review_text - Body of the review, empty when the user rated without writing
  • reviewer_language - Language the review was written in, such as pt-BR
  • device - Device the reviewer used
  • app_version_code - Version of the app the reviewer was running
  • review_submit_millis_since_epoch - When the review was submitted, in milliseconds since the Unix epoch
  • review_last_update_millis_since_epoch - When the review was last edited
  • developer_reply_text - Text of your reply, when the review was answered
  • developer_reply_millis_since_epoch - When the reply was posted
  • review_link - Play Console link that opens the review
Estimated sales: one row per charge, refund or chargeback Google recorded.Key Fields:
  • order_number - Google order identifier, repeated across the rows of the same order
  • order_charged_date - Date the order was charged
  • order_charged_timestamp - Moment the order was charged, in milliseconds since the Unix epoch
  • financial_status - Charged, Refunded, Charged-back or Partially refunded
  • package_id - Application id the purchase belongs to
  • sku_id - Identifier of the in-app product or subscription that was bought
  • product_title - Display name of the product
  • currency_of_sale - Currency the buyer was charged in
  • item_price - List price in the currency of sale, before taxes
  • taxes_collected - Tax collected on the transaction
  • charged_amount - Total the buyer was charged, negative on refunds and chargebacks
  • country_of_buyer - Country the buyer was in
  • base_plan_id / offer_id - Base plan and offer, for subscription purchases
  • device_model - Device the purchase was made on
The reconciled statement behind your payout, one row per charge, fee, tax or refund.Key Fields:
  • description - What the row settles, usually the order number of the transaction
  • transaction_date - Date of the transaction, as exported by Google
  • transaction_type - Nature of the row: Charge, Google fee, Tax, Refund and so on
  • package_id - Application id the row belongs to
  • sku_id - Identifier of the in-app product or subscription
  • buyer_currency - Currency the buyer was charged in
  • amount_buyer_currency - Amount of the row in the buyer’s currency
  • currency_conversion_rate - Rate used to convert into the merchant currency
  • merchant_currency - Currency you are paid in
  • amount_merchant_currency - Amount of the row in your currency, the figure that adds up to the payout
  • service_fee - Service fee percentage Google applied
  • buyer_country - Country of the buyer