Try Netice Own your app revenue data App Store and Google Play revenue, delivered to your warehouse or storage. Try free for 30 days No credit card required

Netice app revenue data infrastructure

Null, not zero: app revenue finance data policy

In app revenue finance data, an unknown value is not the same thing as zero. Netice preserves that distinction by keeping unknown, unsupported, unavailable, not disclosed, or not applicable finance values as null instead of fabricating zeros that look like real platform-reported facts.

Daily analyticsApple + Google can unify in Daily App Sales
Finance reviewFinance Unified keeps monthly finance separate
Unknown valuenull
Known zero0

What null-not-zero means

The null-not-zero policy is simple: null means unknown, unsupported, unavailable, not disclosed, or not applicable. Zero means known zero. These two meanings must not be collapsed into one value just because a spreadsheet, dashboard, or SQL query looks cleaner with zeros.

This policy matters most in Netice finance_unified, the monthly platform finance output for app revenue data. Finance Unified can represent Apple App Store Connect financeReports and Google Play Earnings data where configured. Those source reports do not always disclose the same fields, the same event types, the same fee/tax details, or the same currency facts. A missing finance value can be meaningful. It stays null instead of becoming a fake zero.

The revenue distinction in Netice is two-fold. Daily App Sales is the analytics layer: Apple App Store and Google Play revenue can be unified into one clean daily table when the customer enables both providers. Finance Unified is the monthly platform-finance layer for finance-team review. Null-not-zero is primarily a Finance Unified policy, while Daily App Sales remains an operational analytics layer with method-qualified estimates.

Why fake zeros are dangerous

A fake zero looks authoritative. Once a blank finance field is converted to 0, downstream dashboards, SQL models, and automated summaries can treat an unknown value as if the platform reported a real zero. That can hide missing provider reports, unsupported event types, unavailable FX, undisclosed Apple fee/tax components, or Google ledger rows that simply do not have customer-charge fields.

Netice preserves source meaning. If a value is unknown, it stays null. If the source or a defensible transformation says the value is zero, it stays zero. Null does not mean zero. Zero does not mean unknown.

Policy vocabulary

Finance data needs clear language. These are the meanings Netice keeps separate.

Term Meaning Correct handling
Known zero The source or a defensible transformation says the value is exactly zero. Store 0.
Unknown The value is blank, null-like, unavailable, or not known at this step. Store null or surface a quality issue.
Unsupported The current source/report family does not provide that fact. Keep null or omit unsupported rows/fields.
Not disclosed The provider does not disclose a component as a separate finance fact. Do not synthesize the component.
Not applicable The field does not apply to that row type. Keep null.
Missing report The provider report was not available, not ready, or blocked by access/configuration. Surface an unavailable or pending state, not zero rows.
Missing cross-currency FX Native amount exists but the conversion rate is not available. Keep report-currency fields null or surface a quality issue.

Finance Unified is the primary null-not-zero layer

Finance Unified uses source_kind = 'FINANCE' and is built for monthly platform finance output. It is separate from Daily App Sales. Its finance fields include native values, report-currency values, FX rate, event type, source report, finance period, and lineage context.

In Finance Unified, nullable finance amount fields remain nullable. Examples include native_net_proceeds, native_customer_charge, report_net_proceeds, report_customer_charge, and fx_rate. A null in one of these fields is interpreted through the source report, event type, and quality context, not blindly treated as zero.

Finance field Why it can be null Correct interpretation
native_net_proceeds Unknown, invalid before validation, unsupported, or blocked by source quality conditions. No native proceeds amount is fabricated.
native_customer_charge Not applicable on fee, tax, or adjustment rows; not safely derivable for some source rows. A null customer charge can be correct for non-customer-charge events.
report_net_proceeds Missing FX or unresolved report-currency conversion. Converted proceeds stay null until the conversion is valid.
report_customer_charge Native customer charge is null or FX is unavailable. Converted gross/customer-charge values are not manufactured.
fx_rate Cross-currency rate unavailable or invalid. Use 1 only when native and report currency are the same.

Daily App Sales can unify Apple and Google, but it is not finance close

Daily App Sales is the operational analytics layer. When a customer enables both Apple App Store and Google Play, Netice can place both providers into one clean daily app-sales output such as app_sales_daily or APP_SALES_DAILY, depending on the destination. The table keeps provider and report-family context visible through fields such as source, platform, source_kind, and source_report.

That unified daily table is useful for analytics: daily trends, product/SKU reporting, country reporting, lifecycle filtering, and report-currency reporting. It is still not monthly finance truth. Monthly platform finance belongs in Finance Unified, using Apple financeReports and Google Play Earnings where configured.

