An app can earn money from showing ads while its acquisition report assigns too little, too much or the wrong share of that value to a campaign. The monetization dashboard, analytics property and measurement partner may each contain a plausible number. That does not make the numbers interchangeable—or ready to guide bidding.
Ad revenue attribution connects revenue generated by ads inside an app to the acquisition sources credited with bringing its users. It requires two separate pieces of evidence: a trustworthy publisher-revenue feed and a defensible acquisition assignment. Before using the result for ROAS or value optimization, validate collection coverage, currency and units, duplicate handling, cohort definitions and the destination's reporting rules. Attribution allocates credit; it does not establish incremental growth or settled cash.
This guide helps an ad-funded or hybrid app team decide whether to repair its measurement, use the feed for analysis, or prepare it for an eligible bidding configuration. The acceptance framework is original editorial guidance. Platform mechanics come from the linked documentation; the Android examples are not universal SDK instructions.
Separate publisher revenue from the cost of acquiring users
The same company can buy ads to attract users and sell advertising attention inside its app. Keep those roles distinct. An acquisition network may receive credit for a user whose later ad impressions earn revenue through an entirely different monetization network.
AppsFlyer's ad revenue attribution guide describes this distinction and several collection methods: aggregate API, device-level API, impression-level SDK and a combined route. The integration determines available granularity and freshness. A method suitable for a daily portfolio report is not automatically suitable for every downstream signal.
For the growth team, three questions follow. What publisher value was observed? Which acquisition source receives credit under the chosen rules? What business decision may that result support? Answer them separately before calculating returns. The mobile app ROAS guide covers the wider return calculation; this page examines the ad-revenue feed entering its numerator.
A five-boundary acceptance register
Do not begin with a demand that every dashboard match. Begin with a register showing where each meaning changes.
Boundary Question to resolve Evidence to retain Reason to withhold a spend decision --- --- --- --- Occurrence Which ad formats and mediation paths produced a revenue callback or record? App build, format, source route and controlled test trace A material production path has no tested collection Value What amount, currency, unit and precision did the source provide? Original payload and documented transformation Units, currency or estimation status are unknown Assignment How is revenue connected to an acquisition cohort? Attribution rules, cohort entry and unmatched category Activity totals are being compared with acquisition cohorts Report Which values are included, delayed, replaced or revised? Export timestamp, filters, coverage and replacement rules Two snapshots describe different populations or maturity Bidding Which destination receives which event and value? Eligible campaign setup and destination readback Reporting receipt is mistaken for an accepted optimization signal
Give each row an owner and a state: demonstrated, conditional or unresolved. An unresolved boundary is a limit on the decision, not an invitation to supply a convenient estimate. A report can be useful for directional investigation while still being unsuitable for automated value optimization.
For example, an analyst may identify missing interstitial coverage without knowing the exact acquisition source of every impression. That is sufficient to commission an instrumentation repair. It is insufficient to declare one campaign unprofitable or increase another campaign's budget.
Inventory mediation coverage before adding another integration
List the actual production routes by app build, operating system, format and mediation arrangement. For each destination, record whether collection is automatic, manually logged, imported by API or received through another SDK. Include legacy builds still in use. A tested current build does not describe users who have not updated.
Google's Firebase ad-revenue documentation describes automatic adimpression measurement for linked AdMob apps and manual logging examples for other monetization platforms. Its examples include source, format, value and currency parameters. Inspect the implemented path before adding custom logging alongside an existing automatic route.
Google also says AdMob impression-level revenue is not sent for partner bidding ad units; publishers should work with the mediation platform to capture that revenue. A missing path can therefore be a coverage question rather than evidence that an acquisition campaign attracts users with no ad value.
For each source-to-destination pair, require one documented inclusion or supported replacement rule. AppsFlyer explicitly warns that simultaneous mediation-platform and mediated-network revenue integrations can duplicate data. Its combined integration can replace SDK-derived values with later API data under documented conditions. Do not manually add both views together, and do not assume another vendor uses the same replacement behavior (ROI360 guide).
An inventory should identify which route to investigate before anyone disables a feed. Changes need an owner, supported configuration and recovery plan. Removing an apparently redundant integration without tracing its coverage can replace overcounting with missing revenue.
Rehearse one impression from source value to destination
Select a supported test setup with the engineering owner. Observe an ad impression and trace its value into the intended analytics or measurement destination using the provider's testing guidance. Do not click live ads, manufacture paid engagement or send fabricated production revenue to make a test pass.
Google's Android legacy SDK documentation exposes a paid-event listener and an AdValue containing micros, currency and precision. The separate GMA Next-Gen Android guide documents its own API. Identify the installed SDK family before borrowing implementation details from either page.
A useful rehearsal records the source payload, the transformation, the outbound event and the destination readback. Check that the same amount survives the journey. If a source reports 5,000 micros, the amount is 0.005 currency units, not 5,000 currency units. Keep enough decimal precision to represent small impression values; rounding every impression to two decimal places can discard meaningful totals.
Singular's implementation guidance specifically warns about source-unit differences and validates currency and revenue before forwarding. Treat that as a reason to check the actual payload and destination contract, not a license to apply one conversion to every platform or SDK.
Then expand the rehearsal across the routes that matter: rewarded, interstitial or banner inventory; relevant mediation sources; fresh and returning sessions; and builds with different instrumentation. Define the matrix from production usage. Testing every imaginable combination adds little if the revenue-bearing configuration remains untested.
Keep precision and missingness visible
Impression-level is a description of granularity, not a guarantee of final accuracy. Preserve the source's precision classification wherever the reporting architecture supports it. Separate estimates from values that lack enough information to be calculated.
AdMob documents precise, estimated, publisher-provided and unknown values. Unknown values can be zero when information is insufficient; house ads and AdMob campaigns also have documented zero-value cases (AdMob revenue guidance). Therefore, zero, missing and observed no-revenue are different diagnostic states.
The practical question is whether those states could change the decision. If one important source has unknown value, show its coverage separately. Do not fill the gap with an industry eCPM or silently distribute the known revenue across all users. A labeled estimate may support planning; it should not masquerade as observed campaign value.
Reconcile equal populations before comparing totals
A calendar-day monetization total includes revenue generated that day, potentially by users acquired long ago. A day-seven acquisition cohort includes the chosen users' activity through a specified lifecycle age. Neither is inherently wrong. They answer different questions.
Write the comparison definition before exporting: app and operating system, build coverage, acquisition-entry rule, revenue-occurrence dates, cohort age, timezone, currency treatment, attribution settings, included networks and export timestamp. Keep organic, unmatched and otherwise unavailable acquisition assignments visible. A clean total does not require every amount to have a paid-campaign label.
Use a simple bridge:
Comparable attributed value = source value within scope − demonstrated duplicate value − value outside the selected population ± documented timing or valuation adjustments.
Every adjustment needs evidence and a sign. Never create an “other” adjustment solely to force agreement. If an unexplained difference could reverse the proposed budget action, the appropriate result is unresolved.
Google recommends DebugView, Realtime and sampled BigQuery exports at different validation stages. Use event inspection to verify parameters, then a suitably scoped production sample to assess coverage. A debug event proves a path can work; it does not prove all users or formats are represented. The cohort-analysis guide explains the separate maturity comparison.
Fictional example: the apparent revenue gain disappears
The following numbers are illustrative, not a benchmark or client result. A hybrid Android app's measurement report shows 1,200 currency units of ad value against 1,000 of acquisition spend for a defined cohort and horizon. The team is considering a budget increase.
Reconciliation step Ad value Evidence required in the example --- --- --- Initial attributed export 1,200 Saved filters, cohort and timestamp Remove demonstrated overlapping mediation feed −200 Matching coverage and documented duplicate route Remove activity from users outside the selected cohort −100 Reproducible population filter Comparable ad value 900 Same currency, horizon and acquisition population
The apparent ad-value return changes from 120% to 90%. That is not a judgment about the app's total profitability. Purchase proceeds, costs, subsequent value and publisher adjustments remain separate. Nor does correcting the report prove media performance deteriorated: the original comparison was invalid.
The next action is to repair the feed and reproduce the bridge. Increasing spend because the first export exceeded a target would have treated a measurement defect as economic evidence. Equally, stopping the whole channel because the corrected number is below 100% would ignore the app's full, properly defined economics.
Reporting acceptance and bidding acceptance are different gates
Google documents tROAS for ad revenue, called ARO, using the Analytics adimpression event. Its stated prerequisites include Analytics-based bidding, import of that event and an app deriving a significant majority or all revenue from ads. The same page describes hybrid monetization using ad-impression and selected purchase events. Verify the applicable setup in the actual account; do not apply the ad-funded description as a blanket eligibility rule for every hybrid app.
There is also a reporting trap: Google's ARO guidance says conversion-count columns for adimpression show zero, while the conversion-value column carries the summed ad value. A zero count alone does not establish a broken revenue feed. Confirm the event, column and campaign context before changing instrumentation (ARO reporting FAQ).
For a proposed bidding change, retain four additional checks:
The destination receives the intended event and correctly transformed value.
The selected campaign can use that event under its current requirements.
The chosen conversion window and evaluation horizon describe the intended value.
Ad and purchase streams are distinct, with documented overlap and revision handling.
A business may analyze mixed revenue without having a suitable production signal for that same calculation. Keep the Google campaign-goal decision separate from the feed audit. Do not change bids, event imports and mediation configuration simultaneously if that prevents the team from explaining the result.
What to request from an agency or implementation partner
Ask for a compact acceptance packet before expanding the assignment. It should contain a source-to-destination diagram, supported integration settings, a redacted payload trace, coverage by material build and format, the reconciliation bridge, unresolved differences, and the campaign configuration that will consume the value.
Ask who owns each failure. A missing callback belongs with the app implementation owner; conflicting mediation feeds require the monetization and measurement owners; cohort filters require the analyst; campaign-event selection requires the media owner. One partner may coordinate the work, but coordination does not remove the need for named implementation authority.
Require an observation period chosen around your reporting maturity, not a generic number of days. Define the discrepancy that would change the business decision, the next review point and the condition for holding or reversing the proposed configuration. Preserve pre-change exports so a later correction does not erase the explanation.
If choosing between analytics and an MMP remains unresolved, use the Firebase versus MMP framework. Buying another tool cannot establish missing source coverage or correct an undocumented unit transformation by itself.
When the result must remain conditional
Do not authorize value-based expansion from this analysis when a material revenue route is absent, duplicate handling is unresolved, units or currency cannot be demonstrated, cohort populations differ, or destination receipt is unverified. Restricted reporting granularity also limits which campaign or creative conclusions are possible; impression-level collection does not guarantee impression-level access everywhere downstream.
Privacy and contractual limits still apply. A revenue-validation project is not authorization to add identifiers or send more user data. Keep the approved collection and sharing boundaries with the relevant owners. This framework does not replace legal review or determine whether a specific account satisfies platform requirements.
Finally, attributed revenue is not causal lift. A reliable feed may improve the evidence used for a decision, but it does not demonstrate that advertising created all credited value. Publisher revenue estimates also need an appropriate finance reconciliation before being treated as cash available to fund acquisition.
Bring the revenue path to the growth conversation
For app founders, UA leads and monetization owners who cannot explain a material publisher-revenue discrepancy, start with redacted source and destination exports, the integration inventory, one example payload and the exact spend decision at risk.
Sharply Labs' mobile app growth work includes event-quality review and reporting reconciliation within an agreed scope; paid acquisition and attribution services support the related operating decisions. Discuss the ad-revenue evidence to identify the constraints, missing proof and next owners for an initial prioritized agenda. Deeper account review, engineering and campaign operation are scoped separately. The conversation does not promise a completed audit, full attribution, a bidding outcome, higher ROAS or lower acquisition cost.