# Welcome to AdLibertas

AdLibertas is a data platform for mobile apps that collects, processes and stores your app’s data, giving users in your organization, flexible, easy-to-use interactive analytics.

## Getting Started

**Got 1.5 minutes?** Check out a video overview of the platform:

{% embed url="<https://youtu.be/PMR9ddtFq2I>" %}

{% hint style="info" %}
**TL;DR:** AdLibertas collects all of your important app data and helps you answer questions about user behavior and track the performance of your business.
{% endhint %}

<figure><img src="https://www.adlibertas.com/wp-content/uploads/2021/07/howItWorks.png" alt=""><figcaption></figcaption></figure>

Interested in learning more on how the AdLibertas platform works? Check out details on our data pipeline and architecture in the section below.

{% content-ref url="/pages/WhI4DEP3fH4wDfIBQxy4" %}
[How it works](/the-platform/how-it-works)
{% endcontent-ref %}

## Guides: How can it be used

See how some of our customers use AdLibertas to grow their apps:

{% embed url="<https://www.adlibertas.com/case-study-better-onboarding-increases-retention-doubles-user-ltv>" %}
See how the popular animation app Flipaclip analyzes customer onboarding performance
{% endembed %}

{% embed url="<https://www.adlibertas.com/first-day-actions-predict-ltv>" %}
See how the creators of the smash-hit Flow Free **uses first-day actions to find valuable users.**
{% endembed %}

{% embed url="<https://www.adlibertas.com/guest-post-starting-a-live-ops-strategy>" %}
Geoff Hladik, Head of Growth for Visual Blasters shares his story on how a simple AB test turned into creating dynamic app experiences to increase user engagement, retention, and LTV.
{% endembed %}

{% embed url="<https://www.adlibertas.com/case-study-data-driven-app-design>" %}
Random Logic Games uses Firebase AB testing and AdLibertas Audience Reporting to test game mechanics and increases user LTVs 10% in a single AB test.
{% endembed %}

