Netice app revenue data infrastructure

Unified daily app sales schema

The Netice unified daily app sales schema is the source-aware daily revenue output for Apple App Store and Google Play reporting. It is designed for operational analytics, dashboards, product reporting and finance review — not final payout reconciliation or accounting close.

What this schema is for

This schema describes the daily app-sales output Netice creates from Apple App Store and Google Play reporting surfaces. It gives analytics, finance and data teams a consistent way to query platform-reported app revenue while keeping the source context visible. A row should not become an anonymous revenue number after it lands in a warehouse or a file destination. It should still answer the practical questions: which platform reported it, which report family produced it, which date it belongs to, which app and product it refers to, what currency context applies, and how the amount was derived.

Netice uses this daily schema for the google_apple_app_sales workflow. Customers can select Apple App Store, Google Play, or both as daily sales sources and send the resulting output to a customer-owned destination such as BigQuery, Snowflake, Google Cloud Storage or AWS S3. In BigQuery, the default managed table name is app_sales_daily. In Snowflake, the default table name is APP_SALES_DAILY. In object storage, the managed CSV file follows the pattern app_sales_enriched_<REPORT_CURRENCY>.csv.

The goal is not to hide Apple and Google differences. The goal is to make those differences queryable. Apple and Google Play do not expose identical report families, currency fields, proceeds fields, fee behavior or lifecycle events. The schema therefore keeps fields such as source, platform, source_report, net_method, fee_method, tax_method and data_completeness visible instead of flattening everything into one unexplained amount.

What this schema is not for

The unified daily app sales schema is not a final payout, settlement, accounting, revenue-recognition or audit-close table. Apple daily Sales and Trends style reporting is not Apple finance reporting. Google Play Estimated Sales is not Google Play Earnings. Netice keeps the daily app-sales layer separate from finance_unified, which is the separate monthly platform finance output for finance-style reporting.

Treat the daily schema as an operational analytics layer. It is useful for daily revenue trends, product and SKU analysis, country breakdowns, app portfolio monitoring, subscription lifecycle review and early directional reads. For monthly platform finance, settlement-style review or close workflows, use the finance-specific output instead of trying to turn the daily schema into accounting truth.

Source reports represented in the daily schema

The source_report field is one of the most important columns in the schema. It keeps the report family visible after Apple and Google Play rows have been normalized into the same output. That matters because the same app, product and date can mean different things depending on whether the row came from daily sales reporting, a subscription lifecycle event, a raw report or monthly finance reporting.

Provider Daily source report label Typical use in the daily schema Important boundary
Apple App Store ASC_SUMMARY_SALES Daily Apple sales-style rows from App Store Connect sales reporting. Not Apple financeReports and not transaction-level settlement.
Apple App Store ASC_SUBSCRIPTION_EVENT Subscription lifecycle events when available. Some lifecycle rows may not contain revenue.
Google Play GP_ESTIMATED_SALES Daily Google Play estimated sales rows. Not Google Play Earnings and not service-fee itemization.
Google Play GP_SUBSCRIPTIONS Google Play subscription lifecycle rows when available. Lifecycle events should not be treated as money-bearing by default.

Core field groups

The current daily schema is based on the app_sales_daily_v4 field set. The public schema should be read as a source-aware analytics contract: some fields are direct source values, some are normalized by Netice, some are derived, and some are intentionally nullable when a provider does not expose the same fact.

Field group Fields Why it matters
Row identity and source context revenue_date, platform, source_kind, source, source_report Shows when the row belongs, which provider reported it, and which report family produced it.
App and product dimensions app_id, item_id, item_name, subscription_period, transaction_type Supports product, SKU, app and lifecycle reporting without hiding provider-specific differences.
Market and units country, units Allows country and volume analysis while keeping source semantics visible.
Report-currency amounts report_currency, estimated_gross, estimated_net, estimated_tax, estimated_fee Gives a common presentation layer for daily analytics, with method fields explaining estimates.
Native-currency components native_currency, gross_local, net_local, tax_local, fee_local Keeps local amount context visible instead of replacing it with report currency only.
Apple proceeds fields apple_proceeds_currency, apple_proceeds_native Preserves Apple-specific proceeds context and stays blank or null for Google Play rows.
FX and derivation methods gross_fx, net_fx, tax_fx, fee_fx, net_method, fee_method, tax_method Explains how report-currency values and daily estimates were produced.
Freshness and traceability data_completeness, source_file_uri, source_row_number, source_row_hash, ingested_at, meta_json Supports run review, freshness interpretation and safe provenance without exposing raw provider rows.

