> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appeeky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Metrics

> Definitions of every number on the Appeeky Analytics dashboard, with periods, filters, breakdowns, funnel, retention and LTV

This page defines every number on the Analytics dashboard. The same numbers come back from the [Analytics API](https://docs.appeeky.com/docs/analytics-api.md).

***

## Periods and Time Zones

Every view takes a `range`:

| Range | Period | Chart buckets |
| - | - | - |
| `today` | The app's local day so far | Hourly |
| `7d` | The last 7 local days, including today so far | Daily |
| `30d` | The last 30 local days, including today so far | Daily |

Days and hours follow the **app's time zone**, an IANA name such as `Europe/Istanbul`. It is `UTC` until you change it in the app's Analytics settings (or with `PATCH /v1/analytics/apps/:appId/settings`). Changing it moves the day boundaries of every view, including past days.

### Previous-period comparison

Each KPI shows its value for the previous period and the relative change.

* The previous period has the same length and ends where the current one starts.
* It is compared over the **same elapsed time**. "Today" until 14:00 is compared with yesterday until 14:00, not with all of yesterday. For `7d`, the 7 days before are compared up to the same time of day.
* `change` is `(value - previous) / |previous|`, so `0.12` means +12%. It is empty when the previous value is 0 or missing.

***

## KPIs

| KPI | Definition |
| - | - |
| **Installs** | New installs first seen in the period. An install is first seen when the SDK first sends from it. |
| **Active users** | Installs with any app activity in the period: any SDK event, including screens, sessions and custom events. Sale events from RevenueCat do not count as activity. |
| **Revenue** | USD revenue that happened in the period: purchases, trial conversions, renewals and ad revenue, minus refunds. Without filters, this includes [unattributed sales](https://docs.appeeky.com/docs/analytics-revenue.md#unattributed-sales). |
| **Install → paid** | Share of the period's installs that made a purchase or converted a trial by the end of the period. Renewals and ad revenue do not make an install a payer. |
| **Revenue per user** | Revenue divided by active users. |
| **Avg. session** | Average time in the foreground per session, in seconds. Each time the app goes to the background, the SDK reports the time since it came to the foreground; a session's time is the sum of those. |
| **Online users** | Installs with app activity in the last 5 minutes. Not compared with a previous period. |

Revenue is counted when it happens, while installs and install → paid are counted for installs first seen in the period. A purchase today from an install made last month adds to today's revenue but not to today's install → paid conversion.

***

## Filters

Click a row in any breakdown to filter the whole dashboard by it. With the API, add `filter=<dimension>:<value>`.

| Dimension | Matches |
| - | - |
| `source` | `apple_search_ads`, `smart_link`, `campaign_link`, `play_referrer`, `organic` |
| `campaign` | The install's campaign |
| `keyword` | The Apple Search Ads keyword id |
| `country` | Two-letter country code |
| `device` | Device model |
| `version` | App version |

* Filters are repeatable, up to 4. Each filter narrows the results further.
* `~none` matches installs with no value, for example `filter=campaign:~none`.
* Filters apply to installs. Every metric is then counted only for installs that match.

> [!WARNING]
>
> With any filter, revenue only counts customers **linked to a matching install**. Unattributed sales (no linked install) drop out, so filtered revenue can add up to less than unfiltered revenue.

***

## Breakdowns

Each breakdown is a ranked table of up to 50 rows, with a count and the revenue linked to each row.

| Dimension | Count | Revenue |
| - | - | - |
| `source` | Installs first seen in the period | Revenue in the period from installs with that source |
| `campaign` | Installs first seen in the period | Revenue in the period from installs with that campaign |
| `keyword` | Installs first seen in the period (Apple Search Ads installs only) | Revenue in the period from installs with that keyword |
| `country` | Active users in the period | Revenue in the period from installs in that country |
| `device` | Active users in the period | Revenue in the period from installs on that device model |
| `version` | Active users in the period | Revenue in the period from installs on that app version |
| `screen` | Users who saw the screen in the period | Revenue in the period from purchases made after the user first saw the screen |
| `entry` | Sessions that started on the screen | None |
| `exit` | Sessions that ended on the screen | None |

* Revenue on a row uses the dimension of the install that paid, so a purchase this week from an install made last month shows on that install's source and campaign.
* Sales with no linked install show on an empty row ("Unattributed" for source).
* `country`, `device` and `version` are values stored on the install. The country comes from the network location of the device's request when available, otherwise from the device locale.

### Screen revenue counts a sale more than once

A purchase counts toward **every** screen the buyer saw before it. If a buyer saw Onboarding, Paywall and Settings before paying $10, each of those rows gets $10. Screen revenue therefore adds up to more than total revenue. Use it to compare screens, not to sum revenue.

***

## Funnel

An ordered funnel for installs first seen in the period.

* A step is an event name (`first_open`, `trial_started`, `onboarding_completed`) or a screen view written as `screen:<name>` (`screen:Paywall`).
* A saved funnel has 2 to 6 steps. A funnel passed with `steps` can have up to 6.
* Each step must happen at or after the time the install first reached the previous step. Steps can happen after the period ends.
* Each step shows the number of installs that reached it, the share of the first step, and the share of the previous step.

The default funnel is:

```
first_open → screen:Paywall → trial_started → trial_converted
```

Save your own steps in the app's Analytics settings (`funnel`), or pass `steps=a,screen:B,c` to the API to try a funnel without saving it. `GET …/event-names` lists the event names and screens seen in the last 30 days, to pick steps from.

`trial_started` and `trial_converted` come from RevenueCat, so they only count for installs linked with `identify`.

***

## Retention

Cohorts of installs by the day or week they were first seen, and the share of each cohort that was active in each later day or week.

| Range | Cohorts |
| - | - |
| `today` | None |
| `7d` | Daily: one cohort per local day |
| `30d` | Weekly: 7-day blocks counted from the start of the period. The last block can be shorter. |

* Period 0 is the cohort's own day or week. Period 1 is the next day or week, and so on.
* A user is active in a period when the install sent any app event in it. Sale events do not count.
* Periods that have not started yet are empty.
* The **last period is partial**: it is still running, so its values will grow until it ends.

***

## LTV

Revenue within 1, 7 and 30 days of install (D1, D7, D30) for installs first seen in the period, grouped by `all`, `source`, `campaign`, `keyword`, `country`, `device` or `version`.

| Field | Description |
| - | - |
| `installs` | Installs first seen in the period |
| `payers` | Those installs that made a purchase or converted a trial |
| `revenueUsd` | All revenue from those installs so far |
| `windows[].matureInstalls` | Installs old enough to have a complete window |
| `windows[].revenueUsd` | Revenue those mature installs made within that many days of install |
| `windows[].perInstall` | LTV for the window: revenue per mature install |

> [!NOTE]
>
> **Maturity rule:** a window only counts installs that are at least that many days old. An install from 3 days ago counts for D1 but not yet for D7 or D30. When no install is old enough, the window's LTV is empty instead of a misleading low number.

***

## Related Docs

* [Attribution](https://docs.appeeky.com/docs/analytics-attribution.md)
* [Revenue](https://docs.appeeky.com/docs/analytics-revenue.md)
* [ROAS](https://docs.appeeky.com/docs/analytics-roas.md)
* [Analytics API](https://docs.appeeky.com/docs/analytics-api.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.