ROI360 cost aggregation overview

Premium

At a glance: Learn about methods for advertisers to aggregate and view marketing cost data.

Cost aggregation

ROI360:

  • Provides aggregate advertising cost data and cost-related LTV performance metrics. These are available via dashboards and performance reports. The cost-related metrics available include ROI, ROAS, clicks, impressions, campaign ROI, and average effective cost per installation (eCPI) over time.
  • Covers advertising costs across all platforms, including mobile apps, web browsers, CTV, PCs, and consoles.
  • Supports different cost models used by the partner, for example, CPI, CPA, CPC, and CPM.
  • Records advertising cost by API, Cost Import (CSV file upload), and cost on the attribution link.
  • Agencies can access ROI360 cost data for advertisers with an ROI360 subscription.

The following metrics are available to advertisers without an ROI360 subscription:

Principles of cost data aggregation

This section describes the main principles of campaign cost data aggregation.  

Cost aggregation methods

Cost data is obtained from partners using one or more methods. If cost is reported by more than one method, then the cost prioritization mechanism determines which data is used. This ensures that cost data is not inflated.

After AppsFlyer processes the data, it displays in UTC timezone (default) or as per your app-specific timezone settings.

Cost aggregation method Cost models supported Data granularity Data freshness Remarks
API* All Level depends on the integration Intraday Data may change after the cost event as we try to receive data up to 7 days back (depending on the media source). This enables us to take into account retroactive changes made by the media source. 
Cost Import (file upload) All Level depends on the file uploaded  Up to 4 hours after import Cost reported can be reverted and corrected data submitted for up to 90 days.
Cost on the attribution link CPI User-level

Minimum: realtime

Maximum: Up to 4 hours after link is clicked

No change possible
* API integrations between partners and AppsFlyer are by either Cost API or InCost API (never both). The API used and data granularity provided is partner-dependent.

Cost data availability and reports

The following table indicates where cost data is available.

For the purposes of understanding the table, the following explanations apply, unless otherwise indicated in the table remarks:

Cost in the UA view

Campaign cost data is classified into User Acquisition based on whether the campaign has at least one install, click, or impression recorded on the date the cost is reported (install date) and within ±10 days of that date. Matching is done using the media source, campaign ID, and agency.

Cost in the Unified view

The Unified view includes cost data for all campaigns of the selected app, regardless of whether installs, clicks, or impressions exist within ±10 days of the date the cost is reported (install date).

Example

  • If cost for campaign X is reported on March 10 and campaign X has at least one click or install between March 1–March 20, the cost for March 10 appears in UA and in Unified.

    • If no activity exists in that time window, the cost for March 10 appears only in Unified.

  • If campaign name changes are not supported, both campaign names will display: one with attribution data and one with cost data. Neither campaign name displayed will include the complete data picture.

Cost data availability and reports

Reporting method View/data type Campaign name change support Remarks
Overview dashboard
  • UA
  • Unified
Yes Retargeting view doesn't display cost. Cost for retargeting displays in the unified view.
Activity dashboard UA Yes  
Cohort dashboard
  • UA
  • Unified
Yes
  • Retargeting view doesn't display cost
  • This unified data is available only for campaigns with at least one install, click, or impression recorded within ±10 days of the date the cost is reported (install date).
Cohort API
  • UA
  • Unified
Yes This unified data is available only for campaigns with at least one install, click, or impression recorded within ±10 days of the date the cost is reported (install date).
SKAN dashboard SKAN No SKAN installs display, along with cost data for all installs (including non-SKAN installs).
SKAN Aggregated Performance API SKAN No SKAN installs display, along with cost data for all installs (including non-SKAN installs).
Pivot dashboard UA No  
Master API UA No  
Custom dashboard UA No  
Cost ETL Unified Yes All available cost data displays.
Aggregated Pull API UA No  
Push API Raw click data (not aggregated) Not relevant  
Raw data Pull API Raw click data (not aggregated) Not relevant  
Data Locker Raw click data (not aggregated) Not relevant Data Locker Cohort doesn’t support cost.

