At a glance: Attribute ad revenue to complete the LTV performance view.
Ad revenue attribution
- Ads display in the app on banners, offer walls, interstitials, etc., and generate ad revenue. Integrate ad monetization network SDKs into the app to serve ads to your users and generate ad revenue.
- Ad revenue, in-app purchases, and subscription revenue combined provide you with the complete LTV picture of the user. By matching user LTV with media spend campaign, ROI is determined and available for further analysis in the Platform.
Ad revenue data:
- Is acquired from the mediation and/or ad monetization networks via server APIs or by embedded reporting SDK in the app (including iOS 14).
- Is attributed to the media source that originally brought the user.
- Reporting granularity depends on the monetization network integration:
- Aggregate granularity: break down by country/geo.
- User-level granularity: allows you to drill down through the advertising hierarchy to the device level. You can further analyze user value by using ad revenue raw data reports.
User-level granularity vs. aggregate level
Ad revenue attribution supports different granularity methods. The granularity is monetization network dependant.
- Aggregate granularity:
- AppsFlyer gets the revenue daily broken down by geo.
- The effective revenue per action (eRPA) is derived by dividing the revenue by the number of instances of a trigger event.
- The trigger events are either app open or specific in-app events set in the app.
- User-level granularity (aka impression-level granularity) [best practice]:
- The monetization network reports the revenue by user at the impression level. Not all monetization networks support user-level granularity.
- This revenue is attributed to the media source that brought the user. Meaning AppsFlyer ad revenue attribution adheres to the attribution rules found in the platform, including retargeting attribution rules.
Note: If you're using a mediation network, make sure to disable ad revenue integrations for monetization partners that are mediated via the mediation network before enabling the user-level granularity integration. Failure to do so results in duplicate data.
Attributed revenue vs. Monetization revenue API
AppsFlyer provides several types of ad revenue data. Note: Not all ad networks provide all the options listed below.
Attributed revenue: Ad revenue based on the user acquisition source, available at both aggregate-level and user-level. For example:
- User sees an ad from Network A and downloads your app.
- Ad displays inside the app.
- Ad revenue is attributed to Network A (responsible for the user acquisition), no matter who published the ad.
Monetization revenue API: Revenue based on the ad source, not the user acquisition source. For example:
- User sees an ad from Network A and downloads your app.
- Ad from Network B displays inside the app.
- Ad revenue is attributed to Network B.
Implementation
The following sections describe the types of ad revenue attribution available, as well as the workflows and steps necessary for implementation and maintenance.
API Ad revenue attribution workflows
To implement API ad revenue attribution, follow one of the granularity method workflows in the following table.
Step | Aggregate granularity | User-level (impression-level) granularity |
---|---|---|
1 | Not Applicable | |
2 |
In the app implement:
|
In the app implement:
|
3 | Connect to the add monetization network partner in AppsFlyer |
Connect to a user-level ad monetization network: |
4 | Generate and attribute ad revenue | Generate and attribute ad revenue |
Aggregate granularity using app open or in-app events
Aggregate granularity implementation:
- The integrated network reports the total revenue per day broken down by geo.
- AppsFlyer derives the effective revenue per action (eRPA) by dividing the ad revenue with the number of instances of a trigger event.
- Each time a trigger event occurs, AppsFlyer creates a _monetized event, that includes the eRPA. For example, ad_matched_monetized.
- Using eRPA revenue is attributed to media sources.
- Don't report ad revenue in in-app events. Doing so causes ad revenue to be duplicated in the Dashboard because AppsFlyer gets the revenue data from the monetization network by integration.
- If you're using a mediation network, make sure to disable ad revenue integrations for monetization partners that are mediated via the mediation network before enabling the ad revenue integration with the mediation network. Failure to do so results in duplicate data.
- You can use one of the following event types:
- Unique monetization in-app event requires modifications to the app.
- af_app_opened event which is available by default.
Event method | How implemented | Considerations |
---|---|---|
Unique monetization in-app event |
|
|
af_app_opened event |
|
|
Method | Pros | Cons | Considerations |
---|---|---|---|
Use the same event for all networks. For example, ad_watched. This automatically generates the ad_watched_monetized event containing the monetization details | Simplest to implement | No quality information, like the number of clicks and ad revenue per network |
|
(best practice) Each network is allocated a unique event for ad watching. Example: ad_watch_admob, ad_watch_vungle. |
Full visibility and ability to compare the monetizing networks in the dashboard in addition to the raw data. | Ad revenue isn't accumulated under a single event. The number of events is equivalent to the number of networks | Enables comparison of monetizing networks in the dashboard. Ad revenue is separated by network using an in-app event per network. |
User-level granularity with Ad revenue API
User-level (impression-level) granularity implementation:
This method is the best practice. It provides the greatest level of granularity and ad revenue is attributed without the need to modify the app. Ad revenue is accurately attributed to the UA source.
User-level ad revenue data: attribution is available in raw data reports. We don't send postbacks of user-level data to integrated partners.
Revenue from app users for which there is no attribution record in AppsFlyer is attributed as organic, with the install date as the day the ad revenue is reported. This can occur, for example, after deleting user-level data from Facebook.
Caution
If you're using a mediation network, make sure to disable ad revenue integrations for monetization partners that are mediated via the mediation network before enabling the ad revenue integration with the mediation network. Failure to do so results in duplicate data.
Method | How implemented | Considerations |
---|---|---|
User-level data using Ad revenue API |
|
N/A |
Migrating from aggregate granularity to user-level granularity implementation notes
- Migrating does not impact historical ad revenue data. This data remains unchanged.
- Ad revenue data is pulled once a day at 1400 UTC using the granularity options selected at that time.
- User-level granularity does not require you to define in-app events (like you do for aggregate-level reporting). You can continue sending these events, but they don't impact the user-level granularity reporting in AppsFlyer.
Connecting to ad revenue integrated partners