Field-level reference

The table below gives the practical interpretation of the most important fields. It is intentionally not written as a generic database dictionary. The important part is how each field should be read when Apple and Google Play rows appear together.

Field Meaning How to read it
revenue_date Daily source reporting date. Use this for daily trend analysis. Do not read it as payout date, settlement date or accounting period.
platform Normalized platform code. Apple rows use IOS; Google Play rows use ANDROID.
source_kind Layer identifier for the row. Daily app-sales rows use SALES. Monthly finance rows belong to the separate finance_unified layer.
source Provider system. Use APPLE_APP_STORE and GOOGLE_PLAY to keep provider-specific behavior visible.
source_report Report family label. Critical for separating Apple Summary Sales, Apple subscription events, Google Estimated Sales and Google subscription events.
report_currency Task-configured presentation currency. Use it for comparable reporting views, but do not confuse it with the provider's native source currency.
estimated_net Estimated developer-side daily net amount in report currency. Useful as a daily analytics metric. Not a payout or settlement value.
estimated_tax Daily tax amount in report currency when source or derivation supports it. Read together with tax_method. Do not assume all providers expose exact tax in the same way.
estimated_fee Daily platform-fee estimate in report currency when Netice can derive one. Read together with fee_method. Daily fee estimates are not a settlement ledger.
apple_proceeds_currency Apple proceeds currency when present. Apple-specific. Google Play rows should not be forced to fill this field.
apple_proceeds_native Apple developer proceeds in Apple proceeds currency when present. Useful for Apple-specific interpretation; not a Google Play concept.
net_method, fee_method, tax_method Derivation method labels. These explain whether values are source-derived, estimated, residual or fallback-based.
data_completeness Daily source-readiness status. Values such as LIVE, T_PLUS_2_STABILIZED and MATURE describe daily data readiness, not settlement finality.
event_has_revenue Whether the row has revenue-impacting component values. Important for subscription lifecycle rows because not every event is a revenue event.
source_row_hash Hash of a canonicalized source-row representation. Useful for traceability. Public examples should never use real hashes.
meta_json Compact metadata for source and derivation context. Should remain safe and compact. It is not a place to dump raw provider rows.

Apple-specific behavior

Apple daily app-sales rows are based on App Store Connect sales-style reporting, not Apple finance reporting. The daily Apple report family can support operational questions such as product sales, refunds, preorders, renewals, storefront context, units and daily trends. It does not turn the row into a bank-settled finance event.

Apple also has fields that do not map cleanly to Google Play. In particular, Apple can expose proceeds-related context such as proceeds currency and developer proceeds. The daily schema preserves that context through Apple-specific fields such as apple_proceeds_currency and apple_proceeds_native. These fields are intentionally not forced into Google Play rows. A blank or null Google value is the correct result when a field is Apple-specific.

Fee and tax interpretation also requires care. Apple Summary Sales does not itemize commission and tax in the same way a finance report would. Netice therefore uses method-coded daily estimates where possible and keeps method fields visible. The important public rule is simple: if a value is estimated, the schema should tell the reader how to treat it.

Google Play-specific behavior

Google Play daily sales rows come from Play Console sales-style report exports, not Google Play Earnings reports. In the daily schema, Google rows use source=GOOGLE_PLAY, platform=ANDROID and source-report labels such as GP_ESTIMATED_SALES or GP_SUBSCRIPTIONS.

Google Play can expose tax information in ways that are different from Apple. For example, a Google tax method can indicate source-truth tax when taxes collected are present. But Google Play Estimated Sales does not itemize every finance concept a monthly earnings report would contain. Service-fee interpretation still needs method context. That is why the daily schema keeps fee_method and tax_method visible instead of implying all amount fields are equally final.

Subscription lifecycle rows also need careful interpretation. A subscription event can be useful for lifecycle analytics even when the row does not have a revenue amount. The event_has_revenue field helps downstream users avoid treating every event as a money-bearing transaction.

Report currency, native currency and FX

