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.
- Ad revenue, combined with in-app purchases, and subscription revenue 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.
Attributed ad revenue data:
- Is acquired from the mediation platforms 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. 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.
- Reporting granularity depends on the monetization network integration and ad revenue attribution type.
Integration types for ad revenue attribution
Data accuracy and freshness are dependent on the ad revenue attribution integration type, as explained in the following table.
Note: SDK integration types require developer assistance to implement. S2S integration types require you to have the correct network credentials.
Ad revenue attribution integration type | Description |
---|---|
Aggregate level via S2S API |
|
Device-level via S2S API |
|
Impression-level via SDK |
|
Impression-level (via SDK) with device-level (via S2S API) |
|
Implementation
The following sections describe the types of ad revenue attribution available, as well as the workflows and steps necessary for implementation and maintenance.
Connect 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, from the side menu, select Settings > Revenue Settings > Ad revenue.
- In Ad revenue integration, click New ad revenue integration.
-
Select an add revenue partner and click Next.
-
Select the type of ad revenue data you want to receive. Note: Not all ad networks provide all the options listed below.
- Attributed revenue. Meaning revenue based on the user acquisition source. Attributed revenue reports can be either:
-
Aggregate level via S2S API.
- 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.
- Device-level via S2S API.
- Note: If you're enabling the device-level ad revenue API of a mediation platform you must disable the ad revenue integrations of the monetization networks that it mediates. Failure to do so results in duplicate data.
- Impression-level via SDK.
- Tell your app developers to integrate the AppsFlyer ad revenue SDK API.
- Impression-level (via SDK) with device-level (via S2S API).
- Tell your app developers to integrate the AppsFlyer ad revenue SDK API.
- Note: If you're using a mediation platform, make sure to disable ad revenue integrations for monetization partners that are mediated via the mediation platform before enabling the ad revenue integration with the mediation platform. Failure to do so results in duplicate data.
-
Aggregate level via S2S API.
- 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 integrations.
- Click Save.
-
If the Test Connection button displays, as in the image above, click Test Connection.
- If API key verified displays, you have successfully completed the procedure.
- If 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 data from the partner multiple times per day. - [Optional ]QA and compare the ad revenue data you see in AppsFlyer to the ad revenue data you see in your mediation partner and UA partner dashboards. Learn more
- [Optional] Share ad revenue data to your UA partners via UA signals and ad revenue event postbacks.
Note: If you change from one integration type to another, the change takes effect at 12 AM UTC the following day.
View, edit, and delete ad revenue integrated partners
To view, edit, or delete ad revenue network integrations:
-
In AppsFlyer, from the side menu, select Settings > Revenue Settings > Ad revenue and select your app.
A list of all your partner integrations displays, along with information about the product and integration type, integration status, and the ad revenue event names. - Hover over the integration and click Edit or Delete as needed.
Deduplicate cross-referenced ad revenue
When an app uses two mediation platforms with API integration types (aggregate level or device-level), both of which are associated with the same monetization network, partial duplication of ad revenue data may occur. In such cases, each mediation platform reports all the ad revenue generated by their associated monetization network, regardless of whether that revenue was generated while being mediated by only one of the platforms.
To help avoid partial duplication of revenue data when two mediation platforms cross-reference each other:
- If available, use impression-level integrations via SDK.
- There isn’t duplication if both mediation platforms use impression-level integrations via SDK.
- If you have multiple integrations, and one of them is SDK, we recommend also making your other integrations via SDK.
-
For integrations via API, deduplicate the ad revenue:
- In AppsFlyer, from the side menu, select Settings > Revenue Settings > Ad revenue.
- In General Settings, check the box Deduplicate ad revenue when two mediation partners cross-reference each other. Note: Don't check the box if the 2 mediation platforms:
- Mediate different ad formats. For example, when platform 1 shows Banner and Interstitial, and platform 2 shows AppOpen and Native ads.
- Have impression-level integrations via SDK.
Aggregate granularity using app open or in-app events
Aggregate granularity for ad revenue works as follows:
- 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.
- AppsFlyer creates a _monetized event, that includes the total eRPA for each attributed device. For example, ad_matched_monetized.
- Using eRPA, revenue is attributed to media sources.
- 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.
- Don't report ad revenue amounts in in-app events in parallel to an ad revenue integration. Doing so causes ad revenue to be duplicated in the dashboard because AppsFlyer gets the revenue data from the monetization network by integration.
Aggregate ad revenue using events
Event method | How implemented | Considerations |
---|---|---|
Unique monetization in-app event |
|
|
af_app_opened event |
|
|
Comparison of in-app event methods
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. |
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 aggregate data
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
- LTV reports
- Cohort dashboard and reports
- 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:
- Meta 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_ ad_view |
chartboost_ ad_view |
admob_ ad_view |
applovin_ ad_view |
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 device-level or impression-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.
-
Impression-level raw data is:
- Aggregated to device-level and available in device-level reports.
- Available as in impression-level reports in Data Locker.
- Raw data freshness is identical to that of device-level ad revenue in the Activity dashboard.
Report | Export data page |
Pull API | Data Locker |
---|---|---|---|
Attributed ad revenue (non-organic) | ✓ | ✓ | ✓* |
Organic ad revenue | ✓ | ✓ | ✓* |
Retargeting ad revenue | ✓ | ✓ | ✓* |
Impression-level raw data** | - | - | ✓ |
* Versioned report is also available, updated multiple times per day, with data aggregated at the device level. Non-versioned Data Locker reports are daily. ** This refers to reports with impression-level in the name, not to impression-level ad revenue integration. |
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.
Fields populated by ad revenue
api_name | Field name | Field type | Description |
---|---|---|---|
event_time | Event time | Context | The date the revenue is attributed to |
event_name | Event name | Context | 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 platform reporting the event to AppsFlyer |
Fields by network
Display name | Admob | ironSource (LevelPlay) | AppLovin MAX | Appodeal | Fyber |
---|---|---|---|---|---|
Ad unit | ✓ | ✓ | ✓ | ✓ | ✓ |
Segment | - | (1) | - | - | - |
Placement | - | ✓ | ✓ | ✓ | ✓ |
Monetization Network | ✓ | ✓ | - | ✓ | - |
Impressions | - | - | ✓ | ✓ | - |
Mediation Network | - | ✓ | ✓ | ✓ | - |
(1) The advertiser needs to configure this in ironSource |
Data freshness
Data freshness depends on the integration type and the reporting method.
For S2S API integrations, the earliest that data becomes available is:
- Dashboards and reports (via Data Locker) starting at Day X+1, 8 AM UTC, approximately 4 times per day, every 6 hours. And days 2, 3, 7, and 14, once per day.
For impression-level SDK integrations, the earliest that data becomes available is:
- Dashboards and reports (via Data Locker) best case scenario, starting at Day X from 5 AM UTC, updated approximately 6 times per day, every 4 hours.
- Impression level raw data reports (via Data Locker) at Day X from 1 AM UTC, updated hourly.
For impression-level (via SDK) with device-level (via S2S API), you get data freshness for Day X with the data accuracy for Days X+1, as follows:
-
For impression-level data that arrives via SDK:
- Dashboards and reports (via Data Locker) best case scenario, starting at Day X from 5 AM UTC, updated approximately 6 times per day, every 4 hours.
- Impression level raw data reports (via Data Locker) at Day X from 1 AM UTC, updated hourly.
-
For device-level data that arrives via S2S API:
- Dashboards and reports (via Data Locker) starting at Day X+1, 8 AM UTC, approximately 4 times per day, every 6 hours. And days 2, 3, 7, and 14, once per day.
Note: When changing the integration type, data received via the previous integration type for dates in the past will not be backfilled by the new integration type. For example, if on day X the integration type was changed from SDK to S2S, the data will be pulled from day X+1 onwards and not be pulled for days preceding day X.
Ad Revenue Data Locker reports
Name | Freshness | Report Sections |
---|---|---|
Daily Ad Revenue (aggregated at device-level) |
The ad revenue for a particular day (day X) is reported on the following day (X+1), at 8 PM UTC. For instance, Ad revenue from May 1st will be reported on May 2nd. |
The report includes Attributed, Organic, and Retargeting AdRevenue sections. |
Versioned Daily Ad Revenue Report (aggregated at device-level) |
The daily report consists of:
In other words, the version set of a daily report includes the following versions:
|
Each report version includes Attributed, Organic, and Retargeting AdRevenue sections. |
Impression level Ad Revenue report (impression-level) | The impression-level ad revenue records are written to a separate file every hour. |
Additional information
Migrating from aggregate to device-level granularity
- 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.
- Device-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 device-level granularity reporting in AppsFlyer.
FAQ
How can I get the total ad revenue from each platform?
|
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 device-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:
|
Traits and limitations
Trait | Remarks |
---|---|
Limitations |
Ad revenue events are not available to:
Device-level granularity limitations:
The count of unique users triggering an af_ad_revenue event is not supported in AppsFlyer dashboards. |
Ad network access | Can't access Cohort reports |
Agency access | Agencies:
|
Agency transparency | Not supported |
Time zone |
Ad revenue displays in AppsFlyer dashboards and reports in UTC timezone only. Meaning, if data is reported at 2 PM UTC+2, in AppsFlyer it displays as 2 PM UTC. processed daily. This is because AppsFlyer needs to normalize the data collected from multiple sources and partners, most of which report their data in UTC. |
Currency | In AppsFlyer:
|
Data type | Both organic and non-organic data are supported |
Data freshness | Ad revenue |
Historical/retroactive data |
|
Account user access | Supported |
SKAN | Supported by impression-level ad revenue SDK API. |
Geo/country | In Cohort dashboard, when geo is unknown (N/A), the N/A data doesn't display when aggregating by geo. |
In-app event postbacks |
|
CTV, PC, and console apps |
|
Deduplicate cross-referenced ad revenue | Not available for device-level via API MAX integrations. |
List of Ad revenue integrated partners
Partner | Integration type available | ||
---|---|---|---|
Aggregate level | Device level | Impression level | |
Admost | - | ✓ | ✓ |
AppLovin | ✓ | - | - |
AppLovin Max | - | ✓ | ✓ |
Appodeal | - | ✓ | ✓ |
Bytedance Ads (China traffic) | ✓ | - | - |
Bytedance Global (TikTok for Business - Legacy) | ✓ | - | - |
Chartboost | ✓ | - | ✓ |
Custom Mediation | - | - | ✓ |
DoubleClick (Google Marketing Platform -DV360/CM) | ✓ | - | - |
Meta ads | ✓ | - | - |
Fyber | ✓ | ✓ | ✓ |
Google Admob | ✓ | - | ✓ |
Inmobi | ✓ | - | - |
ironSource (LevelPlay) | ✓ | ✓ | ✓ |
Mintegral | ✓ | - | - |
Odeeo | - | ✓ | - |
Tapjoy | - | ✓ | - |
Topon | ✓ | ✓ | ✓ |
Topon Pte | - | - |
✓ |
Tradplus | - | ✓ | ✓ |
Unity Ads | ✓ | - | - |
Unity Ads Mediation | - | - | ✓ |
Voodoo | ✓ | - | - |
Vungle | ✓ | - | - |
Yandex | - | - | ✓ |