Before you begin:
- Request that the ad revenue integrated partner provide you API credentials.
To enable ad revenue integration with the ad revenue network:
- In AppsFlyer, go to Configuration > Integrated Partners.
The Integrated Partner window opens. - Select a partner. Tip: Select Active and Ad revenue to display your existing partners that have Ad revenue capabilities.
The integrated partner's configuration window opens. - Go to the Ad Revenue tab and enable Get Ad Revenue Data.
- Select the type of ad revenue data you want to receive. Note: Not all ad networks provide all the options listed below. If attributed revenue doesn't include the user-level option, it means only aggregate data is available.
- Attributed revenue. Meaning revenue based on the user acquisition source. Attributed revenue reports can be either:
- Aggregate-level. For aggregate level, you also need to select the event on which to base the ad revenue. For example, if you choose the event af_app_opened, then the total ad revenue is divided between all app-opened events, which gives you the ad revenue per app open.
- SDK-level
- Note: If you're using a mediation network, make sure to disable ad revenue integrations for monetization partners that are mediated via the mediation network before enabling the ad revenue integration with the mediation network. Failure to do so results in duplicate data.
- Monetization revenue API. Meaning revenue based on the ad source, not the UA source.
- Attributed revenue. Meaning revenue based on the user acquisition source. Attributed revenue reports can be either:
- Complete the API credentials, or login, as required by the integrated partner. This is not relevant for SDK level integration.
- Click Save ad revenue.
- If the Test Connection button displays, as in the image above, click Test Connection.
- API key verified displays, you have successfully completed the procedure.
- Any other message displays, see Ad revenue API status and testing and repeat the procedure.
- If there is no Test Connection button, you have completed the procedure.
AppsFlyer collects the data from the partner multiple times per day.
Ad revenue API status and testing
-
The operational status of ad revenue integration is available as follows:
- Cost and ad revenue integration status dashboard: Centralized list of partners for whom ad revenue integration is enabled for one or more apps housed in your account.
- Some partners enable you to test the API connection. Where available, a Test connection button displays.
- To verify that the API connection is operational:
- Click Test connection.
The message API key verified displays. If this is not the case, follow the corrective action guidance in the table that follows.
Status | Meaning | Remarks/action required |
---|---|---|
API key verified |
|
None |
Invalid credentials |
One or more of the credentials provided is incorrect. |
Get the correct credentials from the ad revenue partner |
Missing configuration details | One or more of the credential fields is incomplete | Retrieve the credentials in the ad revenue partner's dashboard or reach out to the partner and request the credentials. |
Ad revenue data
Ad revenue data is available via AppsFlyer dashboards and raw data reports.
Ad revenue in the dashboard
Ad revenue shows the quality of users from different sources over time. As users continue launching the app and engaging with ads, their LTV increases.
Note: There may be discrepancies between the ad revenue data in different dashboards and reports. Learn more.
Ad revenue attribution is available as follows:
- LTV based:
- Dashboards being: Overview, events,
- Cohort analytics
- Master API
- Activity based:
- Dashboard: Activity
- Ad revenue raw data
Overview dashboard - aggregated performance report