Netice separates report-currency presentation from native source context. The report_currency field is selected during task setup and is used for comparable daily analytics fields such as estimated_gross, estimated_net, estimated_tax and estimated_fee. Native fields such as native_currency, gross_local, net_local, tax_local and fee_local keep the local amount context visible.

The FX fields — gross_fx, net_fx, tax_fx and fee_fx — explain conversion into report currency where conversion is used. These fields should be read as part of the daily analytics contract. They do not turn a daily source row into a settled finance row.

Data completeness and recurring refreshes

Daily app-store reports can arrive, stabilize or change after the first time a period is available. Netice therefore treats refresh behavior as part of the output contract. The daily schema includes data_completeness so a reader can distinguish very recent rows from more mature rows.

Current completeness labels include LIVE, T_PLUS_2_STABILIZED and MATURE. These are daily source-readiness concepts. They are not settlement finality labels. A row marked as more mature is still part of the daily operational app-sales layer, not the monthly finance layer.

The daily app-sales setup supports a recurring recent-window refresh. Netice can keep the same managed table or file refreshed rather than forcing teams to manually append new exports. For BigQuery and Snowflake, this means the selected managed table stays current. For object-storage destinations, the managed CSV object is refreshed. The article should not claim a hard historical maximum unless a public product limit has been approved, but it can explain the operating model: initial backfill brings historical context into the destination, and recurring refresh keeps recent completed days updated.

Destination output: warehouse tables and CSV files

The same daily field set can be useful in both warehouse and file destinations. The destination changes how the data is consumed, not what the schema means.

Destination Default output example How teams typically use it
BigQuery example_project.example_dataset.app_sales_daily SQL analytics, BI models, app revenue dashboards and joins with product or marketing data.
Snowflake EXAMPLE_DATABASE.EXAMPLE_SCHEMA.APP_SALES_DAILY Warehouse reporting and governed analytics workflows in Snowflake.
Google Cloud Storage gs://example_bucket/app-revenue/app_sales_enriched_EUR.csv CSV file handoff, archive, lake ingestion or downstream processing.
AWS S3 s3://example_bucket/app-revenue/app_sales_enriched_EUR.csv Object-storage handoff into lake, warehouse, workflow or archive layers.

For direct object-storage output, the supported file format for this workflow is CSV. The schema article should not promise Parquet object output for google_apple_app_sales unless that product behavior changes and is verified.

Safe synthetic example

The example below is intentionally small. It shows the shape of the daily schema without using real apps, products, buckets, tables, source files, hashes or customer amounts.

revenue_date,platform,source,source_kind,source_report,app_id,item_id,country,units,report_currency,estimated_net,net_method,data_completeness,event_has_revenue,source_row_hash
2026-02-10,IOS,APPLE_APP_STORE,SALES,ASC_SUMMARY_SALES,com.example.app,premium_monthly,US,1,EUR,6.99,APPLE_PROCEEDS,T_PLUS_2_STABILIZED,true,synthetic_hash_apple_001
2026-02-10,ANDROID,GOOGLE_PLAY,SALES,GP_ESTIMATED_SALES,com.example.app,premium_monthly,US,1,EUR,6.99,GOOGLE_ESTIMATED_NET_FROM_CHARGED_AMOUNT_MINUS_ESTIMATED_FEE,T_PLUS_2_STABILIZED,true,synthetic_hash_google_001

A typical BigQuery query for operational daily analytics might group by date, platform, report family and product:

SELECT
  revenue_date,
  platform,
  source_report,
  item_id,
  SUM(estimated_net) AS estimated_net_report_currency,
  SUM(units) AS units
FROM `example_project.example_dataset.app_sales_daily`
WHERE revenue_date BETWEEN DATE '2026-02-01' AND DATE '2026-02-29'
  AND source_kind = 'SALES'
GROUP BY revenue_date, platform, source_report, item_id
ORDER BY revenue_date, platform, item_id;

This query is for daily operational analytics. It should not be presented as payout reconciliation, settlement evidence or accounting close output.

How this differs from finance_unified

The daily app sales schema and finance_unified answer different questions. Daily app sales explains platform-reported operational activity by day. Finance Unified is the separate monthly platform finance output. Keeping the two outputs separate prevents a dashboard, analyst or LLM summary from turning daily operational data into a false finance claim.

