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.- 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.
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.
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.
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.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.
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:Installs overview
Installs overview
Daily install activity for each app, one row per day.Key Fields:
date- Day the metrics were measuredpackage_name- Application id of the app, such as com.example.appdaily_device_installs- Devices that newly installed the app on this daydaily_device_uninstalls- Devices that uninstalled the app on this daydaily_device_upgrades- Devices that upgraded to a new version on this daycurrent_device_installs- Devices that had the app installed at the end of the dayactive_device_installs- Devices with the app installed that were active in the last 30 daysdaily_user_installs- User accounts that installed the app for the first time on this daydaily_user_uninstalls- User accounts that removed the app from every device they owncurrent_user_installs- User accounts with the app installed on at least one devicetotal_user_installs- User accounts that have ever installed the app
Installs by dimension
Installs by dimension
The install metrics above, split by one dimension per row.Key Fields:
date- Day the metrics were measuredpackage_name- Application id of the appdimension- Which breakdown the row belongs to: country, device, language, app_version, carrier or os_versiondimension_value- Value of that breakdown, such as the country or the device modeldaily_device_installs- Devices that newly installed the app on this dayactive_device_installs- Devices with the app installed that were active in the last 30 dayscurrent_user_installs- User accounts with the app installed on at least one device
Ratings overview and Ratings by dimension
Ratings overview and Ratings by dimension
How your app is rated, per day and optionally per breakdown.Key Fields:
date- Day the ratings were measuredpackage_name- Application id of the appdaily_average_rating- Average of the ratings submitted on this day, empty when nobody ratedtotal_average_rating- Average of every rating accumulated so far, the score shown on the store listingdimension/dimension_value- Breakdown and its value, on the by dimension stream only
Crashes overview and Crashes by dimension
Crashes overview and Crashes by dimension
Stability as reported by users who opted in to sharing crash data.Key Fields:
date- Day the errors were reportedpackage_name- Application id of the appdaily_crashes- Crashes reported on this daydaily_anrs- Application Not Responding errors reported on this daydimension/dimension_value- Breakdown and its value, on the by dimension stream only
Store performance by country
Store performance by country
The store listing funnel, per country.Key Fields:
date- Day the visits were measuredpackage_name- Application id of the appcountry_region- Country or region the visitors were instore_listing_visitors- Users who viewed the store listing, counted once per userstore_listing_acquisitions- Users who first installed the app after viewing the listingstore_listing_conversion_rate- Acquisitions divided by visitors, as a fraction between 0 and 1
Store performance by traffic source
Store performance by traffic source
The same funnel, attributed to what brought the visitor in.Key Fields:
date- Day the visits were measuredpackage_name- Application id of the apptraffic_source- Channel the visitor arrived through, such as Play Store search or third-party referrerssearch_term- Search term that led to the listing, when it is above Google’s reporting thresholdutm_source- utm_source tag on the store listing link, when the link carried oneutm_campaign- utm_campaign tag on the store listing link, when the link carried onestore_listing_visitors- Users who viewed the store listingstore_listing_acquisitions- Users who first installed the app after viewing the listingstore_listing_conversion_rate- Acquisitions divided by visitors
Subscriptions by country
Subscriptions by country
Subscription counts per product, base plan, offer and country.Key Fields:
date- Day the counts refer topackage_name- Application id of the appproduct_id- Identifier of the subscription product, as declared in Play Consolecountry- Country the subscribers are billed inbase_plan_id- Base plan the counts refer to, empty for older subscriptionsoffer_id- Offer the subscriber signed up through, when one appliednew_subscriptions- Subscriptions started on this daycanceled_subscriptions- Subscriptions cancelled on this day, which stay active until the paid period endsactive_subscriptions- Subscriptions active at the end of the day
Reviews
Reviews
Every review left on your apps, with your replies.Key Fields:
review_id- Identifier of the review, taken from the review linkpackage_name- Application id of the reviewed appstar_rating- Rating the user gave, 1 to 5review_title- Title of the review, empty for reviews left after Play dropped titlesreview_text- Body of the review, empty when the user rated without writingreviewer_language- Language the review was written in, such as pt-BRdevice- Device the reviewer usedapp_version_code- Version of the app the reviewer was runningreview_submit_millis_since_epoch- When the review was submitted, in milliseconds since the Unix epochreview_last_update_millis_since_epoch- When the review was last editeddeveloper_reply_text- Text of your reply, when the review was answereddeveloper_reply_millis_since_epoch- When the reply was postedreview_link- Play Console link that opens the review
Sales
Sales
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 orderorder_charged_date- Date the order was chargedorder_charged_timestamp- Moment the order was charged, in milliseconds since the Unix epochfinancial_status- Charged, Refunded, Charged-back or Partially refundedpackage_id- Application id the purchase belongs tosku_id- Identifier of the in-app product or subscription that was boughtproduct_title- Display name of the productcurrency_of_sale- Currency the buyer was charged initem_price- List price in the currency of sale, before taxestaxes_collected- Tax collected on the transactioncharged_amount- Total the buyer was charged, negative on refunds and chargebackscountry_of_buyer- Country the buyer was inbase_plan_id/offer_id- Base plan and offer, for subscription purchasesdevice_model- Device the purchase was made on
Earnings
Earnings
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 transactiontransaction_date- Date of the transaction, as exported by Googletransaction_type- Nature of the row: Charge, Google fee, Tax, Refund and so onpackage_id- Application id the row belongs tosku_id- Identifier of the in-app product or subscriptionbuyer_currency- Currency the buyer was charged inamount_buyer_currency- Amount of the row in the buyer’s currencycurrency_conversion_rate- Rate used to convert into the merchant currencymerchant_currency- Currency you are paid inamount_merchant_currency- Amount of the row in your currency, the figure that adds up to the payoutservice_fee- Service fee percentage Google appliedbuyer_country- Country of the buyer