[{"data":1,"prerenderedAt":599},["ShallowReactive",2],{"blog-/en/blog/monetization-metrics-ecpm-fill-rate-arpdau":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"author":11,"cover":12,"ogImage":12,"tags":13,"draft":6,"faq":19,"body":35,"_type":593,"_id":594,"_source":595,"_file":596,"_stem":597,"_extension":598},"/en/blog/monetization-metrics-ecpm-fill-rate-arpdau","blog",false,"","Ad Monetization Metrics Explained: eCPM, Fill Rate and ARPDAU for Telegram Mini Apps","eCPM, fill rate, impressions per DAU and ARPDAU explained with formulas — and what to watch in the GigaPub publisher dashboard of a Telegram Mini App.","2026-09-18","GigaPub Team","/og-image.png",[14,15,16,17,18],"telegram-mini-apps","ecpm","fill-rate","arpdau","analytics",[20,23,26,29,32],{"q":21,"a":22},"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 in the publisher dashboard instead of chasing a market average.",{"q":24,"a":25},"How is eCPM calculated?","eCPM = revenue ÷ impressions × 1000. It is the effective revenue per 1,000 ad impressions. The GigaPub publisher dashboard shows it in the CPM column, calculated as profit ÷ impressions × 1000.",{"q":27,"a":28},"Why is my ad revenue down while impressions are flat?","If impressions did not change, the drop is in eCPM: either the country mix of your audience shifted towards cheaper geos, or demand for your inventory weakened. Group the dashboard by country to see which one it is.",{"q":30,"a":31},"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. The promise rejects when nothing could be shown, so calls minus rejections divided by calls is your fill rate.",{"q":33,"a":34},"How often is the GigaPub statistics dashboard updated?","Once per hour. Impressions, clicks, CTR, profit and CPM can be grouped by date, country or application.",{"type":36,"children":37,"toc":581},"root",[38,46,52,61,86,93,98,104,109,115,120,125,157,178,184,189,211,223,235,241,246,251,256,261,267,272,278,419,424,430,490,495,501,510,519,528,544,553,557],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"ad-monetization-metrics-explained-ecpm-fill-rate-and-arpdau-for-telegram-mini-apps",[44],{"type":45,"value":8},"text",{"type":39,"tag":47,"props":48,"children":49},"p",{},[50],{"type":45,"value":51},"Ad revenue in a Telegram Mini App is the product of four numbers: how many people open the\napp, how many ads each of them sees, how often an ad request actually gets filled, and how\nmuch advertisers pay per thousand impressions. This guide defines each metric, gives its\nformula and shows what to watch in the publisher dashboard. GigaPub is an ad network and\nad-mediation platform for Telegram Mini Apps, and these are the metrics we look at first\nwhen a publisher asks \"why did my revenue change?\"",{"type":39,"tag":47,"props":53,"children":54},{},[55],{"type":39,"tag":56,"props":57,"children":58},"strong",{},[59],{"type":45,"value":60},"Key takeaways",{"type":39,"tag":62,"props":63,"children":64},"ul",{},[65,71,76,81],{"type":39,"tag":66,"props":67,"children":68},"li",{},[69],{"type":45,"value":70},"Daily revenue on its own tells you nothing — normalise it per user (ARPDAU) or per\nthousand impressions (eCPM) before comparing days, countries or ad networks.",{"type":39,"tag":66,"props":72,"children":73},{},[74],{"type":45,"value":75},"eCPM = revenue ÷ impressions × 1000. Fill rate = filled requests ÷ ad requests.\nARPDAU = ad revenue ÷ daily active users.",{"type":39,"tag":66,"props":77,"children":78},{},[79],{"type":45,"value":80},"ARPDAU = impressions per DAU × eCPM ÷ 1000 — so there are exactly two levers: show more\nads per user, or earn more per ad.",{"type":39,"tag":66,"props":82,"children":83},{},[84],{"type":45,"value":85},"Most revenue drops are one of three things: a country-mix shift (eCPM), a fill problem\n(fewer impressions per user) or a DAU change. Grouping the dashboard by date, country and\napplication tells you which.",{"type":39,"tag":87,"props":88,"children":90},"h2",{"id":89},"why-is-daily-revenue-a-misleading-metric",[91],{"type":45,"value":92},"Why is daily revenue a misleading metric?",{"type":39,"tag":47,"props":94,"children":95},{},[96],{"type":45,"value":97},"Because it moves with your audience size. Revenue can grow while monetization is getting\nworse, simply because a promo brought more users, and it can fall on a quiet weekend while\nevery user is earning you more than before. To judge monetization you need numbers that are\nindependent of how many people showed up: revenue per user and revenue per impression.",{"type":39,"tag":87,"props":99,"children":101},{"id":100},"what-does-the-gigapub-publisher-dashboard-show",[102],{"type":45,"value":103},"What does the GigaPub publisher dashboard show?",{"type":39,"tag":47,"props":105,"children":106},{},[107],{"type":45,"value":108},"Five columns — Impressions, Clicks, CTR, Profit and CPM — grouped by date, country or\napplication, updated once per hour. Profit is your revenue for the selected period. CPM is\ncalculated as profit ÷ impressions × 1000, which is exactly the eCPM defined below. Switch\nthe grouping to country whenever a number moves: a country breakdown answers most\n\"what happened?\" questions without any further tooling.",{"type":39,"tag":87,"props":110,"children":112},{"id":111},"what-is-ecpm-and-how-is-it-calculated",[113],{"type":45,"value":114},"What is eCPM and how is it calculated?",{"type":39,"tag":47,"props":116,"children":117},{},[118],{"type":45,"value":119},"eCPM is the effective revenue per 1,000 ad impressions: eCPM = revenue ÷ impressions × 1000.\nIt is the price your inventory actually fetched, averaged over every impression you served.",{"type":39,"tag":47,"props":121,"children":122},{},[123],{"type":45,"value":124},"Two things drive it more than anything else:",{"type":39,"tag":62,"props":126,"children":127},{},[128,138],{"type":39,"tag":66,"props":129,"children":130},{},[131,136],{"type":39,"tag":56,"props":132,"children":133},{},[134],{"type":45,"value":135},"Country mix.",{"type":45,"value":137}," Advertisers pay different prices for different geos, so the same app with\nthe same placements earns a different eCPM as its audience shifts between countries. An\neCPM drop with flat impressions is usually a mix shift, not a \"bad network\".",{"type":39,"tag":66,"props":139,"children":140},{},[141,146,148,155],{"type":39,"tag":56,"props":142,"children":143},{},[144],{"type":45,"value":145},"Format mix.",{"type":45,"value":147}," Rewarded video, where the user opts in and watches to the end, usually\nfetches a higher eCPM than an interstitial shown at a level break. See\n",{"type":39,"tag":149,"props":150,"children":152},"a",{"href":151},"/blog/rewarded-vs-interstitial-ads",[153],{"type":45,"value":154},"rewarded video vs interstitial",{"type":45,"value":156}," for when to use each.",{"type":39,"tag":47,"props":158,"children":159},{},[160,162,168,170,176],{"type":45,"value":161},"One warning: never compare ad networks by eCPM alone. A network that pays well but fills\nonly a fraction of your requests leaves the rest of the moments empty. What matters is\nrevenue per ",{"type":39,"tag":163,"props":164,"children":165},"em",{},[166],{"type":45,"value":167},"request",{"type":45,"value":169},", which is why ",{"type":39,"tag":149,"props":171,"children":173},{"href":172},"/blog/how-ad-mediation-works",[174],{"type":45,"value":175},"ad mediation",{"type":45,"value":177}," sends\nevery impression to several demand sources instead of one.",{"type":39,"tag":87,"props":179,"children":181},{"id":180},"what-is-fill-rate-and-why-does-it-matter",[182],{"type":45,"value":183},"What is fill rate and why does it matter?",{"type":39,"tag":47,"props":185,"children":186},{},[187],{"type":45,"value":188},"Fill rate is the share of ad requests that end with an ad actually shown:\nfill rate = filled requests ÷ ad requests × 100%. Every unfilled request is a moment where\nthe user asked for a bonus and got nothing — lost revenue and a small dent in trust.",{"type":39,"tag":47,"props":190,"children":191},{},[192,194,201,203,209],{"type":45,"value":193},"In a Telegram Mini App a no-fill looks like this: the promise returned by ",{"type":39,"tag":195,"props":196,"children":198},"code",{"className":197},[],[199],{"type":45,"value":200},"window.showGiga()",{"type":45,"value":202},"\nrejects, so your ",{"type":39,"tag":195,"props":204,"children":206},{"className":205},[],[207],{"type":45,"value":208},"catch",{"type":45,"value":210}," branch runs and no reward is granted. That also makes fill rate\neasy to measure on your side — count the calls and the rejections:",{"type":39,"tag":212,"props":213,"children":218},"pre",{"className":214,"code":216,"language":217,"meta":7},[215],"language-js","try {\n  await window.showGiga()\n  analytics.track('ad_filled')\n  grantReward()\n} catch (e) {\n  analytics.track('ad_no_fill') // nothing could be shown\n}\n","js",[219],{"type":39,"tag":195,"props":220,"children":221},{"__ignoreMap":7},[222],{"type":45,"value":216},{"type":39,"tag":47,"props":224,"children":225},{},[226,228,233],{"type":45,"value":227},"Fill rate is where a single ad network becomes a ceiling: it only has demand for some\ncountries and some moments. A mediation layer with several networks and RTB bidders behind\none call is the usual fix — the details are in\n",{"type":39,"tag":149,"props":229,"children":230},{"href":172},[231],{"type":45,"value":232},"how ad mediation works",{"type":45,"value":234},".",{"type":39,"tag":87,"props":236,"children":238},{"id":237},"what-are-impressions-per-dau-and-arpdau",[239],{"type":45,"value":240},"What are impressions per DAU and ARPDAU?",{"type":39,"tag":47,"props":242,"children":243},{},[244],{"type":45,"value":245},"Impressions per DAU is the average number of ads one daily active user sees:\nimpressions per DAU = impressions ÷ DAU. ARPDAU is average ad revenue per daily active\nuser: ARPDAU = ad revenue ÷ DAU.",{"type":39,"tag":47,"props":247,"children":248},{},[249],{"type":45,"value":250},"Put together, they give the one formula worth memorising:",{"type":39,"tag":47,"props":252,"children":253},{},[254],{"type":45,"value":255},"ARPDAU = impressions per DAU × eCPM ÷ 1000.",{"type":39,"tag":47,"props":257,"children":258},{},[259],{"type":45,"value":260},"With hypothetical numbers: if a user sees 2 ads per day and your eCPM is $4, ARPDAU is\n2 × 4 ÷ 1000 = $0.008 per daily active user. Doubling either factor doubles ARPDAU — but\nthe two levers cost different things. eCPM is mostly a demand question (geo, format,\ncompetition between networks). Impressions per DAU is a product question: placements,\nfrequency, and how much the user tolerates.",{"type":39,"tag":87,"props":262,"children":264},{"id":263},"how-do-you-raise-ad-frequency-without-hurting-retention",[265],{"type":45,"value":266},"How do you raise ad frequency without hurting retention?",{"type":39,"tag":47,"props":268,"children":269},{},[270],{"type":45,"value":271},"Change one thing at a time and watch D1 and D7 retention of the cohort that received the\nchange against a control cohort. If D1 falls, the extra impressions were borrowed from\ntomorrow's DAU, and ARPDAU will follow it down. Rewarded placements are the safe way to add\nfrequency because the user chooses them; interstitials need caps.",{"type":39,"tag":87,"props":273,"children":275},{"id":274},"metrics-cheat-sheet",[276],{"type":45,"value":277},"Metrics cheat sheet",{"type":39,"tag":279,"props":280,"children":281},"table",{},[282,306],{"type":39,"tag":283,"props":284,"children":285},"thead",{},[286],{"type":39,"tag":287,"props":288,"children":289},"tr",{},[290,296,301],{"type":39,"tag":291,"props":292,"children":293},"th",{},[294],{"type":45,"value":295},"Metric",{"type":39,"tag":291,"props":297,"children":298},{},[299],{"type":45,"value":300},"Formula",{"type":39,"tag":291,"props":302,"children":303},{},[304],{"type":45,"value":305},"What a change usually means",{"type":39,"tag":307,"props":308,"children":309},"tbody",{},[310,329,347,365,383,401],{"type":39,"tag":287,"props":311,"children":312},{},[313,319,324],{"type":39,"tag":314,"props":315,"children":316},"td",{},[317],{"type":45,"value":318},"Impressions",{"type":39,"tag":314,"props":320,"children":321},{},[322],{"type":45,"value":323},"count of ads shown",{"type":39,"tag":314,"props":325,"children":326},{},[327],{"type":45,"value":328},"up: more DAU or more frequency; down: fill problem or DAU drop",{"type":39,"tag":287,"props":330,"children":331},{},[332,337,342],{"type":39,"tag":314,"props":333,"children":334},{},[335],{"type":45,"value":336},"CTR",{"type":39,"tag":314,"props":338,"children":339},{},[340],{"type":45,"value":341},"clicks ÷ impressions × 100%",{"type":39,"tag":314,"props":343,"children":344},{},[345],{"type":45,"value":346},"a spike: accidental clicks or a badly placed close button; near zero: creatives not rendering",{"type":39,"tag":287,"props":348,"children":349},{},[350,355,360],{"type":39,"tag":314,"props":351,"children":352},{},[353],{"type":45,"value":354},"eCPM",{"type":39,"tag":314,"props":356,"children":357},{},[358],{"type":45,"value":359},"revenue ÷ impressions × 1000",{"type":39,"tag":314,"props":361,"children":362},{},[363],{"type":45,"value":364},"country mix, format mix, competition among demand sources",{"type":39,"tag":287,"props":366,"children":367},{},[368,373,378],{"type":39,"tag":314,"props":369,"children":370},{},[371],{"type":45,"value":372},"Fill rate",{"type":39,"tag":314,"props":374,"children":375},{},[376],{"type":45,"value":377},"filled requests ÷ ad requests × 100%",{"type":39,"tag":314,"props":379,"children":380},{},[381],{"type":45,"value":382},"demand availability for your geos; one network = a ceiling",{"type":39,"tag":287,"props":384,"children":385},{},[386,391,396],{"type":39,"tag":314,"props":387,"children":388},{},[389],{"type":45,"value":390},"Impressions per DAU",{"type":39,"tag":314,"props":392,"children":393},{},[394],{"type":45,"value":395},"impressions ÷ DAU",{"type":39,"tag":314,"props":397,"children":398},{},[399],{"type":45,"value":400},"number of placements and frequency caps",{"type":39,"tag":287,"props":402,"children":403},{},[404,409,414],{"type":39,"tag":314,"props":405,"children":406},{},[407],{"type":45,"value":408},"ARPDAU",{"type":39,"tag":314,"props":410,"children":411},{},[412],{"type":45,"value":413},"ad revenue ÷ DAU",{"type":39,"tag":314,"props":415,"children":416},{},[417],{"type":45,"value":418},"the one number to track week over week",{"type":39,"tag":47,"props":420,"children":421},{},[422],{"type":45,"value":423},"Most in-app video inventory is bought per impression, so CTR does not change your revenue\ndirectly. Treat it as a health signal, not a target.",{"type":39,"tag":87,"props":425,"children":427},{"id":426},"a-weekly-monetization-checklist",[428],{"type":45,"value":429},"A weekly monetization checklist",{"type":39,"tag":431,"props":432,"children":433},"ol",{},[434,444,453,470,480],{"type":39,"tag":66,"props":435,"children":436},{},[437,442],{"type":39,"tag":56,"props":438,"children":439},{},[440],{"type":45,"value":441},"eCPM by country",{"type":45,"value":443}," — did the mix shift, or did one geo drop on its own?",{"type":39,"tag":66,"props":445,"children":446},{},[447,451],{"type":39,"tag":56,"props":448,"children":449},{},[450],{"type":45,"value":390},{"type":45,"value":452}," — did frequency creep up, or did a placement silently break?",{"type":39,"tag":66,"props":454,"children":455},{},[456,460,462,468],{"type":39,"tag":56,"props":457,"children":458},{},[459],{"type":45,"value":372},{"type":45,"value":461}," — the ",{"type":39,"tag":195,"props":463,"children":465},{"className":464},[],[466],{"type":45,"value":467},"ad_no_fill",{"type":45,"value":469}," share from your own analytics.",{"type":39,"tag":66,"props":471,"children":472},{},[473,478],{"type":39,"tag":56,"props":474,"children":475},{},[476],{"type":45,"value":477},"CTR anomalies",{"type":45,"value":479}," — a spike or a collapse both mean a rendering or placement problem.",{"type":39,"tag":66,"props":481,"children":482},{},[483,488],{"type":39,"tag":56,"props":484,"children":485},{},[486],{"type":45,"value":487},"D1 / D7 retention",{"type":45,"value":489}," of any cohort that received a monetization change this week.",{"type":39,"tag":47,"props":491,"children":492},{},[493],{"type":45,"value":494},"Ten minutes a week with these five lines catches almost every revenue surprise before it\nbecomes a month-end one.",{"type":39,"tag":87,"props":496,"children":498},{"id":497},"faq",[499],{"type":45,"value":500},"FAQ",{"type":39,"tag":47,"props":502,"children":503},{},[504,508],{"type":39,"tag":56,"props":505,"children":506},{},[507],{"type":45,"value":21},{"type":45,"value":509},"\nThere is no single good eCPM: it depends on the countries your users come from and on the\nad format. Rewarded video usually earns a higher eCPM than interstitial, and the same format\npays differently in different countries. Compare your own eCPM by country over time instead\nof chasing a market average.",{"type":39,"tag":47,"props":511,"children":512},{},[513,517],{"type":39,"tag":56,"props":514,"children":515},{},[516],{"type":45,"value":24},{"type":45,"value":518},"\neCPM = revenue ÷ impressions × 1000 — the effective revenue per 1,000 ad impressions. The\nGigaPub dashboard shows it in the CPM column, calculated as profit ÷ impressions × 1000.",{"type":39,"tag":47,"props":520,"children":521},{},[522,526],{"type":39,"tag":56,"props":523,"children":524},{},[525],{"type":45,"value":27},{"type":45,"value":527},"\nThe drop is in eCPM: either the country mix shifted towards cheaper geos, or demand for\nyour inventory weakened. Group the dashboard by country to see which.",{"type":39,"tag":47,"props":529,"children":530},{},[531,535,537,542],{"type":39,"tag":56,"props":532,"children":533},{},[534],{"type":45,"value":30},{"type":45,"value":536},"\nCount how many times you call ",{"type":39,"tag":195,"props":538,"children":540},{"className":539},[],[541],{"type":45,"value":200},{"type":45,"value":543}," and how many of those calls reject.\nCalls minus rejections, divided by calls, is your fill rate.",{"type":39,"tag":47,"props":545,"children":546},{},[547,551],{"type":39,"tag":56,"props":548,"children":549},{},[550],{"type":45,"value":33},{"type":45,"value":552},"\nOnce per hour, with grouping by date, country or application.",{"type":39,"tag":554,"props":555,"children":556},"hr",{},[],{"type":39,"tag":47,"props":558,"children":559},{},[560,562,570,572,579],{"type":45,"value":561},"Connect your app at ",{"type":39,"tag":149,"props":563,"children":567},{"href":564,"rel":565},"https://giga.pub",[566],"nofollow",[568],{"type":45,"value":569},"giga.pub",{"type":45,"value":571},", follow the\n",{"type":39,"tag":149,"props":573,"children":576},{"href":574,"rel":575},"https://docs.giga.pub/integration-guide.html",[566],[577],{"type":45,"value":578},"integration guide",{"type":45,"value":580},", and the dashboard starts\nfilling these columns within an hour of the first impression.",{"title":7,"searchDepth":582,"depth":582,"links":583},2,[584,585,586,587,588,589,590,591,592],{"id":89,"depth":582,"text":92},{"id":100,"depth":582,"text":103},{"id":111,"depth":582,"text":114},{"id":180,"depth":582,"text":183},{"id":237,"depth":582,"text":240},{"id":263,"depth":582,"text":266},{"id":274,"depth":582,"text":277},{"id":426,"depth":582,"text":429},{"id":497,"depth":582,"text":500},"markdown","content:en:blog:monetization-metrics-ecpm-fill-rate-arpdau.md","content","en/blog/monetization-metrics-ecpm-fill-rate-arpdau.md","en/blog/monetization-metrics-ecpm-fill-rate-arpdau","md",1790073279593]