Question Daily app sales schema finance_unified
Main use Daily trends, product analytics, app portfolio monitoring, lifecycle reporting. Monthly platform finance and settlement-style reporting.
Source kind SALES FINANCE
Apple source boundary Apple Summary Sales and subscription event style reporting. Apple finance reports.
Google source boundary Google Play Estimated Sales and subscription report style data. Google Play Earnings-style finance reporting.
Can it be used as accounting final? No. It is closer to platform finance reporting, but final booked revenue still remains the customer's accounting process.

Setup requirements behind the schema

The schema is not only a list of columns. It is the result of a configured Netice task. For daily app sales, the source mode is google_apple_app_sales. During setup, the user selects Apple App Store, Google Play, or both, then configures the destination and report currency. Source access and destination access are separate concerns: the source configuration must be able to read the selected report family, and the destination configuration must be able to receive the managed table or file.

Setup area What it controls Why it matters for the schema
Provider selection Apple App Store, Google Play, or both. Determines which source and platform values appear in the output.
Source access App Store Connect or Google Play reporting access. Determines whether Netice can read the selected report family.
Destination BigQuery, Snowflake, GCS or S3. Determines where the same daily schema is delivered.
Report currency Presentation currency for estimated daily fields. Determines the currency context for report-currency amount columns.
Backfill and refresh Initial historical window and recent-window refresh behavior. Determines which dates are present and how recent periods are kept current.

Failure states this schema helps diagnose

A source-aware schema also makes operational issues easier to understand. If the output keeps source report, provider, date, freshness and method context visible, a team can separate very different states that would otherwise all look like “the revenue number is wrong.”

State What it means How the schema helps
Source not ready The provider has not made the expected report available yet. data_completeness and run status can prevent premature finance interpretation.
Source permission issue The connected source account cannot read the selected report family. The source/destination boundary keeps this separate from warehouse write errors.
Destination permission issue The selected warehouse or bucket cannot receive the output. The schema remains the same, but delivery needs destination access correction.
Provider format drift A provider report shape changes or needs review. Source report, row hash and metadata fields help identify affected rows safely.
Lifecycle event without revenue A subscription event may matter operationally without carrying money. event_has_revenue prevents all events from being treated as revenue rows.

FAQ

What is the Unified Daily App Sales Schema?

It is the Netice daily app-sales output schema for Apple App Store and Google Play operational revenue analytics. It keeps provider, report family, product, currency, method and freshness context visible so teams can query app revenue without losing source meaning.

Is daily app sales final payout or settlement data?

No. Daily app sales is operational analytics. It is not final payout, settlement, revenue recognition, accounting close or transaction-level finance truth.

Which Apple reports feed the daily schema?

The daily Apple side is based on App Store Connect sales-style reporting such as Summary Sales, with subscription event rows when available. It is not Apple financeReports.

Which Google Play reports feed the daily schema?

The daily Google Play side is based on sales-style and subscription reporting such as Google Play Estimated Sales and subscription event data. It is not Google Play Earnings.

Why are Apple proceeds fields blank for Google Play rows?

Apple proceeds fields are Apple-specific. Google Play does not use Apple proceeds fields, so those values should remain blank or null for Google rows instead of being forced into Apple semantics.

Why are some gross, net, tax and fee fields estimated?

Apple and Google Play do not expose every finance component in the same way in daily sales reports. Netice keeps method fields such as net_method, fee_method and tax_method visible so teams can see how daily values should be interpreted.

What does data_completeness mean?

data_completeness describes daily source-readiness states such as LIVE, T_PLUS_2_STABILIZED and MATURE. It is not a settlement-finality field.

Does the schema apply to BigQuery and object-storage outputs?

Yes. The same daily field set is relevant for managed warehouse tables such as BigQuery and Snowflake, and for managed CSV object outputs in GCS or S3. The destination changes how the data is consumed, not the meaning of the fields.

What is the difference between this schema and finance_unified?

This schema is for daily operational app-sales analytics. finance_unified is the separate monthly platform finance output. They should not be merged into one interpretation.

Can I use this table for accounting close?

No. Use it for daily analytics and operational review. Final booked revenue remains your accounting process, and monthly platform finance should use the finance-specific output.

Use the schema as a data contract, not a black box

Netice is built for teams that want Apple App Store and Google Play revenue reporting in their own warehouse or storage destination while keeping source meaning, refresh behavior and finance boundaries visible.

Review pricing Review security