{% hint style="info" %}
Looking to see how we can help your specific use case?  Schedule a [**conversation**](https://www.adlibertas.com/schedule-a-demo/)**!**
{% endhint %}

## Integrating your data

{% hint style="info" %}
**No SDK:** Getting started only requires API credentials. Wherever we can leverage your existing technology stack, we connect via APIs to started quickly. You can stop anytime.
{% endhint %}

Combining and unifying the data generated by your users can be a complex undertaking. At AdLibertas we’ve built our business around providing easy, actionable access to complex data to mobile app developers. Our mission is simple: build the tools so you can focus on making better apps, not wrestling with data.&#x20;

See how we connect with your data in 3 easy steps:

{% content-ref url="/pages/9dOTM5U6kjGDg8o2fX5G" %}
[Connecting in 3 steps](/data-integrations/connecting-in-3-steps)
{% endcontent-ref %}


# How it works

AdLibertas functions as your private end-to-end data cloud: we do the heavy lifting of managing your data so you can focus your efforts on more valuable activities.

<div align="left"><img src="https://www.adlibertas.com/wp-content/uploads/2022/09/InputsToOutputs-v2.png" alt="more details about the platform"></div>

### **Step 1. API Data Collection**

We have 100+ APIs that are scheduled to batch-fetch your data from all in-app service providers. We don’t require an SDK for integration, and most data can be collected by simply connecting credentials.

{% embed url="<https://adlibertas.gitbook.io/product-docs/data-integrations/integrate-in-3-steps>" %}

### **Step 2. Data Pipeline: Processing & Storage**

**Scheduled Data Import & ETL**

Our scheduled, overlapping data import schedules ensures the latest data available is accessible while back-fetching ensures any later-posted data is added to keep data access timely and correct.

We’ve pre-built the ETL & processing algorithms so there’s no need for you to wrestle with scripting your own.

**Fully managed data lake**

For every AdLibertas customer, we spin up a single-tenant AWS account to house and store your data. We’ve architected your data to be stored as ORC files in S3 buckets. This maximizes long-term cost-efficiency and maintains accessibility and security for all clients. There’s no maintenance or overhead needed.

&#x20;                                                 ![](/files/xVFutmLHpDXuSPSNSYK4)

&#x20;                                                     **Building your own Data Pipeline: Best Practices**

For app developers that want to architect, build and maintain their own data architecture, AdLibertas Head of Architecture, Allen Eubank, [shares our experiences](https://www.adlibertas.com/mobile-data-architecture-and-data-pipeline/) in building a scalable, reliable data pipeline.

**Fast, parallel-distributed query processing**

For processing the many petabytes of information generated by our clients, we adopted *Trino* a fast, highly parallel, and distributed query engine that is built from the ground up for efficient, low latency analytics at scale.&#x20;

&#x20;                                                     <img src="/files/73N9T8QDixUTh6Y27YwM" alt="" data-size="original">

&#x20;                               [<mark style="color:blue;">Read how and why</mark>](https://trino.io/users.html#adlibertas) AdLibertas uses *Trino* to enable their customers.

{% embed url="<https://www.adlibertas.com/the-adlibertas-approach-to-big-data>" %}

### **Step 3. End-User Reporting & Access**

**Rich, interactive reporting and custom dashboarding**

![Dashboard and reporting](/files/i4xjb2KKKpr3hgKaqHVn) ![BI & Analytics](https://www.adlibertas.com/wp-content/uploads/2022/01/customDash.png)

**Self-service no-SQL exploration**

Our analytics give all users in your organization the ability to build custom-defined user datasets, defined by user-events, actions, and/or user characteristics. There’s no need for complicated SQL-joins or custom Tableau reports, anyone can simply drag and drop user-audiences. This gives your organization complete control and flexibility in refining their data-sets to find the important users and actions in your app.

![](https://www.adlibertas.com/wp-content/uploads/2022/02/mediator-gif.gif)

{% embed url="<https://www.adlibertas.com/our-customers>" %}

**Interactive, custom reporting & prediction models**

Your organization can compare audience datasets across performance metrics and custom events. See the [<mark style="color:blue;">article on how predicted LTVs work here</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/forecasting) and see how our proprietary machine learning predictions can help you get fast, accurate campaign predictions here

![](https://www.adlibertas.com/wp-content/uploads/2021/10/buildpltv.png)

**Direct SQL Access & Custom Processing**

For customers who want direct access to the data, we offer direct [<mark style="color:blue;">SQL access via Amazon Athena</mark>](https://www.adlibertas.com/supporting-amazon-athena-access/), or end-points to [<mark style="color:blue;">access and download reports.</mark>](https://docs.adlibertas.com/the-platform/business-analytics) Additionally, customers can spin up their own computing clusters to run advanced or custom models against their users or custom datasets.

### Reporting Workflow

<figure><img src="/files/m4ctH7e0NCweshHEv2xK" alt=""><figcaption></figcaption></figure>

[**User-level Audience Reporting**](/the-platform/user-level-audience-reporting) allows you to create hyper-specific reports on user-level characteristics and behavior. From here, we store these reports in the [analytics](/the-platform/business-analytics/analytics-layout) system -- accessible via the "[Explore Data button](https://docs.adlibertas.com/the-platform/business-analytics/understanding-the-explore-data-button)"-- so you can add them to a [custom dashboard](https://docs.adlibertas.com/the-platform/custom-dashboards) or compare them against other user-level reports.

[**Consolidated Revenue Reporting** ](/the-platform/consolidated-revenue-reporting)allows you to view your earnings in [pre-built charts](https://docs.adlibertas.com/the-platform/consolidated-revenue-reporting#rich-reporting-built-for-ad-supported-apps) or drill directly into [analytics](/the-platform/business-analytics/analytics-layout) to create your own reports.

[<br>](https://www.adlibertas.com/knowledge-base/adlibertas-audience-reporting/)


# User-Level Audience Reporting

We collect user actions and earnings from the source. You get user behavioral insights and performance analytics.

{% hint style="info" %}
For information on getting data connected, see how you can [<mark style="color:blue;">integrate with 3 easy steps.</mark>](https://docs.adlibertas.com/data-integrations/connecting-in-3-steps)
{% endhint %}

![](/files/qU9qqIa1bWWZXZYijK9E)

{% embed url="<https://www.adlibertas.com/adlibertas-audience-reporting-easy-accurate-event-level-revenue-reporting>" %}

### The concept

To best understand how user-level reporting works, consider the process as 2 distinct steps:

![](/files/oQlOS4k98xMHaoEsx9UO)

**1. Define Audience** outlines the characteristics, timeframe, and/or actions that define a group of users you'd like to isolate and measure. An example would be: users who installed last month, played over 10 games, and created an account.

![](/files/MUqnxLJ3XcxSUOtwOAUp)

**2. Report Audience Performance** allows you to measure and compare the performance of audiences over time. This could be over an entirely different timeframe, for example measuring this month's performance of users who installed last month.

### Workflows for creating user reports

![Creating a "New User Report" is an easy one-step way to explore the behavior and performance of multiple groups of users. Advanced Audience Builder allows you more control on defining groups by action or exclusion.](/files/9Hbvl1O9qDISzQTEGyGy)

To make getting valuable information easy, we offer two methods to create user-level reports.&#x20;

1. **Create New User Report** This allows you to combine defining multiple audiences and report on their performance in a single step without the overhead of defining an audience, then reporting on the audience performance in a separate step. For instance, in a single step, you can choose a Firebase experiment over the last 30 days, then run a report that will return each variant over this timeframe. For more information see the article on [<mark style="color:blue;">**Creating a New User Report**</mark>](/the-platform/user-level-audience-reporting/creating-reports/creating-a-new-user-report)**.**
2. **Advanced Audience Builder + Advanced User Reports** allows you to separate the steps of running reports enabling further refinement of user groups (audiences) by behavior and actions, then the ability to report on them over varying timeframes. For instance, you can define a group of users that have installed last month, played 10 games on their first day, then report on the performance of those users *this month*. For more information see [<mark style="color:blue;">**Advanced Audience Builder**</mark> ](#advanced-audience-builder)and [<mark style="color:blue;">**Creating Advanced User-Level Reports**</mark>](/the-platform/user-level-audience-reporting/creating-reports/creating-advanced-user-level-reports)<mark style="color:blue;">**.**</mark>

## Exploratory User-Level Reporting walk-through <a href="#h-product-walk-through" id="h-product-walk-through"></a>

Both methods of creating reports will allow you to generate rich, interactive reports to explore user performance and behavior.

Below we walk-through our interactive user-level reporting.

{% embed url="<https://youtu.be/ZsDa1kSOX60>" %}

#### **Running Projections**

Determine visualized curve of best fit against your audience to determine future user pLTV. For more details see [<mark style="color:blue;">**Forecastin**</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/forecasting)<mark style="color:blue;">**g**</mark>

## **Creating Custom Dashboards from User-Level Reports**

From any of the user-level reports, you can click "Explore More" to get into [<mark style="color:blue;">**Business Analytics**</mark>](/the-platform/business-analytics) and start creating your own custom dashboards from your user-level reports.


# Creating Reports


# Creating a New User Report

Getting started with user-level reporting

<img src="/files/55gRbOW79DtyPU0lQqiL" alt="" data-size="original">

Your first step in user-level reporting will be to create a new user report, either in the main menu or on the home page, click "Create New User Report"

## Name and App Filter

Report names don't need to be unique but we highly recommend you consider a naming scheme that allows easy search functionality.

{% hint style="info" %}
When selecting an app, you will filter all events, conditions, and properties to only the app selected. If you don't choose an app, users will be included across all apps.
{% endhint %}

![](/files/dZDW3S2S9kNsO7Ir2HPP)

## Date Ranges

The date range selected in the Absolute Date Range will include users active during the chosen range. For details on the Advanced functionality, see [<mark style="color:blue;">Absolute vs. Relative Reports</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/absolute-vs.-relative-reports)<mark style="color:blue;">.</mark>

![](/files/WbfXdqznzVmB0Ul6FxDx)

## Create Audience Grouping

Here you can choose groups that will define individual audiences, one for each parameter value of the group. Choosing a single group, in our example, an AB test will automatically create an individual group for each test variant.

![](/files/hkCSirtOZK2oR0p0wb0j)

Selecting multiple groups will create an audience for each unique parameter value. In our example, grouping on an experiment + geo will create an audience for **each variant and each geo.**

For groupings that generate over the maximum number of audiences (15), only the largest groups will be returned.

![](/files/e1kGkFQESlFRwJeX4f0I)

## Email Notification

We will send an email to each address when the report is completed or updated. Especially useful when you've created a scheduled report to be updated periodically.

![](/files/d6iAKZIlm8jcW7ui4FRF)

## Filter Created Audiences

![](/files/hUMvviLfP1viFSwRhdwC)

**Maximum number of users in audience:**  We allow you to filter to audience groupings above a minimum number of users.

**Maximum number of audiences, ranked by the number of users:**  Because the UI lags with too many reports, we limit the maximum number of audience groupings to 15.&#x20;

{% hint style="info" %}
If you'd like to run reports with more than 15 audiences (e.g. campaign and ROAS reporting) please contact your AdLibertas account manager to schedule csv reporting.
{% endhint %}

## Walk-through creating a report

{% embed url="<https://youtu.be/uM5xMKZ5adE>" %}


# Creating Advanced User-Level Reports

Advanced reporting allows you to create and refine reports on users identified in the Advanced Audience Builder.

This article will walk you through how you can create an advanced report to compare and contrast different audiences.

### Overview:

\
Once you’ve created an advanced audience, you’ll want to define the date range you’d like to see your audience reported on, as well as choose other audiences to compare and contrast performance.

Navigate to Audience Reporting > Audience Reporting > +New Advanced Report

![](/files/jg2GsCMbkCtM2PMT0Uht)

From here you can add multiple audiences to compare them against each other.

![](https://www.adlibertas.com/wp-content/uploads/2021/07/reporting-4.png)

### **1. Report Name & Description**

A method to differentiate the reports you create. Can be very helpful to find and reference in the future.

### **2. Absolute Date Range**

An absolute report shows your audience over a set, defined date range. For example, let’s say you have an audience defined as all users who’ve clicked an onboarding button, an absolute report will show all of these users' performance during the defined time period.

### **3. Relative User Day**

A relative report (also called a user-cohort report) is a report that **shows all of your defined audience starting with the same install date.** For example, let’s say you have an audience defined as all users who’ve clicked an onboarding button, the relative report will show all of these users from the date they’ve installed the app.

Because the relative report shows the user’s journey from day 0, **only users who have an install date are included in relative reports.**

Because this report can traverse all of your data looking for user install dates, it takes longer to run than absolute reports.

### **4. Both**

Shows both absolute and relative reports. Because this traverses much more data, these reports take longer than a single type.

### **5. Restrict User install dates (Relative Reports only)**

This feature will allow you to restrict the timeframe of relative users to a certain timeframe. Helpful if you’d like the report to run faster, or if you want to only include users who’ve been added to the app during a certain timeframe.

### **6. Days in Lifecycle (Relative Reports only)**

Allows you to choose the number of days returned for a user’s lifecycle. For instance “30” would only return the first 30-days of a user’s lifecycle.

### **7. Absolute Date Period (Absolute Reports only)**

The time period in actual dates which you want to display your audience performance

### **8. Custom Metrics**

This allows you to add metrics to your report. A metric is defined as a discrete user event: such as in\_app\_purchase, or session\_start. Custom Metrics will show in your report as an average, per daily active user, and as a total of your audience.

### **9. Choosing Audiences**

Here you’ll be allowed to choose one or more audiences to measure revenue performance over time. Keep in mind your audience is defined by the events they’ve engaged with during a time period, the reports are those user’s performance over the


# Advanced Audience Builder

Create and refine user groups by their actions or behavior.

In this article, we will show you how to create and edit an audience and define some of the features and tricks when defining an advanced audience.

{% embed url="<https://youtu.be/K3nTGrqBmmk>" %}
*See an example of how to create an audience*
{% endembed %}

### **Overview:**

The purpose of creating or refining a custom audience in the Advanced Audience Builder is to add details of the exact users you’d like to define for your reporting.

To do so, you need to define (or exclude) the events, attributes, and timeframes to isolate the proper group of users. Let’s get started with an example:

### **Create An Audience**

From the main menu, click User-level Reporting > Advanced Audience Builder, or from the home screen click the button with the same name.&#x20;

![](/files/gwn3sGBVKTLsAm9wG7kG)

From there you can click + New audience in the top right.

![](/files/aK7CbvQx5uUkQAmXM82R)

### Refine or edit an existing audience

If you'd like to change or alter a pre-existing audience, you can do so by clicking a pre-existing audience from the list or by clicking the audience name in the report.

![](/files/WoWpqK4EP6wiNhT2Cx97)

From there you can edit the audience using the "edit" button.

&#x20;

![](/files/2RDzcjOVlJmLKQ2oF5uh)

![](/files/kLHTB22DS4g5whx14ZIP)

### **Options for defining an audience:**

### **1. Audience Name & Audience Description:**

This can be very helpful in referring back to your audiences later. You’ll be using these naming conventions when you choose your audiences in reporting. This can be changed at a later date.

### **2. App Name:**

This will filter user events & actions to selected apps. Because user identifiers are constant across apps, if no app filter is selected, user behavior and events will be measured across all apps.

### **3. Period:**

The date selection is the time period the users have generated the events defined in the audience. A user may have installed outside of this period, but still, be included if you include an event that captures the user’s behavior.

### **4. Parameter value or count**

A very valuable metric, this shows the count of events generated by this user. Event Count > 0 will return all users who’ve achieved 1 or more of these events.

In other scenarios, you can select the parameter value, experiment name, etc for each parameter.

### **5. Using the “AND” Operator**

The AND operator will allow you to choose multiple combined events that define a single user. If a user achieves a single event of the two, they will not be included in this audience.

### **6. Firebase Experiments:**

We automatically import your Firebase experiments, pre-populating the variants for ease of revenue-performance measurement of your AB tests.

### **7. The OR operator**

The OR operations allows you to choose multiple events and include a user if they’ve achieved either event.

### **8. Exclusions**

We also allow you to define an audience by choosing events to exclude users. Users who fire an event, or have an attribute included in this sections will NOT be included in your audience.

Clicking Create will build the audience your define. The length of time for this audience to be built will be dependent on the amount of data and the volume of users you have available.

Related Reading: [Using Audience Reporting](https://docs.adlibertas.com/the-platform/user-level-audience-reporting) :: [2. Run Report](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-a-new-user-report) :: [3. Forecast Results](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/forecasting)


# Custom Event Metrics

Understanding how to add custom metrics to your report.

By default, AdLibertas will include some important metrics with your reports: impressions, daily active users, revenue earned, and others. Undoubtedly you'll have need for custom or additional metrics on your reports.

When [<mark style="color:blue;">**creating reports**</mark>](/the-platform/user-level-audience-reporting/creating-reports/creating-advanced-user-level-reports) you'll be able to choose custom event metrics. Below we walk you through how they work.

![](/files/yALJA231ExKw2sIzHBNo)

### Event Counts

Fairly straight-forward we'll return the total number of events, counted either [<mark style="color:blue;">by day or relative (cohort) day.</mark>](/the-platform/user-level-audience-reporting/report-layout/chart-type-module-absolute-vs.-relative-reports) This value will be included as a total, per user, and cumulative value.

Example: `Level_complete`. Counts the number of times the event `level_complete` was fired by the audience defined.

### Event Sum

In some cases, you'll want to sum the values and include the total. For instance, the sum of the `Revenue`field in the `ad_impression`event returns the total ad earnings. This is included automatically, so a better example (as pictured) is including the "sum" of the user\_engagement property which measures [<mark style="color:blue;">the time a user is active in the app.</mark>](/the-platform/user-level-audience-reporting/advanced-reporting-methods/adding-user-time-to-your-reports)

### Value Counts

In this case, you're able to include the count of certain parameter values in an event. A great example -- as pictured -- is the count of Applovin impressions in the impression event. But this could easily be the level pack earned from a reward video, or any other parameter value you would like to measure.


# Report Layout

![](/files/2ChbLxWLxP8DL3YtUVls)

{% content-ref url="/pages/g1OlNOSTtOwjfTWmMreg" %}
[Report Module: Audience Filtering](/the-platform/user-level-audience-reporting/report-layout/report-module-audience-filtering)
{% endcontent-ref %}

![](/files/h1iEG9MgyBSFYjnthEXY)

{% content-ref url="/pages/vlwQHdn43iQSkIzHhDEX" %}
[Chart Type Module: Absolute vs. Relative Reports](/the-platform/user-level-audience-reporting/report-layout/chart-type-module-absolute-vs.-relative-reports)
{% endcontent-ref %}

![](/files/8K2y6imHjwW4KnZlN8Lc)

{% content-ref url="/pages/NfNaTm0wopIaaDU7VwMb" %}
[Daily Totals, Per User, Cumulative Totals](/the-platform/user-level-audience-reporting/report-layout/daily-totals-per-user-cumulative-totals)
{% endcontent-ref %}

![](/files/BONV6f41uyMlF1yvwfBM)

{% content-ref url="/pages/SjHMVPAm2CMfJJXwzYDk" %}
[Lifecycle Reports](/the-platform/user-level-audience-reporting/report-layout/lifecycle-reports)
{% endcontent-ref %}

![](/files/SN6smz2tdkY1bKqEhsAO)

{% content-ref url="/pages/ywYy8yZc54zXeXU4akKi" %}
[Forecasting Module](/the-platform/user-level-audience-reporting/report-layout/forecasting-module)
{% endcontent-ref %}

![](/files/IeB5PTNVyhbHQc7qWA8s)

{% content-ref url="/pages/W1kgxGuTc7Omw6Ny2KXc" %}
[Statistics Module](/the-platform/user-level-audience-reporting/report-layout/statistics-module)
{% endcontent-ref %}


# Report Module: Audience Filtering

Filter out, or focus on revenue outliers.

Many use cases in user-level reporting will require you to either ignore outliers -- helpful for getting a more confident forecast or predictable measurement --  or focus on what makes a top (or bottom) earner.

{% hint style="info" %}
Have 5m? See audience filtering and some use-cases work in a quick video.
{% endhint %}

{% embed url="<https://www.youtube.com/watch?ab_channel=AdamLandis&feature=youtu.be&v=s4Ciz11UvhY>" %}

### Adding a filter

When creating a report, you can now add a filter, that will give you the option to toggle between the filter and the audience in your finished report.

![](/files/sRPgX8CiwDb8fdWaRHxd)

#### Top & Bottom Earners - Focusing on the outliers&#x20;

Allows filter toggling between your entire audience and the top and bottom earning users. Where you choose the X% of users.

{% hint style="info" %}
The top earner filter is particularly useful if you'd like to understand what portion of your overall sales or earnings comes from top earners in an audience, or helps you understand how the top earners act differently than the rest of the audience.
{% endhint %}

#### 1st and 2nd Deviation of revenue earned - Filtering out the outliers

Allows you to include only users who fall into the first and second deviation (68% and 95%) of revenue earners as compared to the mean. In other words: filter out the most extreme 34% or 5% earning users.

{% hint style="info" %}
Filtering out standard deviations is helpful if you are looking for a conservative and repeatable understanding of user behavior. If your audience performance is highly driven by a small number of users, this filter will help you understand the earnings without relying on that user.
{% endhint %}

### Toggling Filters

In the [<mark style="color:blue;">Report Module</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/report-layout) <mark style="color:blue;">section,</mark> you can turn your filter on or off. With the filter on, you will see the performance of the users that fall into your filter.

![](/files/tkrIjhzRKYcxElJVMD0Q)

[![image-text](https://www.adlibertas.com/wp-content/uploads/2022/06/reportFilteringLong.png)](https://www.adlibertas.com/introducing-report-filters/">)

See some real-world examples of how to use report filtering on your app [<mark style="color:blue;">on our blogpost.</mark>](https://www.adlibertas.com/introducing-report-filters/)


# Chart Type Module: Absolute vs. Relative Reports

Time-series vs. Cohort Reporting

When building reports, AdLibertas Audience Reporting allows you the very powerful ability to choose between two types of dates for reporting.

![](/files/xstVYk4J2tfW7QnP0zAG)

* **Absolute Reports allow you to view user activity across a set timeframe (date is on the x-axis)**
* **Relative Reports allows you to view user activity against their age (days since install is on the x-axis)**

{% hint style="info" %}
Absolute reports include all active users within the specified report timeframe, whereas Relative Reports only include users who've installation dates fall into the specified period.
{% endhint %}

### **Absolute Reports:** <a href="#h-absolute-reports" id="h-absolute-reports"></a>

The most familiar type of reporting, absolute reports report on all users in an audience over a date range (x-axis).

Note:

* Some metrics — notably retention and LTV– are unavailable in absolute reporting.
* Since the reporting timeframe can be [defined independently](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/understanding-date-ranges-with-audience-reporting) from an audience, consider audience members may not be active during the report timeframe. For instance, if you define an audience of users who’ve installed in April, then report on their performance during March, there will be no user activity.

![In the example above, daily active users are mapped against an absolute date range (x-axis)](/files/KOXyhrnTd6RuGUounx8a)

### Relative Reports: <a href="#h-relative-reports" id="h-relative-reports"></a>

A very powerful type of reporting, Relative User Day (cohort) reports show all users against their age (days since installation on the x-axis), giving all users the same day 0.

An audience might include a [variety of user ages,](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/understanding-date-ranges-with-audience-reporting) for instance, if your audience includes all active users over the last 7d, your audience may include a user that installed a year ago. A relative report would include this year-old user on the same day-0 as a user who installed yesterday. Therefore you can further restrict install dates when building a relative report using “Restrict user install dates”.

“Days in Lifecycle” limits how many days make up the x-axis in your chart.

![](/files/L9qopFQYLRIdY9oOPHGI)

Notes:

* To ensure accurate lifetime reporting, only users that have an install date within the dynamic report bounds will be included in this report.
* Choosing more “Days in Lifecycle” than exists in an audience will result in a reporting error.

![In this relative report, we see the number of daily active users against their age (days since install on the x-axis)](/files/jS5KTc3zTXNv0wsCzW80)

Since, for most, this is a unique report we’ve listed out some common use-cases to give examples:

| <p>Total revenue earned on day N (as a % of whole) against an audience<br><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/10/image-16.png" alt=""></p> | <p>User’s average impression consumption by days active<br><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/10/image-15.png" alt=""></p> | <p>User CPM/ARPDAU by active day<br><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/10/image-14.png" alt=""></p>                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p>User propensity to purchase by time-in-app<br><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/10/purchase-perc.png" alt=""></p>                     | <p>User activity (levels completed) by days active<br><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/10/image-18.png" alt=""></p>      | <p>Multiple audience cumulative revenue comparison<br><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/10/cumRev.png" alt=""></p> |


# Daily Totals, Per User, Cumulative Totals

![An interesting example of absolute (left) and relative (right) reports for daily active users. On the left each audience is defined as having ibeen nstalled within a given month. You can see the spikes of active users through the month, then the valley as they slowly churn. On the right, you can see the activitiy user total users as they age. The newest (goldenrod) actually falls to zero as this report was built before that audience had a chance to completely mature.](/files/iHOV5y0YdMwj0ISYBrg6)

### Daily Totals

For **absolute reports**, daily totals show the sum of all events/metrics for all active users on a time series

For **relative reports,** daily totals sum the total events/metrics on the nth day of user history the audience users who've installed during the specified timeframe

![Above (left) we have a daily CPM on a per-user basis. Right, shows CPM per user over the lifetime of a user's lifetime.](/files/UcojExrMgEdjA02GVdIo)

### Per User Reports

For absolute reports, per user divides the daily totals against the number of active users on a given date.

For relative reports, per user divides the total events on the n-th day of lifetime.

### Cumulative Totals


# Lifecycle Reports

Retention and LTV

### Retention - See: "Retention Rate"

{% embed url="<https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/user-measurement-and-calculation-details#retention-rate>" %}

### LTV - See: Lifetime Value (LTV) Calculation

{% embed url="<https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/user-measurement-and-calculation-details#lifetime-value-ltv-calculation>" %}


# Forecasting Module

Adding projections on your audience LTVs

{% hint style="info" %}
The Forecasting module allows you to apply earning projections on user performance, helping you anticipate future value of users.
{% endhint %}

![AdLibertas is excited to add Forecasting capabilities to Audience Reporting.](/files/ofyNhyo4zhrP56Lm5w7Q)

### **What is the Forecasting module?**

The LTV forecasting module provides a visualization of a curve of best fit over your audience’s LTV data. It provides a quick and easy way of seeing possible future values of the LTV metric, which may be useful in understanding future values of the audience LTV.

### **The Models:**

We apply several mathematical models to help you choose the curve projection that best represents your data and users. The model is calculated using your chosen LTV data and allows you to extend these models to predict future values. We currently offer 3 curves to choose from:

* **Best fit (auto):** The Best Fit model automatically cycles through the 45 projection models on your audience data and applies the model that shows the highest accuracy with the last tertile of measured performance. For example, if you are projecting LTV on a group with a 15d history, the Best Fit curve would find the model that best matches the last 5 days of history.

{% hint style="warning" %}
Disclaimer: the best fit model simply finds the best mathematical projection representation based on your audience performance. It doesn't factor into account immature or inappropriately small sample sizes. For more information see[ <mark style="color:blue;">"What is the probability projected LTV becomes actual LTV?"</mark>](/faqs/audience-reporting/what-is-the-probability-projected-ltv-becomes-actual-ltv)
{% endhint %}

* **Linear**: Also called line-of-best fit, this is the most aggressive growth model and shows a straight-line growth rate. This most often occurs with a relatively flat retention curve and users are predictably returning to the app. The equation takes the form Y=aX + b. This model usually indicates very low churn and/or increasing user spend throughout their lifetime. For that reason it's relatively rarely appropriate.
* **Linear + Power:** This model averages the results of the linear and power models. This is more aggressive (higher earning) than the power curve alone but lower than the linear curve.&#x20;
* **Power**: A non-linear power regression calculation. Useful when there is a skew in early user behavior (e.g. high early user drop-off). This is the most common curve as it generally applies well for apps seeing retention that models a classic exponential decay curve. The equation takes the form Y=aX^b.
* **Power + Log:** This model averages the results of Power and Logarithmic models. It provides a balance of the more fiscally conservative logarithmic curve and the more median power curve.
* **Logarithmic**: Also called exponential; this is the “most conservative” function and takes the form via a non-linear regression with a logarithmic transform.  This is most useful when there is a large drop-off in retention (or profitability) in early user behavior. Takes the form Y=a\*ln(x) + b.

Depending on the nature of the data, one model may be a better fit for the data than the others. We encourage you to explore and select the one that matches your needs.

![](https://www.adlibertas.com/wp-content/uploads/2022/05/d365LTV.png)

#### Related Reading:

{% embed url="<https://www.adlibertas.com/finding-a-pltv-model-for-your-mobile-app>" %}

{% embed url="<https://www.adlibertas.com/calculate-user-ltv-on-their-first-day>" %}

{% embed url="<https://www.adlibertas.com/two-event-types-you-need-for-growth-and-retention>" %}

### **Customizing your model: Exclusions**

When modeling LTV data for your app, it is not uncommon to [<mark style="color:blue;">see large fluctuations in the retention or earning rates of users over the first several days to several weeks</mark>](https://www.adlibertas.com/two-event-types-you-need-for-growth-and-retention/#:~:text=The%20categories%20are,up%20the%20total.)<mark style="color:blue;">,</mark> which then settles down and tapers off into a long tail of retained users. Since projections over longer time periods rely on the long-tail (retained) of users more than the initial fluctuations, excluding noisy days upfront may lead to more reliable forecasts.

Conversely, a few mature users may adversely affect your prediction, so we offer the ability to make predictions ignoring the last days of your audience performance. In order to help you refine to only the most relevant data points, the UI offers 12 different data filters:

* **Include all data points**: Applies the prediction model using all data points starting at Day 0.
* **Exclude FIrst&#x20;*****N*****&#x20;days**: Excludes Day 0 through Day *N* from the projection model. Will only include all data points from Day n onward in the calculation.
* **Exclude Last&#x20;*****N*****&#x20;days**: If your LTV chart extends to 30d, excluding the Last *N* days would calculate your model by excluding data from 0 to 30-*N*.

![](/files/cpd693DxY6tTElXkZBaX)

To see a quick video example watch the video below:

{% embed url="<https://youtu.be/RQVEs5LUb3Y>" %}

#### **Related:** [**FAQ: What is the probability projected LTV becomes actual LTV?**](https://docs.adlibertas.com/faqs/audience-reporting/what-is-the-probability-projected-ltv-becomes-actual-ltv)

<table data-header-hidden><thead><tr><th width="203.8612478452893"></th><th></th></tr></thead><tbody><tr><td><a href="https://youtu.be/RQVEs5LUb3Y"><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/09/pLTV-Release.png" alt=""></a><br>See the platform<br>in action</td><td><a href="https://www.adlibertas.com/finding-a-pltv-model-for-your-mobile-app/"><img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/09/pLTV-model.png" alt=""></a><br>Find a pLTV model suitable<br>for your application</td></tr></tbody></table>

<br>


# Statistics Module

Tools to help you with analyzing and interpreting the uncertainty and variation in your reports.

![Showing the 1st standard deviation for user LTVs](/files/CzIOP8mZwgaHNmaAS5lh)

### Why is the statistics module important?

Very often when dealing with large datasets, you'll want to understand the certainty and variation in your reports. That is, uncover how confident you can be that your measurements are an accurate measurement of the entire population, and how repeatable your findings will be. We aim to provide high-level statistical outcomes, while still being approachable for non-statisticians.

### Audience Representation

![](/files/rNu5Ji3YCXHM9biF7sOt)&#x20;

Every report has a section in the table listed Audience Representation. This shows the percentage of users compared to the total audience size. In the table summary view, this is returned against the average daily active users, when the data table is expanded you will see daily audience representation.

For example, if your audience has 100,000 users and the audience representation on a given day is 1%, that means you have 1,000 active users. The purpose of this measurement is to ensure you're not unknowingly making assumptions on the performance of a large user group with a very small number of users.&#x20;

### Measuring Confidence

Confidence measures the percentage a random sample of your audience will show as, or greater difference than the mean of the set baseline. You can read more about how to set and use confidence in the [<mark style="color:blue;">Measuring Confidence</mark>](/the-platform/user-level-audience-reporting/report-layout/measuring-confidence) section.

### **1st and 2nd Standard Cohort Deviation (SD)**

{% hint style="info" %}
1st std dev shading incorporates 68% of users; 2nd std dev shading incorporates 95% of users in an audience.
{% endhint %}

The 1st standard cohort deviation shows the dispersion of 68% of individual cohort LTVs closest to the mean. The 2nd standard cohort deviation shows the dispersion of 95% of individual cohort LTVs closest to the mean. Meaning, the shaded area represents 68% or 95% respectively of the users that fall closest to the mean.&#x20;

Deviations are generally used to measure the amount of performance variability of your users as compared to the mean. High deviations mean audience values are generally far from the mean, while low deviations mean user values are clustered close to the mean. You can read more about how deviations [<mark style="color:blue;">can help with analysis here.</mark>](https://en.wikipedia.org/wiki/Standard_deviation)

### Standard Cohort Error (SE)

{% hint style="info" %}
The standard cohort error of the mean is a measure of the variability of daily cohort means around the population (displayed) mean.&#x20;
{% endhint %}

Since each user cohort's average (day of install) can differ from the overall mean, the standard error will show how much the cohort means differ from the population mean. The purpose of the standard cohort error of the mean is a way to know how close the average of cohort samples is to the average of the whole group. It is a way of knowing how precise the overall LTV average is in relation to an individual cohort's LTV. The smaller the standard error, the more representative a random day's LTV will be of the overall population. Conversely, a large standard error indicates less representation of an individual cohort's LTV to the population mean. For more information on standard error, [<mark style="color:blue;">please see this article.</mark>](https://en.wikipedia.org/wiki/Standard_error)

{% hint style="info" %}
**What's the difference between the SD & SE?**&#x20;

The standard deviation (SD) measures the amount of variability from the individual cohorts to the mean, while the standard error of the mean (SE) measures how far a sample mean of the data is likely to be from the mean. The SE is always smaller than the SD. [<mark style="color:blue;">**Source**</mark>](https://www.investopedia.com/ask/answers/042415/what-difference-between-standard-error-means-and-standard-deviation.asp#:~:text=The%20standard%20deviation%20\(SD\)%20measures,always%20smaller%20than%20the%20SD.)
{% endhint %}

### Statistics on Forecasted Values

We also allow you to apply and visualize statistics on forecasted LTVs. We apply the statistics calculation on the population mean then use the [<mark style="color:blue;">projection model chosen in the Forecasting Module</mark>](/the-platform/user-level-audience-reporting/report-layout/forecasting-module)<mark style="color:blue;">.</mark> The idea is to show the projected dispersion of user values based on user value.


# Measuring Confidence

Measuring confidence in your LTV reports

{% hint style="info" %}
Confidence measures the percentage a random sample of your test audience will show as, or greater difference than the mean of the baseline.
{% endhint %}

When you set a baseline in your report, AdLibertas will calculate the statistical significance *(p-value)* of your comparison audiences. The confidence (1 – *p*) percentage returned is the likelihood a random sample will show as, or greater difference than the mean.

### **How to include confidence in AdLibertas reporting**

When creating a [<mark style="color:blue;">report</mark> ](/the-platform/user-level-audience-reporting/creating-reports/creating-a-new-user-report)with more than one [<mark style="color:blue;">audience</mark>](/the-platform/user-level-audience-reporting/creating-reports/advanced-audience-builder)<mark style="color:blue;">,</mark> you’ll be able to select a baseline. That baseline is used as the calculation for your comparison. All other audiences or variants will be compared to the baseline.

![](/files/FpjEBou3ONZ3b2CL0egD)

**How confidence is calculated.**

[<mark style="color:blue;">Statistical significance</mark>](https://www.investopedia.com/terms/s/statistically_significant.asp) is determined by calculating the [<mark style="color:blue;">p-value</mark>](https://www.investopedia.com/terms/p/p-value.asp) of a [<mark style="color:blue;">one-tailed test</mark>](https://www.investopedia.com/terms/o/one-tailed-test.asp#:~:text=Determining%20Significance%20in%20a%20One%2DTailed%20Test\&text=The%20significance%20level%20is%20almost,%22%2C%20which%20stands%20for%20probability.\&text=If%20the%20resulting%20p%2Dvalue,the%20null%20hypothesis%20is%20rejected). [<mark style="color:blue;">Confidence</mark> ](https://www.investopedia.com/terms/c/confidenceinterval.asp)is calculated as (1—*p*-value).

### **Understanding the outcome.**

Confidence returns the likelihood a randomly selected sample of users, one user from A and one from B, will have an outcome as, or greater, than the displayed mean.

![](/files/nbj6oGT2UwltypfodiDV)

### **Best practices for using confidence in your reporting**

Most scientists and statisticians often strive for [<mark style="color:blue;">95%+ confidence levels</mark>](https://www.investopedia.com/terms/c/confidenceinterval.asp) in experiments but you’ll find a range that works for your purposes. An AB test with <50% confidence isn’t necessarily a failure, it is just less than half of the users in the experiment will fall closer together than the mean value.

Also – like mean values– a small number of users will distort your confidence levels, so be sure to keep in mind the number of users at the end of the experiment.

Looking for more tips, read our article on [<mark style="color:blue;">setting up an effective framework for AB tests.</mark>](https://www.adlibertas.com/the-correct-framework-for-ab-testing-your-mobile-app/)


# Advanced Reporting Methods

This section outlines more sophisticated methods of measurement.


# User Measurement & Calculation Details

In-depth details on how we calculate important user measurements -- like installs, activity, retention rate, and LTV to help AdLibertas customers understand the subtleties of the platform.

### **Unique users**

To tie users across datasets AdLibertas uses the most commonly available pervasive ID to identify unique users.&#x20;

* For iOS, this is the IDFV, "The value of this property is the same for apps that come from the same vendor running on the same device." ([<mark style="color:blue;">documentation</mark>](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor)).&#x20;
* For Android, this is the GAID. "The advertising ID is a unique, user-resettable ID for advertising, provided by Google Play services." ([<mark style="color:blue;">documentation</mark>](https://support.google.com/googleplay/android-developer/answer/6048248?hl=en)).

Note: for Google, users who opt out of GAID tracking have a shared ID. This can cause confusion with reporting, read more in [<mark style="color:blue;">Excluding GAID tracking opt-outs</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/exclude-gaid-tracking-opt-outs)<mark style="color:blue;">.</mark>

This may differ from Firebase: by default Firebase users a [<mark style="color:blue;">user\_pseudo\_id</mark> ](https://firebase.google.com/docs/analytics/userid)to track individual users, this number is re-generated every time a user re-installs the app and therefore may differ from the centralized IDs depending on user activity.

### Installs

By default, we opt to use the Firebase `user_first_touch_timestamp` which [<mark style="color:blue;">is defined as</mark>](https://support.google.com/firebase/answer/7029846?hl=en#:~:text=user_first_touch_timestamp) a measurement of when a user has first opened the app or visited the site.

This may differ from Firebase reporting: by default, Firebase uses the [<mark style="color:blue;">first\_open event</mark>](https://support.google.com/analytics/answer/9234069?visit_id=637860001261915594-840608156\&rd=1#:~:text=message_name%2C%20message_device_time%2C%20message_id-,first_open,\(app\),-the%20first%20time) to tie attribution to installs. However, this event is also known to fire on app updates.&#x20;

### **Active Users**

By default, both us and [<mark style="color:blue;">Firebase</mark>](https://support.google.com/firebase/answer/6317517?hl=en#) consider a user “active” when they’ve fired at least one “engagement event” a day. For Firebase users, this is the `user_engagement` event. [<mark style="color:blue;">Defined by Google</mark>](https://support.google.com/analytics/answer/9234069?hl=en#:~:text=app%20or%20website-,user_engagement) as *“when the app is in the foreground…for at least one second.”*&#x20;

However, for some apps, we have seen users who don’t have a user\_engagement event, but do show other activity; either because this event hadn't had time to fire or developers have modified this event behavior.&#x20;

For this reason, we offer the ability to also consider a user active when they fire a `session_start` event, [<mark style="color:blue;">defined as</mark>](https://support.google.com/analytics/answer/9234069?hl=en#:~:text=engagement_time_msec-,session_start) *“when a user engages the app.”*

\
For customers who opt into this additional metric to consider a user "active"– and who have users that are firing a `session_start` event but not firing a `user_engagement_event`—you’ll see a higher number of installs and active users on a daily basis. Depending on how many additional users this includes, you’ll see a decreased LTV. This is because all revenue will be shared across more active users.

#### Why would counts differ across platforms & vendors?

The deeper you delve into install rates & unique users, the more complicated you'll find the topic. There's a reason the [<mark style="color:blue;">mobile analytics market is worth over $10B.</mark>](https://www.globenewswire.com/news-release/2021/11/02/2325565/0/en/Global-Mobile-Apps-and-Web-Analytics-Market-is-Estimated-to-Observe-USD-28-88-billion-by-2028-Fior-Markets.html#:~:text=02%2C%202021%20\(GLOBE%20NEWSWIRE\),the%20forecast%20period%202021%2D2028.)

Succinctly put, there are many reasons user counts may differ across analytics platforms, here are some examples:

* Retention rates may differ between different reporting technologies if they are using different events to measure installs & active users. As hinted at above, even Firebase can show different times between a`first_open` event and `user_first_touch_timestamp`. Across different vendors, each may have a unique way of measuring a user's first and subsequent visits. If your users exhibit a large discrepancy between any of these measurements, retention may vary.
* Using different IDs: Depending on how the platform is counting users, there could be multiple methods to measure unique users: advertising IDs reset or can be obfuscated, Vendor IDs may not be reset upon reinstall (IDFVs). Certain vendors might have IDs that reset more often (e.g. Firebase as described above)
* Duplicate Counts: user re-installs, resetting Ad-IDs, or ad platforms [<mark style="color:blue;">self-attributing networks</mark>](https://branch.io/glossary/self-attributing-network#:~:text=Self%20Attributing%20Network%20\(SAN\),Snapchat%2C%20Google%2C%20and%20Twitter.) may lead to multiple counts for a single user's install.
* Firebase Installs may differ because the user has installed but has not generated a `first_open` event. We've seen this happen with pre-load or other low-quality install sources.
* DAU may differ if users don't trigger a user\_engagement event.
* Firebase unique users may differ if users re-install and reset their firebase pseudo id

### Retention Rate

![](/files/HcrGsVeGJZzW2g8ijTPL)

Retention rate is defined as:

> A retention rate gives a number to the percentage of users who still use an app a certain number of days after install. It is calculated by counting unique users that trigger at least one session in one day, then dividing this by total installs within a given cohort.&#x20;
>
> [<mark style="color:blue;">Adjust</mark>](https://www.adjust.com/glossary/retention-rate/)

While retention rate is a widely used metric for tracking app performance, there are details that are important to understand when you dive into how the metric is calculated. For most high-level performance measurements, this won't be a concern but for users buying traffic, any changes to retention can alter your LTV calculations, which can skew your performance measurements.

One such detail in the wording above is "trigger at least one session *in one day*." Meaning **if a user isn't active on their day of installation, they will not be considered in subsequent "retention rates."** Or put another way: if a user shows up as active on day two, are they really "retained?"

#### Understanding "Retention Rate" in the dashboard

In the AdLibertas dashboard there are 3 important metrics in the retention section:

* **Retention Rate** - measures users that have returned on a given day, having *also* visited on day 0. This percentage is calculated by the number of active users on a given day divided by the number of users *eligible* for retention. For instance, users who installed 29 days ago aren't considered eligible for day 30 retention.
* **Daily Active Users** - the number of users who were active on the given day.
* **Audience Representation** - the number of active users divided by the entire audience size. This is to provide guidance on when you're making major decisions based on the activity of a small number of users.

#### Relative Reports vs Retention (lifecycle) Reports.&#x20;

The eagle-eyed report builder may come across a situation where day-30 of a[ <mark style="color:blue;">relative report</mark>](/the-platform/user-level-audience-reporting/report-layout/chart-type-module-absolute-vs.-relative-reports) has more users than exist in the retention report. This is because a relative report includes users based on their activity since day-0, whereas a retention rate will only include users who were active on day-30 AND we're active on day-0.

### Lifetime Value (LTV) calculation

Lifetime user value is one of the most powerful metrics offered by AdLibertas User-Level Audience Reporting. Simply put this measures the (estimated) revenue on a per-user basis for your defined cohort of users. More details are available in the article below:

{% embed url="<https://www.adlibertas.com/finding-a-pltv-model-for-your-mobile-app>" %}

AdLibertas calculates LTV by taking the actual earned revenue (both impression-level ad revenue and in-app purchase revenue) of the cohort and multiplying it by the inverse of the retention rate.

![](/files/dHwVLQovaVo0XOP0Ozi2)

Related:[ <mark style="color:blue;">forecasting LTVs</mark>](/the-platform/user-level-audience-reporting/report-layout/forecasting-module)

This means the two factors that impact your LTV are your chort [<mark style="color:blue;">retention</mark> ](#retention-rate)and earned revenue. Some hyper-casual apps -- or other apps with high user turn-over-- face potential challenges in measuring accurate retention rates (users who don't engage on day of installation). For that reason, many marketing teams use cumulative revenue earned divided by day-0 users as an alternative measurement for ROI calculation.

{% hint style="info" %}
Lifecycle reports factor in user eligibility, whereas relative reports do not.
{% endhint %}

If you choose to use cumulative revevenue earned be aware: LTV calculations include users who have reached the appropriate age, whereas cumulative relative reports only report on the total earned to date. You may inadvertently lessen your user metrics by not letting your cohort mature.

For instance, if on March 30th, you're running a 30d performance report starting on March 1st, your LTV report will use retention rates and earnings only for the users who've aged 30d (those who installed March 1). A cumulative report's day 30 will include revenue from users who've installed on March 1st but will not have revenue from cohorts <30d old (March 2nd-March 30th). Therefore will be lower.


# Date Ranges: Define Audience vs. Create Report

Previous Reading: Audience Reporting Walk-through :: Creating an audience :: Running Reports :: Absolute vs. Relative Reports

### Overview

To understand the nuances with user-level dates it's helpful to start with the[ concept of reporting](tps://docs.adlibertas.com/the-platform/user-level-audience-reporting#the-concept).  Defining an audience is a discrete, separate step from running a report of user performance. So you need to define discrete date windows when you [create an audience](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-a-new-user-report) and then again when you view user performance by [running a report.](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-advanced-user-level-reports) This is simply because **you may want to define users by their behavior during one timeframe, then see their performance over a different timeframe.**

![](/files/7cHFjlPrGTbIFosJuUnD)

This important level of detail can be confusing when first using Audience Reporting – but once mastered it can uncover powerful insights of your users.

#### Example: Define an Audience

When you create an audience, you can restrict dates on users that meet the criteria you’ve defined. In the example belo&#x77;**,** the users have completed a “DailyCompleted” Event within the last 7 days.

![Users who’ve fired at least one DailyCompleted event in the last 7d](/files/isfc0Kkmn2c74kfxLHQa)

This means the [<mark style="color:blue;">Audience Builder</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-audience-builder) will find all users who meet these criteria. In the example below, Users A and C would be a part of the audience. User B, would not be included.

![An audience report run over the last 7 days.](/files/poHnbGVkFNPZ6eWd6GNj)

Now when you [<mark style="color:blue;">Run a Report</mark>](https://www.adlibertas.com/knowledge-base/2-running-reports/), you can specify a different timeframe to measure the performance of users A & C.

#### Absolute Report: defining an audience by activity but reporting over  a different timeframe <a href="#h-absolute-reporting" id="h-absolute-reporting"></a>

This is an important feature in[ <mark style="color:blue;">**Absolute Reporting**</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/absolute-vs.-relative-reports)<mark style="color:blue;">,</mark> you can define an audience using a different timeframe than your report. This means you can measure a user's performance over an earlier timeframe than the behavior or action you're using to define the audience. In the example below we’re actually choosing a reporting date frame that precedes the window of the audience definition.

![](/files/rTYprJMAG9j8LO7ct3C7)

#### Step 3: Run a Relative Report on a different timeframe <a href="#h-relative-reporting" id="h-relative-reporting"></a>

For [**Relative Reporting**](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/absolute-vs.-relative-reports), user performance starts at install.

* Restrict user install dates limit the Audience Users to have installed within the timeframe. Users whose install date falls out of the defined timeframe will not be included in the report.
* Days in Lifecycle indicate how many days will be shown in the report (0-14)

![](/files/XBJbaNX7f19uSotspdIC)

So in the below case, User A would show the event at 14d of activity, while User C would only have activity on the first 3d after their install.

![In a relative report, both user A & User C will have the same day 0.](/files/C1FaOMZoSNfQxZwxEoMO)

<figure><img src="/files/YpgRE3Vk3e3spEzHlUaA" alt=""><figcaption><p>User C's action will be measured on day 3, User A on day 14.</p></figcaption></figure>


# Exclude GAID tracking opt-outs

{% hint style="info" %}
Tl;DR: Since Android users who opt-out of tracking all return the same ID, it can cause confusion in user-level reports. For that reason, **we recommend you exclude Android users from reporting.**
{% endhint %}

By default on the Android platform, AdLibertas uses the Google Ad ID (GAID) for tracking users across data sources. This is the (currently) [preferred ](https://support.google.com/googleplay/android-developer/answer/6048248?hl=en#zippy=%2Cpersistent-identifiers-including-android-id)Google identifier for tracking users and there are generally few opt-outs it works for most app developers.

However, there is one main drawback with using the GAID:

> When a user opts out of interest-based advertising or ads personalization, the advertising identifier will not be available. You will receive a string of zeros in place of the identifier.
>
> [*Google Documentation*](https://support.google.com/googleplay/android-developer/answer/6048248?hl=en)

A subset of users will have a shared ID, represented by a string of zeros. When aggregating user-level data users who share a string of zeros as their GAID may be **incorrectly considered a single, unique user.** This can lead to some very strange reporting outcomes.

By default, we do not include these opt-out users in your audience. You can include them if you’d like, or report on only them by using commonly used events. But note, data from these users will be undifferentiable and will appear as a single user.

![](/files/xPydKkhMb8G0Ytr7t2CB)

User Properties: Advertising\_ID = `00000000-0000-0000-0000-000000000000`

Related: [How does AdLibertas manage privacy & security?](https://docs.adlibertas.com/faqs/audience-reporting/how-do-you-manage-privacy-and-security)

<br>


# Scheduled Reports: Keep Updated & Rolling

&#x20;By default audiences and reports are set to "Run Once." But for reporting that needs to stay updated, AdLibertas offers two methods of scheduling updates:

### Keep Updated

Allows users to assign a fixed start date (anchor) and keep the end date updated and current. Helpful for measuring a test or group of users over time.

![](/files/pvZnibUmxEf657dotgV5)

### Rolling

Allows you to have a moving start and end date. Helpful for keeping tabs on users over time.&#x20;

![](/files/BBxva2zMeHsO2qSYY41E)

{% hint style="info" %}
Tip: When scheduling reports keep in mind Audiences and Reports can have [<mark style="color:blue;">distinct and different date ranges</mark>](/the-platform/user-level-audience-reporting/advanced-reporting-methods/date-ranges-define-audience-vs.-create-report). If you change a report’s timeframe without changing an audience’s timeframe, you may get drift in your reports.
{% endhint %}

### Report Scheduling & Notifications

We give you the option to send email alerts when a report is finished. This is very helpful when you have a report you only use periodically and will decrease paused reports.

![](/files/swppsc5Ar4Msc4946zoA)

### Auto-Pausing Reports

[<mark style="color:blue;">Processing big data is hard. And expensive.</mark>](https://www.adlibertas.com/the-adlibertas-approach-to-big-data/) To avoid ballooning infrastructure costs we pause scheduled reports that are not being visted. If you don't visit a report after it runs three times, it and it's audiences will be automatically changed back to "Run Once."

To re-enable these reports, you simply need to change them back to the preferred schedule.

Alerts of change in status to reports will come if you've opted into email notifications, if you'd like Slack notiifcations, pelase contact your AdLibertas account representative.


# Reporting on a Firebase AB test

How to set-up and report on a Firebase AB test in AdLibertas

A very popular use-case for our platform is to measure ongoing — or completed — [AB tests running in Firebase.](https://firebase.google.com/products/ab-testing) This article is to help you get started with measuring Firebase AB tests using the AdLibertas platform.

<figure><img src="/files/KwPdplFazbaaXaoxnkJP" alt=""><figcaption><p><em>We include popular metrics (cumulative earned revenue, LTV) but also allow you to add your own.</em></p></figcaption></figure>

### Background:

{% embed url="<https://www.adlibertas.com/firebase-ab-testing-with-ad-revenue-use-ltvs-to-determine-test-winners/>" %}

{% embed url="<https://www.adlibertas.com/ab-testing-tips-from-a-pro/>" %}

### Step 1: View the test in AdLibertas <a href="#h-step-1-view-the-test-in-adlibertas" id="h-step-1-view-the-test-in-adlibertas"></a>

When you have Firebase connected to AdLibertas you can automatically select and report on your Firebase AB tests. By default Firebase assigns a user property to each variant of the AB test, therefore we make it easy to run a report on these users over a timeframe of your choice. To do so, simply [create an audience](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-audience-builder), choose Firebase Experiment, then choose the appropriate Experiment Name that’s running in Firebase.

In our example, let’s analyze a (fictional) test running that changes game complexity for new users.

![](/files/PIfO0srk7JK038pSyQb2)

Next, you can choose one (or more) variants for each audience.

![](/files/NykpIkg4DHp3TlEVplhg)

### Step 2: Running Reports on a Firebase AB test <a href="#h-step-2-running-reports-on-a-firebase-ab-test" id="h-step-2-running-reports-on-a-firebase-ab-test"></a>

Once you’ve built your audiences, then you can [run reports ](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-advanced-user-level-reports)on these users over a timeframe of your choice.

Note: This will allow you to test your variants during, before, or after the actual timeframe.

![Choose the timeframe.](/files/OifINpeVpPiLYZMPfJGs)

Once you’ve run the reports, you can measure the impact of these AB tests across multiple metrics and timeframes.

![Adding 2 variants into a report.](/files/TN3Wrvdvh4JuTOD1SSYB)

![You can add the count and averages for custom metrics to any audience, including a user's time in the app.](/files/E9ew9hEzl1Bg4XSVSmHK)

Now you can explore the performance and behavioral differences through the standard Audience Reporting features

![Measuring the LTV of multiple test variants](/files/KwPdplFazbaaXaoxnkJP)

![Measuring the cumulative impressions/revenue/actions of variants](/files/wN4xwXTAmfFLkhld6bzw)

Firebase AB Test related reading: [Audience Reporting Walk-through](https://docs.adlibertas.com/the-platform/user-level-audience-reporting) :: [Creating an audience](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-a-new-user-report) :: [Running Reports](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-advanced-user-level-reports) :: [Understanding Date Ranges](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/understanding-date-ranges-with-audience-reporting)


# Understanding “Audience Restraints”

Related: Using User-level Audience Reporting :: Creating an Audience

When using Audience Reporting when you [create an audience](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/creating-a-new-user-report), you’re defining a data-set of users through conditions (actions, behaviors, or user properties.) **Audience Restraints give you the ability to restrain these defining conditions to only apply to certain timeframes as referenced against user’s install/re-install event.**

### **Condition Restraint**

<figure><img src="/files/oeKeeC0wTPcvWzhhmSRO" alt=""><figcaption></figcaption></figure>

![Then you can choose a timeframe or session metric](/files/CKT2u9iqJqfg1jslbDvE)

![As well as an operator. Above you’re limiting the condition to happen less than or equal to 45 min from a user’s install/re-install event.](/files/HVsRjpsQdb7tWMYU7JT3)

#### **Some notes:**

* A user’s install event is defined as day 0
* While the event defining the condition needs to be within the defined audience timeframe, the user’s install date does not.
* The user’s install (by default) is the first\_open\_timestamp

### **Audience Restraint**:

The Audience Restraint applies the same defined restraint to all conditions in the defined audience.

![All conditions added to the audience will need to happen on the user’s day of install/re-install.](/files/hBhY2FJUynivkXx5FU4X)

More reading:

[Audience Reporting Walkthroughs](https://docs.adlibertas.com/the-platform/user-level-audience-reporting)


# Adding user time to your reports

Firebase has a helpful feature where every event they fire, they’ll include a parameter in the event that will tell you how much time has elapsed since the last event. This parameter is called **engagement\_time\_msec.** When these parameters are added up, this can tell you the total time a user spends in the app. (Details on this event are available[ <mark style="color:blue;">in this article</mark>](https://firebase.blog/posts/2018/12/new-changes-sessions-user-engagement))

I walk through this in a video and with a couple of screenshots.

{% embed url="<https://www.youtube.com/watch?ab_channel=AdamLandis&v=dUXgnpYKMZQ>" %}
1.49s video walk-through of adding user-time to your app
{% endembed %}

When creating a report, under Custom Metrics, you can add “User’s Engagement Time in App” that will add up all the “elapsed time” that’s recorded in engagement\_time\_msec.

![Add the conversion from milliseconds of your choice when building a report](/files/bkMzEVRkx9WeeBukZ9S5)

Then when viewing the report, you’ll see a sum & count feature added. For the total time, you’ll want to view the sum! (The count is actually the number of events, not helpful in this context!)

![Here you can see the average user time (in minutes) for an audience. Cumulative, and total time will also be included.](/files/L2jo2HhM8aFTsZPCWv0x)


# Consolidated Revenue Reporting

Combine all earned app revenue across all mediators and app stores. Finally see all your revenue in one place.

![](/files/5fAfAY1UOfITS32mw6ix)

![](/files/0m2alrkvioVYel30MuLv)

#### *“Before determining a strategy, you need a source of truth.”*

As you may already know, not all advertising reporting is created equal. There are some networks that don’t have reporting APIs; some don’t include much data; and even some that don’t have dashboards. However, almost every network offers *some* type of daily reporting that indicates how and where they are buying traffic. We’ve built custom APIs that pull in the data available– however, presented—and more importantly, extrapolate the missing data to provide a unified view of reporting.

Our reporting is fetched daily and then automatically unified and consolidated to a single source of truth.

![](/files/tS08UriCJoHeZC3SQBUx)

### Integrate with just credentials <a href="#h-consolidated-revenue-reporting" id="h-consolidated-revenue-reporting"></a>

Like all AdLibertas products, we only need credentials to connect collect and correlate your app earnings.&#x20;

{% hint style="info" %}
For details on how to connect your app earnings to AdLibertas, see [Connecting in 3 Steps](/data-integrations/connecting-in-3-steps).
{% endhint %}

### Rich reporting built for ad-supported apps

Keep updated about important revenue trends on your apps.

![](/files/Pw1aIgwBrFwaasKXRJZl)

{% embed url="<https://youtu.be/byWhg1OaEvo>" %}
*video: 2:55 functional demo*
{% endembed %}

{% embed url="<https://youtu.be/1YJwet-qNMk>" %}

### Business Analytics & Custom Dashboards

With access to powerful [<mark style="color:blue;">Business Analytics</mark>](#business-analytics-and-custom-dashboards), create custom views of important KPIs and metrics of your earnings.

![](/files/EH3uMRt9MoKughJrhSzD)

{% embed url="<https://youtu.be/jkSceNhTOD4>" %}

### Unsupported Networks

#### *“There’s always someone new…”*

At the time of publication, we support over 150 separate network APIs however there will always be a new API we’ve yet to build. If you have a network that you’d like to include, please contact your account manager or shoot an email to <support@adlibertas.com>.


# Reporting Discrepancies

### Reporting Discrepancies

#### *“There are three sides to every story: your side, my side, and the truth.”*

> *“Ad **serving discrepancy** refers to a **difference** between the number of ad impressions counted by a publisher or ad network adserver and the one counted by the agency or advertiser ad server. Ad **serving discrepancy** can be the source of billing issues.”*
>
> [The Digital Marketing Glossary](http://www.digitalmarketing-glossary.com/What-is-Ad-serving-discrepancy-definition)

It’s unthinkable your bank would “lose” 10% of a transaction between accounts but bizarrely in advertising technology it’s “normal” to have conflicting counts of impressions & inventory between ad-servers. The truth is ad-serving isn’t easy and the challenge of this fast-moving technology is most acutely felt in the often painful reality of reporting discrepancies.

> “Mobile discrepancies can range from 5-50% depending on a number of factors.”
>
> [iab Mobile Discrepancies 2.0](https://www.iab.com/wp-content/uploads/2015/07/Mobile_Discrepancies_2_0.pdf)

A serving discrepancy is the difference of impression & request counts between a third-party reporting network and an ad-server count. Or put another way, the difference of ad-server measured transactions vs the network (buyer) transactions. In our experience mobile advertising has an acceptance rate of discrepancy (usually 10-15% depending on the medium) and given the massive numbers of impressions, complexities of reporting, attribution, technology, and fraud-prevention techniques in place, it’s not surprising this is an accepted shortcoming in the market.

### How are they caused?

As you may imagine the list of why the ad-server vs network counts are off is virtually endless but there is a common list of problems, here are the ones we most commonly see:

* **Incomplete information:** Obviously if you are serving a portion of traffic outside of your ad-server (via another exchange or ad-server, a high discrepancy will exist between your network and ad-server.
* **Fraud Prevention / Difference of the definition of “impression”:** Fraud is a touchy subject with most networks but commonly we see an increasing number of discrepancies arise from a network “attempting” to buy an impression but not counting the impression due to the impression not being “delivered.” For instance, if your ad-server sends an impression to a network, the network buys said impression but the ad only stays on screen for 2 seconds before the user moves to a different screen, the network may not count that impression against their total, where MoPub will. This can be true with occluded, or incompletely rendered impressions.
* **Time zone differences:** Where possible we unify time zones but some networks don’t allow reporting to be called in UTC (standardized ad-server timezone), therefore daily impressions may spill into different days.
* **Failed impression pass backs:** If a network attempts to pass an impression back to your ad server as “unfilled” but your ad server doesn’t receive said impression, the ad server will consider these impressions as “served” but the network won’t.
* **Broken integrations:** similar to missing pass backs, if an impression is incorrectly handed to a network (via SDK or tag) the network may not recognize the impression and it could be lost.
* **Time-outs**: If a network missed the ad server timeout in handing back an unsold impression, the ad-server will mark as sold, the network will not.

&#x20;

### Why this should concern you:

While discrepancies may part of ad serving technology you should be aware of the impact on your bottom line. They can be an indication of lost impressions, thus lost revenue. For instance, if you optimize using Network CPM and a network is losing/not-counting 50% of incoming impressions, the actual CPM could be 50% lower than the network’s measurement, so you might be better off selling to a network with a lower CPM and lower discrepancy.

In cases of large discrepancies, we advise testing optimizing using MoPub-calculated CPMs which unify measurement of all networks and keep a common method of counting. This doesn’t always work, however, as sometimes the miss-measurement can be tied back to MoPub counts.


# Reporting Availability & Timezones

### Reporting Availability

Note when scheduling or pulling ad hoc periodic reports, consider some mediators and networks finalize well into the next day so any selection early the following day could yield incomplete results. Our scheduled reporting is designed to re-deliver reports that change +/-  10% by end of day to keep you updated with the most accurate results.

### Time Zones

Your ad-server reports in UTC and wherever possible we pull reports in the same timezone. However, some networks don’t allow timezone selection which could cause impressions discrepancies between days.


# Ad Network Re-Repost; Also: Revenue Reconciliation Accuracy

Ad Networks will often change numbers after the initial posting of data: known as re-posting reporting. While this can sometimes be good– your earnings increase after initial posting– it can also be negatively adjusted as well. Regardless it always caused revenue reconciliation issues with accounting when the recorded reporting doesn’t match the revenue paid to the publisher at the end of the month. To keep as up-to-date as possible we continually back-fetch data to keep as-accurate-as-possible reporting with the network’s latest posting. For this reason, we don’t recommend you rely on earnings until 15 days after the initial posting.


# Consolidated Reporting vs. Consolidated Inventory Reporting

Generally, mediators return two types of reports, waterfall reports, combined into the **Consolidated Reporting Table** and Inventory Reports known to us as **Consolidated Inventory Reporting.**

What's the difference?

* **Consolidated Reporting** shows demand source and placement information, but does not merge with ad requests.
* **Inventory Reporting** shows ad requests, which don't merge 1:1 with ad networks or placement information.

### **Why are there two types of reports?**

Simply put, it’s not possible to tie a single ad request to multiple ad delivery attempts through a waterfall.&#x20;

Think of it this way, a single ad request is sent to your mediator, it travels through 6 ad units before being filled. Which line item owns that request? Is it correct to assign 0 to the other line items? What do you do in the case of a lost (unanswered) attempt?

### **How to use each report**

* Consolidated Reporting is most commonly used to determine network & placement performance.&#x20;
* Consolidated Inventory Reporting is good for monitoring overall fill rates-- it powers our App Performance Page -- and is uniquely useful for the metric of Revenue per Thousand Ad Requests (Rev per AdReq) which shows the revenue generated by total device impression requests and can often be a more useful metric than CPM to judge performance.

![](/files/T91eHIWBHFzxVNn8ZJJs)


# Reporting Table – Column Descriptions Common Metrics (Calculated Fields)

There’s a wealth of data at your disposal when looking through our analytics tool-set.  Since it can be confusing to keep all combined data sources and naming conventions straight, we’ve taken the liberty of giving you a guide:

Previous Reading:

* [Reporting vs. Inventory Reporting](https://docs.adlibertas.com/the-platform/consolidated-ad-network-reporting/campaign-reporting-vs.-inventory-reporting)
* [Reporting Aggregation Overview](https://docs.adlibertas.com/the-platform/consolidated-ad-network-reporting/consolidated-reporting-overview)
* [Reporting Attribution (Consolidation)](https://docs.adlibertas.com/the-platform/consolidated-ad-network-reporting/consolidated-reporting-overview)

&#x20;

![](/files/dgbb3FHRTVjSjp0MkOYI)

| **Column Name**      | **Description**                                                                                                                     |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| Ad Unit Name         | Ad Unit Name as defined in the mediator                                                                                             |
| Ad Unit Type         | The Ad Unit Type as defined by your mediator                                                                                        |
| AdLibertas Managed   | Line item / ad-unit managed by AdLibertas                                                                                           |
| AdLibertas Waterfall | Name of the defined optimization waterfall as assigned by AdLibertas                                                                |
| App Name             | Application name as defined in your mediator                                                                                        |
| Clicks               | Clicks (network reporting)                                                                                                          |
| Country              | Unified country name                                                                                                                |
| Country ISO-2        | Unified country ISO-2 code                                                                                                          |
| Day                  | Date                                                                                                                                |
| Network              | The attributed third-party network                                                                                                  |
| Network Ad Unit ID   | The 3rd party network ad-unit ID, where applicable                                                                                  |
| Network Ad Unit Name | The ad network name for the ad unit, where provided                                                                                 |
| Network Impressions  | Impression Count, as provided by Network Reporting                                                                                  |
| Ad Unit ID           | The unique ad unit ID as defined by mediator                                                                                        |
| App ID               | The unique application ID, as defined by your mediator                                                                              |
| Clicks               | Clicks (as reported by MAX)                                                                                                         |
| MAX Impressions      | Impressions reported by MAX                                                                                                         |
| MAX Line Item ID     | The unique line item, as defined by MAX                                                                                             |
| MAX Line Item Name   | The MAX-defined line item name                                                                                                      |
| MAX Line Item Type   | The MoPub-defined line item type, for more please visit [MAX](https://developers.mopub.com/publishers/ui/orders/manage-line-items/) |
| MAX Ad Attempts      | The number of attempts MAX has tried for an impression                                                                              |
| MAX Segment ID       | Unique Segment identifier as defined by MAX (where applicable)                                                                      |
| MAX Segment Name     | The Segment Name as defined by MAX (where applicable)                                                                               |
| Platform             | App Platform, as defined by MAX                                                                                                     |
| Network Attempts     | The number of attempts the network has recorded for an impression (where provided)                                                  |
| Revenue              | Attributed network revenue                                                                                                          |

&#x20;

### Common Metrics (Calculated Fields)

Some common performance metrics have been pre-populated as calculated fields. These differ from the columns as these values are nonsensical when summed and must be calculated at the aggregated level. You can find these in the view section under **“Common Metrics”**

![](/files/kENgAov7Z9Rz8ftEOwgc)

| **Calculated Field** | **Description**                                                                                               |
| -------------------- | ------------------------------------------------------------------------------------------------------------- |
| MAX CPM              | CPM as calculated using MAX impression counts and network revenue                                             |
| MAX CTR              | Click-through-rate calculated using MAX click & impression counts                                             |
| MAX Fill Rate        | Impressions divided by serving attempts using MAX counts                                                      |
| Network CPM          | CPM calculated using the Network impression and revenue counts                                                |
| Network CTR          | Click-through-Rate calculated using Network counts (where available)                                          |
| Network Fill Rate    | Impressions divided by serving attempts using Network counts (where available)                                |
| Serving Discrepancy  | The difference of MAX vs Network Impression counts. *Calculated: 1 – (Network impressions – MAX Impressions)* |

Tags:

* [Reporting Definitions](https://www.adlibertas.com/knowledge-base/tag/reporting-definitions/)


# Facebook Reporting

Granting access on Facebook can be confusing at first blush.  Facebook Advertising Network allows two types of reporting credentials

1. **Facebook System User Token** – granted by token, does not expire. (Facebook preferred method).
2. **Facebook Login** – granted by a Facebook Developer. Expires after 90-days.

### **1. Facebook System User Tokens**

* Facebook allows granular access to applications via a granted System User Token — a walk-through of creating one[ is available here](https://developers.facebook.com/docs/audience-network/reporting-api/systemuser).
* After creating the token, select “System User Token” from the drop-down on the [Facebook Credential Page.](https://dashboard.adlibertas.com/settings/credentials)
* Once we’re received credentials we will display the token’s validity for each Facebook app ID we have access to.

**Note: If your token doesn’t allow access to Facebook reporting, we will not include Facebook reporting for this app.**

### **2. Facebook Login**

Requires you log in with credentials associated with the app developer’s account. Facebook credentials will require renewal every 90 days, when you receive notification of pending expiration, please log in to  [The Ad Network Dashboard](https://dashboard.adlibertas.com/settings/adnetworks) of the AdLibertas dashboard to revoke & renew your credentials.

An example of adding Facebook credentials:

{% embed url="<https://youtu.be/TwR4ZJ1Wy3I>" %}

An example of renewing Facebook credentials:

{% embed url="<https://youtu.be/1NmsV8YpsNQ>" %}


# Consolidated Ad Revenue with multiple mediators

### **Introduction:**

We’ve launched support to include reporting from the ironSource and Applovin mediators into your AdLibertas reporting. By default when migrating from MoPub, reporting will include revenue earned from both platforms.

### **Consolidated Reporting Tables**

<div align="center"><img src="/files/wwmPx5FMIcSIDGjFDu4M" alt=""></div>

The combined ad revenue is located in the tables `Consoldiated Reporting Data` and `Consolidated Reporting Inventory Data`

**Consolidated Reporting:** contains individual ad-unit and app performance by network. Since this data includes ad waterfall and placement data it cannot include ad impression request data. (In MAX this type of reporting is called [Campaign Reporting](https://docs.adlibertas.com/the-platform/consolidated-ad-network-reporting/campaign-reporting-vs.-inventory-reporting)). This table is the basis for the [Ad Network Performance](https://dashboard.adlibertas.com/static_reports) page.

**Consolidated Reporting Inventory Data:** This reporting table aggregates at the ad unit level and provides ad request and impression data. It cannot however report on individual network ad unit requests/bids (MoPub calls this type of reporting [Inventory Reporting](https://docs.adlibertas.com/the-platform/consolidated-ad-network-reporting/campaign-reporting-vs.-inventory-reporting)). This reporting is used for the [App Performance](https://dashboard.adlibertas.com/static_reports/top_app?from=2022-02-16\&to=2022-03-01) page

### **Avoiding duplication when migrating from MoPub to a new platform**

Since mediators report from the same revenue sources there can be duplicate reporting during your transition. To avoid duplication, you’ll need to filter out potentially duplicated data:

**“Non\_mopub”** app name refers to revenue that’s collected from a third-party network but cannot be attributed to an active ad unit in the Max configuration. During a transition, non\_mopub *may include revenue that’s being served by other mediators. For accuracy, filter-out non\_mopub to avoid duplicated revenue between platforms (*[*<mark style="color:blue;">more on non\_</mark>*<mark style="color:blue;">mopub</mark>](https://docs.adlibertas.com/faqs/reporting/what-is-non_mopub-revenue))

**Applovin revenue served through MoPub:** AppLovin revenue reporting comes through in zones, if you have the same zones running for both mediators, you’ll see discrepancies. This can extend to bidding, revenue served on Max.

**Reusing ad units** customers that use the same ad units on multiple platforms will see duplication as both Max and the new platform will report the entire amount of earned revenue causing a [serving discrepancy](https://www.adlibertas.com/impression-discrepancy/).

### **Watch a video on how to dedupe revenue using consolidated reporting**

{% embed url="<https://youtu.be/8KhtbiL_aJo>" %}

### Avoid duplication post-MoPub shutdown

Since AdLibertas connects directly to the revenue sources (e.g. directly to Google to pull Admob earnings) when you've migrated from Mopub and your new platform (Max or ironSource) also reports these earnings, **you'll need to disconnect network connections served through the mediator to avoid duplication.**

This simply means you should remove all network credentials for networks that you are serving through a mediator.

To do so, simply navigate to [<mark style="color:blue;">Manage Connections</mark>](https://dashboard.adlibertas.com/settings/credentials) in your AdLibertas dashboard, then remove credentials from your dashboard.

<img src="/files/tHmxbKUVoQtCGz1rl6tU" alt="" data-size="original">

![](/files/JTOCzSZUzxmHmu7aA73b)

<br>


# Business Analytics

Getting started with your self-serve business intelligence tool.

![](/files/Up20L8d1tAwskKK6xBJh)

### Overview:

Part of the benefit of having a single-source-of-truth is the ability to get a complete view of your traffic behavior & trends. Very early on we found the need for data analysis tools on publisher traffic, over the years we’ve refined & polished our internal tools to become a fast favorite for our customers. Our analytics have become a cornerstone for our publishers, whether [<mark style="color:blue;">answering a question</mark>](https://docs.adlibertas.com/the-platform/bi-and-analytics/asking-a-question), [<mark style="color:blue;">sharing information internally</mark>](https://docs.adlibertas.com/the-platform/dashboard-features/sharing-collaborative-links), or setting up a [<mark style="color:blue;">custom dashboard</mark>](https://docs.adlibertas.com/the-platform/bi-and-analytics) the possibilities are endless. We highly encourage you to spend the time necessary to take advantage of these tools, they’ll return your time investment tenfold.

### **Analyze your Revenue** & Answer Questions <a href="#h-analyze-your-revenue-answer-questions" id="h-analyze-your-revenue-answer-questions"></a>

We supply a rich set of analytics tools for your to-do deep dives on your data to determine new opportunities and discover problems.

![](/files/2j9B0LCAkg9M845tqSGR)

### Build Custom Dashboards <a href="#h-build-custom-dashboards" id="h-build-custom-dashboards"></a>

A lot of our customers want to build custom views of their data, so they can monitor or share custom views of ad traffic or earnings reports.

![](/files/Sv2MOtUm8mUm5Ib1JTtv)

### Asking a Question:

{% embed url="<https://youtu.be/8GIhPTlvtTU>" %}

### Saving A Question

{% embed url="<https://youtu.be/a1uZy5_6bOQ>" %}

### Setting up a Custom Dashboard

{% embed url="<https://youtu.be/i09dqMH0ei8>" %}

### Setting up a Pulse

{% embed url="<https://youtu.be/rpPPljrBQe0>" %}


# Analytics Layout

The organization & workflow of your analytics tool

{% hint style="info" %}
Looking for a walk-through? [<mark style="color:blue;">Watch a 3-minute video on how it works.</mark> ](/the-platform/business-analytics/asking-a-question)
{% endhint %}

When [<mark style="color:blue;">asking a question</mark>](/the-platform/business-analytics/asking-a-question), or clicking on [<mark style="color:blue;">Explore Data</mark>](/the-platform/business-analytics/understanding-the-explore-data-button) from another part of the dashboard, you'll be taken to the analytics tool. This document walks through the layout and the workflow of how the Analytics tool can be used.

![](/files/Pm9AtDnM6jeAepYsehUl)

* [<mark style="color:blue;">Explore Data</mark>](/the-platform/business-analytics/understanding-the-explore-data-button)
* [<mark style="color:blue;">Asking a Question</mark>](/the-platform/business-analytics/asking-a-question)
* [<mark style="color:blue;">Understanding the Data Table</mark>](/the-platform/business-analytics/the-data-table)
* Creating Custom Charts
* Downloading CSVs
* [Saving a Question](/the-platform/business-analytics/saving-a-question)
* [<mark style="color:blue;">API Export</mark>](/the-platform/exporting-data/custom-api-connections)
* [<mark style="color:blue;">Create custom dashboards</mark>](/the-platform/custom-dashboards)
* [<mark style="color:blue;">Daily Pulse</mark>](/the-platform/business-analytics/setting-up-a-pulse)


# Understanding the "Explore Data" button

Linking to powerful BI to customize, save questions and create custom dashboards.

![](/files/Czt6Rr4ddjts2OWPekmO)

From most charts in the dashboard, there is a button in the top right labeled "Explore Data." This button will take you straight into a formatted chart in our business analytics tool. This will allow you to quickly [<mark style="color:blue;">modify your view</mark>](/the-platform/business-analytics/asking-a-question), create a <mark style="color:blue;">custom dashboard</mark> and more.


# The Data Table

![](/files/UtHkd1nCQesICU9lrfFd)


# Asking a Question

{% hint style="info" %}
If you're just getting started, we recommend you read the [<mark style="color:blue;">analytics layout page</mark>](/the-platform/business-analytics/analytics-layout)<mark style="color:blue;">.</mark>
{% endhint %}

### Walk-through video asking a custom question

{% embed url="<https://youtu.be/8GIhPTlvtTU>" %}

### Step 1: "Data" - Choose your data table

![](/files/8nQWTrPwgKRfk5E8gXxw)

The "data" field allows you to select data tables available to you. These tables will depend on which products you've signed up for in AdLIbertas.

![](/files/bJ5N6a2oEOiCcTIFuBYv)

* ~~AdLibertas Cost:~~ Deprecated
* ~~App Store and MoPub Revenue:~~ Deprecated
* **App Store IAP:** in-app purchase data collected from the app stores. For more information please see [<mark style="color:blue;">How App Store Reporting works</mark>](/data-integrations/ad-network-and-store-connections/how-does-app-store-reporting-work)<mark style="color:blue;">.</mark>
* **App Store Subscriptions:** Same as above, except for subscriptions.
* **Audience Reporting Metrics:**  volume and count of user-level data you are importing. For more information, see [<mark style="color:blue;">AdLibertas Cost.</mark>](/the-platform/general/adlibertas-cost)
* **Consolidated Reporting Data:** Table of all ad revenue earnings. For more information see [Consolidated Reporting Overview.](/the-platform/consolidated-revenue-reporting)
* **Consolidated Reporting Inventory Data:** For the difference see [<mark style="color:blue;">Consolidated Reporting vs. Consolidated Inventory Reporting</mark>](/the-platform/consolidated-revenue-reporting/consolidated-reporting-vs.-consolidated-inventory-reporting)
* Li~~ne Item Change Logs~~: deprecated
* ~~MoPub Campaign Reporting~~ deprecated
* ~~MoPub Inventory Reporting:~~ deprecated
* **Reporting Absolute Audience Reports:** Keeps an updated table of your most recently run [<mark style="color:blue;">user</mark> ](/the-platform/user-level-audience-reporting)level [<mark style="color:blue;">absolute reports</mark>](/the-platform/user-level-audience-reporting/report-layout/chart-type-module-absolute-vs.-relative-reports). Subsequent reports will overwrite previously run reports.
* **Reporting Absolute Audience Historical Reports:** A comprehensive table of all user-level [<mark style="color:blue;">absolute reports</mark>](/the-platform/user-level-audience-reporting/report-layout/chart-type-module-absolute-vs.-relative-reports). Every day an absolute report is updated, a historical record will be stored.
* **Reporting Relative Audience Reports:** Table containing results of the recently run user-level relative report. Every report run overwrites previously created data.
* **Reporting Relative Audience HIstorical Reports:** Table contains the daily historical record of [<mark style="color:blue;">user</mark>](/the-platform/user-level-audience-reporting)-level [<mark style="color:blue;">relative</mark> ](/the-platform/user-level-audience-reporting/report-layout/chart-type-module-absolute-vs.-relative-reports)reports. Every day an absolute report is updated, a record will be stored in this table.
* **Users By App Version:** A table outlining revenue, impressions, and users by app version. Useful for setting up custom KPIs to track new app releases.

### **Step 2: "Filtered By"  - Setting filters**

Filters limit the amount of data returned in your report.

![](/files/Y8ezhTzbJHlwPQrqr4TX)

Each table has the ability to limit the data by column or row values in the table. In the example above a date filter will only return data from within the selected date ranges.&#x20;

{% hint style="info" %}
PivotTable Junkies: This is your **FILTERS** field
{% endhint %}

### Step 3: "View" -  choose metrics/dimensions for your report

The view section allows you to choose metrics to be returned in your report.

![](/files/3zLqHuMCHZZQb08cGAZX)

This section will allow you to add metrics to your report, such as users, impressions, or revenue. In a chart, the metrics will be the individual variants. In a table, the metrics will be table values.

Once you get familiar with metrics, consider exploring [custom metrics.](/the-platform/business-analytics/creating-a-custom-dimension)

![](/files/ObxKUYuf3SBcxvFAUdvx)

{% hint style="info" %}
PivotTable Junkies: This is your **VALUES** field
{% endhint %}

### Step 4: "Grouped By" - Choose data segmentation

![](/files/EOFNoL5z1tRiLURJEsuj)

The group by section allows you to break out your report by values in your table. You can only chart 20 individual groupings.

![](/files/hQpaXFD0BnW32EljjqeM)

{% hint style="info" %}
PivotTable Junkies: This is your **ROW** field
{% endhint %}

{% embed url="<https://youtu.be/8GIhPTlvtTU>" %}

###

###


# Saving a Question

Keep a question around for posterity, add to a dashboard or connect for API-export.

The "Save” button is available in the top right of your Metabase canvas after [asking a question](/the-platform/business-analytics/asking-a-question).

{% hint style="info" %}
TL;DR: Click **SAVE** in the top right of your report or chart.
{% endhint %}

{% embed url="<https://youtu.be/a1uZy5_6bOQ>" %}
0:41s walk-through of saving a question.
{% endembed %}

### Setting up a Custom Dashboard

{% embed url="<https://youtu.be/i09dqMH0ei8>" %}

###


# Creating a custom dimension

Custom metrics (expressions) allow you to get more complex view of your data.

When you're analyzing your data in our BI tool, you have the ability to combine or add calculations between columns of your data.

{% embed url="<https://www.youtube.com/watch?v=xrktncPLmMg>" %}


# Setting up a pulse

### Setting up a Pulse

{% embed url="<https://youtu.be/rpPPljrBQe0>" %}


# Custom Dashboards

{% hint style="info" %}
**TL;DR:** Click "Explore Data" from any dashboard, or ask a new question. Save your report, then add to a new dashboard.
{% endhint %}

One of the most popular use-cases for monitoring custom KPIs is building a dashboard. Like our Business Analytics, both [<mark style="color:blue;">Consolidated Revenue</mark> ](/the-platform/consolidated-revenue-reporting)and [<mark style="color:blue;">User Level Reporting</mark>](/the-platform/user-level-audience-reporting) can be exported to analytics. [<mark style="color:blue;">Start here</mark>](/the-platform/business-analytics) if you want more background.

### Walk-through of a Custom Dashboard

{% embed url="<https://youtu.be/i09dqMH0ei8>" %}
1:23s video walk-through of a custom dashboard
{% endembed %}

### **Workflow**

Once you have a formatted data table-- or a chart-- from business analytics you can save this question and add it to the dashboard. Changes to the saved question -- including formatting -- will be applied to the dashboard on refresh.

![](/files/WNSbjpBaOFqe3r0UYTFD)

Next: learn how to [<mark style="color:blue;">combine charts</mark>](/the-platform/custom-dashboards/combining-data-into-a-single-chart) on a custom dashboard.


# Custom Dashboard Filters

Adding global filters to your dashboard

![](/files/wEaxFNw1BhifcS020lDR)

You can add a global filter to your [<mark style="color:blue;">custom dashboard</mark> ](/the-platform/custom-dashboards)by looking in the top right of the chart's canvas and clicking `Edit` > `Add a filter`. From here you can choose time, location, or "Other Categories."&#x20;

Other categories will allow you to choose a custom filter of the data in each question on your dashboard. Watch a short example below.

Y![](/files/3MsnPn1FPvGGI4VpdYm3)

### Example: Setting country filters.

Watch a short video on how to add country filters to a custom dashboard

{% embed url="<https://www.youtube.com/watch?v=7PL013x12LE>" %}


# Combining data into a single chart

{% hint style="info" %}
By selecting a question on a custom chart you can overlay other questions on top of each other.
{% endhint %}

Combining questions on a chart will allow you to compare and contrast different questions, datasets, or data providors. See an example on how to do so below.

{% embed url="<https://www.youtube.com/watch?v=-HQOqDM9CI4>" %}


# Direct SQL Access

AdLibertas offers customers the ability to access their datasets directly using Amazon Athena.

![](/files/NxjakjYaJRLNxiBlDFjo)

### How it works

With just your credentials, AdLibertas will collect data from all of your data sources, unify, and store the compressed data in a customer-specific AWS account. You can use[ <mark style="color:blue;">Amazon Athena</mark>](https://aws.amazon.com/athena/) to directly SQL-query your normalized data from here.

Since Athena is an easy to use serverless Amazon-managed service, teams can get directly access their data using standard SQL. And since AdLibertas is pulling and storing the data, there is no need for data engineering effort to get up and running.

### Getting Started

AdLibertas customers can contact their account representative to request access to Athena. You will be given:

A Sign-in URL: `https://example.signin.aws.amazon.com/console`

User name: `example_account`

One-time Password: `*******`

* A Sign-in URL: <https://example.signin.aws.amazon.com/console>
* User name: example\_account
* One-time Password: \*\*\*\*\*\*\*

{% hint style="info" %}
Note: Once you have access to the AWS Management Console you will have administrative access for the purposes of Amazon Athena access and while data can’t be deleted via Athena, account access does allow the ability to permanently alter datasets.
{% endhint %}

Once you have access to your account:&#x20;

1. [<mark style="color:blue;">Apply Payment Method</mark>](https://us-east-1.console.aws.amazon.com/billing/home?region=us-east-1#/paymentmethods)<mark style="color:blue;">.</mark>
2. [<mark style="color:blue;">Access Athena</mark>](https://us-west-2.console.aws.amazon.com/athena/home?region=us-west-2#/query-editor)<mark style="color:blue;">.</mark>
3. Change Region to `Us-West-2`
4. Change workgroup to your `example_account`
5. Change database to your `example_account`

### Popular Use-cases

#### Custom or granular access:&#x20;

While AdLibertas out-of-the box user-level reporting allows highly sophisticated reports to be constructed without the need for custom SQL, customers do have the need to create more complex queries that are out of scope from a UI. Most often, these customers will lean on writing their own queries to access the data. A popular use case is downloading the members of an [<mark style="color:blue;">AB test</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/reporting-on-a-firebase-ab-test), then running user-level event counts to gain more sophisticated insights into test-outcome [<mark style="color:blue;">probabilities</mark> ](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/report-layout/statistics-module)and [<mark style="color:blue;">confidence</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/report-layout/measuring-confidence), not already supported.

#### Targeting or CRM management

Since all [<mark style="color:blue;">audiences</mark> ](/the-platform/user-level-audience-reporting/creating-reports/advanced-audience-builder)are readily available for SQL export, customers can easily export user IDs for the purposes of targeting or CRM management. A great example would be running a report on your [<mark style="color:blue;">top-performing users</mark>](https://www.adlibertas.com/introducing-report-filters/), then giving them a special offer to incentivize retention or conversion.

&#x20;


# Exporting Data


# Ad Network Reports

### Ad Network Delivery of Ad Network Reports

*“Automatic delivery of network performance”*

&#x20;

The goal of AdLibertas is to increase the liquidity of demand competing for publisher ad supply. Part of doing so is enabling the demand partner/network to buy inventory intelligently. We’ve introduced the concept of [Network Reports](https://dashboard.adlibertas.com/reports) which gives the network insight into their buying positions in AdLibertas-managed regions. This way a demand source can adjust their buys to move up or down the waterfall – much like a more traditional exchange, with the aim of buying on mobile app inventory in a more efficient manner. Efficiency of competition =  more demand = higher prices for inventory.

Some examples of benefits we’ve seen from enabling Network Reporting on publisher inventory:

* Network gets to see their changing waterfall position – without needing to interact/ask the publisher.
* Network will be able to identify serving discrepancies as we include their reporting vs. ad server counts.
* A network can see when their buying at too low of a fill rate, and are in danger of being removed from a segment.
* The buyer can see when their buys are switched off and when we will automatically re-introduce their buys in periodic “market price tests”

**It should be noted Network Reporting will only give updates to the named network, the buyer will not see other network buying positions or prices.** You can set up your own Demand Report in the [Reporting section of your dashboard.](https://dashboard.adlibertas.com/reports)

For an outline of the report and column definitions, please download this file:

[NetworkWaterfallExample.xlsx](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2020/12/NetworkWaterfallExample.xlsx)


# Chart Reports

### Customized downloadable charts <a href="#articletoc_0" id="articletoc_0"></a>

*Customize, schedule, deliver!*

Located:&#x20;

BI & Analytics > [<mark style="color:blue;">Download Reports</mark>](<https://dashboard.adlibertas.com/reports >) > Chart Reports

![](/files/iNH6UMBhlYZ4lXEXM9KQ)

![Click "Chart Reports" in the menu](https://www.adlibertas.com/wp-content/uploads/2020/04/networkTotal.gif)

The purpose of the daily chart reports is to deliver high-level views of your overall consolidated revenue performance on a periodic timeframe. These charts won't answer all questions but they'll instead provide indicators of shifting performance. For more detail click on any image to visit the dashboard and drill into more results.

The data collected from these reports come from[ <mark style="color:blue;">Consolidated Revenue Reporting:</mark>](/the-platform/consolidated-revenue-reporting) from the platforms that report on your revenue.

**Note on delivery:** If reports aren’t yet available at scheduled delivery time (customizable but by default, 9A PT), you’ll get a notification that reporting isn’t yet available. If reporting changes +/- 15% by EOD, you’ll get an updated chart at 17h PT.

### **The Main Report**

![](https://www.adlibertas.com/wp-content/uploads/2018/08/Dashboard.png)

* **Yesterday’s Revenue:** Total aggregated revenue of the previous day’s aggregated network reporting.
* **DoD Change %:** Day-over-day change from yesterday’s earnings to the previous day as a percentage change.
* **7d Compare %:** Yesterday’s revenue as compared to the performance of one week ago – as a percentage.
* **Revenue:** Revenue trend-line over the selected period. Default is 14 days but you can alter the period delivered in the [reporting dashboard.](https://dashboard.adlibertas.com/reports)

**Network Performance:**

![](/files/4r0Aln00W6xWYHdaZ3HX)

* **% Daily Change:** is the percentage change as compared to the previous day’s earnings.
* **Revenue by Network:** Stacked revenue by network, highest earnings bottom to top – limited to top 15. If you’d like more detail, click on the chart and you can isolate networks by clicking on the key.

**Impressions, CPM & Network Performance**

![](/files/cbWLCG4RHqxO18gvFVVR)

* **Daily Impressions and CPM:** dual-axis chart of impressions (bar, left axis) versus CPM (line, right axis).
* **Revenue by Country (top 5):** revenue contribution for the top 5 countries. To isolate, click through to our dashboard and click on the country key.

### Top Apps Report

![](/files/LXDZINEX05xd48LHAs7j)

The Top Apps Report is an optional add-on to the Chart Reports. This will summarize the ad revenue on your top apps.

To enable, enable the “Include Top Apps Report” checkbox when setting up a Chart Report. By default, this section will report on the top 5 apps by revenue.

* **Revenue by App:** Total ad revenue earned by app name.
* **CPM by App:** App CPM by app
* **Impressions By App:** Ad impressions served by app
* Revenue per Ad Request: Revenue earned per measured ad request
* Requests by App: Total ad requests measured per app
* Fill Rate by App: Ad impression per ad request per app. Note: depending on your platform, may include pre-cached but not served interstitials.

### ~~**DEPRECATED Daily Optimization Report:**~~

The Daily Optimization Updates are an optional add-on to the Chart Reports. This will summarize the AdLibertas optimization activity of your managed revenue.

To enable, enable the “Include Optimization Report” checkbox when setting up a Chart Report.

**Daily Optimization:**

![](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2019/03/DailyOptHeader-1024x334.png)

The optimization header-bar is designed to show you the ebb and flow of optimization changes and tests that are happening in your managed traffic.

* **Waterfall changes:** Total daily optimized price points indicate the number of daily updates to line items, this mainly consists of changing priority, allocation, and status (on/off). Note: because our line items are largely running separate priorities, the CPM doesn’t need to be updated in most cases, and to increase efficiency we don’t include CPM updates unless necessary.
* **Active Market Price Tests:** Periodically we re-introduce line items that have been tested out of the waterfall due to low-performance at a small allocation of traffic to see if the market dynamics have allowed for a higher tier of traffic to be purchased. This number is the number of price-tests that are active in your managed inventory.
* **Successful Price Tests:** The number of prices judged to have succeeded, and are now being ramped up in allocation (amount of traffic).
* **Failed Market Price Tests:** indicate introductions or failing performance of existing line items that are being actively ramped down in traffic, or turned off.

**Optimization Results:**

* **Managed revenue** is the total AdLibertas amount of revenue that is managed by AdLibertas.
* **Daily Cost:** is the daily cost of our measured performance increase (for more see the [cost calculation section](https://docs.adlibertas.com/getting-started/welcome-to-adlibertas)).
* **Optimization Changes:** Area chart, over time, of the number of waterfall changes AdLibertas makes to the waterfall.
* **Total Running Line Items:** Total number of running line items under AdLibertas management.
* **Optimization Tests:** total successful (blue) & failing (grey) price tests running under AdLibertas care.

Next: [Ad Network Reporting](https://docs.adlibertas.com/the-platform/dashboard-features/ad-network-reports)


# Custom API connections

Getting programmatic access to your data

{% hint style="info" %}
For most customers looking to download data, we recommend [<mark style="color:blue;">Downloading Consolidated Data</mark>](/the-platform/exporting-data/downloading-and-scheduling-data-reports) in the reporting section, and for user-level data to [<mark style="color:blue;">request bulk report outputs</mark>](https://www.adlibertas.com/ltvs-made-easy-bulk-campaign-pltv-outputs/) from your account manager.
{% endhint %}

This document outlines how to connect to the AdLibertas dashboard via API. The connection is through our [<mark style="color:blue;">business analytics tool</mark> ](/the-platform/business-analytics)Metabase. Data exports from both [<mark style="color:blue;">user-level reporting</mark>](/the-platform/user-level-audience-reporting) and [<mark style="color:blue;">consolidated revenue reporting</mark>](/the-platform/consolidated-revenue-reporting) are available to export via API.

For simplicity's sake, we recommend using an authenticated post request to download saved questions. If you want/need the ability to create dynamic questions for API export, this is significantly more difficult and will require you to contruct the queries with each post. If you'd like assistance, please let us know.

Note for Consolidated Revenue Reporting: AdLibertas is constantly re-pulling network data to ensure we capture any changes or problems as reported by your data sources. Additionally, there are frequently data delays and outages that may lead to data being unavailable at the time of your request. For this reason we recommend you pull the trailing 7-15 days of data to account for any corrections we find.

### **Authentication:**

1\.      Login to the Adlibertas dashboard with your username/password

```
curl'https://publicapi.adlibertas.com/v1/users/login
' -H 'content-type: application/json;charset=UTF-8' --data-binary '{"username":"______@adlibertas.com","password":"_______"}' --compressed

# response will look like this
{"token":"XXXXX","session_id":"XXXXXX"}
```

2\.  For a request to be authenticated, set your `cookie` header to `metabase.SESSION_ID=your-session-id-here`&#x20;

Note: the session ID, will be used in the next request. Session IDs are set to expire after 30 days.

&#x20;

### **Create your Question:**

1\.    [  <mark style="color:blue;">Create</mark> <mark style="color:blue;"></mark><mark style="color:blue;">**a new question:**</mark>](/the-platform/business-analytics/asking-a-question)

2\.      [<mark style="color:blue;">**Save your question**</mark>](/the-platform/business-analytics/saving-a-question)

&#x20;Example Question: <https://metabase.adlibertas.com/question/1646>

Note: the 1646 at the end of the request URL, is your report ID **\<reportID>**.

&#x20;

**Download the saved question as a CSV:**

For CSV: Send an authenticated POST request to `https://metabase.adlibertas.com/api/card/`**`<reportID>/`**`query/csv` updating the report ID to the desired question.

To download as JSON: Send an authenticated POST request to `https://metabase.adlibertas.com/api/card`**`/<reportID>`**`/query/json` updating the ID to the desired question.

&#x20;


# Downloading & Scheduling Data Reports

### Downloading Data Reports

**Located:** [**https://dashboard.adlibertas.com/reports**](https://dashboard.adlibertas.com/reports)

If you’re interested in downloading or having periodic data-sets sent to your email inbox, you’ll want to explore Download Reports.

By clicking the plus sign with “Data Reports” selected, you’ll be able to download a one-off or schedule a periodically delivered report to your inbox!

![](/files/2gldKRkc2s11MELIk7h8)

* **Report Name:** is the title of the email delivered.
* **Description**: Notes to describe the purpose of your report
* **Schedule Delivery:** This allows you to choose a periodic delivery of your report via email
* **Day/Time:** This allows you to choose when the report will be delivered.
* **Send to:** your ability to add a list of email addresses for delivery.

Next: [Chart Reports](https://docs.adlibertas.com/the-platform/dashboard-features/chart-reports)


# Deprecated: Line Item Change Log

### Tracking automated line item changes

The Line Item Change Log shows individual line item optimization status & changes. Don’t let the complexity scare you, this is a very powerful tool to see the performance & optimization of individual line items. Simply understanding the column definitions will help you get value out of this report.

We have both a video tutorial and screen-shots for your reference.

Change log video tutorial:

{% embed url="<https://youtu.be/eKPBrRDaPhw>" %}


# General


# Change your Username & Password

To change your account password simply click in the top right on your user name > Account Settings

![](/files/NgPGUmbS7hzuhTPR4M86)

From here you can click User Information and update your username and password. Don't forget to click save!

![](/files/5hkrfW3hK2PBgFo5yWFh)

{% embed url="<https://www.youtube.com/watch?v=AsDEAEtYGuo>" %}


# Adding Users to your Account

To add users to your account password simply click in the top right on your user name > Account Settings

![](/files/IMrCxacSo32j4ysI2jfs)

From here you can add new users to your account!&#x20;

{% hint style="info" %}
Admin users can add new additional users to the dashboard.
{% endhint %}

![](/files/7YFpRncrJlQpdgOCgNTm)


# Sharing Collaborative Links

We’ve made it easy to share the exact report or page you’re viewing in the AdLibertas dashboard with your team. To create a collaborative link, simply click on the link icon (red) and a shortened link

We’ve made it easy to share the exact report or page you’re viewing in the AdLibertas dashboard with your team. To create a collaborative link, simply click on the link icon (red) and a shortened link

![](/files/Wrkk1tzc6BFxtORgLYmE)

Then when you click the link, it will take you to the exact page you’ve shared.

See it work below

{% embed url="<https://youtu.be/loskNj8No_4>" %}

<br>


# AdLibertas Cost

## Consolidated Network Reporting:

Network reporting cost depends on the number of data connections you have connected.

## User-Level Reporting

Cost depends on your data volume. We do offer a free 14-day trial. You can see your data usage at any time by selecting the `Audience Reporting Metrics` table in your BI tool.

![](/files/XKB1b5IW09Jmb8LsCyoW)

For details [<mark style="color:blue;">please contact us to get a quote</mark>](mailto:sales@adlibertas.com) or [<mark style="color:blue;">get in touch for a platform demo.</mark>](https://www.adlibertas.com/schedule-a-demo/)

## Payment Terms

We do not charge up-front commitments. We bill net-30 for the previous month’s usage. You can stop at any time and we will prorate your cost for the month.

You can pay by wire, direct transfer, credit card, or check.

You can view all of your open and past invoices and their status in the [<mark style="color:blue;">Invoices</mark>](https://dashboard.adlibertas.com/invoices) section of your AdLibertas dashboard.


# Connecting in 3 steps

Connect your data quickly and easily

We have 100+ API connections to ensure your data is complete and comprehensive.

### **Step 1: Add New Data Sources**

{% hint style="info" %}
**No SDK required, no data engineering, no app changes needed.**
{% endhint %}

For most service providers all you need to provide are API credentials. We pull and combine reports directly from the vendors and serve as your Single Source of Truth for all of your data sources. We support over 100 data integrations, for a unified view of your users and their earnings.

{% embed url="<https://www.adlibertas.com/wp-content/uploads/2021/06/AddingBigQuery.gif>" %}

Start connecting data sources [<mark style="color:blue;">here</mark>](https://dashboard.adlibertas.com/onboarding/credentials)<mark style="color:blue;">.</mark>

{% embed url="<https://www.adlibertas.com/data-connections>" %}
See a list of all of our current data connections
{% endembed %}

{% hint style="info" %}
If we *don’t have your data source, or you have a custom connection we can facilitate ingesting your datasets via* [*custom webhooks*](https://docs.adlibertas.com/data-integrations/custom-integrations/sending-events-via-webhooks-to-adlibertas)*.*
{% endhint %}

### **Step 2. We download & consolidate your data**

You don’t need to architect a data-processing and storage system. There’s no need for your tech team to write python scripts or custom ETLs. We do the heavy lifting of providing the data pipeline, storage, and deploying the query engine to complete your analytics solution.

Enable your users so you can get back to work. We operate on single-tenant storage and shared resource report-processing for both security and cost-efficiency.

{% embed url="<https://docs.adlibertas.com/privacy-and-security/privacy-and-security-details>" %}

### **Step 3. You get answers**

**Exploratory Analytics to enable the entire organization**

Allows anyone in the organization to get actionable insights from your data. Extrapolate mathematical prediction models on your data. Quickly and easily apply predictions to your reports.

Beautiful, comprehensive dashboards give you full access to user behavior and performance.

[See a walk-through of the product](https://docs.adlibertas.com/the-platform/how-it-works)

<figure><img src="https://www.adlibertas.com/wp-content/uploads/2021/09/pLTVgif.gif" alt=""><figcaption></figcaption></figure>

**Recommended:** [*Using Audience Reporting*](https://docs.adlibertas.com/the-platform/user-level-audience-reporting)


# Ad Impression-Level Revenue Connections


# AppLovin Max User Revenue API

![](https://www.adlibertas.com/wp-content/uploads/2022/01/FirebaseApplovin-Wide.png)

Applovin / MAX offers a **Report Key** API that allows you to grant access to both aggregate and user-level ad revenue. To find this **Report Key** in your [<mark style="color:blue;">Applovin dashboard</mark>](https://dash.applovin.com/o/account#keys)<mark style="color:blue;">,</mark> click Account > Keys ().

[<mark style="color:blue;">Applovin/MAX Documentation</mark>](https://dash.applovin.com/documentation/mediation/reporting-api/max-ad-revenue)

<figure><img src="/files/bhEH3nusm2jmGsn7F6I1" alt=""><figcaption></figcaption></figure>

To add to AdLibertas, simply add the API in your[ <mark style="color:blue;">AdLibertas Credential Manager.</mark>](https://dashboard.adlibertas.com/onboarding/credentials/new/applovin_max)

[<mark style="color:blue;">Back to integrations</mark>](https://docs.adlibertas.com/data-integrations/connecting-in-3-steps)

**Interested in seeing how to best utilize AppLovin user-level revenue?**

Rea&#x64;**:** [<mark style="color:blue;">**Connecting Applovin MAX with Firebase:**</mark>](https://www.adlibertas.com/connecting-applovin-max-ad-revenue-with-firebase)

{% embed url="<https://www.adlibertas.com/connecting-applovin-max-ad-revenue-with-firebase/>" %}

*Applovin Max tells you how much your users are worth, Firebase tells you what your users are doing. Only by combining these datasets can you see what your app user actions are worth.*

![](https://www.adlibertas.com/wp-content/uploads/2022/01/pre-built-tool.png)


# ironSource Ad Revenue Measurement Integration

IronSource makes it easy to collect impression-level data. While they do provide a post-back app event, it’s much easier for AdLibertas to collect the impression-level data from the ironSource API.

Simply [add the API credentials](https://dashboard.adlibertas.com/onboarding/credentials/new/ironsource) to our dashboard.

![](https://www.adlibertas.com/wp-content/uploads/2021/06/iSFBst.png)

Further reading: [**Why link ironSource with Firebase**](https://www.adlibertas.com/why-should-you-link-ironsource-and-firebase/)

![](https://www.adlibertas.com/wp-content/uploads/2022/01/pre-built-tool.png)


# Impression level tracking with Admob Mediation

Firebase and Admob have an automatic integration, but the revenue amount [<mark style="color:blue;">is not exported to BigQuery</mark>.](https://stackoverflow.com/questions/51202704/can-i-get-ad-impression-and-ad-click-from-bigquery-linked-with-firebase-anal#comment91341767_51202704) Not being able to export this information means you won’t be able to export or utilize impression-level data outside of the Firebase dashboard. This article outlines our recommended way to implement impression-level tracking with Admob mediation.

You can gather the impression value by using the Admob paid event handler.

* [<mark style="color:blue;">iOS</mark>](https://developers.google.com/admob/ios/early-access/paid-events) documentation
* [<mark style="color:blue;">Android</mark>](https://developers.google.com/admob/android/early-access/paid-events) documentation
* [<mark style="color:blue;">Unity</mark>](https://developers.google.com/admob/unity/paid-events) documentation

Implementing the paid event handler will allow you to capture the earned value of the ad impression and relay via Firebase analytics method [<mark style="color:blue;">logEvent</mark>](https://firebase.google.com/docs/analytics/events)<mark style="color:blue;">.</mark>

This will be similar to how other mediation platforms recommend tracking impression-level ad revenue at the app level (e.g [<mark style="color:blue;">ironSource</mark> ](https://www.adlibertas.com/knowledge-base/ironsource-ad-revenue-measurement-arm-integration/)and [<mark style="color:blue;">Applovin-MAX</mark>](/data-integrations/ad-impression-level-revenue-connections/applovin-max-user-revenue-api)). Be sure you include as much detail from the impression as possible (the bare minimum should be value and currency).

We recommend you call the impression event something other than ad\_impression since it would generate duplicate counts in the Firebase dashboard.


# Collecting MoPub Impression-Level Data as a Firebase Event

Today MoPub doesn’t offer an API providing impression-level events. The information is only allowed as a post-back to the app.

One of the easiest ways to track MoPub impression-level data is by enabling Firebase to collect ad impressions as events. This article outlines the recommended methods for doing so.

**Summary:**

1. Enable ILRD
2. Integrate listeners to collect the post-back
3. Send the information as a Firebase Event.

### **1. Enabling Impression-level Revenue Data (ILRD):**

First, data will only be sent to SDK versions v5.7.0 or higher.

Below is MoPub’s documentation on the latest versions:

* [Android](https://developers.mopub.com/publishers/android/integrate/)
* [iOS](https://developers.mopub.com/publishers/ios/integrate/)
* [Unity](https://developers.mopub.com/publishers/unity/integrate/)

Contact your MoPub account representative to enable ILRD. If you’re not assigned an account manager you can send an email to <support@mopub.com> to request this feature.

### **2. Integrate listeners to collect post-back**

The ILRD event is sent as a JSON blob, to collect the JSON delivered with the ad impression you’ll need to add listeners to capture, parse and relay the information to Firebase:

* [Android](https://developers.mopub.com/publishers/android/impression-data/)
* [iOS](https://developers.mopub.com/publishers/ios/impression-data/)
* [Unity](https://developers.mopub.com/publishers/unity/impression-data/)

### **3. Relay the information as an event to Firebase**

Note, we recommend you send all information provided with the impression:

**iOS – Sending MoPub ILRD to Firebase**

```
- (void)mopubAd:(id<mpmopubad>)ad didTrackImpressionWithImpressionData:(MPImpressionData * _Nullable)impressionData
{

// Feed impression data into internal tools or send to third-party analytics
    if (impressionData != nil)
    {
     [FIRAnalytics logEventWithName:kFIREventAdImpression
      parameters:@{
        kFIRParameterAdPlatform:@”MoPub”,
        kFIRParameterAdUnitName:impressionData.adUnitName,   
        kFIRParameterAdFormat:impressionData.adunitFormat,
        kFIRParameterValue:impressionData.publisherRevenue,
        kFIRParameterCurrency:impressionData.currency,
        kFIRParameterAdSource:impressionData.networkName,
        @“precision”:impressionData.precision
        }];
    }
}</mpmopubad>
```

**Android – Sending MoPub ILRD to Firebase**

```
@Override
public void onImpression(@NonNull final String adUnitId, @Nullable final ImpressionData impressionData) {

  if (impressionData != null) {
    // Feed impression data into internal tools or send to third-party analytics
    FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(context);

    Bundle params = new Bundle();
    params.putString(FirebaseAnalytics.Param.AD_PLATFORM, “MoPub”);
    params.putString(FirebaseAnalytics.Param.AD_SOURCE, impressionData.network_name);
    params.putString(FirebaseAnalytics.Param.AD_FORMAT, impressionData.adunit_format);
    params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.adunit_name);
    params.putString(FirebaseAnalytics.Param.VALUE, impressionData.publisher_revenue);
    params.putString(FirebaseAnalytics.Param.CURRENCY, impressionData.currency);
    params.putString("precision", impressionData.precision);
    mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params);
  }

}
```

**Unity – Sending MoPub ILRD to Firebase**

```
// REGISTER TO LISTEN TO THE EVENT FROM MOPUB SDK
    private void OnEnable() {
        MoPubManager.OnImpressionTrackedEvent += OnImpressionTrackedEvent;
    }

    private void OnImpressionTrackedEvent(string adUnitId, MoPub.ImpressionData impressionData)
    {
        // Feed impression data into internal tools or send to third-party analytics
        if (impressionData != null) {
          var myImpressionObject = JsonUtility.FromJson<ImpressionObject>(impressionData.JsonRepresentation);
          var impressionParameters = new[] {
              new Firebase.Analytics.Parameter("ad_platform", “MoPub”),
              new Firebase.Analytics.Parameter("ad_source", myImpressionObject.network_name),
              new Firebase.Analytics.Parameter("ad_unit_name", myImpressionObject.adunit_name),
              new Firebase.Analytics.Parameter("ad_format", myImpressionObject.adunit_format),
              new Firebase.Analytics.Parameter("value", myImpressionObject.publisher_revenue),
              new Firebase.Analytics.Parameter("currency", myImpressionObject.currency),
              new Firebase.Analytics.Parameter("precision", myImpressionObject.precision)
          };
          Firebase.Analytics.FirebaseAnalytics.LogEvent("ad_impression", impressionParameters);
        }
    }

    [Serializable]
    public class ImpressionObject
    {
        public string adunit_id;
        public string adunit_name;
        public string adunit_format;
        public string app_version;
        public string id;
        public string currency;
        public string publisher_revenue;
        public string network_name;
        public string network_placement_id;
        public string adgroup_id;
        public string adgroup_name;
        public string adgroup_type;
        public string adgroup_priority;
        public string country;
        public string precision;
    }
```


# Ad Network & Store Connections


# Adding Ad Network Credentials

![](/files/OXJ3ML5rGB43vBsN3TCw)

### Gathering 3rd Party Network Reporting Credentials

To get started you will be prompted to add 3rd party network credentials. Each network has its own reporting interface and we’ve worked diligently to account for each of their idiosyncrasies to consume as much of the information as possible.

![You can see the status of your data connections by clicking on Data Source Status](/files/cXNCGjYxslTPeMPDeNnQ)

* Where possible we recommend you create a new user with “reporting-only” credentials. Not all networks offer this feature but rest assured your credentials are stored in a secure Amazon data vault. [<mark style="color:blue;">More on AdLibertas security.</mark>](https://docs.adlibertas.com/privacy-and-security/privacy-and-security-details)
* Each network page in our dashboard has information for the method to collect reporting credentials. Some of these require help from the network, so do plan on these credentials taking some time to collect from the networks.
* We can process networks individually, so don’t feel the need to wait for all credentials before entering into the AdLibertas dashboard.

![Simply add credentials to connect your data](/files/QHZQ4dGsDSH8oEo5HgCl)


# How does App Store Reporting work?

AdLibertas can track your App Store revenue generated on Apple AppStore and Google Play.

### **Getting Started:**

All we need are credentials. To get started, Check our how-to for connecting [Apple App Store Connect](https://docs.adlibertas.com/data-integrations/ad-network-and-store-connections/adding-sub-user-to-app-store-connect) and [here for Google Play](https://docs.adlibertas.com/data-integrations/ad-network-and-store-connections/adding-access-to-google-play) to AdLibertas.

**How is Revenue Displayed?**

Unfortunately, neither App Store is straight-forward with how it displays and updates earnings to the app developer. We’ve done our best to show you the most important and up-to-date data available — however, there are some important details about gross and [net revenue.](https://docs.adlibertas.com/data-integrations/ad-network-and-store-connections/how-does-app-store-reporting-work)

**Metric Definitions:**

* Active Users: See [Firebase Reporting](https://docs.adlibertas.com/data-integrations/analytics/setting-user-campaigns-in-firebase)
* **Net Revenue** *– Revenue you can expect to collect. Excludes taxes and fees*.
* **Gross Revenue** – *Revenue charged to app users (includes App Store Fees and taxes).*
* IAP: **Units** *– Number of IAP events/transactions*
* IAP: **Refunds** *– The count of refunds granted and reported by the store. This refund is accounted in net & gross revenue.*
* Subscriptions: **Active** – *Number of subscriptions reported active by store*
* Subscriptions: **Activations** – *Number of new subs created on the day*
* Subscriptions (Apple Only): **Cancellations**: *Any subscription not renewed directly by the customer or as a result of a plan/tier change.*
* Subscriptions (Apple Only): **Conversions** *– the number of introductory or subscription offers that have renewed to a standard price subscription.*
* Subscriptions (Apple Only): **Billing Retries** *– the number of subscriptions that have not been renewed due to a billing issue. When a subscription expires due to a billing issue, Apple will attempt to renew the subscription and collect payment for up to 60 days. Includes subscriptions that previously entered a 6 or 16 days Billing Grace Period but did not renew.*
* Subscriptions (Apple Only): **Reactivations** *– the number of previously canceled subscriptions that have re-reactivated to a subscription in the same group, including upgrades, downgrades, and crossgrades.*
* Subscriptions (Apple Only): **Renewals** *– the number of subscriptions that have successfully renewed out of the billing retry state. Does not include subscriptions that renewed during a 6 or 16 day Billing Grace Period window.*
* Subscriptions (Apple Only): **Refunds** *– the number of subscriptions refunded to customers. Includes full and partial refunds.*
* Subscriptions (Apple Only): **Grace Periods** *– the number of subscriptions that have not renewed due to a billing issue, and have entered a 6 or 16 day Billing Grace Period window.*

**Currency Conversion**

AdLibertas automatically converts currency, as reported in the stores are reported in local currency. Both Apple and Google convert revenue on the day it was earned, therefore it’s important we retain and apply the currency conversion on the day the sale/subscription was made.

We use [Open Exchange](https://openexchangerates.org/) for these conversions.

**How is Net Revenue Reported?**

**iTunes Revenue:**

* Gross Revenue: Apple calls these Sales. This is what the end-user pays.
* Net Revenue: Apple calls this “Proceeds.” This is the money you can expect to collect. Excludes any applicable sales taxes as well as Apple’s 30% rev share from the end-user price.

**Google Play Revenue:**

* Gross Revenue: Google calls this “Total Charge Amount and does include VAT & Sales taxes.
* Net Revenue: Excludes any applicable collected sales taxes as well as Google’s 30% rev share.
* Note: For subscriptions >1 year, Google charges a rev share of 15%. At the end of each month, AdLibertas reconciles the revenue from the monthly sales report and re-posts the previous month’s subscription revenue. Until this reconciliation, monthly earnings on subscriptions should be considered an estimate.

[Apple definitions](https://help.apple.com/app-store-connect/en.lproj/static.html)


# Adding access to Google Play

We now offer the ability to import app store revenue to the AdLibertas dashboard. This will give you a holistic view of your mobile app revenue performance.

**We simply need your Google Play Cloud Storage Bucket Name and authentication to collect your store data.**

[![](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2020/04/GooglePlay.png)](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2020/04/GooglePlay.png)

**To collect your bucket ID:**

1. Log in to the Google Play [dashboard.](https://play.google.com/apps/publish/)
2. On the left menu click **Download Reports** > **Financial**
3. On the right, click **Copy Cloud Storage URI**
4. **Paste only the numbers** into the Google Play Cloud Storage Bucket Name in the [AdLibertas dashboard.](https://dashboard.adlibertas.com/settings/credentials/new/google_play)

```
Note: The Cloud Storage Bucket Name will have the following format:gs://pubsite_prod_rev_123456789/earnings/In the example above, the Google Play Storage Bucket ID is pubsite_prod_rev_123456789
```

**5. Press Sign in with Google** in our dashboard to begin the OAuth process.

*You’ll need to have finance privileges to enable access via OAuth.*

<figure><img src="/files/HRnhSbceHHkC5fB2FIWi" alt=""><figcaption></figcaption></figure>


# Adding Sub User to App Store Connect

Importing Sales Data from the Apple App Store into AdLibertas

&#x20;                                             ![](/files/X8UetUuCxOcAmsOU0lTt)[<br>](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2020/04/apple-app-store.jpg)

We now offer the ability to import app store revenue to the AdLibertas dashboard. This will give you a holistic view of your mobile app revenue performance. To include this in your account, follow the steps below.

![](/files/XbM5f3sEmKVTg2qHMhv9)

**Creating a sub-user in App Store Connect**

*You’ll need to have admin privileges to add users*

**To create a sub-user:**

1. Log into your [App Store Connect](https://appstoreconnect.apple.com/)
2. Click on Users and Roles
3. Click the + button at the top of the page.
4. Set the First Name and Last Name fields to AdLibertas and Analyst
5. Set the email field to an email that isn’t your main email but one that you have access to.
6. Select the following permissions from the list: Finance.
7. Click Invite.
8. Accept the email invite.

To create an **app-specific password** for this user:

1. Sign in to your [Apple ID account page.](https://appstoreconnect.apple.com/)
2. In the Security section, click Generate Password below App-Specific Passwords.
3. Follow the steps on your screen.
4. &#x20;After you generate your app-specific password, enter or paste the email and password into the fields in [our dashboard](https://dashboard.adlibertas.com/settings/credentials/new/appstore).
5. *Apple’s documentation is available* [*<mark style="color:blue;">here.</mark>*](https://support.apple.com/en-us/HT204397)


# Getting the most from Ad Network Reports

**This article is for AdLibertas customers or Ad Networks receiving a daily report on buying behavior of a specific network.**&#x20;

On a daily basis, the Ad Network reports are sent to networks on an opt-in basis: **The network will only receive their buying positions in AdLibertas managed inventory.**

### What is an Ad Network Report?

In short: an opt-in daily report sent to ad networks on their buying positions on publisher inventory.

### Why do we send it?

In short, to help increase the throughput of demand and supply. For more on this [click here](https://docs.adlibertas.com/the-platform/dashboard-features/ad-network-reports).

### What is sent:

Contained in the report is the day’s status of each ad unit running in a particular waterfall or segment of inventory. We encourage ad networks to use this information to tailor or optimize buying positions. Keep in floors can be dynamic, so if networks change pricing to buy more efficiently, they can do so without waiting for an update or confirmation from publishers.

### How do I request a report or change delivery addresses?

Publishers can create network reports in [our reporting dashboard](https://dashboard.adlibertas.com/reports) networks can contact publishers or <help@adlibertas.com> to request, change or update delivery preferences.


# Analytics Connections


# Data Set Status

Status and details of your user level data pipeline.

![To see the default view of your data pipeline, simply click on the Data Set Status icon from in your dashboard.](/files/oI2kwYX1Fn18R7lXTCLL)

Data sources can vary in uptime and how they make data available. Your data pipeline can easily expand to pulling petabytes of information into your data lake. To help keep you updated on the current status of your data availability, we have a [<mark style="color:blue;">Data Set Status</mark> ](https://dashboard.adlibertas.com/data-set-status)page.

For more details on how your data pipeline, see "[<mark style="color:blue;">The AdLibertas Approach to Big Data</mark>](https://www.adlibertas.com/the-adlibertas-approach-to-big-data/)".

![](/files/0KZJFWUaw1c0Aq8kIAlG)

### Data Set Status Page Layout

**Data Source:** The name of your dataset, as defined by the technology vendor.

**Health:**&#x20;

* **Green:** Data exists over the last 4 days and bytes delivered for every day > 0.
* **Red:** Last 4 days have no data.
* **Yellow:** 1-3 days have 0 bytes of data.

**Last Run:** The date of the last data fetch attempt.

**Dates:** The number of bytes returned by the data vendor is displayed under each date for the last four days.

### Data Availability

To reduce cost, we recommend you (where possible) schedule data to be delivered/updated daily. By default, we collect yesterday's data. Most data sources have completed data available for the previous day starting at 9 AM PST.

### Advanced Data Reporting

For deeper insights to data collection, including historical volume for pricing and forecasting, you'll need to leverage your AdLiberats [<mark style="color:blue;">Business Analytics</mark>](/the-platform/business-analytics) to [<mark style="color:blue;">ask a custom question</mark>](/the-platform/business-analytics/asking-a-question)<mark style="color:blue;">.</mark>

![](/files/4p5ilgh7vnDLatXRiiKw)

The data table you'll need is named "Audience Reporting Metrics." From here you'll be able to report on data source status by date, volume, and other helpful metrics.

![](/files/QdAmeKx0IGihHhcIWuhT)


# Connect AdLibertas to Firebase

This article covers how to enable AdLibertas to collect and store Firebase analytics and AB testing data

![](https://www.adlibertas.com/wp-content/uploads/2021/06/iSFBst.png)

### Step 1: Link Google BigQuery to Firebase <a href="#h-step-1-link-google-bigquery-to-firebase" id="h-step-1-link-google-bigquery-to-firebase"></a>

Firebase by itself doesn’t allow access to individual events. To enable AdLibertas Audience Reporting to access your Firebase data you’ll need to first [link a Firebase project to BigQuery](https://support.google.com/firebase/answer/6318765?hl=en\&ref_topic=6317497) (google documentation)

{% hint style="info" %}
**Data Sampling on Spark: inaccuracies on the free plan**

Google BigQuery is available for all Firebase projects. **For Firebase projects that stay on the Spark plan, the raw event data exported to BigQuery is sampled and only represents \~10% of the actual events on the free plan.** To export all events you’ll need to upgrade to the [Blaze Plan.](https://firebase.google.com/docs/projects/billing/firebase-pricing-plans)
{% endhint %}

* You’ll need Firebase owner privileges to enable this feature
* Be sure to include advertising identifiers.
* We recommend daily exports, to [<mark style="color:blue;">minimize your costs</mark>](/data-integrations/analytics-connections/firebase-best-practices-keeping-google-bigquery-costs-down)<mark style="color:blue;">.</mark>

{% hint style="info" %}
Note: Today we only export Google Analytics, so you don’t need to enable Crashlytics / / etc. **But you will** want to export *Include advertising identifiers in export* for maximum user granularity.&#x20;

It takes up to 24 hours for the dataset to be created and for event collection to begin.
{% endhint %}

### Step 2: Add AdLibertas as a viewer to your Firebase Project <a href="#h-step-2-enable-adlibertas-access" id="h-step-2-enable-adlibertas-access"></a>

Next, you'll want to invite an AdLibertas-enabled Firebase user to your project(s). In addition to your data export, this will enable us to pull Experiment names directly from your AB tests running in Firebase.

Add <`yourcompanyname>@adlibertas.com` to your Firebase project with **Viewer** role.

![](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2020/06/firebase.png)

![](/files/aHpA0MNluMx0SOKB3He1)

{% hint style="info" %}
You’ll need to have owner privileges to add members to your Firebase account.
{% endhint %}

1.[ Sign in](https://console.firebase.google.com/) to Firebase.\
2\. Select the project associated with the app you want to share access\
3\. Click,<img src="https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2020/06/cog.png" alt="" data-size="line"> then select **Users and permissions.**\
4\. On the Permissions page, click **Add member.**\
5\. In the user dialog, enter [myCompanyName@adlibertas.com](mailto:myCompanyName@reporting.adlibertas.com)\
6\. Select **Viewer** as role.

Related: [Firebase Reporting Details](https://docs.adlibertas.com/data-integrations/analytics/setting-user-campaigns-in-firebase)


# Connecting AdLibertas to BigQuery

This article covers how to connect AdLibertas directly to Google BigQuery

*Note: If you’ve already* [*connected AdLibertas to Firebase*](https://docs.adlibertas.com/data-integrations/analytics/connecting-adlibertas-audience-reporting-to-firebase) *you don’t need to also connect your account to BigQuery. This option is for folks who only want to grant access to BigQuery or want to grant additional table access. It should be noted that without a Firebase user, AdLibertas cannot report by Firebase Experiment names.*

![](/files/URIJtbNCaCVFTtbZGD9V)

AdLibertas can connect to extract data from your Google Cloud / BigQuery account.

{% hint style="info" %}

{% endhint %}

Before starting ensure your AdLibertas account representative has created a Google account for your company. This will generally follow the naming convention \<companyName>@adlibertas.com.

**For each project you’d like to connect:**

1. Visit Google Cloud [IAM permissions page](https://console.cloud.google.com/iam-admin/iam)
2. Select the appropriate project in the top menu
3. Click ADD for a new user
4. Enter \<company-name>@adlibertas.com and
5. select “Big Query Data Viewer” (to view the data) and
6. add another role for “BigQuery Job User” (to extract the data)

That’s it! From here, we’ll add the appropriate keys to your account.


# Firebase Install Counts in Audience Reporting

TL;DR: The best way to measure installs with Firebase data is using the first\_touch\_timestamp user property.

Firebase Analytics itself does not directly report on installs but does capture the first time a user opens the app. This is a property called `user_first_touch_timestamp` and is set the first time a user initializes the Firebase Analytics SDK. At this point, a `first_open` event is fired and automatically collected.

However, the `first_open` event is a misnomer in Firebase. The event `first_open` is actually tracked each time a user installs, reinstalls, or updates the app, meaning a single unique user can have multiple `first_open` events. AdLibertas builds audiences with this in mind and uses the `user_first_touch_timestamp` property to build retention curves and calculate new user counts. The `user_first_touch_timestamp` is only set on the *first* `first_open` event and does not change as long as the user has the app installed. A few things to note when looking at an Audience:

* A user may download the app but never have an active session. This would show as an install event in the app store’s reporting or your MMP, but as it won’t have a corresponding,`first_open` won’t show in Audience Reporting.
* A user may download the app, and open it on a different calendar day. The timestamp of the install event and the `first_open` event will fall on different days.
* A user may have multiple `first_open` events if they uninstall, reinstall, or update the app.
* A user may download and fire a `first_open` event, but “bounce” meaning they did not fire an engagement event or stay long enough in the app to be counted as an active session. These users are not counted towards daily active user counts.
* A user may have multiple first\_touch\_timestamps, if they have re-installed. This can create confusing results where users have activity, prior to their first\_touch\_timestamp. To combat this, we recommend you exclude first\_touch\_timestamps that are outside of your install windows:

![](/files/98gqdxK4MUB8wIxMaKJu)

In Audience Reporting, we include an “Installs During Period %” metric to help you understand the percentage of users whose first touch timestamp occurs within the query’s date range.

* A low percentage of “Installs During Period %” means the majority of users are reinstalling the app during the query’s date range.
* A high percentage of “Installs During Period %” means the majority of users are installing the app for the first time.

Please refer to [Firebase’s documentation](https://support.google.com/firebase/answer/9234069?hl=en#:~:text=message_name%2C%20message_device_time%2C%20message_id-,first_open,\(app\),-the%20first%20time) on *first\_open* and other automatically collected events.


# Setting User Campaigns in Firebase

<br>

![Still haven’t connected Firebase? You can do so here.](https://www.adlibertas.com/wp-content/uploads/2021/06/iSFBst.png)

One of the most popular uses for LTV reporting is measuring the performance of user acquisition campaigns. In order to track individual campaigns, you must enable the Campaign attribute to be set on the user’s device. You can do this 2 ways: Via a campaign referral link or by a post-back from your MMP of choice.

Note: Firebase will automatically track campaigns from a variety of acquisition sources, as [<mark style="color:blue;">listed here.</mark>](https://firebase.google.com/products/analytics/partners/)

{% hint style="info" %}
For iOS v. 14.5+ Firebase will require a user's permissions through ATT to track them or access IDFA. [<mark style="color:blue;">Details</mark>](https://firebase.google.com/docs/ios/supporting-ios-14).
{% endhint %}

### **Setting Campaigns Via Referral Link / Deep link**

If you’re interested in adding a custom campaign source, you’ll need to execute 3 steps:

**1. Tag all referral links with UTM parameters**

To store custom traffic, you’ll need to have your incoming campaign traffic set with the proper UTMs. To set these you can use [<mark style="color:blue;">Google Play URL Builder</mark>](https://developers.google.com/analytics/devguides/collection/android/v4/campaigns#google-play-url-builder)<mark style="color:blue;">.</mark>

**2. Fetch UTMs from the deep link in your app**

Essentially, this process will capture the campaign referral link in your app.

**3. Set Parameters as Firebase User Property**

Below is an example on Android from a deep link:

![](https://d3rv1nmzvje89q.cloudfront.net/optimized_v5/2018/05/Untitled.png)

*Image courtesy of Tatvic*

More information on this strategy [<mark style="color:blue;">available here</mark>](https://medium.com/firebase-developers/firebase-traffic-source-attribution-guide-287d7de80d76)<mark style="color:blue;">.</mark>

{% hint style="info" %}
With iOS 14.5+ Apple requires permissions to track users for the purpose of advertising ([<mark style="color:blue;">documentation</mark>](https://developer.apple.com/documentation/apptrackingtransparency)). Google lists attribution for links as [<mark style="color:blue;">unvailable for conversion events.</mark>](https://firebase.google.com/docs/ios/supporting-ios-14#affected-firebase-products)
{% endhint %}

### **Setting Campaigns Via an MMP**

Quite simply you’ll accept the campaign ID & other parameters via the MMP via a post-back, or referral ID sent to the device. Once these are set to the user’s user property ([<mark style="color:blue;">iOS</mark> ](https://firebase.google.com/docs/analytics/user-properties?platform=ios)and [<mark style="color:blue;">Android</mark>](https://firebase.google.com/docs/analytics/user-properties?platform=android))– most often the “Source”– you’ll have access to the campaign ID in Firebase.

Below is an Android example of passing an AppsFlyer install event to the Firebase Campaign attribute.

![(Generously provided by one of our customers)](/files/ifmYsRqc3HA7QCkoM7zg)

The user property is sent with each event, so AdLibertas Audience Reporting will be able to report on campaigns once they’ve been set at the Firebase User Property, even if the user-property is set later in the app’s lifecycle.


# Why use revenue to determine Firebase AB test winners?

Combining ad revenue and accurate IAP revenue to your Firebase AB test helps you understand the actual revenue outcome of your tests.

![It’s not always easy to determine a winner by events or day-1 retention.](/files/x1wJy9fNFEATrPkzZ1K8)

### **Why we recommend you use revenue to determine the winner of your AB tests**

While Firebase is an exceptionally powerful tool, its test outputs are limited to a handful of event metrics, and these counts only give directional confidence in success. The AdLibertas platform combines Firebase Analytics with the actual ad impression, which means we can provide easy exploration of ongoing or completed tests, with a variety of metrics– including ARPU and LTV to better help quantify the test outcome.

![It’s easier to determine the winner of a test when you can see the actual revenue projections of the variants.](/files/new86JZ2XvDs46JJB6mm)

### **Linking Firebase AB Tests with Revenue**

While the concept of merging these datasets is straightforward, the difficulty comes in the details. This generally means creating a data pipeline to combine the data sources, choosing a storage technology (Google Cloud, Snowflake, Redshift), and analytics (Looker, Tableau, etc.). The full process often requires 6-12 months of R\&D alongside server costs of $30K+ depending on the size of your datasets.

[Read about our recommendations on how to build your own data platform.](https://www.adlibertas.com/mobile-data-architecture-and-data-pipeline/)

**We make this easy**

The AdLibertas platform simplifies your process by centralizing all of your revenue into a single location. Max allows app developers to send ad revenue callbacks, with the value of each impression, to the device. At this point, the event is relayed to Firebase to consolidate actual ad revenue in a single place. Working with this data, even in a consolidated format, can be very difficult. Our cost-effective platform skips any need for custom integrations, data engineering, or SQL writing, and our customers quickly connect with API keys to get up and running – often seeing same-day insights.

[More details on how AdLibertas works](https://docs.adlibertas.com/the-platform/how-it-works).

### **Examples of how revenue can be used to determine winners**

| ![](https://www.adlibertas.com/wp-content/uploads/2021/11/header-image.png)                                 | See a [walk-through example](https://www.adlibertas.com/firebase-ab-testing-with-ad-revenue-use-ltvs-to-determine-test-winners#example) of AB testing the length of a game level or [watch it on video.](https://youtu.be/5_de4vnfX28)                                                                                                               |
| ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://www.adlibertas.com/wp-content/uploads/2022/01/flipaclip-logo.png)                               | Read how VisualBlasters started testing giving away a feature for free and[ ended up increasing retention and revenue by 21%](https://www.adlibertas.com/removing-paywalls-increases-user-retention/). Then how they advanced from AB testing to a[ full-on live ops strategy.](https://www.adlibertas.com/guest-post-starting-a-live-ops-strategy/) |
| ![](https://www.adlibertas.com/wp-content/uploads/2021/10/Title-LI.png)                                     | Interested in learning how to properly set up AB tests? [We’ve created a guide for setting up an optimal framework](https://www.adlibertas.com/the-correct-framework-for-ab-testing-your-mobile-app/) for app developers.                                                                                                                            |
| <img src="https://www.adlibertas.com/wp-content/uploads/2021/06/RLG-IMage.jpg" alt="" data-size="original"> | Read how AdLibertas customer, Random Logic Games, was able to [drive user-LTV up 10%](https://www.adlibertas.com/case-study-data-driven-app-design/?utm_source=ctsg17\&utm_medium=email\&utm_campaign=ctg17-msg-1) by AB testing game mechanics.                                                                                                     |

### **Related articles:**

{% embed url="<https://www.adlibertas.com/why-should-you-link-ironsource-and-firebase/>" %}

{% embed url="<https://www.adlibertas.com/connecting-applovin-max-ad-revenue-with-firebase/>" %}


# Firebase Best Practices: keeping Google BigQuery Costs Down

We specifically designed AdLibertas to use the Google batch export feature — which is [currently free](https://cloud.google.com/bigquery/pricing#exporting_data).

**But your own data costs, if not properly managed, can become significant and will scale with time. So here are some tips to keep your Google BigQuery costs down.**

Related: [Connecting Firebase to AdLibertas Audience Reporting](https://docs.adlibertas.com/data-integrations/analytics/connecting-adlibertas-audience-reporting-to-firebase)

**Disable Data Streaming Inserts** – in December of 2020 Firebase started real-time streaming into BigQuery by default to enable up-to-date data. However, this will increase the price significantly and it may be unnecessary for most AdLibertas customers. To disable streaming events:

1. Login to your [Firebase Console](https://console.firebase.google.com/).
2. Go to project settings > integrations > Google Analytics Manage
3. Open the Linked Google Analytics account which should take you to the Google Analytics admin dashboard.
4. Click **BigQuery Linking** under the **Product Linking** section for the linked Google Analytics property
5. Select the Firebase project ID from the list.
6. Disable the **Streaming** checkbox and then click Save (button in the upper right).

**Setting Table Expiration** – Once the BigQuery integration is enabled for Firebase projects with a paid plan, Google creates a new dataset that will incur an ongoing storage cost. AdLibertas will import and save new data as it is made available.

We recommend setting a default table expiration time of at least 60 days to keep the storage costs down. This is so Google has enough time to finalize and send all event data to BigQuery before expiring the table. To enable a default table expiration time:

*Note, you’ll need to repeat these instructions for each Firebase project on a paid plan.*

1. Visit your [BigQuery console](https://console.cloud.google.com/bigquery)
2. In the Resources pane, select your dataset.
3. On the Details page, click the pencil icon next to Dataset info to edit the expiration.
4. In the Dataset info dialog, in the Default table expiration section, enter a value for the Number of days after table creation.
5. Click Save.

**Reducing Unnecessary Events** – Reducing the number of user events has an important factor in data-set size, overhead — and cost. Therefore we recommend periodically auditing your user events and disabling/ deleting the unnecessary or non-valuable user events.

For example, Google automatically logs an event “screen\_view” automatically for each screen a user sees. For apps with a high amount of screen views, this could be an unnecessary burden. [See this article](https://firebase.googleblog.com/2020/08/google-analytics-manual-screen-view.html) for manually tracking screen views.

**Note:** reducing events will impact the accuracy of other measurements. For example, the user’s time in the app is measured by adding up milliseconds between each event. Filtering or deleting events will reduce the time measured by these missing events.

**Related reading:**

{% embed url="<https://www.adlibertas.com/firebase-ab-testing-with-ad-revenue-use-ltvs-to-determine-test-winners>" %}


# Custom Integrations


# Sending Events via Webhooks to AdLibertas

&#x20;                                            ![](/files/OQvCT5VqjpTpHZ0VzDU6)&#x20;

AdLibertas [<mark style="color:blue;">Audience Reporting</mark>](https://www.adlibertas.com/audience-reporting/) allows you to send custom events to be imported, normalized, and stored in your data lake.

**To get started:** you’ll need a unique **webhook URL** and **auth header** from your [<mark style="color:blue;">AdLibertas account manager</mark>](mailto:sales@adlibertas.com)<mark style="color:blue;">.</mark>

### **Documentation:**

Please follow our [<mark style="color:blue;">webhook documentation</mark>](https://publicapi.adlibertas.com/swagger#!/webhooks/postV1WebhooksEventsPublicId) to start sending custom events to AdLibertas.

The default rate limit is 100 requests/30 seconds per IP address. If you need this increased, please contact [<mark style="color:blue;">your account manager</mark>](mailto:sales@adlibertas.com)<mark style="color:blue;">.</mark>

An example request [<mark style="color:blue;">can be found here</mark>](https://gist.github.com/adeubank/2dd721f41920b40e58f0ffe62ea32abf)<mark style="color:blue;">.</mark>


# Impression level tracking with Admob Mediation

Firebase and Admob have an automatic integration, but the revenue amount [is not exported to BigQuery.](https://stackoverflow.com/questions/51202704/can-i-get-ad-impression-and-ad-click-from-bigquery-linked-with-firebase-anal#comment91341767_51202704) Not being able to export this information means you won’t be able to export or utilize impression-level data outside of the Firebase dashboard. This article outlines our recommended way to implement impression-level tracking with Admob mediation.

You can gather the impression value by using the Admob paid event handler.

* [iOS](https://developers.google.com/admob/ios/early-access/paid-events) documentation
* [Android](https://developers.google.com/admob/android/early-access/paid-events) documentation
* [Unity](https://developers.google.com/admob/unity/paid-events) documentation

Implementing the paid event handler will allow you to capture the earned value of the ad impression and relay via Firebase analytics method [logEvent](https://firebase.google.com/docs/analytics/events).

This will be similar to how other mediation platforms recommend tracking impression-level ad revenue at the app level (e.g [ironSource ](https://docs.adlibertas.com/data-integrations/ad-impression-level-revenue-connections/ironsource-ad-revenue-measurement-integration)and [MAX](https://docs.adlibertas.com/data-integrations/ad-impression-level-revenue-connections/collecting-mopub-impression-level-data-as-a-firebase-event)). Be sure you include as much detail from the impression as possible (bare minimum should be value and currency).

We recommend you call the impression event something other than ad\_impression since it would generate duplicate counts in the Firebase dashboard.


# Connecting AdLibertas to BigQuery

<figure><img src="/files/0KKFoP39Y85hkUOzDLwS" alt=""><figcaption></figcaption></figure>

AdLibertas can connect to extract data from your Google Cloud / BigQuery account.

*Note: If you’ve already* [*connected AdLibertas to Firebase*](https://docs.adlibertas.com/data-integrations/analytics/connecting-adlibertas-audience-reporting-to-firebase) *you don’t need to also connect your account to BigQuery. This option is for folks who only want to grant access to BigQuery or want to grant additional table access. It should be noted that without a Firebase user, AdLibertas cannot report by Firebase Experiment names.*

Before starting ensure your AdLibertas account representative has created a Google account for your company. This will generally follow the naming convention \<companyName>@adlibertas.com.

**For each project you’d like to connect:**

1. Visit Google Cloud [IAM permissions page](https://console.cloud.google.com/iam-admin/iam)
2. Select the appropriate project in the top menu
3. Click ADD for a new user
4. Enter \<company-name>@adlibertas.com and
5. select “Big Query Data Viewer” (to view the data) and
6. add another role for “BigQuery Job User” (to extract the data)

That’s it! From here, we’ll add the appropriate keys to your account.


# Importing a custom data set

For most customers connecting data sources will be the primary source of data collection, for users with webhooks, we have a [custom webhook integration](https://docs.adlibertas.com/data-integrations/custom-integrations/sending-events-via-webhooks-to-adlibertas) as well.

However, in some use-cases, you may want to import a custom dataset. This article covers the schema and procedure for importing a custom dataset to AdLibertas.

**Uploading the data**

To get started all we need is data uploaded to an s3 bucket, please reach out to your account manager for AWS credentials.

All files will be nested underneath an s3 folder in this format:

```
s3://adlibertas-<<company_name>>/athena/production/singulari/v1/s3_events_123456/
```

[Here is an example of the output](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2022/02/project_idmy-demo-project-dc2a9_dataset_idanalytics_227417573_table_idevents_20210528_000000000000.json_.gz)

**Partitioning:**

If you have used hive or AWS glue/ athena before, our s3 paths should be familiar. Each upload should be categorized underneath a `dataset_id` and an `event_date`.

A dataset can be as large as you like and contain multiple apps. However, we ask that you separate uploads by an `event_date` (YYYY-MM-DD).

Breaking down the example file partitions, you can see the `dataset_id=com.awesomeapp` and `event_date=2021-05-28` where \*com.awesomeapp\* is the dataset ID and \*2021-05-28\* is the event date.

**Formatting:**

Each file uploaded is in a JSONL file gzipped format. Please see [this example file](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2022/02/project_idmy-demo-project-dc2a9_dataset_idanalytics_227417573_table_idevents_20210528_000000000000.json_.gz) for the schema of each JSON object (our schema is very close to the Firebase analytics schema). This is the schema used for the Hive data table. Do note most of the columns are not required, but to get the most out of the AdLibertas platform, we ask that you provide as much data as possible.

These columns should be provided at a minimum:

* `event_timestamp`
* `event_name` (ad\_impression,in\_app\_purchase,user\_engagement,etc)
* `event_params` (this can be a revenue event \[IAP or impression], engagment time in the app, user activity, etc)
* `user_id` (your unique user ID)
* `user_pseudo_id` (IDFV or Google App Set ID)
* `user_properties` (assigned user properties, often AB test assignments)
* `user_first_touch_timestamp` (Install timestamp)
* `device.vendor_id` (IDFV) and/or `device.advertising_id` (IDFA or GAID)
* `geo.country` (ISO2 country code)
* `app_info.id` (app bundle ID)
* `platform` (IOS or ANDROID)
* `traffic_source.name` (campaign name for tracking LTV & ROAS by campaign)

**Example SQL query**

Here is the comprehensive schema of the Hive table that the new dataset needs to follow.

```
CREATE EXTERNAL TABLE `s3_events_123456`(
  `event_timestamp` bigint COMMENT 'from deserializer', 
  `event_name` string COMMENT 'from deserializer', 
  `event_params` array<struct<key:string,value:struct<string_value:string,int_value:bigint,float_value:double,double_value:double>>> COMMENT 'from deserializer', 
  `event_previous_timestamp` bigint COMMENT 'from deserializer', 
  `event_value_in_usd` double COMMENT 'from deserializer', 
  `event_bundle_sequence_id` bigint COMMENT 'from deserializer', 
  `event_server_timestamp_offset` bigint COMMENT 'from deserializer', 
  `user_id` string COMMENT 'from deserializer', 
  `user_pseudo_id` string COMMENT 'from deserializer', 
  `user_properties` array<struct<key:string,value:struct<string_value:string,int_value:bigint,float_value:double,double_value:double,set_timestamp_micros:bigint>>> COMMENT 'from deserializer', 
  `user_first_touch_timestamp` bigint COMMENT 'from deserializer', 
  `user_ltv` struct<revenue:double,currency:string> COMMENT 'from deserializer', 
  `device` struct<category:string,mobile_brand_name:string,mobile_model_name:string,mobile_marketing_name:string,mobile_os_hardware_model:string,operating_system:string,operating_system_version:string,vendor_id:string,advertising_id:string,language:string,is_limited_ad_tracking:string,time_zone_offset_seconds:bigint,browser:string,browser_version:string,web_info:string> COMMENT 'from deserializer', 
  `geo` struct<continent:string,country:string,region:string,city:string,sub_continent:string,metro:string> COMMENT 'from deserializer', 
  `app_info` struct<id:string,version:string,install_store:string,firebase_app_id:string,install_source:string> COMMENT 'from deserializer', 
  `traffic_source` struct<name:string,medium:string,source:string> COMMENT 'from deserializer', 
  `stream_id` string COMMENT 'from deserializer', 
  `platform` string COMMENT 'from deserializer', 
  `event_dimensions` string COMMENT 'from deserializer', 
  `ecommerce` string COMMENT 'from deserializer', 
  `items` array<string> COMMENT 'from deserializer')
PARTITIONED BY ( 
  `dataset_id` string, 
  `event_date` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 
  'paths'='app_info,device,ecommerce,event_bundle_sequence_id,event_dimensions,event_name,event_params,event_previous_timestamp,event_server_timestamp_offset,event_timestamp,event_value_in_usd,geo,items,platform,stream_id,traffic_source,user_first_touch_timestamp,user_id,user_ltv,user_properties,user_pseudo_id') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://adlibertas-<<COMPANY>>/athena/production/singulari/v1/s3_events_123456'
```

```
```

```
```


# IAP Connections


# Tracking IAP & Subscriptions in Firebase and BigQuery

![](https://www.adlibertas.com/wp-content/uploads/2022/01/pre-built-tool.png)

### Tracking User-Level Events: <a href="#h-tracking-user-level-events" id="h-tracking-user-level-events"></a>

Most app developers who use Firebase rely on the default ***Automatically Generated Events*** for in-app purchase and subscription reporting. Unfortunately, it’s not always very accurate and there are cases where revenue is misreported or doesn’t match. We attempt to demystify how Google reports on in-app revenue.

By default, the product ID, product name, currency, and quantity are passed as parameters in an automatically generated `in_app_purchase` event. The revenue is reported is gross.

For **Android apps**, the Firebase account [must be connected with Google Play](https://support.google.com/firebase/answer/6392038).

Google documentation on the `in_app_purchase` event:

> **For iOS apps**, Firebase collects some events but doesn’t communicate or validate these purchases with the App Store– so events that are handled by the store will not be included. For IAP (Consumables) this generally is limited to trials or refunds. For subscriptions, this includes refunds and– critically– renewals. Therefore by default Firebase revenue may differ from values you see on the App Store.
>
> When a user completes an in-app purchase, including an initial subscription, that is processed by the App Store on iTunes or by Google Play. Google Analytics supports automatic subscription tracking on Android and iOS.
>
> This event is triggered only by versions of your app that include the Google Analytics for Firebase SDK. Note: **paid-app purchase revenue and refunds (iOS only) are not automatically tracked.**&#x20;
>
> Your reported revenue may differ from the values you see in the Google Play Developer Console. Events that are flagged as being invalid or as sandbox (test) are ignored. Only iOS events are flagged as sandbox. [Learn more](https://developer.android.com/google/play/billing/billing_testing) about testing Google Play billing.
>
> [*Google documentation*](https://support.google.com/firebase/answer/9234069?visit_id=637806567513711513-1338229260\&rd=1)

An important note for those app developers who are exporting this data to make use elsewhere: when exported to BigQuery, the price remains in the local currency. This is why we convert purchases from local currency to USD using [Open Exchange Rates](https://openexchangerates.org/) for that day and report all data in GMT.

Earlier in the same document, for the `app_store_subscription_renew` event, Google states:

> When a paid subscription is renewed. This event is set as a default conversion. Requires an initial subscription that was made on or after July 1, 2019.
>
> This event is not exported to BigQuery.
>
> [*Google documentation*](https://support.google.com/firebase/answer/9234069?visit_id=637806567513711513-1338229260\&rd=1#:~:text=price%2C%20value%2C%20currency%2C%20quantity-,app_store_,is%20not%20exported%20to%20BigQuery.,-product_id%2C%20price%2C%20value%2C%20currency)

Ostensibly this suggests Firebase does track Google Play events — and makes this available in Google Analytics but doesn’t enable this data to be exported to Google BigQuery. There are three workarounds: use a third-party receipt validation service like [RevenueCat](https://docs.adlibertas.com/data-integrations/iap/revenuecat-integration-webhooks), build your own validation service and share events using a [custom webhook,](https://docs.adlibertas.com/data-integrations/custom-integrations/sending-events-via-webhooks-to-adlibertas) or overload the in\_app\_purchase event with your own renewal event.

### Tracking Aggregate Earnings <a href="#h-tracking-aggregate-earnings" id="h-tracking-aggregate-earnings"></a>

If you’d like to simply track aggregate IAP and Subscription spend earnings, you should pull directly from the store APIs. Which we do in our Revenue Dashboards.

![Above is a demo version of our App Revenue Overview, that tracks all revenue earned from your app. Regardless of source.See more about connecting data sources](/files/XMg6opBl0qJrwaRQgz5D)


# RevenueCat Integration: WebHooks

[RevenueCat ](https://www.revenuecat.com/)is a product that helps track and manage subscription and IAP prices. AdLibertas supports a very simple integration to capture user subscriptions from their service.

### **1. Your Unique URL**

First, contact your [AdLibertas Account Manager](mailto:sales@adlibertas.com) for your **unique Webhook URL** and **Header Value**. You’ll need one per app title you want to combine into AdLibertas.

### **2. Add a Collaborator**

**Add an AdLibertas user as a “Read Only – Collaborator”** to each app you want AdLibertas to track, using the following email syntax:\<companyname>@adlibertas.com

![](/files/H5Yy7mkNFVyObHeJJiYk)

*From the* [*RevenueCat* ](https://app.revenuecat.com/overview)*dashboard, navigate to your App > Collaborators > click “+ New”*

### **3. Enter your URL into the RevenueCat Account**

Then **enter your unique Webhook URL into the** [RevenueCat ](https://app.revenuecat.com/login)[dashboard](https://app.revenuecat.com/overview).

From your [RevenueCat ](https://app.revenuecat.com/overview)dashboard *Navigate to Apps > Webhooks. Enter your unique Webhook URL & Header Value*.

That’s it!

RevenueCat will then relay subscription events to AdLibertas where we’ll capture and store them in your consolidated data lake.

[<br>](https://www.adlibertas.com/knowledge-base/revenuecat-setting-universal-identifiers/)


# RevenueCat: Setting Universal Identifiers

A common question we see with [RevenueCat ](https://www.revenuecat.com/)users is how to link back a universal ID to link the subscription or consumable event with an identifiable user on other data sources.

For both Android and iOS we recommend you send along with all IDs available to expand your options on aliasing with other data sources. This will require you to set some **Subscriber Attributes** in the app.

### Android <a href="#h-android" id="h-android"></a>

On Android, use the **collectDeviceIdentifiers** function to set the GAID as a subscriber attribute: [RevenueCat documentation.](https://sdk.revenuecat.com/android/purchases/com.revenuecat.purchases/-purchases/collect-device-identifiers.html)

### iOS <a href="#h-ios" id="h-ios"></a>

Use [**collectDeviceIdentifiers**](https://sdk.revenuecat.com/ios/Classes/RCPurchases.html#/c:objc\(cs\)RCPurchases\(im\)collectDeviceIdentifiers) to automatically set the device identifiers as subscriber attributes ([revenueCat Github](https://github.com/RevenueCat/purchases-ios/blob/3.10.7/Purchases/Public/RCPurchases.h#L531)).

Questions about [user-level policy adherence](https://docs.adlibertas.com/privacy-and-security/privacy-and-security-details)?


# MMP Connections


# Connecting Adjust

![](/files/0PKSPxF7zUeRh1NqBAkJ)

| <p>We have 2 Adjust integrations. Most customers will want both, the Callbacks give us install events from your app(s). The dashboard login allows us to pull the latest cost from the Adjust dashboard.</p><p></p> |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

### Callbacks

The AdLibertas [<mark style="color:blue;">Adjust integration</mark>](https://dashboard.adlibertas.com/onboarding/credentials/new/adjust) allows you to send callback events from your app to your AdLibertas account. This requires we give you a customized URL to enable real-time callbacks from the Adjust dashboard.

Contact your AdLibertas account representative for your customized URL.

Once you have your customized URL, follow the steps outlined in the [<mark style="color:blue;">Adjust documentation on setting up a single event callback</mark>](https://help.adjust.com/en/article/callbacks#single-event-callback)<mark style="color:blue;">.</mark>

![](https://images.ctfassets.net/5s247im0esyq/5Nu1h6Kfo0SV805ad40KFB/aeb4a4392d34ba2a0289a4f1d7fe1b46/update.png)

### Dashboard Login

To pull the most accurate revenue information, we also recommend you create an AdLibertas account with **"Reader" permissions.**&#x20;

{% hint style="info" %}
From Adjust: Readers have read-only access to the Statistics tab in your dashboard. Readers can view app data, but they cannot change the account in any way.
{% endhint %}

To add a new **Reader User**, follow these steps as outlined in [<mark style="color:blue;">Adjust's documentation</mark>](https://help.adjust.com/en/article/users)<mark style="color:blue;">.</mark>

* Login to your Adjust dashboard
* Select MENU to open the main navbar (on the left-hand side) > My Account.
* Select the Users tab.
* Select ADD USER.
* Enter the user's email address and role. Next, customize their feature access.
* Select CREATE.

Use the naming convention: \<companyname>@adlibertas.com for your user.


# Connecting AppsFlyer

<figure><img src="/files/k8wxtoEXkkTdSzr4X3wQ" alt=""><figcaption></figcaption></figure>

### **Overview:**

We connect to AppsFlyer’s APIs to pull campaign data, events, and (in some cases) ad impressions collected by the AppsFlyer SDK.

To obtain access we simply need you to share access to AppsFlyer data with AdLibertas in way of **creating an AdLibertas team member and sharing the v1.0 API Token.**

Add AdLibertas as a **Team Member** to AppsFlyer

**use the format \<customer-name>@adlibertas.com**

### **To Add A Team Member:**

(From [<mark style="color:blue;">AppsFlyer Documentation</mark>](https://support.appsflyer.com/hc/en-us/articles/207033806-Managing-team-members-roles-permissions-and-data-access))

**To add a team member:**

1. Click the email address on the right side of the header bar.&#x20;
2. Select **Team members** from the dropdown list.
3. On the **Team members** page, click **+Add team members**.
4. Complete the **Create a new member** section:
   * **\<customer-name>@adlibertas.com**
   * **Department**: Product
5. **Grant app permissions** \[Default: Access is enabled] Team members have access to all apps and all future apps in the account.
6. **Manage data permissions** \[Raw data access: Enable for AdLibertas access]
7. Click **Save**.

Notify your AdLibertas account manager.

### **Create/Access your API token**

Note: *Only the admin, can see and access the token page.*\
1\. Click the email address located on the right side of the header bar.\
2\. Select API tokens. (V1.0)\
3\. Copy the required token.

Notify your AdLIbertas account manager or [<mark style="color:blue;">connect credentials directly in your AdLibertas account.</mark>](https://dashboard.adlibertas.com/onboarding/credentials/new/appsflyer)


# Connecting Kochava

<figure><img src="/files/Wrt4tizY1wLW57UPAnau" alt=""><figcaption></figcaption></figure>

### **Overview:**

We connect with Kochava to collect campaign data, and where applicable events tracked by the Kochava SDK.

To connect with Kochava, simply add a user from the Kochava dashboard with the following naming convention:

**\<companyname>@adlibertas.com**

### **To add a user to Kochava:**

(Referenced from [Kochava Documentation](https://support.kochava.com/reference-information/users-overview/))

![](https://2la1xp2tiyea46tdsj1ai1pe-wpengine.netdna-ssl.com/wp-content/uploads/2021/05/kochava-user-433x1024.gif)

1. Log in to Kochava
2. Select the desired Account.
3. Select **Account Options > Users**.
4. Click **Add a User**.
5. Enter the **Username**.
6. Enter the user's **Name**.
7. Enter the user's **Email**.
8. Enter a **Password**.
9. Enter the same **Password** into the **Confirm** field.
10. Select any **Groups** the user will belong to.
11. Select the **Time Zone**.
12. Select the default **Language**:
13. Select the default **Currency**.
14. Click **Submit**.


# General


# Why does AdLibertas need credentials?

AdLibertas provides a variety of reporting, analytics, and optimization services to our clients. Depending on the AdLibertas product(s) your using, we may need you to connect our systems to data providers to gather the raw data.

### **User-Level Audience Reporting**

For most use-cases and service providers, there is no development work needed. We only collect credentials/API keys to access and consolidate data. For more information, [see our no-code integration in 3 steps.](https://docs.adlibertas.com/data-integrations/connecting-in-3-steps)

### **Ad Network Reporting Credentials**

Networks provide reporting data, in some cases, they offer a reporting API that allows you to only give API access. However, some accounts provide limited information through their API — or no API at all. In these cases, we will need access to the network’s dashboard. Some dashboards will allow you to create a user with limited access. We recommend this where possible.

For more information please see details on [Adding Reporting Credentials.](https://docs.adlibertas.com/data-integrations/ad-network-and-store-connections/adding-ad-network-credentials)

### Ad Optimization Credentials

The first step with any AdLibertas customer is to download and process the current configuration of your mediation platform. For this reason, we need an AdLibertas-specific user that will allow our systems to log in and consume the necessary information.

* We will not alter your account — or any serving configuration — in the credential-collection process.
* Each of these mediation platforms allows the creation of credentials that limits access to serving and reporting only. AdLibertas has no need for financial or payment access.

For more information see details on [<mark style="color:blue;">connecting demand sources.</mark>](https://docs.adlibertas.com/data-integrations/connecting-in-3-steps)


# Audience Reporting


# Why doesn't my daily active user count match Firebase?

Although [<mark style="color:blue;">Firebase documentation</mark>](https://support.google.com/firebase/answer/6317517#active-users\&zippy=%2Cin-this-article) claims they calculate daily active users by unique users who've fired a `user_engagment` event, some app developers see drift from the Firebase dashboard and unique `user_engagement`events in BigQuery. For this reason we support expanding the criteria for "active user" counts as [<mark style="color:blue;">explained in this article.</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/user-measurement-and-calculation-details#measuring-active-users)


# Why doesn’t my retention rate match?

#### See: [<mark style="color:blue;">**Measuring Active Users.**</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/user-measurement-and-calculation-details)


# Why aren't my install rates matching?

See <mark style="color:blue;">**Why aren't my**</mark> [<mark style="color:blue;">**install**</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/advanced-reporting-methods/user-measurement-and-calculation-details#retention-rate) <mark style="color:blue;">**rates matching?**</mark> under Measurement & Calculation Details.


# Why doesn't my relative user count match retention?

See: [<mark style="color:blue;">**Relative reports vs. Retention (Lifecycle) Reports**</mark>](/faqs/audience-reporting/why-doesnt-my-relative-user-count-match-retention)


# What is the probability projected LTV becomes actual LTV?

The answer is it really depends.

The[ <mark style="color:blue;">projection models</mark>](https://docs.adlibertas.com/the-platform/user-level-audience-reporting/forecasting) are statistical tools for you to analyze trends in your data and extrapolate future values based on those trends. The less complete your dataset is, the more likely that model will be incomplete or miss key days that impact the extrapolation.

Consider trying to estimate the weight of a child at its first birthday based on its weight over the first few days after being born. You can certainly extrapolate the data to estimate weight, but including additional days and weeks will likely provide better data set to extrapolate and estimate from.

See also: [<mark style="color:blue;">Measuring Confidence</mark>](/the-platform/user-level-audience-reporting/report-layout/measuring-confidence)

![A sample projection model.](/files/IEUN6b9FKvh6fGs2ahT5)


# Why doesn’t Firebase and AdLibertas revenue match?

There are a few possibilities why revenue doesn’t match your Firebase console:

### **Ad Revenue**

Google uses <mark style="color:blue;">“</mark>[<mark style="color:blue;">Admob-network estimated</mark>](https://support.google.com/firebase/answer/6317517?authuser=0#revenue\&zippy=%2Cin-this-article)<mark style="color:blue;">”</mark> revenue (only) for their ad revenue numbers. AdLibertas uses impression-level actual ad revenue from your ad networks.

### **In-App Purchase Revenue:**

Some revenue discrepancies might be due to time zones and currency exchange. AdLibertas reports on GMT and auto-converts on the day of purchase from local currency using [<mark style="color:blue;">Open Exchange Rates</mark>](https://openexchangerates.org/) to convert to USD.

### **Subscription Revenue:**

It should be noted that while Firebase auto-fires subscription renewals, [<mark style="color:blue;">they don’t export that data to BigQuery</mark>](https://support.google.com/firebase/answer/9234069?visit_id=637806567513711513-1338229260\&rd=1#:~:text=set%20to%20true.-,this%20event%20is%20not%20exported%20to%20bigquery.,-product_id%2C%20price%2C%20value)<mark style="color:blue;">.</mark> So if you have material renewals or refunds, those will not be represented in AdLibertas by default. Your choices are to integrate a subscription management tool like [<mark style="color:blue;">RevenueCat</mark>](https://docs.adlibertas.com/data-integrations/iap/revenuecat-integration-webhooks)<mark style="color:blue;">,</mark> fire a custom renewal event in Firebase, or [<mark style="color:blue;">send a custom webhook</mark>](https://docs.adlibertas.com/data-integrations/custom-integrations/sending-events-via-webhooks-to-adlibertas) to our servers.

To read more about how Firebase handles IAP & Subscription revenue, [<mark style="color:blue;">read this article.</mark>](https://docs.adlibertas.com/data-integrations/iap/tracking-iap-and-subscriptions-in-firebase-and-bigquery)


# Reporting


# What is “non\_mopub” revenue

In the event we find network revenue that cannot be mapped to MoPub-served revenue, we label this as “non\_mopub.”

If MoPub doesn’t have the ad unit in the UI, we don’t know how it associates with the Mopub configuration. In most cases, these are ad units that are served elsewhere or are directly hard-coded in the app.

Examples:

* You have an ad-unit serving in a (mobile) web application
* You have a hard-coded back-fill unit in the app
* The network revenue is being served through another mediator (not through MoPub)


# How do customers use AdLibertas?

Related: What is AdLibertas? :: Getting started with AdLibertas

AdLibertas provides tools to help track ad revenue in apps and handles full-service optimization for in-app ads. Our customers rely on us for a number of use-cases, some of the more popular we’ve outlined below:

#### Analyze user-revenue performance. <a href="#h-analyze-user-revenue-performance" id="h-analyze-user-revenue-performance"></a>

Our revolutionary Audience Reporting product allows app developers to define and measure the revenue performance of the user-group.

Watch a brief demo on how it works below:

#### Measure user-acquisition campaign performance <a href="#h-measure-user-acquisition-campaign-performance" id="h-measure-user-acquisition-campaign-performance"></a>

Fast, easy, and accurate predicted earnings for your UA campaigns. One-touch integration. Automated pLTV outputs, skip the hassle.

![](https://www.adlibertas.com/wp-content/uploads/2022/01/LTV-User-Zoom.png)

### **Consolidate & Unify all App Earnings** <a href="#h-consolidate-unify-all-app-earnings" id="h-consolidate-unify-all-app-earnings"></a>

We have over 100 API connections to automatically pull and normalize your in-app earnings– app purchases, subscriptions, and advertising– into a single place.

![See a demo on how it works](https://www.adlibertas.com/wp-content/uploads/2022/09/InputsToOutputs-v2.png)

### **Analyze your Revenue** & Answer Questions <a href="#h-analyze-your-revenue-answer-questions" id="h-analyze-your-revenue-answer-questions"></a>

We supply a rich set of analytics tools for your to-do deep dives on your data to determine new opportunities and discover problems.

[See more details on our website](https://www.adlibertas.com/products/#analytics)\
or\
a demo on [how it works](https://www.youtube.com/watch?v=8GIhPTlvtTU\&t=3s\&ab_channel=AdamLandis)

![](https://www.adlibertas.com/wp-content/uploads/2020/02/Component-3-%E2%80%93-1@2x-890x1024.png)

### Build Custom Dashboards <a href="#h-build-custom-dashboards" id="h-build-custom-dashboards"></a>

A lot of our customers want to build custom views of their data, so they can monitor or share custom views of ad traffic or earnings reports.

![See a demo on how it works.](https://www.adlibertas.com/wp-content/uploads/2022/01/customDash.png)

### **Earn more money from in-app advertising.** <a href="#h-earn-more-money-from-in-app-advertising" id="h-earn-more-money-from-in-app-advertising"></a>

* See how Taptalk i[ncreased earnings 75% with AdLibertas](https://www.adlibertas.com/case-study-social-app-tapatalk-increases-mobile-ad-revenue-by-75/).
* See how Narwhal for Reddit [doubled revenue in a week](https://www.adlibertas.com/narwal-doubles-revenue-in-a-week/).

### Learn the best place to set your price floors <a href="#h-learn-the-best-place-to-set-your-price-floors" id="h-learn-the-best-place-to-set-your-price-floors"></a>

Our powerful revenue distribution chart can help you set the right floors for your inventory. This one-of-a-kind visualization is very powerful tool for helping your ad strategy.

![](https://www.adlibertas.com/wp-content/uploads/2018/05/ChartImage.png)

You can see more about how the Revenue Distribution Chart works below:

{% embed url="<https://youtu.be/k_Is6dODF9k>" %}

<br>




---

[Next Page](/llms-full.txt/1)

