← All articles
September 18, 2026

Ad Monetization Metrics Explained: eCPM, Fill Rate and ARPDAU for Telegram Mini Apps

Ad revenue in a Telegram Mini App is the product of four numbers: how many people open the app, how many ads each of them sees, how often an ad request actually gets filled, and how much advertisers pay per thousand impressions. This guide defines each metric, gives its formula and shows what to watch in the publisher dashboard. GigaPub is an ad network and ad-mediation platform for Telegram Mini Apps, and these are the metrics we look at first when a publisher asks "why did my revenue change?"

Key takeaways

  • Daily revenue on its own tells you nothing — normalise it per user (ARPDAU) or per thousand impressions (eCPM) before comparing days, countries or ad networks.
  • eCPM = revenue ÷ impressions × 1000. Fill rate = filled requests ÷ ad requests. ARPDAU = ad revenue ÷ daily active users.
  • ARPDAU = impressions per DAU × eCPM ÷ 1000 — so there are exactly two levers: show more ads per user, or earn more per ad.
  • Most revenue drops are one of three things: a country-mix shift (eCPM), a fill problem (fewer impressions per user) or a DAU change. Grouping the dashboard by date, country and application tells you which.

Why is daily revenue a misleading metric?

Because it moves with your audience size. Revenue can grow while monetization is getting worse, simply because a promo brought more users, and it can fall on a quiet weekend while every user is earning you more than before. To judge monetization you need numbers that are independent of how many people showed up: revenue per user and revenue per impression.

What does the GigaPub publisher dashboard show?

Five columns — Impressions, Clicks, CTR, Profit and CPM — grouped by date, country or application, updated once per hour. Profit is your revenue for the selected period. CPM is calculated as profit ÷ impressions × 1000, which is exactly the eCPM defined below. Switch the grouping to country whenever a number moves: a country breakdown answers most "what happened?" questions without any further tooling.

What is eCPM and how is it calculated?

eCPM is the effective revenue per 1,000 ad impressions: eCPM = revenue ÷ impressions × 1000. It is the price your inventory actually fetched, averaged over every impression you served.

Two things drive it more than anything else:

  • Country mix. Advertisers pay different prices for different geos, so the same app with the same placements earns a different eCPM as its audience shifts between countries. An eCPM drop with flat impressions is usually a mix shift, not a "bad network".
  • Format mix. Rewarded video, where the user opts in and watches to the end, usually fetches a higher eCPM than an interstitial shown at a level break. See rewarded video vs interstitial for when to use each.

One warning: never compare ad networks by eCPM alone. A network that pays well but fills only a fraction of your requests leaves the rest of the moments empty. What matters is revenue per request, which is why ad mediation sends every impression to several demand sources instead of one.

What is fill rate and why does it matter?

Fill rate is the share of ad requests that end with an ad actually shown: fill rate = filled requests ÷ ad requests × 100%. Every unfilled request is a moment where the user asked for a bonus and got nothing — lost revenue and a small dent in trust.

In a Telegram Mini App a no-fill looks like this: the promise returned by window.showGiga() rejects, so your catch branch runs and no reward is granted. That also makes fill rate easy to measure on your side — count the calls and the rejections:

try {
  await window.showGiga()
  analytics.track('ad_filled')
  grantReward()
} catch (e) {
  analytics.track('ad_no_fill') // nothing could be shown
}

Fill rate is where a single ad network becomes a ceiling: it only has demand for some countries and some moments. A mediation layer with several networks and RTB bidders behind one call is the usual fix — the details are in how ad mediation works.

What are impressions per DAU and ARPDAU?

Impressions per DAU is the average number of ads one daily active user sees: impressions per DAU = impressions ÷ DAU. ARPDAU is average ad revenue per daily active user: ARPDAU = ad revenue ÷ DAU.

Put together, they give the one formula worth memorising:

ARPDAU = impressions per DAU × eCPM ÷ 1000.

With hypothetical numbers: if a user sees 2 ads per day and your eCPM is $4, ARPDAU is 2 × 4 ÷ 1000 = $0.008 per daily active user. Doubling either factor doubles ARPDAU — but the two levers cost different things. eCPM is mostly a demand question (geo, format, competition between networks). Impressions per DAU is a product question: placements, frequency, and how much the user tolerates.

How do you raise ad frequency without hurting retention?

Change one thing at a time and watch D1 and D7 retention of the cohort that received the change against a control cohort. If D1 falls, the extra impressions were borrowed from tomorrow's DAU, and ARPDAU will follow it down. Rewarded placements are the safe way to add frequency because the user chooses them; interstitials need caps.

Metrics cheat sheet

MetricFormulaWhat a change usually means
Impressionscount of ads shownup: more DAU or more frequency; down: fill problem or DAU drop
CTRclicks ÷ impressions × 100%a spike: accidental clicks or a badly placed close button; near zero: creatives not rendering
eCPMrevenue ÷ impressions × 1000country mix, format mix, competition among demand sources
Fill ratefilled requests ÷ ad requests × 100%demand availability for your geos; one network = a ceiling
Impressions per DAUimpressions ÷ DAUnumber of placements and frequency caps
ARPDAUad revenue ÷ DAUthe one number to track week over week

Most in-app video inventory is bought per impression, so CTR does not change your revenue directly. Treat it as a health signal, not a target.

A weekly monetization checklist

  1. eCPM by country — did the mix shift, or did one geo drop on its own?
  2. Impressions per DAU — did frequency creep up, or did a placement silently break?
  3. Fill rate — the ad_no_fill share from your own analytics.
  4. CTR anomalies — a spike or a collapse both mean a rendering or placement problem.
  5. D1 / D7 retention of any cohort that received a monetization change this week.

Ten minutes a week with these five lines catches almost every revenue surprise before it becomes a month-end one.

FAQ

What is a good eCPM for a Telegram Mini App? There is no single good eCPM: it depends on the countries your users come from and on the ad format. Rewarded video usually earns a higher eCPM than interstitial, and the same format pays differently in different countries. Compare your own eCPM by country over time instead of chasing a market average.

How is eCPM calculated? eCPM = revenue ÷ impressions × 1000 — the effective revenue per 1,000 ad impressions. The GigaPub dashboard shows it in the CPM column, calculated as profit ÷ impressions × 1000.

Why is my ad revenue down while impressions are flat? The drop is in eCPM: either the country mix shifted towards cheaper geos, or demand for your inventory weakened. Group the dashboard by country to see which.

How do I measure fill rate in my Telegram Mini App? Count how many times you call window.showGiga() and how many of those calls reject. Calls minus rejections, divided by calls, is your fill rate.

How often is the GigaPub statistics dashboard updated? Once per hour, with grouping by date, country or application.


Connect your app at giga.pub, follow the integration guide, and the dashboard starts filling these columns within an hour of the first impression.