Note:

  • Data granularity can differ based on dashboard/report type. The Cost ETL reporting tool contains the complete set of data. This includes campaign hierarchy details (media source, campaign name, adset, and the dimensions made available by the media source, including geo, channel. site ID, and keywords).
  • Cost data reported on the attribution link is available in raw-data reports. 

Cost prioritization mechanism

For a given media source, cost can be provided by more than one method. To avoid cost inflation, a campaign cost prioritization mechanism decides which cost data is made available in the platform. Priority is given according to the aggregation method. The priority from lowest to highest is: Cost on the attribution link > Cost API > Cost Import.

The cost prioritization mechanism impacts aggregate data reports and dashboards. Attribution link cost data available in raw data reports are not impacted by the prioritization mechanism.

Considerations:

  • The priority mechanism works at the campaign levels. This means that if you get 2 cost inputs for one campaign via different mechanisms, then they compete and the higher priority wins for the entire campaign.
    • On any day, when there's cost data for a specific app and media source (or agency) via Cost API, cost data on the attribution link is ignored.
  • If you change cost aggregation methods, the change has a retroactive impact. Historical aggregate cost data can change.
  • Change to the cost aggregation method affects agency-generated traffic in the same manner. This includes both transparent and non-transparent agencies. 

 Example

Scenario: An media source reports cost on the attribution link, but you decide to enable the media source's Cost API.

Result: Cost is aggregated by both cost on the attribution link and Cost API. Since Cost API has priority, cost on the attribution link is ignored.

[Closed Beta] Cost split 

There are ad networks that report the campaign cost data without an associated app ID. When this happens, AppsFlyer completes the app ID(s) using engagement and attribution data.

AppsFlyer matches apps based on those associated with the campaign’s clicks, impressions, and conversions within a ±10-day window around the reported cost date.

If the app completion process results in multiple matched apps, AppsFlyer distributes the campaign cost across those apps as follows:

Proportional split (by conversions)

If conversions exist on the reported cost date, the cost is split proportionally based on each app’s number of conversions.

Example: If the total cost on Day 1 is $100, and the campaign drives 60 installs on iOS and 40 installs on Android, then:

  • iOS: $60
  • Android: $40

Equal split (no conversions)

If no conversions exist on the reported cost date, the cost is split equally across the matched apps.

Example: If the total cost on Day 1 is $100 and the campaign has impressions but no conversions on that date, then:

  • iOS: $50
  • Android: $50

Limitations

  • This feature is available only to closed beta customers.
  • This feature is supported only for Google campaigns.

Additional information

List of media sources supporting Cost API

The downloadable table below lists all media sources supporting Cost API, with the data granularity available for each:

  • Dimensions
  • Supported features and their characteristics
  • Metrics (as reported by the media sources)

Download file: CSVXLS

Changing campaign names

AppsFlyer displays campaigns using the campaign ID as the key.

To avoid display anomalies ensure that:

  • Campaigns have a unique campaign ID assigned to them.
  • You don't use the same campaign name with different campaign IDs.

Learn more about campaign name changes

Costs without installs

Why do I see cost data with no installs? This occurs when cost is provided at an upper-level hierarchy (e.g. campaign level), but the performance information (clicks and installs) is provided at a lower level in the advertising hierarchy (e.g. adset).

AppsFlyer completes the cost data for missing dimensions from an upper-level hierarchy. This guarantees a full view of the cost data at any level and minimizes internal discrepancies.

 Example

An advertiser runs a campaign. The advertising hierarchy is as follows:

  • Media source: media_eg
  • Campaign: campaign_eg
  • Adsetsadset1, adset2

The following information relating to the media source is displayed.

Hierarchy: All Media Sources > media_eg

Campaign Cost Installs
campaign_eg $100 100
campaign_yy $200 1000
campaign_zz $300 2000

Drilling down into campaign_eg, the adset level is shown. 

Hierarchy: All Media Sources > media_eg > campaign_eg 