Layer Correct interpretation Boundary
Daily App Sales One clean daily analytics output for Apple and/or Google Play when enabled. Operational analytics, not final payout or finance close.
Finance Unified Monthly platform finance output that preserves unknowns as null. Finance-team review input, not a full accounting system.
Raw Reports Provider-native Apple or Google report artifacts. No report-currency normalization or finance-null transformation.

Apple financeReports examples

Apple financeReports and Apple Summary Sales are different report families. In Finance Unified, Apple finance rows preserve what the Apple finance source supports. Netice does not fabricate separate Apple platform-fee or tax events when Apple does not disclose those components as separate finance facts.

This is a classic null-not-zero situation. If Apple does not itemize a separate tax or platform-fee row, the safe answer is not “tax is zero” or “fee is zero.” The answer is that the component is not disclosed as a separate finance fact in that source context.

Apple situation Correct finance handling Unsafe interpretation
Apple does not disclose a separate platform-fee row. No separate platform-fee event is fabricated. Apple platform fee is zero.
Apple does not disclose a separate tax row. No separate tax event is fabricated. Apple tax is zero.
Customer gross cannot be safely derived. Customer-charge field stays null. Gross was zero.
Finance row has proceeds but not a separate component split. Source-level proceeds are preserved with component caveats. Fee/tax is reverse-engineered as source truth.

Google Play Earnings examples

Google Play Earnings can preserve ledger-style rows such as sale, refund, platform fee, tax, and adjustment rows where the source provides them. That does not mean every finance row is a customer-charge row.

For example, a Google platform-fee row can have native_net_proceeds but a null native_customer_charge. That null is correct because the row is a fee ledger event, not a customer sale. The same logic applies to tax rows. Null customer charge does not mean the customer paid zero for a sale; it means this row is not a customer-charge event.

Google Earnings row type Expected customer-charge behavior Safe interpretation
SALE Can have customer charge where the source provides it. Revenue event.
REFUND Can have customer charge/refund context where the source provides it. Reversal event.
PLATFORM_FEE Customer-charge fields can be null. Fee ledger event, not customer charge.
TAX Customer-charge fields can be null. Tax ledger event, not customer charge.
ADJUSTMENT Customer-charge fields can be null or not applicable. Finance adjustment event.

Missing provider reports are not zero-revenue months

A provider report can be missing, unavailable, delayed, not generated, blocked by permissions, or outside the selected configuration. Netice surfaces that as a provider availability or configuration condition, not as a zero-revenue finance month.

This is especially important for finance review. If an expected Google Play Earnings report is unavailable, writing a zero row would make the output look complete when it is not. Netice preserves the missing-report status and avoids inventing finance facts.

Status Meaning Finance value behavior
Provider report pending The platform has not provided the selected report yet. No fake zero rows.
Permission failure Netice cannot access the source report family. No fake zero rows.
Unsupported field The source family does not expose that fact. Null or omitted field, not zero.
Invalid required value A required finance value cannot be safely parsed. Fail closed or surface a quality issue.

FX gaps: missing conversion is not rate 1

Report currency is a presentation layer. Native values remain native. If native and report currency are the same, finance FX can use 1. But if native and report currency differ and the conversion rate is not available, report-currency fields stay null or are surfaced as a quality issue.

Missing cross-currency FX does not silently become 1. It does not become zero. A missing FX rate means the converted report-currency value is unknown.

FX case Correct behavior Wrong behavior
Native currency equals report currency. Use fx_rate = 1. Treat same-currency as missing.
Cross-currency rate available. Populate report-currency fields. Overwrite native values.
Cross-currency rate missing. Keep fx_rate and converted fields null. Use rate 1 or fill zero.
Native proceeds exist but report proceeds are missing. Surface coverage/quality issue. Hide the gap with blanket COALESCE.

SQL patterns that preserve nulls

SQL can accidentally destroy null semantics. The most common mistake is to use COALESCE(field, 0) in finance transformations without preserving a parallel null-coverage measure. That can be acceptable for a display-only chart in some contexts, but it does not replace finance-null storage or finance review logic.

Better coverage query

SELECT
  fiscal_period,
  source_report,
  COUNT(*) AS rows_total,
  COUNTIF(report_net_proceeds IS NULL) AS rows_missing_report_net_proceeds,
  COUNTIF(report_net_proceeds = 0) AS rows_known_zero_report_net_proceeds
FROM `example_project.example_dataset.finance_unified`
GROUP BY fiscal_period, source_report
ORDER BY fiscal_period, source_report;

Unsafe finance-close pattern

-- This hides unknown finance values unless null coverage is preserved elsewhere.
SELECT
  fiscal_period,
  SUM(COALESCE(report_net_proceeds, 0)) AS chart_value
FROM `example_project.example_dataset.finance_unified`
GROUP BY fiscal_period;

Safer presentation query