In the Overview dashboard:
- Values, including revenue, are LTV. See LTV vs. activity data.
- The Revenue column includes all revenue, including ad revenue and in-app purchases.
- Drill-down into the advertising hierarchy (media source, campaign, ad set, geo) to view the monetized events in the report.

In the Activity dashboard:
- Values including revenue are activity date-based. See LTV vs. activity data.
- The Average Actions per User indicates the tendency of users to engage with the ads presented in the app.
Examples
Three users install an app on December 31, 2017. They are attributed as follows:
- User A: Network A
- User B: Network B
- User C: Organic
The app is integrated with five different monetization platforms. Each platform uses a unique in-app event using the AppsFlyer SDK as follows:
- Facebook Audience Network: fb_ad_view
- Chartboost: chartboost_ad_view
- Admob: admob_ad_view
- Applovin: applovin_ad_view
- IronSource: is_ad_view
After the install for a period of four days, the users are shown ads, as follows:
User |
UA network |
fb_ |
chartboost_ |
admob_ |
applovin_ |
is_ad_view |
Total |
---|---|---|---|---|---|---|---|
A |
Network A 2017-12-31 |
2018-01-01 $1 |
2018-01-02 $1 |
2018-01-03 $1 |
2018-01-04 $1 |
|
$4 |
B |
Network B 2017-12-31 |
2018-01-02 $1 |
|
2018-01-04 $1 |
|
$2 | |
C |
Organic 2017-12-31 |
2018-01-01 $1 |
2018-01-02 $1 |
$2 |
Looking at the data, we can now summarize the revenue collected per user, per day (and per in-app event):
User |
2018-01-01 |
2018-01-02 |
2018-01-03 |
2018-01-04 |
Total LTV |
---|---|---|---|---|---|
A |
$1 |
$1 |
$1 |
$1 |
$4 |
B | $1 | $1 | $2 | ||
C | $1 | $1 | $2 | ||
Total | $2 | $3 | $1 | $2 | $8 |
Understanding the Reports:
As mentioned, ad revenue is tied to user LTV. Therefore, the time period you select in the Dashboard represents the cohort of installs for which the revenue is aggregated up until the current time and day. Let’s examine a report with two different date selections:
Aggregate Report : Dates Selected: 2017-12-31-2018-01-05
Network |
LTV Revenue |
---|---|
Organic |
$2 |
Network A |
$4 |
Network B |
$2 |
Network C |
$2 |
In this case, the cohort is users who installed the app from 2017-12-31 until the current day, 2018-01-05. All the revenue generated by those users is tied back to the acquiring source and represented under the user’s LTV.
Ad revenue raw data