Adset Cost Installs
None $100  
adset_1 N/A 30
adset_2 N/A 70

In this case, the cost of campaign_eg is $100 and is provided at the campaign level. When drilling down to the adset level, which in this case is the component level, the cost cannot be broken down by adset. 

To overcome this, AppsFlyer carries down the cost from the campaign level and displays it in a separate row. In this case, the adset is shown as none and the installs field left blank

Cost currency conversion

If the campaign cost currency provided by the media source differs from that of the app-defined currency set on the platform, the cost is converted to the app-defined currency as follows:

  • AppsFlyer gets the rates from openexchangerates.org.
  • Exchange rates are updated hourly for data up to 7 days back.
  • Currency conversions are performed using the last known rate.

Traits and limitations

Trait Remarks
Agencies
  • Agencies can access ROI360 cost data for advertisers with an ROI360 subscription.
  • When transparent agencies run campaigns, advertisers can see the cost displayed in dashboards and reports that support unified view. Learn more
  • If an advertiser ends their relationship with an agency and the agency has cost configured for the app, cost data continues to be pulled even if the advertiser disables the agency permissions at the app level. To prevent this, the advertiser must ask the agency to disable their cost integration in AppsFlyer before disabling the agency permissions.
  • For some media sources, agencies must contact the advertiser to activate the integration and are prompted in the AppsFlyer UI to do so. For these networks, agencies and advertisers must ensure that when the media source sends data it includes the af_prt parameter, required for agency cost attribution.
  • For X Ads, cost data for SKAN-only campaigns (campaigns that only have SKAN installs and no "regular" installs) isn't available to agencies. The cost integration must be set up by the advertiser. And the data can only be viewed by the advertiser.
API data freshness
  • Intraday (except for Moloco)
  • Mintegral data is available via API by the following day, approximately 4 hours after the previous day ended. Meaning, if the event occurred on Day 1, cost data is available by Day 2, at approximately 4:00.
Campaign name changes Ad spend data displays using the most recent campaign name reported. Note: This is for the display of aggregate data; not the raw data itself.
Timezone If an media source supports just one timezone, and there is a discrepancy between the timezone the media source supports and the timezone set in your app settings, the timezone that the media source supports is used.
CTV, PC, and console platforms For apps on these platforms, cost data must be sent via Ad Spend Ingestion using the upload file by email method.
Cross-platform Cost data isn't available for cross-platform clicks and impressions, meaning when the impression/click is on one platform and the app install happens on another platform. 
Out-of-store apps Cost data from Mintegral isn't available for out-of-store apps (apps from platforms other than Google Play and App Store).
Geo Geo/country breakdown isn't available for Mistplay bundled campaigns (campaigns targeted to several countries). For such campaigns, geo displays as N/A.
Smadex Dashboards and cost ETL reports may show cost and attribution data separately. This occurs when Smadex includes other things (like inventory ID) in the site ID value. 
Apple Search Ads For SKAN-only reporting, ASA cost data isn’t available in the SKAN dashboard or Pull API, since Apple doesn’t include campaign-level data in SKAN postbacks. However, cost data is available in SSOT reports via our classic integration.
Cost data dimension character limit

The following dimensions cannot exceed the specified character length. Failing to comply with these limits will result in the exclusion of dimension values from the report. 

  • app_id <=100
  • publisher <=250
  • partner <=250
  • campaign <=250
  • campaign_id <=250
  • adset <=250
  • adset_id <=250
  • ad <=250
  • ad_id <=250
  • site_id <=250
  • site_name <=250
  • channel <=250
  • ad_account <=250
  • ad_account_name <=250
API Cost data availability

API cost data is displayed only for customers with an active ROI360 asset. If ROI360 is deactivated, cost data from API sources is no longer available—only CPI-based cost data will be shown in the dashboard.

Mintegral: ad level granularity To get cost reporting with ad-level granularity from Mintegral, the following ad network permissions are required per ad account: Sub/Package × Creative dimension.