Netice app revenue data infrastructure
Google Play revenue to BigQuery
Netice moves Google Play daily app-sales reporting into a customer-owned BigQuery table, so Android app teams can query revenue activity, products, countries, subscriptions, report currency amounts and source metadata without maintaining fragile Play Console export scripts.
What Netice sends from Google Play to BigQuery
Netice uses its daily app-sales workflow to send Google Play revenue reporting into BigQuery. The internal source mode is google_apple_app_sales, but Google Play can be selected as the provider on its own when the task is configured for Google Play reporting. The resulting managed BigQuery table is designed for daily operational app-sales analytics, not for monthly payout reconciliation or accounting close.
The current default BigQuery table name for this daily layer is app_sales_daily. A typical synthetic destination example is example_project.example_dataset.app_sales_daily. The table keeps Google Play source context visible through fields such as source, platform, source_kind and source_report, instead of flattening Play Console data into a vague revenue number.
For Google Play daily revenue rows, the important report-family label is GP_ESTIMATED_SALES. Subscription lifecycle rows can use GP_SUBSCRIPTIONS. Those lifecycle rows should not automatically be treated as money rows; the table includes event_has_revenue so downstream queries can separate revenue-bearing rows from lifecycle-only context.
What this BigQuery table is not for
The Google Play daily BigQuery output is not Google Play Earnings. It is not final payout, settlement, audited revenue, bank reconciliation, accounting close, tax advice, GAAP, IFRS or ASC 606 evidence. It is an analytics-ready daily app-sales layer that helps teams understand recent Google Play revenue activity.
If your question is “what happened by day?” use the daily app-sales table. If your question is “what did Google Play report for the monthly finance period?” use the separate monthly finance output where configured. If your question is “can I preserve the original provider-native files?” use raw Google Play reports instead.
Google Play source reports behind the table
Google Play daily app-sales rows come from Play Console Estimated Sales style reporting. Netice preserves that source family in the output through source_report = 'GP_ESTIMATED_SALES'. This matters because Google Play Estimated Sales is not Google Play Earnings.
Estimated Sales is useful for daily app revenue analytics. Earnings is a monthly finance report family. They differ in source object family, date/period shape, fee visibility, tax handling, finance finality and intended use. Treating Estimated Sales as Earnings creates misleading dashboards and finance confusion.
| Concept | Daily Google Play BigQuery output | Boundary |
|---|---|---|
| Provider | GOOGLE_PLAY |
Google Play source rows only in this page’s examples. |
| Platform | ANDROID |
Do not mix with Apple examples on this page. |
| Source kind | SALES |
Daily app-sales analytics, not monthly finance. |
| Estimated Sales label | GP_ESTIMATED_SALES |
Not Google Play Earnings. |
| Subscription lifecycle label | GP_SUBSCRIPTIONS |
Lifecycle rows may be non-revenue rows. |
BigQuery destination setup
Google Play source access and BigQuery destination access are separate. Google Play access lets Netice read selected Google Play reporting data. BigQuery destination access lets Netice write the managed output table into the customer’s Google Cloud project and dataset.
In the current BigQuery path, Netice needs a BigQuery project, dataset, managed table name and a GCS staging bucket used to load data into BigQuery. The staging bucket is part of the warehouse loading process. It should not be confused with customer-facing object-storage export output.
| Setup area | What it does | Safe example |
|---|---|---|
| Google Play source access | Allows Netice to read selected Google Play reports. | example_google_play_reporting |
| BigQuery destination access | Allows Netice to write the managed table. | example_bigquery_app_revenue |
| BigQuery target | Customer-owned project, dataset and table. | example_project.example_dataset.app_sales_daily |
| GCS staging bucket | Used during BigQuery load. | example_bucket |
Public examples should never include real project IDs, datasets, tables, buckets, staging paths, service-account JSON, report bucket values, task IDs, logs or source rows.
The managed app_sales_daily table
Netice is designed to keep the same managed BigQuery table current. First runs, recurring refreshes and selected reruns should update the managed output instead of creating arbitrary new public tables on every run.
The BigQuery path stages candidate rows before updating the selected reporting window. That gives Netice a chance to validate the candidate output, detect duplicate conditions, check typed table compatibility and avoid treating an empty provider candidate as permission to erase existing data. The customer-facing model is: stable table, selected-window refresh, source-aware rows.
| Warehouse behavior | What it means for customers |
|---|---|
| Managed table | The default daily table is app_sales_daily. |
| Staged candidate rows | Rows are prepared before the managed table is updated. |
| Window-scoped refresh | Recent or selected dates can be refreshed without describing the process as a blind full-table rewrite. |
| Empty candidate guard | Provider-late or empty candidate conditions should not be interpreted as zero revenue or automatic deletion. |
| Schema and duplicate checks | Bad candidate data can be blocked before it is treated as usable output. |
Google Play field groups in BigQuery
The Google Play daily BigQuery output is useful because it carries both analytic amounts and source context. A row should not be read only by its revenue number. The surrounding fields explain which provider produced it, which report family it came from, which currency was used, how estimates were derived and whether the row represents a revenue-bearing event.
| Field group | Representative fields | Why it matters |
|---|---|---|
| Source/report context | source, platform, source_kind, source_report |
Shows Google Play, Android, daily sales layer and report family. |
| Date and readiness | revenue_date, data_completeness, ingested_at |
Shows daily reporting date and readiness state, not settlement finality. |
| App/product context | app_id, item_id, item_name, subscription_period, transaction_type, units |
Supports product, SKU, subscription and country analytics. |
| Report-currency amounts | report_currency, estimated_gross, estimated_net, estimated_tax, estimated_fee |
Daily analytical amounts in the selected report currency. |
| Native/local amounts | native_currency, gross_local, net_local, tax_local, fee_local |
Keeps source/local currency context separate from report currency. |
| Method fields | net_method, fee_method, tax_method |
Explains whether values are source-derived, estimated or unavailable. |
| Lifecycle and provenance | event_has_revenue, source_file_uri, source_row_number, source_row_hash, meta_json |
Supports safe lineage and prevents lifecycle-only rows from being treated as revenue rows. |
Report currency, native currency and method fields
Netice daily app-sales output has a configured report_currency. In examples, this may be EUR. Report currency is a presentation layer for daily analytics. It does not erase the source/native currency context and does not turn daily estimates into final payout or settlement data.
For Google Play Estimated Sales, service fee is not itemized the same way as in monthly Earnings. That is why method fields matter. For example, fee_method can tell downstream users that the fee value is estimated rather than source-truth. Tax can be source-truth when Google Play provides taxes collected and tax_method says so, but that should not be generalized into “all tax values are exact.”
| Amount question | Where to look | Safe interpretation |
|---|---|---|
| Which currency is used for analytics? | report_currency |
Task-selected presentation currency. |
| What was the source/local currency? | native_currency |
Provider/source currency context. |
| Is net source-derived or estimated? | net_method |
Read the method before treating the number as source truth. |
| Is tax source-provided? | tax_method |
Source-truth only when the method explicitly supports that interpretation. |
| Is service fee itemized by Estimated Sales? | fee_method |
Estimated Sales does not itemize service fee like monthly Earnings. |
Backfills, provider-late data and recurring refreshes
Google Play reports can arrive late or change after a first run. Netice app-sales tasks therefore support first runs, selected history, recurring refreshes and reruns of bounded windows. The recurring daily refresh model is designed to keep the same managed table current for recent completed days.
In current validation evidence, the recurring daily refresh defaults to the latest 7 completed days and validates up to a configured cap. That is a daily app-sales refresh concept, not a monthly finance period and not a provider SLA. Google Play does not publish a strict daily-ready hour that should be promised in customer documentation.
| Run behavior | Google Play BigQuery meaning | Boundary |
|---|---|---|
| First run | Creates or populates the managed daily output when setup succeeds. | Do not describe as synchronous browser work. |
| Initial history | Can include selected historical daily app-sales windows. | Do not promise unlimited history. |
| Recurring refresh | Updates recent completed days in the same managed table. | Do not describe as monthly finance reconciliation. |
| Provider-late data | Recent windows can be refreshed again when provider data changes or becomes available. | Provider-late does not automatically mean credential failure. |
Google Play Estimated Sales vs Google Play Earnings
The most important finance boundary is simple: Google Play Estimated Sales is not Google Play Earnings. This BigQuery page is about daily Google Play app-sales analytics. Monthly Google Play Earnings belongs to the Finance Unified layer when configured.
| Question | Daily Google Play BigQuery | Monthly Google Play finance |
|---|---|---|
| Source family | Estimated Sales and subscription lifecycle data | Google Play monthly Earnings |
| Source kind | SALES |
FINANCE |
| Typical table | app_sales_daily |
finance_unified |
| Best use | Daily operational analytics | Monthly platform finance review |
| Wrong use | Payout reconciliation or accounting close | Daily product analytics replacement |
Safe BigQuery examples
The following examples are synthetic. They show the shape of Google Play daily app-sales analysis without exposing real package names, SKUs, projects, datasets, tables, source paths, hashes, task IDs, logs or customer data.
Synthetic BigQuery target
Project: example_project
Dataset: example_dataset
Table: app_sales_daily
Fully qualified table: example_project.example_dataset.app_sales_daily
Staging bucket: example_bucket
Daily Google Play revenue query
SELECT
revenue_date,
source_report,
item_id,
data_completeness,
SUM(estimated_net) AS estimated_net_report_currency,
SUM(units) AS units
FROM `example_project.example_dataset.app_sales_daily`
WHERE source = 'GOOGLE_PLAY'
AND platform = 'ANDROID'
AND source_kind = 'SALES'
AND revenue_date BETWEEN DATE '2026-02-01' AND DATE '2026-02-29'
GROUP BY revenue_date, source_report, item_id, data_completeness
ORDER BY revenue_date, source_report, item_id;
Revenue vs lifecycle row check
SELECT
source_report,
data_completeness,
COUNT(*) AS row_count,
COUNTIF(event_has_revenue) AS revenue_rows,
COUNTIF(NOT event_has_revenue) AS lifecycle_only_rows
FROM `example_project.example_dataset.app_sales_daily`
WHERE source = 'GOOGLE_PLAY'
AND revenue_date >= DATE '2026-02-01'
GROUP BY source_report, data_completeness
ORDER BY source_report, data_completeness;
These queries are for operational analytics. They are not accounting close, payout reconciliation or Google Play Earnings queries.
FAQ
What Google Play revenue data can Netice send to BigQuery?
Netice sends Google Play daily app-sales reporting into a managed BigQuery table for operational analytics. The table includes source context, Android platform context, report currency amounts, method fields, source report labels and provenance fields.
Can I use Google Play without Apple App Store in the same task?
Yes, Google Play can be selected as the provider on its own where source access and destination access are configured correctly.
What is the default BigQuery table name?
The current default daily app-sales BigQuery table is app_sales_daily. Public examples should use synthetic full names such as example_project.example_dataset.app_sales_daily.
Is the BigQuery table based on Google Play Estimated Sales or Google Play Earnings?
The daily app-sales BigQuery table is based on Google Play Estimated Sales style reporting and subscription lifecycle data. It is not Google Play monthly Earnings.
Is Google Play revenue in BigQuery final payout or settlement data?
No. Daily Google Play revenue in BigQuery is operational analytics. It is not final payout, settlement, accounting close, audited revenue, tax advice or bank reconciliation.
Why does Netice need BigQuery destination access separately from Google Play access?
Google Play access lets Netice read Google Play reports. BigQuery destination access lets Netice write to the customer-owned project, dataset and table. They are separate permissions.
What does report currency mean?
Report currency is the presentation currency used for daily analytical amount fields such as estimated_net. It does not replace native/source currency and does not turn daily rows into finance-close data.
What does data_completeness mean for Google Play rows?
data_completeness describes daily source-readiness states such as live, stabilized or mature. It is not settlement finality.
Why can Google subscription rows have no revenue?
Subscription lifecycle rows can describe subscription activity without carrying revenue. Use event_has_revenue and source_report before treating rows as money rows.
When should I use Finance Unified instead?
Use Finance Unified when the question is monthly platform finance, Google Play Earnings, finance periods or settlement-style review. Use daily app sales for daily operational analytics.
Related guides
- Product overview
- Product documentation
- App revenue to BigQuery
- Unified daily app sales schema
- Google Play Estimated Sales vs Google Play Earnings
- Daily app sales vs platform finance reports
- Report currency and FX
- App revenue backfills and reruns
- BigQuery warehouse refresh behavior
- Security policy
- Pricing
Put Google Play revenue where your team can query it
Netice helps app teams move Google Play daily app-sales reporting into customer-owned BigQuery with source-aware fields, report currency context, recurring refreshes and clear boundaries between daily analytics, raw reports and monthly finance output.