Ad revenue raw data reports contain data provided by monetization networks having user-level integration with AppsFlyer.
Principles of ad revenue raw data
- Data is aggregated by the number of unique impressions per user. Unique impressions are derived from the combination of ad monetization network, ad unit, and placement.
- Raw data freshness is identical to that of user-level ad revenue in the Activity dashboard.
Report |
Export |
Pull API | Data Locker |
---|---|---|---|
Attributed ad revenue (non-organic) | ✓ | ✓ | ✓ |
Organic ad revenue | ✓ | ✓ | ✓ |
Retargeting ad revenue | ✓ | ✓ | ✓ |
Data characteristics and fields
The fields in ad revenue reports are populated:
- by the ad revenue event itself and listed in the table that follows. These fields are divided into:
- Specific: Fields specific to ad revenue. For example, impressions and placement. Note! The fields populated differ by monetization partner, as shown in the Fields by network table in this section.
- Context: Fields having a similar meaning in other raw data reports. For example, event name, event value, currency.
- as a result of attributing the event to the media source that brought the user. Meaning these fields are copied from the conversion event that brought the user. For example, media source and campaign. These fields are not listed in the table that follows.
api_name | Field name | Field type | Description |
---|---|---|---|
event_time | Event time | Context | The date the revenue is attributed to |
event_name | Event name | Context | Always set to af_ad_revenue |
event_revenue | Event Revenue Currency | Context |
|
event_revenue_currency | Event Currency | Context | Event revenue currency |
event_revenue_XXX | Event Revenue XXX | Context |
|
country | Country |
Context |
Install country of the install conversion |
ad_unit |
Ad unit |
Specific |
Type of ad |
segment | Segment | Specific | Ad placement name |
monetization_network | Monetization Network | Specific | Network sending the ad |
impressions | Impressions | Specific | Number of times that the user saw the ad |
mediation_network | Mediation Network | Specific | Mediation network reporting the event to AppsFlyer |
Display name | Admob | ironSource | AppLovin MAX | Appodeal | Fyber |
---|---|---|---|---|---|
Ad unit | ✓ | ✓ | ✓ | ✓ | ✓ |
Segment | - | (1) | - | - | - |
Placement | - | ✓ | ✓ | ✓ | ✓ |
Monetization Network | ✓ | ✓ | - | ✓ | - |
Impressions | - | - | ✓ | ✓ | - |
Mediation Network | - | ✓ | ✓ | ✓ | - |
(1) The advertiser needs to configure this in ironSource |
Additional information
FAQ
How can I get the total ad revenue from each platform?
- Ad revenue attribution is linked and displays in relation to the user acquisition source.
- This provides the LTV view of your ROI and KPIs.
- To view the total revenue from each monetization platform use a different in-app event for each network and use the following procedure:
- In the Overview dashboard, go to the aggregated performance report table.
- Select up to four monetized events representing the platforms you want to query.
-
Download the report by, click Export CSV.
- Sum up the Revenue column of the requested platform's monetized event
- Note that this total ad revenue is LTV data, i.e. it's the entire revenue generated by a monetizing network for your app from users, who installed during the specified date range.
Is ad revenue available in the activity page?
Yes!
The Activity page reports on the combined revenue from in-app purchases and ad revenue. Note: Ad revenue data is sent to AppsFlyer on a daily basis, the day following the event.
Do I need to activate the partner in the Integration tab?
- If you engage with the partner for ad monetization (ad revenue) only: don't enable Activate Partner in the integration tab.
- Enable only Get Ad Revenue data in the Ad Revenue tab.
How is user-level ad revenue attributed if a user has an app version without the AppsFlyer SDK?
- Ad revenue is attributed as organic.
Is there a discrepancy between ad revenue data in different dashboards and reports?
There can be discrepancies between ad revenue data in the Overview dashboard and raw data reports, and in the Activity or Cohort dashboards. This is because:
- Ad revenue data in Cohort and Activity dashboards, as well as data via Master API and Cohort API is updated retroactively; in the Overview dashboard, and via raw data export and Pull API, it is not.
- Data is sometimes displayed in the Activity and Cohort dashboards before the Overview dashboard.
- Dashboards include events marked as
af_ad_revenue
and_monetized
, while raw data only includesaf_ad_revenue
events. - Unknown devices may be leading to an increase in Day 0 revenue being reported in Cohort and LTV dashboards and reportd.
Traits and limitations
Trait | Remarks |
---|---|
Ad network access | Can't access Cohort reports |
Agency access |
Agencies:
|
Agency transparency | Not supported |
Time zone |
Ad revenue is processed daily. In raw data, this is with a timestamp based on 00:00:00 UTC, but aligned to the app time zone. This means that for an event on July 2, 2021 UTC, for apps in:
|
Currency |
In AppsFlyer:
|
Limitations |
Ad revenue events are not available to:
User-level granularity limitations:
|
Data type | Both organic and non-organic data are supported |
Data freshness | Ad revenue |
Historical/retroactive data |
|
Account user access | Supported |
SKAN | Supported by Admob and generic SDK connection via the af_ad_revenue event. |
Unknown devices |
When there isn't attribution data available to match the ad revenue event to (a common occurrence for retargeting campaigns) :
|
Geo/country |
In Cohort dashboard, when geo is unknown (N/A), the N/A data doesn't display when aggregating by geo. |
List of Ad revenue integrated partners
Partner | Logo | Credential parameters required | Data granularity |
---|---|---|---|
![]() |
|
Aggregate level with geo | |
Admost |
![]() |
|
User-level with geo |
![]() |
|
Aggregate level with geo | |
![]() |
|
User-level with geo | |
![]() |
|
|
|
Bytedance Ads - China traffic | ![]() |
|
Aggregate level with geo |
Chartboost | ![]() |
|
Aggregate level with geo |
![]() |
|
Aggregate level with geo | |
Fyber | ![]() |
|
User-level with geo |
Google Marketing Platform -DV360/CM (DoubleClick) | ![]() |
|
Aggregate level with geo |
Google Admob | ![]() |
|
Aggregate level with geo |
Google Ads | ![]() |
|
Aggregate level with geo |
IronSource | ![]() |
|
|
Mintegral |
![]() |
|
Aggregate level with geo |
Tapjoy |
![]() |
|
User-level with geo |
![]() |
|
Aggregate level with geo |
|
TopOn |
![]() |
|
User-level with geo |
Tradplus mediation |
![]() |
|
User-level with geo |
|
![]() |
|
Aggregate level with geo |
Voodoo Ads | ![]() |
|
Aggregate level with geo |
![]() |
|
Aggregate level with geo |