SELECT
  fiscal_period,
  SUM(report_net_proceeds) AS report_net_proceeds_known,
  COUNTIF(report_net_proceeds IS NULL) AS missing_report_net_proceeds_rows,
  COUNTIF(report_net_proceeds = 0) AS known_zero_report_net_proceeds_rows
FROM `example_project.example_dataset.finance_unified`
GROUP BY fiscal_period
ORDER BY fiscal_period;

These queries use synthetic table names. They are not accounting-close instructions and not bank-reconciliation proof.

Security and secret handling

Null-not-zero is a data-meaning policy, not a credential visibility mechanism. Netice encrypts customer secret material and handles source and destination credentials through secret management. Saved connection values are not shown back as raw credentials after saving.

The examples below remain synthetic. They exclude real Apple vendor numbers, Google Play report bucket IDs, app IDs, package names, product IDs, Snowflake accounts, BigQuery projects, GCS/S3 paths, source row hashes, task IDs, run IDs, logs, private keys, service-account JSON, secret references, and customer revenue amounts.

Safe synthetic examples

The examples below use fake values only. They show policy shape, not real provider rows or customer output.

Apple finance row with no fabricated fee or tax row

platform,source,source_kind,source_report,event_type,event_subtype,commission_disclosed,quantity,native_currency,native_net_proceeds,native_customer_charge,report_currency,report_net_proceeds,report_customer_charge,fx_rate,source_row_hash
IOS,APPLE_APP_STORE,FINANCE,APPLE_FINANCE_DETAIL,SALE,,false,1,EUR,6.990000,9.990000,EUR,6.990000,9.990000,1,synthetic_hash_apple_finance_001

Google fee row with null customer charge

platform,source,source_kind,source_report,event_type,event_subtype,commission_disclosed,quantity,native_currency,native_net_proceeds,native_customer_charge,report_currency,report_net_proceeds,report_customer_charge,fx_rate,source_row_hash
ANDROID,GOOGLE_PLAY,FINANCE,GOOGLE_PLAY_EARNINGS,PLATFORM_FEE,COMMISSION,true,,EUR,-1.500000,,EUR,-1.500000,,1,synthetic_hash_google_fee_001

Missing cross-currency FX example

platform,source,source_kind,source_report,event_type,native_currency,native_net_proceeds,native_customer_charge,report_currency,report_net_proceeds,report_customer_charge,fx_rate,source_row_hash
IOS,APPLE_APP_STORE,FINANCE,APPLE_FINANCE_DETAIL,SALE,USD,6.990000,9.990000,EUR,,,,synthetic_hash_missing_fx_001

Blank cells in these examples represent null. They do not mean zero. The hashes and amounts are synthetic.

FAQ

What does null-not-zero mean?

It means unknown, unsupported, unavailable, not disclosed, or not applicable finance values stay null instead of being converted into fake zeros.

Does null mean the app earned zero revenue?

No. Null does not mean zero revenue. It means the value is not known, not applicable, unsupported, unavailable, or not safely derivable in that context.

When is zero a real zero?

Zero is real when the source or a defensible transformation says the value is exactly zero. Real zero remains zero.

Can Apple App Store and Google Play revenue be unified in one table?

Yes. Daily App Sales can unify Apple App Store and Google Play revenue into one clean daily analytics table when both providers are enabled. Monthly platform finance remains separate in Finance Unified.

Why are Apple fee and tax fields not filled with zero?

Apple finance output does not fabricate separate platform-fee or tax facts when Apple does not disclose those components as separate finance rows. Not disclosed does not mean zero.

Why are Google fee and tax rows missing customer charge?

Google fee and tax rows are ledger component rows, not customer-charge events. Null customer-charge fields can be correct for those rows.

What happens when FX is missing?

Missing cross-currency FX leaves report-currency fields null or surfaces a quality issue. It does not become rate 1 or zero.

Can dashboards use COALESCE to turn null into zero?

Be careful. A display-only chart may use a zero presentation value in some contexts, but finance models preserve null coverage so unknown values are not mistaken for real zeroes.

Is this policy the same for Daily App Sales and Finance Unified?

No. Finance Unified is the primary null-not-zero policy surface. Daily App Sales is an operational estimate layer with method fields, not final finance truth.

Does a missing provider report mean zero revenue?

No. A missing provider report is represented as unavailable, pending, or blocked by access/configuration, not as zero revenue.

Does Netice encrypt customer secrets?

Yes. Netice encrypts customer secret material and handles source and destination credentials through secret management. Saved credential values are not shown back as raw secrets after saving.

Can this output be used for accounting close?

Netice preserves finance data meaning, but it is not a complete accounting system, audit product, tax system, or bank-reconciliation product.

Preserve unknowns instead of inventing finance facts

Netice keeps app revenue finance data source-aware by preserving the difference between unknown values, real zeros, unsupported fields, missing reports and unresolved FX.

Review pricing Review security