commit eb392ec47ef3683294588019877429500b748356 Author: SHAREit Date: Mon Aug 31 14:19:00 2026 +0800 Publish top10 KA FFR report diff --git a/accounts.json b/accounts.json new file mode 100644 index 0000000..57d3c82 --- /dev/null +++ b/accounts.json @@ -0,0 +1,139 @@ +{ + "_说明": "top10-ffr 报表配置。每个 account 生成一个 tab;campaigns 为该 KA 下的投放单元。", + "_口径": "各日报表的 Daily Spend / Spend / Cost 均为客户口径消耗,即我们的 Revenue;Cost 取 Sands,GP = Revenue − Cost。", + "target_spreadsheet_id": "1Bnt94y2ri3ISxF07tbzfVOLKfxaHAo__swNhmSOdccw", + "target_gid": 0, + "sheets": { + "shared": "1KaNOwaZ3DqjTXRK8XhF1OGF9qUmOh0NLXOgxVrh14h0", + "king": "1zb6UR9d9j5Xn3ip6LcWEAsXBjLuPhaaQCXXI7C0gyg0", + "performdm": "1qSke7u_PlzUJc23C6Vg-AUfXEDATGiq4nOc8CBbiv-E", + "caliente": "15Ljge41IyTzsYWlsHHwwEYdnV_7lrfgfu_I9t200his", + "amazon": "1mfrPyev9L9KQ7U6ai6yxtposZgHNSZSB9HydZ2zmVIM" + }, + "accounts": [ + { + "key": "king", + "name": "King", + "target_ka": "king", + "layout": "king", + "pkgs": ["com.king.candycrushsaga", "com.king.candycrushsodasaga"], + "sources": { + "sheet": "king", + "client_gid": 0, + "cost_gid": 1217689915 + } + }, + { + "key": "amazon", + "name": "Amazon", + "target_ka": "amazon", + "layout": "mixed", + "pkgs": ["com.amazon.mShop.android.shopping"], + "sources": { + "report_url": "https://ops.roasbloom.site/zouyun-amazon-za-daily-report/data.json", + "revenue_field": "payable_spend", + "install_field": "install", + "campaign_name": "Amazon ZA" + }, + "campaigns": [ + {"name": "Amazon MENA", "sheet": "amazon", "gid": 917373507, "pkg": "com.amazon.mShop.android.shopping", + "header_row": 11, "date_col": "B", + "install_col": ["D", "Q", "AD", "AT"], + "revenue_col": ["I", "V", "AI", "AY"], + "_备注": "MENA 多地区并排,Install 与美元 Revenue 均为多列求和"}, + {"name": "Amazon BR", "sheet": "amazon", "gid": 117168695, "pkg": "com.amazon.mShop.android.shopping", + "header_row": 10, "install_col": "D", "revenue_col": "R", + "_备注": "M 列为 spend R$(巴西币),R 列为美元,取 R"} + ] + }, + { + "key": "ae", + "name": "AE", + "target_ka": "ae", + "layout": "campaign_sheets", + "pkgs": ["ru.aliexpress.buyer"], + "campaigns": [ + {"name": "AliExpress", "sheet": "shared", "gid": 650573903, "pkg": "ru.aliexpress.buyer"} + ] + }, + { + "key": "vk", + "name": "VK", + "target_ka": "vk", + "layout": "campaign_sheets", + "pkgs": ["ru.mail.cloud", "com.vk.love", "com.uma.musicvk"], + "campaigns": [ + {"name": "MailCloud", "sheet": "shared", "gid": 1961807506, "pkg": "ru.mail.cloud"}, + {"name": "VkLove", "sheet": "shared", "gid": 1938899781, "pkg": "com.vk.love"}, + {"name": "VKmusic", "sheet": "shared", "gid": 1326460173, "pkg": "com.uma.musicvk"} + ] + }, + { + "key": "yandex", + "name": "Yandex", + "target_ka": "yandex", + "layout": "campaign_sheets", + "pkgs": ["com.yandex.bank", "com.yandex.lavka", "ru.yandex.weatherplugin"], + "campaigns": [ + {"name": "YandexBank", "sheet": "shared", "gid": 67392848, "pkg": "com.yandex.bank"}, + {"name": "YandexLavka", "sheet": "shared", "gid": 626239503, "pkg": "com.yandex.lavka"}, + {"name": "YandexWeather", "sheet": "shared", "gid": 1451085739, "pkg": "ru.yandex.weatherplugin"} + ] + }, + { + "key": "performdm", + "name": "PerformDM", + "target_ka": "performdm", + "layout": "campaign_sheets", + "pkgs": ["za.co.nedbank", "capitecbank.co.za"], + "campaigns": [ + {"name": "Nedbank", "sheet": "performdm", "gid": 1621007637, "pkg": "za.co.nedbank", + "header_row": 2, "revenue_col": "M", "_备注": "Spends USD 在 M 列"}, + {"name": "CapitecFuneral", "sheet": "performdm", "gid": 1865192528, "pkg": "capitecbank.co.za", + "header_row": 2, "date_col": "A", "install_col": "D", "revenue_col": "J", + "metric_label": "Impression", + "_备注": "CPM 单:D 列为 Impression(非 Install),J 列为 cost"} + ] + }, + { + "key": "caliente", + "name": "Caliente", + "target_ka": "caliente", + "layout": "campaign_sheets", + "pkgs": ["sports.caliente.mx.calientedeportes"], + "campaigns": [ + {"name": "Caliente", "sheet": "caliente", "gid": 68602299, "pkg": "sports.caliente.mx.calientedeportes", + "header_row": 14, "date_col": "B", "install_col": "E", "revenue_col": "L", + "_备注": "日期为 B 列 Dt;A 列是年月不可用;Revenue 取 L 列 cost"} + ] + }, + { + "key": "joom", + "name": "Joom", + "target_ka": "joom", + "layout": "campaign_sheets", + "pkgs": ["tech.jm"], + "campaigns": [ + {"name": "Joom", "sheet": "shared", "gid": 1582829999, "pkg": "tech.jm"} + ] + }, + { + "key": "xbet", + "name": "1xbet", + "target_ka": "xbet", + "layout": "placeholder", + "note": "本月几乎无数据,暂不接入", + "pkgs": [], + "campaigns": [] + }, + { + "key": "casasbahia", + "name": "Casas Bahia", + "target_ka": "cacas bahia", + "layout": "placeholder", + "note": "暂不接入", + "pkgs": [], + "campaigns": [] + } + ] +} diff --git a/data.json b/data.json new file mode 100644 index 0000000..b81ec79 --- /dev/null +++ b/data.json @@ -0,0 +1,5525 @@ +{ + "title": "Top10 KA · 当月 FFR 与 GP", + "generated_at": "2026-08-31T14:17:59+08:00", + "timezone": "Asia/Shanghai", + "period": { + "start": "2026-08-01", + "end": "2026-08-30", + "days": 30, + "month_days": 31, + "time_progress_percent": 96.77 + }, + "sands": { + "fetched_at": "2026-08-27T15:20:08+08:00", + "source_url": "https://sands.hellay.net/#/newSanReports2", + "by_pkg": { + "com.amazon.mShop.android.shopping": 69674.2724, + "com.king.candycrushsaga": 34539.5205, + "ru.aliexpress.buyer": 30934.4199, + "com.yandex.bank": 20607.7902, + "com.kwai.bulldog": 17520.2603, + "ru.yandex.music": 15821.7703, + "ru.ozon.app.android": 15505.6402, + "ru.kinopoisk": 15395.2806, + "com.king.candycrushsodasaga": 14803.2499, + "com.edadeal.android": 14470.1203, + "sports.caliente.mx.calientedeportes": 13767.0799, + "asrtum.ent.domovyata": 9106.6199, + "story.tv.drama.reels": 8948.0703, + "com.fxpro.direct.application": 7419.5101, + "ru.mail.cloud": 7071.56, + "com.krom.android": 6758.07, + "ru.yandex.weatherplugin": 6005.8499, + "tech.jm": 5796.11, + "com.yandex.lavka": 5716.9501, + "com.master.learn.ai": 5220.38, + "in.startv.hotstar.dplus": 3717.03, + "com.vk.love": 3232.9601, + "ru.mobstudio.andgalaxy": 2905.92, + "com.peramoo": 2603.81, + "com.wings.bene.ph": 2441.7701, + "com.gloriajeans.mobile": 1976.73, + "com.appteka.lapy": 1891.09, + "com.betsoftware.hwpremiumwrapped": 1762.3001, + "com.nagwa.classes": 1717.61, + "prod6932870983.app_ckbg3pkrh1.com": 1605.33, + "ru.rosfines.android": 1586.78, + "com.esprit.rpg.lttlefirykng": 1535.4, + "com.policybazaar": 1529.27, + "ph.com.bdo.pay": 1430.85, + "com.uma.musicvk": 1415.3, + "com.esprit.rpg.cntrctfft": 1308.3, + "com.disneyplus.ph": 1288.74, + "com.notissimus.allinstruments.android": 1077.55, + "com.intellihealth.truemeds": 886.2, + "com.seatech.bluebird": 820.8, + "com.tencent.ig": 718.003, + "com.foreigncurrency.internationalfxeye": 635.13, + "com.winaxis.arionplayandroidapp": 583.54, + "com.lendingplate": 529.66, + "com.moneydd.goodmoney": 517.74, + "ru.uteka.app": 516.72, + "com.mukuru.customer.android": 475.8, + "com.reels.cash.video.app": 447.36, + "ph.com.peso.fast.loan.android": 396.4, + "com.finaccel.android": 379.2, + "com.cash.credit.marikaya": 363.41, + "com.mvp789.com2": 360.22, + "astrum.ent.m2alyona": 360.0, + "com.optimuslinkcatalog.freepdfmaker": 335.84, + "com.mocamoca": 314.05, + "com.pinjamango": 311.4, + "com.yogame.com": 285.5, + "com.ic.ek77_85": 276.9, + "com.pesokuwento.lending.olp.ph": 250.42, + "mx.prestamos.urgente.dinero.online.peso.viva.credito.rapido": 218.3, + "com.fxroyale.app": 202.4, + "com.lucky.fishing.ph": 198.82, + "com.espritgames.rpg.dragon.egg": 186.52, + "com.quick.loan.center.vay.mau": 183.0, + "prod3968651864.app_as777bdtf6.com": 117.06, + "com.rkgg.com2": 82.97, + "com.astro.shop": 77.2, + "com.fgrsdakiufvgds.triunjvbggew": 71.27, + "com.alibaba.aliexpresshd": 70.4, + "com.pinjoy.game.app": 42.85, + "com.hwsj.club": 40.9, + "com.loan.cash.easy.paisaghur": 36.24, + "com.kubi.kucoin": 34.35, + "com.apptool.track.tallyup": 32.37, + "com.trademaxaustralia.tmgm": 30.0, + "pk.pakrummy25.app": 25.34, + "uiendfskjn.nzqifdgdpld.bxcvuwhe": 22.0, + "com.mintq.gocash": 18.0, + "com.iqoption": 17.92, + "com.ravi36.castr5": 17.25, + "com.nextbillion.groww": 14.21, + "com.whizdm.moneyview.loans": 13.75, + "hb.xinxinxr.vip": 13.3, + "com.espritgames.rpg.chsrgn": 11.0, + "prod0151334412.app_m6myrh1.com": 9.29, + "pk.pakrummy24.app": 7.5, + "com.id3hot128.ntla71": 3.3, + "com.lalamove.global.driver.sea": 3.3, + "com.clipcd.clipgo": 3.1, + "com.playmate.playzone": 3.0, + "com.jar.app": 2.88, + "org.telegram.messenger.web": 2.1, + "com.dearmart.app": 1.9, + "in.upstox.app": 1.2, + "com.lk9898.com": 0.9, + "com.unacademyapp": 0.78, + "com.money.credit.pilot.fin.app": 0.75, + "com.remi62.app7": 0.6, + "com.id6javo88.ntla59": 0.5, + "com.levelinfinite.sgameGlobal": 0.5 + }, + "total_cost": 371692.5781 + }, + "totals": { + "installs": 1082314.0, + "impressions": 663033.0, + "revenue": 675232.93, + "cost": 213565.0629, + "target_revenue": 836050.0, + "target_gp": 595439.0, + "gp": 461667.8671, + "gp_rate": 68.37, + "completion": { + "revenue": 80.76, + "gp": 77.53 + } + }, + "accounts": [ + { + "key": "king", + "name": "King", + "layout": "king", + "note": "", + "pkgs": [ + "com.king.candycrushsaga", + "com.king.candycrushsodasaga" + ], + "data_cutoff": null, + "actual": { + "installs": 254017.0, + "impressions": 0, + "revenue": 104065.69, + "cost": 49342.7704, + "gp": 54722.9196, + "gp_rate": 52.58 + }, + "target": { + "revenue": 329376.0, + "gp": 210801.0, + "gp_rate": 64.0 + }, + "completion": { + "revenue": 31.59, + "gp": 25.96 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 28092.0, + "impressions": 0, + "revenue": 29462.8, + "ecpi": 1.0488, + "ecpm": null + }, + { + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 71817.0, + "impressions": 0, + "revenue": 21545.1, + "ecpi": 0.3, + "ecpm": null + }, + { + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 70284.0, + "impressions": 0, + "revenue": 21085.2, + "ecpi": 0.3, + "ecpm": null + }, + { + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 14321.0, + "impressions": 0, + "revenue": 13224.95, + "ecpi": 0.9235, + "ecpm": null + }, + { + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 12178.0, + "impressions": 0, + "revenue": 9162.11, + "ecpi": 0.7523, + "ecpm": null + }, + { + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 52429.0, + "impressions": 0, + "revenue": 8753.21, + "ecpi": 0.167, + "ecpm": null + }, + { + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 4896.0, + "impressions": 0, + "revenue": 832.32, + "ecpi": 0.17, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2313.0, + "impressions": 0, + "revenue": 693.9 + }, + { + "date": "2026-08-02", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2058.0, + "impressions": 0, + "revenue": 617.4 + }, + { + "date": "2026-08-03", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1602.0, + "impressions": 0, + "revenue": 480.6 + }, + { + "date": "2026-08-04", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1840.0, + "impressions": 0, + "revenue": 552.0 + }, + { + "date": "2026-08-05", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1674.0, + "impressions": 0, + "revenue": 502.2 + }, + { + "date": "2026-08-06", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1717.0, + "impressions": 0, + "revenue": 515.1 + }, + { + "date": "2026-08-07", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1883.0, + "impressions": 0, + "revenue": 564.9 + }, + { + "date": "2026-08-08", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1959.0, + "impressions": 0, + "revenue": 587.7 + }, + { + "date": "2026-08-09", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1796.0, + "impressions": 0, + "revenue": 538.8 + }, + { + "date": "2026-08-10", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1983.0, + "impressions": 0, + "revenue": 594.9 + }, + { + "date": "2026-08-11", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2079.0, + "impressions": 0, + "revenue": 623.7 + }, + { + "date": "2026-08-12", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2048.0, + "impressions": 0, + "revenue": 614.4 + }, + { + "date": "2026-08-13", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2275.0, + "impressions": 0, + "revenue": 682.5 + }, + { + "date": "2026-08-14", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2585.0, + "impressions": 0, + "revenue": 775.5 + }, + { + "date": "2026-08-15", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2828.0, + "impressions": 0, + "revenue": 848.4 + }, + { + "date": "2026-08-16", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2573.0, + "impressions": 0, + "revenue": 771.9 + }, + { + "date": "2026-08-17", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2497.0, + "impressions": 0, + "revenue": 749.1 + }, + { + "date": "2026-08-18", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2451.0, + "impressions": 0, + "revenue": 735.3 + }, + { + "date": "2026-08-19", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2284.0, + "impressions": 0, + "revenue": 685.2 + }, + { + "date": "2026-08-20", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2661.0, + "impressions": 0, + "revenue": 798.3 + }, + { + "date": "2026-08-21", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2670.0, + "impressions": 0, + "revenue": 801.0 + }, + { + "date": "2026-08-22", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2906.0, + "impressions": 0, + "revenue": 871.8 + }, + { + "date": "2026-08-23", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2841.0, + "impressions": 0, + "revenue": 852.3 + }, + { + "date": "2026-08-24", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2388.0, + "impressions": 0, + "revenue": 716.4 + }, + { + "date": "2026-08-25", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2734.0, + "impressions": 0, + "revenue": 820.2 + }, + { + "date": "2026-08-26", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2477.0, + "impressions": 0, + "revenue": 743.1 + }, + { + "date": "2026-08-27", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2616.0, + "impressions": 0, + "revenue": 784.8 + }, + { + "date": "2026-08-28", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2697.0, + "impressions": 0, + "revenue": 809.1 + }, + { + "date": "2026-08-29", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2911.0, + "impressions": 0, + "revenue": 873.3 + }, + { + "date": "2026-08-30", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2938.0, + "impressions": 0, + "revenue": 881.4 + }, + { + "date": "2026-08-01", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 762.0, + "impressions": 0, + "revenue": 838.2 + }, + { + "date": "2026-08-02", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 799.0, + "impressions": 0, + "revenue": 878.9 + }, + { + "date": "2026-08-03", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 736.0, + "impressions": 0, + "revenue": 809.6 + }, + { + "date": "2026-08-04", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 851.0, + "impressions": 0, + "revenue": 936.1 + }, + { + "date": "2026-08-05", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 953.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-06", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 945.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-07", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 982.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-08", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 986.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-09", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 979.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-10", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 934.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-11", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 899.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-12", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 909.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-13", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 990.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-14", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 966.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-15", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 976.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-16", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 999.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-17", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 926.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-18", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 954.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-19", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 1000.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-20", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 917.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-21", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 953.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-22", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 941.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-23", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 952.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-24", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 913.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-25", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 939.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-26", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 909.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-27", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 937.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-28", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 993.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-29", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 1028.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-30", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 1064.0, + "impressions": 0, + "revenue": 1000.0 + }, + { + "date": "2026-08-01", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2138.0, + "impressions": 0, + "revenue": 641.4 + }, + { + "date": "2026-08-02", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1939.0, + "impressions": 0, + "revenue": 581.7 + }, + { + "date": "2026-08-03", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1424.0, + "impressions": 0, + "revenue": 427.2 + }, + { + "date": "2026-08-04", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2013.0, + "impressions": 0, + "revenue": 603.9 + }, + { + "date": "2026-08-05", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2024.0, + "impressions": 0, + "revenue": 607.2 + }, + { + "date": "2026-08-06", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2042.0, + "impressions": 0, + "revenue": 612.6 + }, + { + "date": "2026-08-07", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2216.0, + "impressions": 0, + "revenue": 664.8 + }, + { + "date": "2026-08-08", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2304.0, + "impressions": 0, + "revenue": 691.2 + }, + { + "date": "2026-08-09", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2042.0, + "impressions": 0, + "revenue": 612.6 + }, + { + "date": "2026-08-10", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2405.0, + "impressions": 0, + "revenue": 721.5 + }, + { + "date": "2026-08-11", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2253.0, + "impressions": 0, + "revenue": 675.9 + }, + { + "date": "2026-08-12", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2236.0, + "impressions": 0, + "revenue": 670.8 + }, + { + "date": "2026-08-13", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 1728.0, + "impressions": 0, + "revenue": 518.4 + }, + { + "date": "2026-08-14", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2401.0, + "impressions": 0, + "revenue": 720.3 + }, + { + "date": "2026-08-15", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2423.0, + "impressions": 0, + "revenue": 726.9 + }, + { + "date": "2026-08-16", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2192.0, + "impressions": 0, + "revenue": 657.6 + }, + { + "date": "2026-08-17", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2413.0, + "impressions": 0, + "revenue": 723.9 + }, + { + "date": "2026-08-18", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2535.0, + "impressions": 0, + "revenue": 760.5 + }, + { + "date": "2026-08-19", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2450.0, + "impressions": 0, + "revenue": 735.0 + }, + { + "date": "2026-08-20", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2838.0, + "impressions": 0, + "revenue": 851.4 + }, + { + "date": "2026-08-21", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2647.0, + "impressions": 0, + "revenue": 794.1 + }, + { + "date": "2026-08-22", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2861.0, + "impressions": 0, + "revenue": 858.3 + }, + { + "date": "2026-08-23", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2733.0, + "impressions": 0, + "revenue": 819.9 + }, + { + "date": "2026-08-24", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2145.0, + "impressions": 0, + "revenue": 643.5 + }, + { + "date": "2026-08-25", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2598.0, + "impressions": 0, + "revenue": 779.4 + }, + { + "date": "2026-08-26", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2944.0, + "impressions": 0, + "revenue": 883.2 + }, + { + "date": "2026-08-27", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2797.0, + "impressions": 0, + "revenue": 839.1 + }, + { + "date": "2026-08-28", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2915.0, + "impressions": 0, + "revenue": 874.5 + }, + { + "date": "2026-08-29", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 3318.0, + "impressions": 0, + "revenue": 995.4 + }, + { + "date": "2026-08-30", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2843.0, + "impressions": 0, + "revenue": 852.9 + }, + { + "date": "2026-08-01", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 753.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-02", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 834.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-03", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 790.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-04", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 861.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-05", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 796.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-06", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 820.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-07", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 754.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-08", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 818.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-09", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 838.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-10", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 904.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-11", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 678.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-12", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 734.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-13", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 801.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-14", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 721.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-15", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 894.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-16", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 960.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-17", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 952.0, + "impressions": 0, + "revenue": 750.0 + }, + { + "date": "2026-08-18", + "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 413.0, + "impressions": 0, + "revenue": 474.95 + }, + { + "date": "2026-08-01", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 377.0, + "impressions": 0, + "revenue": 252.59 + }, + { + "date": "2026-08-02", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 406.0, + "impressions": 0, + "revenue": 272.02 + }, + { + "date": "2026-08-03", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 335.0, + "impressions": 0, + "revenue": 224.45 + }, + { + "date": "2026-08-04", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 378.0, + "impressions": 0, + "revenue": 264.6 + }, + { + "date": "2026-08-05", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 387.0, + "impressions": 0, + "revenue": 270.9 + }, + { + "date": "2026-08-06", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 440.0, + "impressions": 0, + "revenue": 308.0 + }, + { + "date": "2026-08-07", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 427.0, + "impressions": 0, + "revenue": 311.71 + }, + { + "date": "2026-08-08", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 386.0, + "impressions": 0, + "revenue": 289.5 + }, + { + "date": "2026-08-09", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 415.0, + "impressions": 0, + "revenue": 302.95 + }, + { + "date": "2026-08-10", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 407.0, + "impressions": 0, + "revenue": 297.11 + }, + { + "date": "2026-08-11", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 401.0, + "impressions": 0, + "revenue": 292.73 + }, + { + "date": "2026-08-12", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 408.0, + "impressions": 0, + "revenue": 297.84 + }, + { + "date": "2026-08-13", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 422.0, + "impressions": 0, + "revenue": 308.06 + }, + { + "date": "2026-08-14", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 370.0, + "impressions": 0, + "revenue": 270.1 + }, + { + "date": "2026-08-15", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 392.0, + "impressions": 0, + "revenue": 286.16 + }, + { + "date": "2026-08-16", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 417.0, + "impressions": 0, + "revenue": 312.75 + }, + { + "date": "2026-08-17", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 383.0, + "impressions": 0, + "revenue": 279.59 + }, + { + "date": "2026-08-18", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 411.0, + "impressions": 0, + "revenue": 308.25 + }, + { + "date": "2026-08-19", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 429.0, + "impressions": 0, + "revenue": 343.2 + }, + { + "date": "2026-08-20", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 434.0, + "impressions": 0, + "revenue": 347.2 + }, + { + "date": "2026-08-21", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 416.0, + "impressions": 0, + "revenue": 332.8 + }, + { + "date": "2026-08-22", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 429.0, + "impressions": 0, + "revenue": 343.2 + }, + { + "date": "2026-08-23", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 423.0, + "impressions": 0, + "revenue": 338.4 + }, + { + "date": "2026-08-24", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 365.0, + "impressions": 0, + "revenue": 292.0 + }, + { + "date": "2026-08-25", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 369.0, + "impressions": 0, + "revenue": 295.2 + }, + { + "date": "2026-08-26", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 418.0, + "impressions": 0, + "revenue": 334.4 + }, + { + "date": "2026-08-27", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 415.0, + "impressions": 0, + "revenue": 332.0 + }, + { + "date": "2026-08-28", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 434.0, + "impressions": 0, + "revenue": 347.2 + }, + { + "date": "2026-08-29", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 443.0, + "impressions": 0, + "revenue": 354.4 + }, + { + "date": "2026-08-30", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 441.0, + "impressions": 0, + "revenue": 352.8 + }, + { + "date": "2026-08-01", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 200.0, + "impressions": 0, + "revenue": 34.0 + }, + { + "date": "2026-08-02", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 223.0, + "impressions": 0, + "revenue": 37.91 + }, + { + "date": "2026-08-03", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 178.0, + "impressions": 0, + "revenue": 30.26 + }, + { + "date": "2026-08-04", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 175.0, + "impressions": 0, + "revenue": 29.75 + }, + { + "date": "2026-08-05", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 216.0, + "impressions": 0, + "revenue": 36.72 + }, + { + "date": "2026-08-06", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 226.0, + "impressions": 0, + "revenue": 38.42 + }, + { + "date": "2026-08-07", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 151.0, + "impressions": 0, + "revenue": 25.67 + }, + { + "date": "2026-08-08", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 189.0, + "impressions": 0, + "revenue": 32.13 + }, + { + "date": "2026-08-09", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 245.0, + "impressions": 0, + "revenue": 41.65 + }, + { + "date": "2026-08-10", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 210.0, + "impressions": 0, + "revenue": 35.7 + }, + { + "date": "2026-08-11", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 144.0, + "impressions": 0, + "revenue": 24.48 + }, + { + "date": "2026-08-12", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 194.0, + "impressions": 0, + "revenue": 32.98 + }, + { + "date": "2026-08-13", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 203.0, + "impressions": 0, + "revenue": 34.51 + }, + { + "date": "2026-08-14", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 139.0, + "impressions": 0, + "revenue": 23.63 + }, + { + "date": "2026-08-15", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 186.0, + "impressions": 0, + "revenue": 31.62 + }, + { + "date": "2026-08-16", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 209.0, + "impressions": 0, + "revenue": 35.53 + }, + { + "date": "2026-08-17", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 157.0, + "impressions": 0, + "revenue": 26.69 + }, + { + "date": "2026-08-18", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 99.0, + "impressions": 0, + "revenue": 16.83 + }, + { + "date": "2026-08-19", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 136.0, + "impressions": 0, + "revenue": 23.12 + }, + { + "date": "2026-08-20", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 150.0, + "impressions": 0, + "revenue": 25.5 + }, + { + "date": "2026-08-21", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 153.0, + "impressions": 0, + "revenue": 26.01 + }, + { + "date": "2026-08-22", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 167.0, + "impressions": 0, + "revenue": 28.39 + }, + { + "date": "2026-08-23", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 205.0, + "impressions": 0, + "revenue": 34.85 + }, + { + "date": "2026-08-24", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 82.0, + "impressions": 0, + "revenue": 13.94 + }, + { + "date": "2026-08-25", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 71.0, + "impressions": 0, + "revenue": 12.07 + }, + { + "date": "2026-08-26", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 86.0, + "impressions": 0, + "revenue": 14.62 + }, + { + "date": "2026-08-27", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 105.0, + "impressions": 0, + "revenue": 17.85 + }, + { + "date": "2026-08-28", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 91.0, + "impressions": 0, + "revenue": 15.47 + }, + { + "date": "2026-08-29", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 168.0, + "impressions": 0, + "revenue": 28.56 + }, + { + "date": "2026-08-30", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 138.0, + "impressions": 0, + "revenue": 23.46 + }, + { + "date": "2026-08-01", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1726.0, + "impressions": 0, + "revenue": 293.42 + }, + { + "date": "2026-08-02", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1988.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-03", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1543.0, + "impressions": 0, + "revenue": 262.31 + }, + { + "date": "2026-08-04", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1643.0, + "impressions": 0, + "revenue": 279.31 + }, + { + "date": "2026-08-05", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1840.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-06", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1785.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-07", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1514.0, + "impressions": 0, + "revenue": 257.38 + }, + { + "date": "2026-08-08", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1658.0, + "impressions": 0, + "revenue": 281.86 + }, + { + "date": "2026-08-09", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1969.0, + "impressions": 0, + "revenue": 334.73 + }, + { + "date": "2026-08-10", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1697.0, + "impressions": 0, + "revenue": 288.49 + }, + { + "date": "2026-08-11", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1479.0, + "impressions": 0, + "revenue": 251.43 + }, + { + "date": "2026-08-12", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1800.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-13", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1788.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-14", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1624.0, + "impressions": 0, + "revenue": 276.08 + }, + { + "date": "2026-08-15", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1729.0, + "impressions": 0, + "revenue": 293.93 + }, + { + "date": "2026-08-16", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1903.0, + "impressions": 0, + "revenue": 323.51 + }, + { + "date": "2026-08-17", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1696.0, + "impressions": 0, + "revenue": 288.32 + }, + { + "date": "2026-08-18", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1616.0, + "impressions": 0, + "revenue": 274.72 + }, + { + "date": "2026-08-19", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1800.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-20", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1852.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-21", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1693.0, + "impressions": 0, + "revenue": 287.81 + }, + { + "date": "2026-08-22", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1759.0, + "impressions": 0, + "revenue": 299.03 + }, + { + "date": "2026-08-23", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1944.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-24", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1776.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-25", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1607.0, + "impressions": 0, + "revenue": 273.19 + }, + { + "date": "2026-08-26", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1730.0, + "impressions": 0, + "revenue": 294.1 + }, + { + "date": "2026-08-27", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1767.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-28", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1727.0, + "impressions": 0, + "revenue": 293.59 + }, + { + "date": "2026-08-29", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1845.0, + "impressions": 0, + "revenue": 300.0 + }, + { + "date": "2026-08-30", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1931.0, + "impressions": 0, + "revenue": 300.0 + } + ] + }, + { + "key": "amazon", + "name": "Amazon", + "layout": "mixed", + "note": "", + "pkgs": [ + "com.amazon.mShop.android.shopping" + ], + "data_cutoff": "2026-08-23", + "actual": { + "installs": 350757.0, + "impressions": 0, + "revenue": 278415.27, + "cost": 69674.2724, + "gp": 208740.9976, + "gp_rate": 74.97 + }, + "target": { + "revenue": 246005.0, + "gp": 177124.0, + "gp_rate": 72.0 + }, + "completion": { + "revenue": 113.17, + "gp": 117.85 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "Amazon BR", + "metric": "install", + "installs": 138890.0, + "impressions": 0, + "revenue": 150604.27, + "ecpi": 1.0843, + "ecpm": null + }, + { + "campaign": "Amazon MENA", + "metric": "install", + "installs": 174071.0, + "impressions": 0, + "revenue": 107732.0, + "ecpi": 0.6189, + "ecpm": null + }, + { + "campaign": "Amazon ZA", + "metric": "install", + "installs": 37796.0, + "impressions": 0, + "revenue": 20079.0, + "ecpi": 0.5312, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1440.0, + "impressions": 0, + "revenue": 912.0 + }, + { + "date": "2026-08-02", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1621.0, + "impressions": 0, + "revenue": 360.0 + }, + { + "date": "2026-08-03", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1652.0, + "impressions": 0, + "revenue": 1374.0 + }, + { + "date": "2026-08-04", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1625.0, + "impressions": 0, + "revenue": 618.0 + }, + { + "date": "2026-08-05", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1545.0, + "impressions": 0, + "revenue": 531.0 + }, + { + "date": "2026-08-06", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1420.0, + "impressions": 0, + "revenue": 0.0 + }, + { + "date": "2026-08-07", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1517.0, + "impressions": 0, + "revenue": 1656.0 + }, + { + "date": "2026-08-08", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1435.0, + "impressions": 0, + "revenue": 669.0 + }, + { + "date": "2026-08-09", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1569.0, + "impressions": 0, + "revenue": 993.0 + }, + { + "date": "2026-08-10", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1634.0, + "impressions": 0, + "revenue": 786.0 + }, + { + "date": "2026-08-11", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1617.0, + "impressions": 0, + "revenue": 729.0 + }, + { + "date": "2026-08-12", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1635.0, + "impressions": 0, + "revenue": 864.0 + }, + { + "date": "2026-08-13", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1535.0, + "impressions": 0, + "revenue": 138.0 + }, + { + "date": "2026-08-14", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1660.0, + "impressions": 0, + "revenue": 597.0 + }, + { + "date": "2026-08-15", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1822.0, + "impressions": 0, + "revenue": 1164.0 + }, + { + "date": "2026-08-16", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1800.0, + "impressions": 0, + "revenue": 1035.0 + }, + { + "date": "2026-08-17", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1683.0, + "impressions": 0, + "revenue": 822.0 + }, + { + "date": "2026-08-18", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1840.0, + "impressions": 0, + "revenue": 1230.0 + }, + { + "date": "2026-08-19", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1517.0, + "impressions": 0, + "revenue": 1353.0 + }, + { + "date": "2026-08-20", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1720.0, + "impressions": 0, + "revenue": 1080.0 + }, + { + "date": "2026-08-21", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1867.0, + "impressions": 0, + "revenue": 807.0 + }, + { + "date": "2026-08-22", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1779.0, + "impressions": 0, + "revenue": 1344.0 + }, + { + "date": "2026-08-23", + "campaign": "Amazon ZA", + "metric": "install", + "installs": 1863.0, + "impressions": 0, + "revenue": 1017.0 + }, + { + "date": "2026-08-01", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5343.0, + "impressions": 0, + "revenue": 3775.0 + }, + { + "date": "2026-08-02", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5210.0, + "impressions": 0, + "revenue": 2663.0 + }, + { + "date": "2026-08-03", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5804.0, + "impressions": 0, + "revenue": 3219.5 + }, + { + "date": "2026-08-04", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5715.0, + "impressions": 0, + "revenue": 3592.5 + }, + { + "date": "2026-08-05", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5596.0, + "impressions": 0, + "revenue": 3486.5 + }, + { + "date": "2026-08-06", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5570.0, + "impressions": 0, + "revenue": 117.5 + }, + { + "date": "2026-08-07", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5640.0, + "impressions": 0, + "revenue": 6935.0 + }, + { + "date": "2026-08-08", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5829.0, + "impressions": 0, + "revenue": 3519.5 + }, + { + "date": "2026-08-09", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5882.0, + "impressions": 0, + "revenue": 3401.5 + }, + { + "date": "2026-08-10", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5846.0, + "impressions": 0, + "revenue": 3413.0 + }, + { + "date": "2026-08-11", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5942.0, + "impressions": 0, + "revenue": 3103.5 + }, + { + "date": "2026-08-12", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5847.0, + "impressions": 0, + "revenue": 3266.0 + }, + { + "date": "2026-08-13", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 6140.0, + "impressions": 0, + "revenue": 1144.0 + }, + { + "date": "2026-08-14", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5950.0, + "impressions": 0, + "revenue": 2412.5 + }, + { + "date": "2026-08-15", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 6120.0, + "impressions": 0, + "revenue": 3965.5 + }, + { + "date": "2026-08-16", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 6511.0, + "impressions": 0, + "revenue": 4539.5 + }, + { + "date": "2026-08-17", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 6179.0, + "impressions": 0, + "revenue": 3962.0 + }, + { + "date": "2026-08-18", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 6193.0, + "impressions": 0, + "revenue": 4126.0 + }, + { + "date": "2026-08-19", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 6072.0, + "impressions": 0, + "revenue": 4512.0 + }, + { + "date": "2026-08-20", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5836.0, + "impressions": 0, + "revenue": 4048.5 + }, + { + "date": "2026-08-21", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5902.0, + "impressions": 0, + "revenue": 4273.0 + }, + { + "date": "2026-08-22", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5821.0, + "impressions": 0, + "revenue": 4349.0 + }, + { + "date": "2026-08-23", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5680.0, + "impressions": 0, + "revenue": 4635.5 + }, + { + "date": "2026-08-24", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5629.0, + "impressions": 0, + "revenue": 3536.0 + }, + { + "date": "2026-08-25", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5867.0, + "impressions": 0, + "revenue": 4586.0 + }, + { + "date": "2026-08-26", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 4955.0, + "impressions": 0, + "revenue": 4009.0 + }, + { + "date": "2026-08-27", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5748.0, + "impressions": 0, + "revenue": 2815.0 + }, + { + "date": "2026-08-28", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5802.0, + "impressions": 0, + "revenue": 3141.0 + }, + { + "date": "2026-08-29", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5691.0, + "impressions": 0, + "revenue": 4247.0 + }, + { + "date": "2026-08-30", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5751.0, + "impressions": 0, + "revenue": 2938.0 + }, + { + "date": "2026-08-01", + "campaign": "Amazon BR", + "metric": "install", + "installs": 6001.0, + "impressions": 0, + "revenue": 6507.14 + }, + { + "date": "2026-08-02", + "campaign": "Amazon BR", + "metric": "install", + "installs": 6479.0, + "impressions": 0, + "revenue": 7025.45 + }, + { + "date": "2026-08-03", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4608.0, + "impressions": 0, + "revenue": 4996.65 + }, + { + "date": "2026-08-04", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5308.0, + "impressions": 0, + "revenue": 5755.69 + }, + { + "date": "2026-08-05", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4488.0, + "impressions": 0, + "revenue": 4866.53 + }, + { + "date": "2026-08-06", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4811.0, + "impressions": 0, + "revenue": 5216.77 + }, + { + "date": "2026-08-07", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4991.0, + "impressions": 0, + "revenue": 5411.95 + }, + { + "date": "2026-08-08", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4414.0, + "impressions": 0, + "revenue": 4786.29 + }, + { + "date": "2026-08-09", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5081.0, + "impressions": 0, + "revenue": 5509.54 + }, + { + "date": "2026-08-10", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4931.0, + "impressions": 0, + "revenue": 5346.89 + }, + { + "date": "2026-08-11", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4989.0, + "impressions": 0, + "revenue": 5409.78 + }, + { + "date": "2026-08-12", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4710.0, + "impressions": 0, + "revenue": 5107.25 + }, + { + "date": "2026-08-13", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4673.0, + "impressions": 0, + "revenue": 5067.13 + }, + { + "date": "2026-08-14", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4518.0, + "impressions": 0, + "revenue": 4899.06 + }, + { + "date": "2026-08-15", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5959.0, + "impressions": 0, + "revenue": 6461.59 + }, + { + "date": "2026-08-16", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5884.0, + "impressions": 0, + "revenue": 6380.27 + }, + { + "date": "2026-08-17", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5202.0, + "impressions": 0, + "revenue": 5640.75 + }, + { + "date": "2026-08-18", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5597.0, + "impressions": 0, + "revenue": 6069.06 + }, + { + "date": "2026-08-19", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5252.0, + "impressions": 0, + "revenue": 5694.96 + }, + { + "date": "2026-08-20", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5316.0, + "impressions": 0, + "revenue": 5764.36 + }, + { + "date": "2026-08-21", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5211.0, + "impressions": 0, + "revenue": 5650.51 + }, + { + "date": "2026-08-22", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5603.0, + "impressions": 0, + "revenue": 6075.57 + }, + { + "date": "2026-08-23", + "campaign": "Amazon BR", + "metric": "install", + "installs": 5669.0, + "impressions": 0, + "revenue": 6147.14 + }, + { + "date": "2026-08-24", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4796.0, + "impressions": 0, + "revenue": 5200.5 + }, + { + "date": "2026-08-25", + "campaign": "Amazon BR", + "metric": "install", + "installs": 4017.0, + "impressions": 0, + "revenue": 4355.8 + }, + { + "date": "2026-08-26", + "campaign": "Amazon BR", + "metric": "install", + "installs": 2361.0, + "impressions": 0, + "revenue": 2560.13 + }, + { + "date": "2026-08-27", + "campaign": "Amazon BR", + "metric": "install", + "installs": 2040.0, + "impressions": 0, + "revenue": 2212.06 + }, + { + "date": "2026-08-28", + "campaign": "Amazon BR", + "metric": "install", + "installs": 1929.0, + "impressions": 0, + "revenue": 2091.7 + }, + { + "date": "2026-08-29", + "campaign": "Amazon BR", + "metric": "install", + "installs": 1921.0, + "impressions": 0, + "revenue": 2083.02 + }, + { + "date": "2026-08-30", + "campaign": "Amazon BR", + "metric": "install", + "installs": 2131.0, + "impressions": 0, + "revenue": 2310.73 + } + ] + }, + { + "key": "ae", + "name": "AE", + "layout": "campaign_sheets", + "note": "", + "pkgs": [ + "ru.aliexpress.buyer" + ], + "data_cutoff": null, + "actual": { + "installs": 190841.0, + "impressions": 0, + "revenue": 133588.7, + "cost": 30934.4199, + "gp": 102654.2801, + "gp_rate": 76.84 + }, + "target": { + "revenue": 140678.0, + "gp": 112542.0, + "gp_rate": 80.0 + }, + "completion": { + "revenue": 94.96, + "gp": 91.21 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "AliExpress", + "metric": "install", + "installs": 190841.0, + "impressions": 0, + "revenue": 133588.7, + "ecpi": 0.7, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "AliExpress", + "metric": "install", + "installs": 5573.0, + "impressions": 0, + "revenue": 3901.1 + }, + { + "date": "2026-08-02", + "campaign": "AliExpress", + "metric": "install", + "installs": 5657.0, + "impressions": 0, + "revenue": 3959.9 + }, + { + "date": "2026-08-03", + "campaign": "AliExpress", + "metric": "install", + "installs": 5888.0, + "impressions": 0, + "revenue": 4121.6 + }, + { + "date": "2026-08-04", + "campaign": "AliExpress", + "metric": "install", + "installs": 6327.0, + "impressions": 0, + "revenue": 4428.9 + }, + { + "date": "2026-08-05", + "campaign": "AliExpress", + "metric": "install", + "installs": 6166.0, + "impressions": 0, + "revenue": 4316.2 + }, + { + "date": "2026-08-06", + "campaign": "AliExpress", + "metric": "install", + "installs": 6520.0, + "impressions": 0, + "revenue": 4564.0 + }, + { + "date": "2026-08-07", + "campaign": "AliExpress", + "metric": "install", + "installs": 5997.0, + "impressions": 0, + "revenue": 4197.9 + }, + { + "date": "2026-08-08", + "campaign": "AliExpress", + "metric": "install", + "installs": 6259.0, + "impressions": 0, + "revenue": 4381.3 + }, + { + "date": "2026-08-09", + "campaign": "AliExpress", + "metric": "install", + "installs": 6341.0, + "impressions": 0, + "revenue": 4438.7 + }, + { + "date": "2026-08-10", + "campaign": "AliExpress", + "metric": "install", + "installs": 6670.0, + "impressions": 0, + "revenue": 4669.0 + }, + { + "date": "2026-08-11", + "campaign": "AliExpress", + "metric": "install", + "installs": 5928.0, + "impressions": 0, + "revenue": 4149.6 + }, + { + "date": "2026-08-12", + "campaign": "AliExpress", + "metric": "install", + "installs": 6059.0, + "impressions": 0, + "revenue": 4241.3 + }, + { + "date": "2026-08-13", + "campaign": "AliExpress", + "metric": "install", + "installs": 5798.0, + "impressions": 0, + "revenue": 4058.6 + }, + { + "date": "2026-08-14", + "campaign": "AliExpress", + "metric": "install", + "installs": 5708.0, + "impressions": 0, + "revenue": 3995.6 + }, + { + "date": "2026-08-15", + "campaign": "AliExpress", + "metric": "install", + "installs": 6424.0, + "impressions": 0, + "revenue": 4496.8 + }, + { + "date": "2026-08-16", + "campaign": "AliExpress", + "metric": "install", + "installs": 6972.0, + "impressions": 0, + "revenue": 4880.4 + }, + { + "date": "2026-08-17", + "campaign": "AliExpress", + "metric": "install", + "installs": 7494.0, + "impressions": 0, + "revenue": 5245.8 + }, + { + "date": "2026-08-18", + "campaign": "AliExpress", + "metric": "install", + "installs": 7385.0, + "impressions": 0, + "revenue": 5169.5 + }, + { + "date": "2026-08-19", + "campaign": "AliExpress", + "metric": "install", + "installs": 7917.0, + "impressions": 0, + "revenue": 5541.9 + }, + { + "date": "2026-08-20", + "campaign": "AliExpress", + "metric": "install", + "installs": 7145.0, + "impressions": 0, + "revenue": 5001.5 + }, + { + "date": "2026-08-21", + "campaign": "AliExpress", + "metric": "install", + "installs": 7293.0, + "impressions": 0, + "revenue": 5105.1 + }, + { + "date": "2026-08-22", + "campaign": "AliExpress", + "metric": "install", + "installs": 7318.0, + "impressions": 0, + "revenue": 5122.6 + }, + { + "date": "2026-08-23", + "campaign": "AliExpress", + "metric": "install", + "installs": 7921.0, + "impressions": 0, + "revenue": 5544.7 + }, + { + "date": "2026-08-24", + "campaign": "AliExpress", + "metric": "install", + "installs": 7612.0, + "impressions": 0, + "revenue": 5328.4 + }, + { + "date": "2026-08-25", + "campaign": "AliExpress", + "metric": "install", + "installs": 6837.0, + "impressions": 0, + "revenue": 4785.9 + }, + { + "date": "2026-08-26", + "campaign": "AliExpress", + "metric": "install", + "installs": 6510.0, + "impressions": 0, + "revenue": 4557.0 + }, + { + "date": "2026-08-27", + "campaign": "AliExpress", + "metric": "install", + "installs": 5421.0, + "impressions": 0, + "revenue": 3794.7 + }, + { + "date": "2026-08-28", + "campaign": "AliExpress", + "metric": "install", + "installs": 4828.0, + "impressions": 0, + "revenue": 3379.6 + }, + { + "date": "2026-08-29", + "campaign": "AliExpress", + "metric": "install", + "installs": 5263.0, + "impressions": 0, + "revenue": 3684.1 + }, + { + "date": "2026-08-30", + "campaign": "AliExpress", + "metric": "install", + "installs": 3610.0, + "impressions": 0, + "revenue": 2527.0 + } + ] + }, + { + "key": "vk", + "name": "VK", + "layout": "campaign_sheets", + "note": "", + "pkgs": [ + "ru.mail.cloud", + "com.vk.love", + "com.uma.musicvk" + ], + "data_cutoff": null, + "actual": { + "installs": 83165.0, + "impressions": 0, + "revenue": 33865.72, + "cost": 11719.8201, + "gp": 22145.8999, + "gp_rate": 65.39 + }, + "target": { + "revenue": 56580.0, + "gp": 48093.0, + "gp_rate": 85.0 + }, + "completion": { + "revenue": 59.85, + "gp": 46.05 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "MailCloud", + "metric": "install", + "installs": 40676.0, + "impressions": 0, + "revenue": 14236.6, + "ecpi": 0.35, + "ecpm": null + }, + { + "campaign": "VkLove", + "metric": "install", + "installs": 18410.0, + "impressions": 0, + "revenue": 12887.0, + "ecpi": 0.7, + "ecpm": null + }, + { + "campaign": "VKmusic", + "metric": "install", + "installs": 24079.0, + "impressions": 0, + "revenue": 6742.12, + "ecpi": 0.28, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "MailCloud", + "metric": "install", + "installs": 2033.0, + "impressions": 0, + "revenue": 711.55 + }, + { + "date": "2026-08-02", + "campaign": "MailCloud", + "metric": "install", + "installs": 1729.0, + "impressions": 0, + "revenue": 605.15 + }, + { + "date": "2026-08-03", + "campaign": "MailCloud", + "metric": "install", + "installs": 1682.0, + "impressions": 0, + "revenue": 588.7 + }, + { + "date": "2026-08-04", + "campaign": "MailCloud", + "metric": "install", + "installs": 1327.0, + "impressions": 0, + "revenue": 464.45 + }, + { + "date": "2026-08-05", + "campaign": "MailCloud", + "metric": "install", + "installs": 1490.0, + "impressions": 0, + "revenue": 521.5 + }, + { + "date": "2026-08-06", + "campaign": "MailCloud", + "metric": "install", + "installs": 1621.0, + "impressions": 0, + "revenue": 567.35 + }, + { + "date": "2026-08-07", + "campaign": "MailCloud", + "metric": "install", + "installs": 1552.0, + "impressions": 0, + "revenue": 543.2 + }, + { + "date": "2026-08-08", + "campaign": "MailCloud", + "metric": "install", + "installs": 1477.0, + "impressions": 0, + "revenue": 516.95 + }, + { + "date": "2026-08-09", + "campaign": "MailCloud", + "metric": "install", + "installs": 1480.0, + "impressions": 0, + "revenue": 518.0 + }, + { + "date": "2026-08-10", + "campaign": "MailCloud", + "metric": "install", + "installs": 1736.0, + "impressions": 0, + "revenue": 607.6 + }, + { + "date": "2026-08-11", + "campaign": "MailCloud", + "metric": "install", + "installs": 1097.0, + "impressions": 0, + "revenue": 383.95 + }, + { + "date": "2026-08-12", + "campaign": "MailCloud", + "metric": "install", + "installs": 1027.0, + "impressions": 0, + "revenue": 359.45 + }, + { + "date": "2026-08-13", + "campaign": "MailCloud", + "metric": "install", + "installs": 999.0, + "impressions": 0, + "revenue": 349.65 + }, + { + "date": "2026-08-14", + "campaign": "MailCloud", + "metric": "install", + "installs": 1547.0, + "impressions": 0, + "revenue": 541.45 + }, + { + "date": "2026-08-15", + "campaign": "MailCloud", + "metric": "install", + "installs": 1314.0, + "impressions": 0, + "revenue": 459.9 + }, + { + "date": "2026-08-16", + "campaign": "MailCloud", + "metric": "install", + "installs": 1420.0, + "impressions": 0, + "revenue": 497.0 + }, + { + "date": "2026-08-17", + "campaign": "MailCloud", + "metric": "install", + "installs": 1238.0, + "impressions": 0, + "revenue": 433.3 + }, + { + "date": "2026-08-18", + "campaign": "MailCloud", + "metric": "install", + "installs": 1164.0, + "impressions": 0, + "revenue": 407.4 + }, + { + "date": "2026-08-19", + "campaign": "MailCloud", + "metric": "install", + "installs": 1048.0, + "impressions": 0, + "revenue": 366.8 + }, + { + "date": "2026-08-20", + "campaign": "MailCloud", + "metric": "install", + "installs": 1031.0, + "impressions": 0, + "revenue": 360.85 + }, + { + "date": "2026-08-21", + "campaign": "MailCloud", + "metric": "install", + "installs": 1328.0, + "impressions": 0, + "revenue": 464.8 + }, + { + "date": "2026-08-22", + "campaign": "MailCloud", + "metric": "install", + "installs": 1213.0, + "impressions": 0, + "revenue": 424.55 + }, + { + "date": "2026-08-23", + "campaign": "MailCloud", + "metric": "install", + "installs": 1176.0, + "impressions": 0, + "revenue": 411.6 + }, + { + "date": "2026-08-24", + "campaign": "MailCloud", + "metric": "install", + "installs": 1303.0, + "impressions": 0, + "revenue": 456.05 + }, + { + "date": "2026-08-25", + "campaign": "MailCloud", + "metric": "install", + "installs": 1208.0, + "impressions": 0, + "revenue": 422.8 + }, + { + "date": "2026-08-26", + "campaign": "MailCloud", + "metric": "install", + "installs": 1260.0, + "impressions": 0, + "revenue": 441.0 + }, + { + "date": "2026-08-27", + "campaign": "MailCloud", + "metric": "install", + "installs": 1357.0, + "impressions": 0, + "revenue": 474.95 + }, + { + "date": "2026-08-28", + "campaign": "MailCloud", + "metric": "install", + "installs": 1317.0, + "impressions": 0, + "revenue": 460.95 + }, + { + "date": "2026-08-29", + "campaign": "MailCloud", + "metric": "install", + "installs": 1240.0, + "impressions": 0, + "revenue": 434.0 + }, + { + "date": "2026-08-30", + "campaign": "MailCloud", + "metric": "install", + "installs": 1262.0, + "impressions": 0, + "revenue": 441.7 + }, + { + "date": "2026-08-01", + "campaign": "VkLove", + "metric": "install", + "installs": 383.0, + "impressions": 0, + "revenue": 268.1 + }, + { + "date": "2026-08-02", + "campaign": "VkLove", + "metric": "install", + "installs": 410.0, + "impressions": 0, + "revenue": 287.0 + }, + { + "date": "2026-08-03", + "campaign": "VkLove", + "metric": "install", + "installs": 494.0, + "impressions": 0, + "revenue": 345.8 + }, + { + "date": "2026-08-04", + "campaign": "VkLove", + "metric": "install", + "installs": 446.0, + "impressions": 0, + "revenue": 312.2 + }, + { + "date": "2026-08-05", + "campaign": "VkLove", + "metric": "install", + "installs": 515.0, + "impressions": 0, + "revenue": 360.5 + }, + { + "date": "2026-08-06", + "campaign": "VkLove", + "metric": "install", + "installs": 417.0, + "impressions": 0, + "revenue": 291.9 + }, + { + "date": "2026-08-07", + "campaign": "VkLove", + "metric": "install", + "installs": 462.0, + "impressions": 0, + "revenue": 323.4 + }, + { + "date": "2026-08-08", + "campaign": "VkLove", + "metric": "install", + "installs": 451.0, + "impressions": 0, + "revenue": 315.7 + }, + { + "date": "2026-08-09", + "campaign": "VkLove", + "metric": "install", + "installs": 470.0, + "impressions": 0, + "revenue": 329.0 + }, + { + "date": "2026-08-10", + "campaign": "VkLove", + "metric": "install", + "installs": 486.0, + "impressions": 0, + "revenue": 340.2 + }, + { + "date": "2026-08-11", + "campaign": "VkLove", + "metric": "install", + "installs": 476.0, + "impressions": 0, + "revenue": 333.2 + }, + { + "date": "2026-08-12", + "campaign": "VkLove", + "metric": "install", + "installs": 522.0, + "impressions": 0, + "revenue": 365.4 + }, + { + "date": "2026-08-13", + "campaign": "VkLove", + "metric": "install", + "installs": 440.0, + "impressions": 0, + "revenue": 308.0 + }, + { + "date": "2026-08-14", + "campaign": "VkLove", + "metric": "install", + "installs": 672.0, + "impressions": 0, + "revenue": 470.4 + }, + { + "date": "2026-08-15", + "campaign": "VkLove", + "metric": "install", + "installs": 584.0, + "impressions": 0, + "revenue": 408.8 + }, + { + "date": "2026-08-16", + "campaign": "VkLove", + "metric": "install", + "installs": 615.0, + "impressions": 0, + "revenue": 430.5 + }, + { + "date": "2026-08-17", + "campaign": "VkLove", + "metric": "install", + "installs": 517.0, + "impressions": 0, + "revenue": 361.9 + }, + { + "date": "2026-08-18", + "campaign": "VkLove", + "metric": "install", + "installs": 776.0, + "impressions": 0, + "revenue": 543.2 + }, + { + "date": "2026-08-19", + "campaign": "VkLove", + "metric": "install", + "installs": 670.0, + "impressions": 0, + "revenue": 469.0 + }, + { + "date": "2026-08-20", + "campaign": "VkLove", + "metric": "install", + "installs": 724.0, + "impressions": 0, + "revenue": 506.8 + }, + { + "date": "2026-08-21", + "campaign": "VkLove", + "metric": "install", + "installs": 787.0, + "impressions": 0, + "revenue": 550.9 + }, + { + "date": "2026-08-22", + "campaign": "VkLove", + "metric": "install", + "installs": 652.0, + "impressions": 0, + "revenue": 456.4 + }, + { + "date": "2026-08-23", + "campaign": "VkLove", + "metric": "install", + "installs": 791.0, + "impressions": 0, + "revenue": 553.7 + }, + { + "date": "2026-08-24", + "campaign": "VkLove", + "metric": "install", + "installs": 735.0, + "impressions": 0, + "revenue": 514.5 + }, + { + "date": "2026-08-25", + "campaign": "VkLove", + "metric": "install", + "installs": 890.0, + "impressions": 0, + "revenue": 623.0 + }, + { + "date": "2026-08-26", + "campaign": "VkLove", + "metric": "install", + "installs": 830.0, + "impressions": 0, + "revenue": 581.0 + }, + { + "date": "2026-08-27", + "campaign": "VkLove", + "metric": "install", + "installs": 831.0, + "impressions": 0, + "revenue": 581.7 + }, + { + "date": "2026-08-28", + "campaign": "VkLove", + "metric": "install", + "installs": 783.0, + "impressions": 0, + "revenue": 548.1 + }, + { + "date": "2026-08-29", + "campaign": "VkLove", + "metric": "install", + "installs": 802.0, + "impressions": 0, + "revenue": 561.4 + }, + { + "date": "2026-08-30", + "campaign": "VkLove", + "metric": "install", + "installs": 779.0, + "impressions": 0, + "revenue": 545.3 + }, + { + "date": "2026-08-01", + "campaign": "VKmusic", + "metric": "install", + "installs": 961.0, + "impressions": 0, + "revenue": 269.08 + }, + { + "date": "2026-08-02", + "campaign": "VKmusic", + "metric": "install", + "installs": 678.0, + "impressions": 0, + "revenue": 189.84 + }, + { + "date": "2026-08-03", + "campaign": "VKmusic", + "metric": "install", + "installs": 866.0, + "impressions": 0, + "revenue": 242.48 + }, + { + "date": "2026-08-04", + "campaign": "VKmusic", + "metric": "install", + "installs": 918.0, + "impressions": 0, + "revenue": 257.04 + }, + { + "date": "2026-08-05", + "campaign": "VKmusic", + "metric": "install", + "installs": 968.0, + "impressions": 0, + "revenue": 271.04 + }, + { + "date": "2026-08-06", + "campaign": "VKmusic", + "metric": "install", + "installs": 906.0, + "impressions": 0, + "revenue": 253.68 + }, + { + "date": "2026-08-07", + "campaign": "VKmusic", + "metric": "install", + "installs": 800.0, + "impressions": 0, + "revenue": 224.0 + }, + { + "date": "2026-08-08", + "campaign": "VKmusic", + "metric": "install", + "installs": 886.0, + "impressions": 0, + "revenue": 248.08 + }, + { + "date": "2026-08-09", + "campaign": "VKmusic", + "metric": "install", + "installs": 949.0, + "impressions": 0, + "revenue": 265.72 + }, + { + "date": "2026-08-10", + "campaign": "VKmusic", + "metric": "install", + "installs": 911.0, + "impressions": 0, + "revenue": 255.08 + }, + { + "date": "2026-08-11", + "campaign": "VKmusic", + "metric": "install", + "installs": 855.0, + "impressions": 0, + "revenue": 239.4 + }, + { + "date": "2026-08-12", + "campaign": "VKmusic", + "metric": "install", + "installs": 818.0, + "impressions": 0, + "revenue": 229.04 + }, + { + "date": "2026-08-13", + "campaign": "VKmusic", + "metric": "install", + "installs": 728.0, + "impressions": 0, + "revenue": 203.84 + }, + { + "date": "2026-08-14", + "campaign": "VKmusic", + "metric": "install", + "installs": 781.0, + "impressions": 0, + "revenue": 218.68 + }, + { + "date": "2026-08-15", + "campaign": "VKmusic", + "metric": "install", + "installs": 700.0, + "impressions": 0, + "revenue": 196.0 + }, + { + "date": "2026-08-16", + "campaign": "VKmusic", + "metric": "install", + "installs": 736.0, + "impressions": 0, + "revenue": 206.08 + }, + { + "date": "2026-08-17", + "campaign": "VKmusic", + "metric": "install", + "installs": 1312.0, + "impressions": 0, + "revenue": 367.36 + }, + { + "date": "2026-08-18", + "campaign": "VKmusic", + "metric": "install", + "installs": 1066.0, + "impressions": 0, + "revenue": 298.48 + }, + { + "date": "2026-08-19", + "campaign": "VKmusic", + "metric": "install", + "installs": 862.0, + "impressions": 0, + "revenue": 241.36 + }, + { + "date": "2026-08-20", + "campaign": "VKmusic", + "metric": "install", + "installs": 957.0, + "impressions": 0, + "revenue": 267.96 + }, + { + "date": "2026-08-21", + "campaign": "VKmusic", + "metric": "install", + "installs": 643.0, + "impressions": 0, + "revenue": 180.04 + }, + { + "date": "2026-08-22", + "campaign": "VKmusic", + "metric": "install", + "installs": 703.0, + "impressions": 0, + "revenue": 196.84 + }, + { + "date": "2026-08-23", + "campaign": "VKmusic", + "metric": "install", + "installs": 894.0, + "impressions": 0, + "revenue": 250.32 + }, + { + "date": "2026-08-24", + "campaign": "VKmusic", + "metric": "install", + "installs": 976.0, + "impressions": 0, + "revenue": 273.28 + }, + { + "date": "2026-08-25", + "campaign": "VKmusic", + "metric": "install", + "installs": 966.0, + "impressions": 0, + "revenue": 270.48 + }, + { + "date": "2026-08-26", + "campaign": "VKmusic", + "metric": "install", + "installs": 806.0, + "impressions": 0, + "revenue": 225.68 + }, + { + "date": "2026-08-27", + "campaign": "VKmusic", + "metric": "install", + "installs": 433.0, + "impressions": 0, + "revenue": 121.24 + }, + { + "date": "2026-08-28", + "campaign": "VKmusic", + "metric": "install", + "installs": 363.0, + "impressions": 0, + "revenue": 101.64 + }, + { + "date": "2026-08-29", + "campaign": "VKmusic", + "metric": "install", + "installs": 320.0, + "impressions": 0, + "revenue": 89.6 + }, + { + "date": "2026-08-30", + "campaign": "VKmusic", + "metric": "install", + "installs": 317.0, + "impressions": 0, + "revenue": 88.76 + } + ] + }, + { + "key": "yandex", + "name": "Yandex", + "layout": "campaign_sheets", + "note": "", + "pkgs": [ + "com.yandex.bank", + "com.yandex.lavka", + "ru.yandex.weatherplugin" + ], + "data_cutoff": null, + "actual": { + "installs": 140894.0, + "impressions": 0, + "revenue": 69763.34, + "cost": 32330.5902, + "gp": 37432.7498, + "gp_rate": 53.66 + }, + "target": { + "revenue": 17713.0, + "gp": 11691.0, + "gp_rate": 66.0 + }, + "completion": { + "revenue": 393.85, + "gp": 320.18 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "YandexBank", + "metric": "install", + "installs": 67951.0, + "impressions": 0, + "revenue": 47475.05, + "ecpi": 0.6987, + "ecpm": null + }, + { + "campaign": "YandexWeather", + "metric": "install", + "installs": 31337.0, + "impressions": 0, + "revenue": 13440.29, + "ecpi": 0.4289, + "ecpm": null + }, + { + "campaign": "YandexLavka", + "metric": "install", + "installs": 41606.0, + "impressions": 0, + "revenue": 8848.0, + "ecpi": 0.2127, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "YandexBank", + "metric": "install", + "installs": 827.0, + "impressions": 0, + "revenue": 666.4 + }, + { + "date": "2026-08-02", + "campaign": "YandexBank", + "metric": "install", + "installs": 825.0, + "impressions": 0, + "revenue": 686.8 + }, + { + "date": "2026-08-03", + "campaign": "YandexBank", + "metric": "install", + "installs": 830.0, + "impressions": 0, + "revenue": 571.2 + }, + { + "date": "2026-08-04", + "campaign": "YandexBank", + "metric": "install", + "installs": 892.0, + "impressions": 0, + "revenue": 618.8 + }, + { + "date": "2026-08-05", + "campaign": "YandexBank", + "metric": "install", + "installs": 843.0, + "impressions": 0, + "revenue": 673.2 + }, + { + "date": "2026-08-06", + "campaign": "YandexBank", + "metric": "install", + "installs": 782.0, + "impressions": 0, + "revenue": 659.6 + }, + { + "date": "2026-08-07", + "campaign": "YandexBank", + "metric": "install", + "installs": 1139.0, + "impressions": 0, + "revenue": 809.2 + }, + { + "date": "2026-08-08", + "campaign": "YandexBank", + "metric": "install", + "installs": 1055.0, + "impressions": 0, + "revenue": 600.95 + }, + { + "date": "2026-08-09", + "campaign": "YandexBank", + "metric": "install", + "installs": 1074.0, + "impressions": 0, + "revenue": 642.6 + }, + { + "date": "2026-08-10", + "campaign": "YandexBank", + "metric": "install", + "installs": 1824.0, + "impressions": 0, + "revenue": 1124.55 + }, + { + "date": "2026-08-11", + "campaign": "YandexBank", + "metric": "install", + "installs": 1899.0, + "impressions": 0, + "revenue": 1190.0 + }, + { + "date": "2026-08-12", + "campaign": "YandexBank", + "metric": "install", + "installs": 2032.0, + "impressions": 0, + "revenue": 1178.1 + }, + { + "date": "2026-08-13", + "campaign": "YandexBank", + "metric": "install", + "installs": 2532.0, + "impressions": 0, + "revenue": 1606.5 + }, + { + "date": "2026-08-14", + "campaign": "YandexBank", + "metric": "install", + "installs": 2584.0, + "impressions": 0, + "revenue": 1868.3 + }, + { + "date": "2026-08-15", + "campaign": "YandexBank", + "metric": "install", + "installs": 2682.0, + "impressions": 0, + "revenue": 1999.2 + }, + { + "date": "2026-08-16", + "campaign": "YandexBank", + "metric": "install", + "installs": 2460.0, + "impressions": 0, + "revenue": 1802.85 + }, + { + "date": "2026-08-17", + "campaign": "YandexBank", + "metric": "install", + "installs": 2495.0, + "impressions": 0, + "revenue": 1951.6 + }, + { + "date": "2026-08-18", + "campaign": "YandexBank", + "metric": "install", + "installs": 2338.0, + "impressions": 0, + "revenue": 1630.3 + }, + { + "date": "2026-08-19", + "campaign": "YandexBank", + "metric": "install", + "installs": 2556.0, + "impressions": 0, + "revenue": 1564.85 + }, + { + "date": "2026-08-20", + "campaign": "YandexBank", + "metric": "install", + "installs": 3443.0, + "impressions": 0, + "revenue": 2243.15 + }, + { + "date": "2026-08-21", + "campaign": "YandexBank", + "metric": "install", + "installs": 2990.0, + "impressions": 0, + "revenue": 1796.9 + }, + { + "date": "2026-08-22", + "campaign": "YandexBank", + "metric": "install", + "installs": 2868.0, + "impressions": 0, + "revenue": 2373.2 + }, + { + "date": "2026-08-23", + "campaign": "YandexBank", + "metric": "install", + "installs": 2829.0, + "impressions": 0, + "revenue": 2189.6 + }, + { + "date": "2026-08-24", + "campaign": "YandexBank", + "metric": "install", + "installs": 3063.0, + "impressions": 0, + "revenue": 2196.4 + }, + { + "date": "2026-08-25", + "campaign": "YandexBank", + "metric": "install", + "installs": 3633.0, + "impressions": 0, + "revenue": 2631.6 + }, + { + "date": "2026-08-26", + "campaign": "YandexBank", + "metric": "install", + "installs": 3543.0, + "impressions": 0, + "revenue": 2475.2 + }, + { + "date": "2026-08-27", + "campaign": "YandexBank", + "metric": "install", + "installs": 3617.0, + "impressions": 0, + "revenue": 2794.8 + }, + { + "date": "2026-08-28", + "campaign": "YandexBank", + "metric": "install", + "installs": 3287.0, + "impressions": 0, + "revenue": 2386.8 + }, + { + "date": "2026-08-29", + "campaign": "YandexBank", + "metric": "install", + "installs": 3401.0, + "impressions": 0, + "revenue": 2074.0 + }, + { + "date": "2026-08-30", + "campaign": "YandexBank", + "metric": "install", + "installs": 3608.0, + "impressions": 0, + "revenue": 2468.4 + }, + { + "date": "2026-08-01", + "campaign": "YandexLavka", + "metric": "install", + "installs": 2066.0, + "impressions": 0, + "revenue": 288.0 + }, + { + "date": "2026-08-02", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1878.0, + "impressions": 0, + "revenue": 440.0 + }, + { + "date": "2026-08-03", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1859.0, + "impressions": 0, + "revenue": 232.0 + }, + { + "date": "2026-08-04", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1132.0, + "impressions": 0, + "revenue": 328.0 + }, + { + "date": "2026-08-05", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1244.0, + "impressions": 0, + "revenue": 360.0 + }, + { + "date": "2026-08-06", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1184.0, + "impressions": 0, + "revenue": 328.0 + }, + { + "date": "2026-08-07", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1087.0, + "impressions": 0, + "revenue": 280.0 + }, + { + "date": "2026-08-08", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1101.0, + "impressions": 0, + "revenue": 376.0 + }, + { + "date": "2026-08-09", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1067.0, + "impressions": 0, + "revenue": 336.0 + }, + { + "date": "2026-08-10", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1398.0, + "impressions": 0, + "revenue": 440.0 + }, + { + "date": "2026-08-11", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1252.0, + "impressions": 0, + "revenue": 264.0 + }, + { + "date": "2026-08-12", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1350.0, + "impressions": 0, + "revenue": 328.0 + }, + { + "date": "2026-08-13", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1499.0, + "impressions": 0, + "revenue": 288.0 + }, + { + "date": "2026-08-14", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1079.0, + "impressions": 0, + "revenue": 320.0 + }, + { + "date": "2026-08-15", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1412.0, + "impressions": 0, + "revenue": 368.0 + }, + { + "date": "2026-08-16", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1279.0, + "impressions": 0, + "revenue": 376.0 + }, + { + "date": "2026-08-17", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1343.0, + "impressions": 0, + "revenue": 176.0 + }, + { + "date": "2026-08-18", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1219.0, + "impressions": 0, + "revenue": 224.0 + }, + { + "date": "2026-08-19", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1269.0, + "impressions": 0, + "revenue": 304.0 + }, + { + "date": "2026-08-20", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1228.0, + "impressions": 0, + "revenue": 328.0 + }, + { + "date": "2026-08-21", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1285.0, + "impressions": 0, + "revenue": 240.0 + }, + { + "date": "2026-08-22", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1340.0, + "impressions": 0, + "revenue": 312.0 + }, + { + "date": "2026-08-23", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1364.0, + "impressions": 0, + "revenue": 360.0 + }, + { + "date": "2026-08-24", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1181.0, + "impressions": 0, + "revenue": 240.0 + }, + { + "date": "2026-08-25", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1453.0, + "impressions": 0, + "revenue": 184.0 + }, + { + "date": "2026-08-26", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1718.0, + "impressions": 0, + "revenue": 264.0 + }, + { + "date": "2026-08-27", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1822.0, + "impressions": 0, + "revenue": 160.0 + }, + { + "date": "2026-08-28", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1460.0, + "impressions": 0, + "revenue": 288.0 + }, + { + "date": "2026-08-29", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1514.0, + "impressions": 0, + "revenue": 192.0 + }, + { + "date": "2026-08-30", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1523.0, + "impressions": 0, + "revenue": 224.0 + }, + { + "date": "2026-08-01", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1159.0, + "impressions": 0, + "revenue": 521.55 + }, + { + "date": "2026-08-02", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1292.0, + "impressions": 0, + "revenue": 581.4 + }, + { + "date": "2026-08-03", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1334.0, + "impressions": 0, + "revenue": 600.3 + }, + { + "date": "2026-08-04", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1100.0, + "impressions": 0, + "revenue": 495.0 + }, + { + "date": "2026-08-05", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1201.0, + "impressions": 0, + "revenue": 540.45 + }, + { + "date": "2026-08-06", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1200.0, + "impressions": 0, + "revenue": 540.0 + }, + { + "date": "2026-08-07", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1166.0, + "impressions": 0, + "revenue": 524.7 + }, + { + "date": "2026-08-08", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1038.0, + "impressions": 0, + "revenue": 467.1 + }, + { + "date": "2026-08-09", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1242.0, + "impressions": 0, + "revenue": 558.9 + }, + { + "date": "2026-08-10", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1158.0, + "impressions": 0, + "revenue": 521.1 + }, + { + "date": "2026-08-11", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1092.0, + "impressions": 0, + "revenue": 491.4 + }, + { + "date": "2026-08-12", + "campaign": "YandexWeather", + "metric": "install", + "installs": 879.0, + "impressions": 0, + "revenue": 395.55 + }, + { + "date": "2026-08-13", + "campaign": "YandexWeather", + "metric": "install", + "installs": 942.0, + "impressions": 0, + "revenue": 423.9 + }, + { + "date": "2026-08-14", + "campaign": "YandexWeather", + "metric": "install", + "installs": 827.0, + "impressions": 0, + "revenue": 339.07 + }, + { + "date": "2026-08-15", + "campaign": "YandexWeather", + "metric": "install", + "installs": 776.0, + "impressions": 0, + "revenue": 318.16 + }, + { + "date": "2026-08-16", + "campaign": "YandexWeather", + "metric": "install", + "installs": 836.0, + "impressions": 0, + "revenue": 342.76 + }, + { + "date": "2026-08-17", + "campaign": "YandexWeather", + "metric": "install", + "installs": 874.0, + "impressions": 0, + "revenue": 358.34 + }, + { + "date": "2026-08-18", + "campaign": "YandexWeather", + "metric": "install", + "installs": 821.0, + "impressions": 0, + "revenue": 336.61 + }, + { + "date": "2026-08-19", + "campaign": "YandexWeather", + "metric": "install", + "installs": 814.0, + "impressions": 0, + "revenue": 333.74 + }, + { + "date": "2026-08-20", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1130.0, + "impressions": 0, + "revenue": 463.3 + }, + { + "date": "2026-08-21", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1149.0, + "impressions": 0, + "revenue": 471.09 + }, + { + "date": "2026-08-22", + "campaign": "YandexWeather", + "metric": "install", + "installs": 988.0, + "impressions": 0, + "revenue": 405.08 + }, + { + "date": "2026-08-23", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1100.0, + "impressions": 0, + "revenue": 451.0 + }, + { + "date": "2026-08-24", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1057.0, + "impressions": 0, + "revenue": 433.37 + }, + { + "date": "2026-08-25", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1185.0, + "impressions": 0, + "revenue": 485.85 + }, + { + "date": "2026-08-26", + "campaign": "YandexWeather", + "metric": "install", + "installs": 849.0, + "impressions": 0, + "revenue": 348.09 + }, + { + "date": "2026-08-27", + "campaign": "YandexWeather", + "metric": "install", + "installs": 926.0, + "impressions": 0, + "revenue": 379.66 + }, + { + "date": "2026-08-28", + "campaign": "YandexWeather", + "metric": "install", + "installs": 859.0, + "impressions": 0, + "revenue": 352.19 + }, + { + "date": "2026-08-29", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1126.0, + "impressions": 0, + "revenue": 461.66 + }, + { + "date": "2026-08-30", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1217.0, + "impressions": 0, + "revenue": 498.97 + } + ] + }, + { + "key": "performdm", + "name": "PerformDM", + "layout": "campaign_sheets", + "note": "", + "pkgs": [ + "za.co.nedbank", + "capitecbank.co.za" + ], + "data_cutoff": null, + "actual": { + "installs": 3978.0, + "impressions": 663033.0, + "revenue": 10447.57, + "cost": null, + "gp": null, + "gp_rate": null + }, + "target": { + "revenue": 21748.0, + "gp": 21748.0, + "gp_rate": 100.0 + }, + "completion": { + "revenue": 48.04, + "gp": null + }, + "missing_pkgs": [ + "za.co.nedbank", + "capitecbank.co.za" + ], + "campaigns": [ + { + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 663033.0, + "revenue": 6027.57, + "ecpi": null, + "ecpm": 9.0909 + }, + { + "campaign": "Nedbank", + "metric": "install", + "installs": 3978.0, + "impressions": 0, + "revenue": 4420.0, + "ecpi": 1.1111, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "Nedbank", + "metric": "install", + "installs": 126.0, + "impressions": 0, + "revenue": 140.0 + }, + { + "date": "2026-08-02", + "campaign": "Nedbank", + "metric": "install", + "installs": 123.0, + "impressions": 0, + "revenue": 136.67 + }, + { + "date": "2026-08-03", + "campaign": "Nedbank", + "metric": "install", + "installs": 141.0, + "impressions": 0, + "revenue": 156.67 + }, + { + "date": "2026-08-04", + "campaign": "Nedbank", + "metric": "install", + "installs": 133.0, + "impressions": 0, + "revenue": 147.78 + }, + { + "date": "2026-08-05", + "campaign": "Nedbank", + "metric": "install", + "installs": 128.0, + "impressions": 0, + "revenue": 142.22 + }, + { + "date": "2026-08-06", + "campaign": "Nedbank", + "metric": "install", + "installs": 139.0, + "impressions": 0, + "revenue": 154.44 + }, + { + "date": "2026-08-07", + "campaign": "Nedbank", + "metric": "install", + "installs": 139.0, + "impressions": 0, + "revenue": 154.44 + }, + { + "date": "2026-08-08", + "campaign": "Nedbank", + "metric": "install", + "installs": 137.0, + "impressions": 0, + "revenue": 152.22 + }, + { + "date": "2026-08-09", + "campaign": "Nedbank", + "metric": "install", + "installs": 124.0, + "impressions": 0, + "revenue": 137.78 + }, + { + "date": "2026-08-10", + "campaign": "Nedbank", + "metric": "install", + "installs": 130.0, + "impressions": 0, + "revenue": 144.44 + }, + { + "date": "2026-08-11", + "campaign": "Nedbank", + "metric": "install", + "installs": 144.0, + "impressions": 0, + "revenue": 160.0 + }, + { + "date": "2026-08-12", + "campaign": "Nedbank", + "metric": "install", + "installs": 134.0, + "impressions": 0, + "revenue": 148.89 + }, + { + "date": "2026-08-13", + "campaign": "Nedbank", + "metric": "install", + "installs": 132.0, + "impressions": 0, + "revenue": 146.67 + }, + { + "date": "2026-08-14", + "campaign": "Nedbank", + "metric": "install", + "installs": 137.0, + "impressions": 0, + "revenue": 152.22 + }, + { + "date": "2026-08-15", + "campaign": "Nedbank", + "metric": "install", + "installs": 133.0, + "impressions": 0, + "revenue": 147.78 + }, + { + "date": "2026-08-16", + "campaign": "Nedbank", + "metric": "install", + "installs": 138.0, + "impressions": 0, + "revenue": 153.33 + }, + { + "date": "2026-08-17", + "campaign": "Nedbank", + "metric": "install", + "installs": 122.0, + "impressions": 0, + "revenue": 135.56 + }, + { + "date": "2026-08-18", + "campaign": "Nedbank", + "metric": "install", + "installs": 142.0, + "impressions": 0, + "revenue": 157.78 + }, + { + "date": "2026-08-19", + "campaign": "Nedbank", + "metric": "install", + "installs": 134.0, + "impressions": 0, + "revenue": 148.89 + }, + { + "date": "2026-08-20", + "campaign": "Nedbank", + "metric": "install", + "installs": 140.0, + "impressions": 0, + "revenue": 155.56 + }, + { + "date": "2026-08-21", + "campaign": "Nedbank", + "metric": "install", + "installs": 118.0, + "impressions": 0, + "revenue": 131.11 + }, + { + "date": "2026-08-22", + "campaign": "Nedbank", + "metric": "install", + "installs": 134.0, + "impressions": 0, + "revenue": 148.89 + }, + { + "date": "2026-08-23", + "campaign": "Nedbank", + "metric": "install", + "installs": 139.0, + "impressions": 0, + "revenue": 154.44 + }, + { + "date": "2026-08-24", + "campaign": "Nedbank", + "metric": "install", + "installs": 129.0, + "impressions": 0, + "revenue": 143.33 + }, + { + "date": "2026-08-25", + "campaign": "Nedbank", + "metric": "install", + "installs": 134.0, + "impressions": 0, + "revenue": 148.89 + }, + { + "date": "2026-08-26", + "campaign": "Nedbank", + "metric": "install", + "installs": 136.0, + "impressions": 0, + "revenue": 151.11 + }, + { + "date": "2026-08-27", + "campaign": "Nedbank", + "metric": "install", + "installs": 140.0, + "impressions": 0, + "revenue": 155.56 + }, + { + "date": "2026-08-28", + "campaign": "Nedbank", + "metric": "install", + "installs": 131.0, + "impressions": 0, + "revenue": 145.56 + }, + { + "date": "2026-08-29", + "campaign": "Nedbank", + "metric": "install", + "installs": 121.0, + "impressions": 0, + "revenue": 134.44 + }, + { + "date": "2026-08-30", + "campaign": "Nedbank", + "metric": "install", + "installs": 120.0, + "impressions": 0, + "revenue": 133.33 + }, + { + "date": "2026-08-03", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 0.0, + "revenue": 0.0 + }, + { + "date": "2026-08-04", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 8913.0, + "revenue": 81.03 + }, + { + "date": "2026-08-05", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 6464.0, + "revenue": 58.76 + }, + { + "date": "2026-08-06", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 30934.0, + "revenue": 281.22 + }, + { + "date": "2026-08-07", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27755.0, + "revenue": 252.32 + }, + { + "date": "2026-08-08", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27213.0, + "revenue": 247.39 + }, + { + "date": "2026-08-09", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27013.0, + "revenue": 245.57 + }, + { + "date": "2026-08-10", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 26992.0, + "revenue": 245.38 + }, + { + "date": "2026-08-11", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27969.0, + "revenue": 254.26 + }, + { + "date": "2026-08-12", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27987.0, + "revenue": 254.43 + }, + { + "date": "2026-08-13", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28155.0, + "revenue": 255.95 + }, + { + "date": "2026-08-14", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27890.0, + "revenue": 253.55 + }, + { + "date": "2026-08-15", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27183.0, + "revenue": 247.12 + }, + { + "date": "2026-08-16", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 26910.0, + "revenue": 244.64 + }, + { + "date": "2026-08-17", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28123.0, + "revenue": 255.66 + }, + { + "date": "2026-08-18", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28289.0, + "revenue": 257.17 + }, + { + "date": "2026-08-19", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28303.0, + "revenue": 257.3 + }, + { + "date": "2026-08-20", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28258.0, + "revenue": 256.89 + }, + { + "date": "2026-08-21", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28080.0, + "revenue": 255.27 + }, + { + "date": "2026-08-22", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 27087.0, + "revenue": 246.25 + }, + { + "date": "2026-08-23", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 26875.0, + "revenue": 244.32 + }, + { + "date": "2026-08-24", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28071.0, + "revenue": 255.19 + }, + { + "date": "2026-08-25", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 28048.0, + "revenue": 254.98 + }, + { + "date": "2026-08-26", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 18151.0, + "revenue": 165.01 + }, + { + "date": "2026-08-27", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 18151.0, + "revenue": 165.01 + }, + { + "date": "2026-08-28", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 18216.0, + "revenue": 165.6 + }, + { + "date": "2026-08-29", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 17970.0, + "revenue": 163.36 + }, + { + "date": "2026-08-30", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 18033.0, + "revenue": 163.94 + } + ] + }, + { + "key": "caliente", + "name": "Caliente", + "layout": "campaign_sheets", + "note": "", + "pkgs": [ + "sports.caliente.mx.calientedeportes" + ], + "data_cutoff": null, + "actual": { + "installs": 15918.0, + "impressions": 0, + "revenue": 31836.0, + "cost": 13767.0799, + "gp": 18068.9201, + "gp_rate": 56.76 + }, + "target": { + "revenue": 11268.0, + "gp": 7099.0, + "gp_rate": 63.0 + }, + "completion": { + "revenue": 282.53, + "gp": 254.53 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "Caliente", + "metric": "install", + "installs": 15918.0, + "impressions": 0, + "revenue": 31836.0, + "ecpi": 2.0, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "Caliente", + "metric": "install", + "installs": 951.0, + "impressions": 0, + "revenue": 1902.0 + }, + { + "date": "2026-08-02", + "campaign": "Caliente", + "metric": "install", + "installs": 951.0, + "impressions": 0, + "revenue": 1902.0 + }, + { + "date": "2026-08-03", + "campaign": "Caliente", + "metric": "install", + "installs": 1009.0, + "impressions": 0, + "revenue": 2018.0 + }, + { + "date": "2026-08-04", + "campaign": "Caliente", + "metric": "install", + "installs": 889.0, + "impressions": 0, + "revenue": 1778.0 + }, + { + "date": "2026-08-05", + "campaign": "Caliente", + "metric": "install", + "installs": 709.0, + "impressions": 0, + "revenue": 1418.0 + }, + { + "date": "2026-08-06", + "campaign": "Caliente", + "metric": "install", + "installs": 700.0, + "impressions": 0, + "revenue": 1400.0 + }, + { + "date": "2026-08-07", + "campaign": "Caliente", + "metric": "install", + "installs": 758.0, + "impressions": 0, + "revenue": 1516.0 + }, + { + "date": "2026-08-08", + "campaign": "Caliente", + "metric": "install", + "installs": 766.0, + "impressions": 0, + "revenue": 1532.0 + }, + { + "date": "2026-08-09", + "campaign": "Caliente", + "metric": "install", + "installs": 836.0, + "impressions": 0, + "revenue": 1672.0 + }, + { + "date": "2026-08-10", + "campaign": "Caliente", + "metric": "install", + "installs": 771.0, + "impressions": 0, + "revenue": 1542.0 + }, + { + "date": "2026-08-11", + "campaign": "Caliente", + "metric": "install", + "installs": 714.0, + "impressions": 0, + "revenue": 1428.0 + }, + { + "date": "2026-08-12", + "campaign": "Caliente", + "metric": "install", + "installs": 675.0, + "impressions": 0, + "revenue": 1350.0 + }, + { + "date": "2026-08-13", + "campaign": "Caliente", + "metric": "install", + "installs": 288.0, + "impressions": 0, + "revenue": 576.0 + }, + { + "date": "2026-08-14", + "campaign": "Caliente", + "metric": "install", + "installs": 361.0, + "impressions": 0, + "revenue": 722.0 + }, + { + "date": "2026-08-15", + "campaign": "Caliente", + "metric": "install", + "installs": 314.0, + "impressions": 0, + "revenue": 628.0 + }, + { + "date": "2026-08-16", + "campaign": "Caliente", + "metric": "install", + "installs": 392.0, + "impressions": 0, + "revenue": 784.0 + }, + { + "date": "2026-08-17", + "campaign": "Caliente", + "metric": "install", + "installs": 414.0, + "impressions": 0, + "revenue": 828.0 + }, + { + "date": "2026-08-18", + "campaign": "Caliente", + "metric": "install", + "installs": 413.0, + "impressions": 0, + "revenue": 826.0 + }, + { + "date": "2026-08-19", + "campaign": "Caliente", + "metric": "install", + "installs": 320.0, + "impressions": 0, + "revenue": 640.0 + }, + { + "date": "2026-08-20", + "campaign": "Caliente", + "metric": "install", + "installs": 323.0, + "impressions": 0, + "revenue": 646.0 + }, + { + "date": "2026-08-21", + "campaign": "Caliente", + "metric": "install", + "installs": 332.0, + "impressions": 0, + "revenue": 664.0 + }, + { + "date": "2026-08-22", + "campaign": "Caliente", + "metric": "install", + "installs": 447.0, + "impressions": 0, + "revenue": 894.0 + }, + { + "date": "2026-08-23", + "campaign": "Caliente", + "metric": "install", + "installs": 395.0, + "impressions": 0, + "revenue": 790.0 + }, + { + "date": "2026-08-24", + "campaign": "Caliente", + "metric": "install", + "installs": 268.0, + "impressions": 0, + "revenue": 536.0 + }, + { + "date": "2026-08-25", + "campaign": "Caliente", + "metric": "install", + "installs": 239.0, + "impressions": 0, + "revenue": 478.0 + }, + { + "date": "2026-08-26", + "campaign": "Caliente", + "metric": "install", + "installs": 307.0, + "impressions": 0, + "revenue": 614.0 + }, + { + "date": "2026-08-27", + "campaign": "Caliente", + "metric": "install", + "installs": 301.0, + "impressions": 0, + "revenue": 602.0 + }, + { + "date": "2026-08-28", + "campaign": "Caliente", + "metric": "install", + "installs": 292.0, + "impressions": 0, + "revenue": 584.0 + }, + { + "date": "2026-08-29", + "campaign": "Caliente", + "metric": "install", + "installs": 452.0, + "impressions": 0, + "revenue": 904.0 + }, + { + "date": "2026-08-30", + "campaign": "Caliente", + "metric": "install", + "installs": 331.0, + "impressions": 0, + "revenue": 662.0 + } + ] + }, + { + "key": "joom", + "name": "Joom", + "layout": "campaign_sheets", + "note": "", + "pkgs": [ + "tech.jm" + ], + "data_cutoff": null, + "actual": { + "installs": 42744.0, + "impressions": 0, + "revenue": 13250.64, + "cost": 5796.11, + "gp": 7454.53, + "gp_rate": 56.26 + }, + "target": { + "revenue": 12682.0, + "gp": 6341.0, + "gp_rate": 50.0 + }, + "completion": { + "revenue": 104.48, + "gp": 117.56 + }, + "missing_pkgs": [], + "campaigns": [ + { + "campaign": "Joom", + "metric": "install", + "installs": 42744.0, + "impressions": 0, + "revenue": 13250.64, + "ecpi": 0.31, + "ecpm": null + } + ], + "records": [ + { + "date": "2026-08-01", + "campaign": "Joom", + "metric": "install", + "installs": 1738.0, + "impressions": 0, + "revenue": 538.78 + }, + { + "date": "2026-08-02", + "campaign": "Joom", + "metric": "install", + "installs": 1884.0, + "impressions": 0, + "revenue": 584.04 + }, + { + "date": "2026-08-03", + "campaign": "Joom", + "metric": "install", + "installs": 1835.0, + "impressions": 0, + "revenue": 568.85 + }, + { + "date": "2026-08-04", + "campaign": "Joom", + "metric": "install", + "installs": 1605.0, + "impressions": 0, + "revenue": 497.55 + }, + { + "date": "2026-08-05", + "campaign": "Joom", + "metric": "install", + "installs": 1554.0, + "impressions": 0, + "revenue": 481.74 + }, + { + "date": "2026-08-06", + "campaign": "Joom", + "metric": "install", + "installs": 1276.0, + "impressions": 0, + "revenue": 395.56 + }, + { + "date": "2026-08-07", + "campaign": "Joom", + "metric": "install", + "installs": 1638.0, + "impressions": 0, + "revenue": 507.78 + }, + { + "date": "2026-08-08", + "campaign": "Joom", + "metric": "install", + "installs": 1136.0, + "impressions": 0, + "revenue": 352.16 + }, + { + "date": "2026-08-09", + "campaign": "Joom", + "metric": "install", + "installs": 1400.0, + "impressions": 0, + "revenue": 434.0 + }, + { + "date": "2026-08-10", + "campaign": "Joom", + "metric": "install", + "installs": 1386.0, + "impressions": 0, + "revenue": 429.66 + }, + { + "date": "2026-08-11", + "campaign": "Joom", + "metric": "install", + "installs": 1255.0, + "impressions": 0, + "revenue": 389.05 + }, + { + "date": "2026-08-12", + "campaign": "Joom", + "metric": "install", + "installs": 1273.0, + "impressions": 0, + "revenue": 394.63 + }, + { + "date": "2026-08-13", + "campaign": "Joom", + "metric": "install", + "installs": 1270.0, + "impressions": 0, + "revenue": 393.7 + }, + { + "date": "2026-08-14", + "campaign": "Joom", + "metric": "install", + "installs": 1275.0, + "impressions": 0, + "revenue": 395.25 + }, + { + "date": "2026-08-15", + "campaign": "Joom", + "metric": "install", + "installs": 1293.0, + "impressions": 0, + "revenue": 400.83 + }, + { + "date": "2026-08-16", + "campaign": "Joom", + "metric": "install", + "installs": 1357.0, + "impressions": 0, + "revenue": 420.67 + }, + { + "date": "2026-08-17", + "campaign": "Joom", + "metric": "install", + "installs": 1350.0, + "impressions": 0, + "revenue": 418.5 + }, + { + "date": "2026-08-18", + "campaign": "Joom", + "metric": "install", + "installs": 1264.0, + "impressions": 0, + "revenue": 391.84 + }, + { + "date": "2026-08-19", + "campaign": "Joom", + "metric": "install", + "installs": 1212.0, + "impressions": 0, + "revenue": 375.72 + }, + { + "date": "2026-08-20", + "campaign": "Joom", + "metric": "install", + "installs": 1260.0, + "impressions": 0, + "revenue": 390.6 + }, + { + "date": "2026-08-21", + "campaign": "Joom", + "metric": "install", + "installs": 1472.0, + "impressions": 0, + "revenue": 456.32 + }, + { + "date": "2026-08-22", + "campaign": "Joom", + "metric": "install", + "installs": 1476.0, + "impressions": 0, + "revenue": 457.56 + }, + { + "date": "2026-08-23", + "campaign": "Joom", + "metric": "install", + "installs": 1381.0, + "impressions": 0, + "revenue": 428.11 + }, + { + "date": "2026-08-24", + "campaign": "Joom", + "metric": "install", + "installs": 1424.0, + "impressions": 0, + "revenue": 441.44 + }, + { + "date": "2026-08-25", + "campaign": "Joom", + "metric": "install", + "installs": 1462.0, + "impressions": 0, + "revenue": 453.22 + }, + { + "date": "2026-08-26", + "campaign": "Joom", + "metric": "install", + "installs": 1160.0, + "impressions": 0, + "revenue": 359.6 + }, + { + "date": "2026-08-27", + "campaign": "Joom", + "metric": "install", + "installs": 1102.0, + "impressions": 0, + "revenue": 341.62 + }, + { + "date": "2026-08-28", + "campaign": "Joom", + "metric": "install", + "installs": 1097.0, + "impressions": 0, + "revenue": 340.07 + }, + { + "date": "2026-08-29", + "campaign": "Joom", + "metric": "install", + "installs": 1872.0, + "impressions": 0, + "revenue": 580.32 + }, + { + "date": "2026-08-30", + "campaign": "Joom", + "metric": "install", + "installs": 2037.0, + "impressions": 0, + "revenue": 631.47 + } + ] + }, + { + "key": "xbet", + "name": "1xbet", + "layout": "placeholder", + "note": "本月几乎无数据,暂不接入", + "pkgs": [], + "data_cutoff": null, + "actual": { + "installs": 0, + "impressions": 0, + "revenue": 0, + "cost": null, + "gp": null, + "gp_rate": null + }, + "target": { + "revenue": 150884.0, + "gp": 134287.0, + "gp_rate": 89.0 + }, + "completion": { + "revenue": 0.0, + "gp": null + }, + "missing_pkgs": [], + "campaigns": [], + "records": [] + }, + { + "key": "casasbahia", + "name": "Casas Bahia", + "layout": "placeholder", + "note": "暂不接入", + "pkgs": [], + "data_cutoff": null, + "actual": { + "installs": 0, + "impressions": 0, + "revenue": 0, + "cost": null, + "gp": null, + "gp_rate": null + }, + "target": { + "revenue": 32085.0, + "gp": 16684.0, + "gp_rate": 52.0 + }, + "completion": { + "revenue": 0.0, + "gp": null + }, + "missing_pkgs": [], + "campaigns": [], + "records": [] + } + ], + "definitions": { + "revenue": "各 KA 日报表的 Daily Spend / Spend / Cost,客户口径消耗,即我们的 Revenue", + "cost": "Sands Report 2.0 按包名汇总的 Cost,需本地抓取", + "gp": "GP = Revenue − Cost;GP rate = GP ÷ Revenue × 100", + "target": "Oversea FY2627 Monthly FFR 表对应 KA 行的 Target Rev / GP / GP%", + "completion": "完成率 = 实际 ÷ Target × 100,仅用于 Revenue 与 GP", + "impressions": "CPM 单(如 CapitecFuneral)的曝光量,单独统计,不并入 Install" + } +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..24b580e --- /dev/null +++ b/index.html @@ -0,0 +1,273 @@ + + + +Top10 KA · FFR 与 GP +
+

Top10 KA · FFR 与 GP

正在加载数据…

数据加载中
+
+
+ +
+ diff --git a/update_report_data.py b/update_report_data.py new file mode 100644 index 0000000..4f00380 --- /dev/null +++ b/update_report_data.py @@ -0,0 +1,648 @@ +"""生成 top10-ffr 报表数据(多 KA,按 tab 展示)。 + +取数范围:当月 1 号至昨天。 +口径: +- Revenue 来自各 KA 日报表的 Daily Spend / Spend / Cost(客户口径消耗) +- Cost 来自 Sands Report 2.0,按包名汇总(需本地抓取 sands_cost.json) +- GP = Revenue − Cost;GP rate = GP ÷ Revenue × 100 +- Target 来自 Oversea FY2627 Monthly FFR 表对应 KA 行 + +读取优先公开 CSV 导出,失败回退本地 credentials.json。脚本不含任何凭据。 +""" + +import csv +import io +import json +import re +import sys +import urllib.request +from collections import defaultdict +from datetime import datetime, timedelta +from pathlib import Path +from zoneinfo import ZoneInfo + +BASE = Path(__file__).resolve().parent +CONFIG_FILE = BASE / "accounts.json" +TIMEZONE = ZoneInfo("Asia/Shanghai") +SKIP_MARKS = ("总计", "合计", "total") +SPEND_NAMES = {"cost"} +SPEND_BLOCKLIST = ("cap", "budget", "rate", "expend") +INSTALL_BLOCKLIST = ("cap", "rate", "overall", "superset", "rejected", "reject") + + +def clean(value): + return " ".join(str(value or "").replace("\xa0", " ").split()) + + +def norm(value): + return re.sub(r"\s+", "", str(value or "")).lower() + + +def cell(row, index): + if index is None or index < 0 or index >= len(row): + return "" + return row[index] + + +def letter(index): + if index < 26: + return chr(65 + index) + return chr(64 + index // 26) + chr(65 + index % 26) + + +def parse_date(value): + text = clean(value) + for fmt in ("%Y/%m/%d", "%Y-%m-%d", "%Y%m%d", "%m/%d/%Y"): + try: + return datetime.strptime(text, fmt).date() + except ValueError: + pass + match = re.fullmatch(r"(\d{4})\D{1,3}(\d{1,2})\D{1,3}(\d{1,2})", text) + if not match: + return None + try: + return datetime(*map(int, match.groups())).date() + except ValueError: + return None + + +def parse_number(value): + text = clean(value).replace(",", "").replace("$", "").replace("%", "") + if not text or text in {"-", "—"} or text.startswith("#"): + return None + negative = text.startswith("(") and text.endswith(")") + cleaned = re.sub(r"[^0-9.\-]", "", text) + if cleaned in {"", "-", ".", "-."}: + return None + try: + number = float(cleaned) + except ValueError: + return None + return -number if negative else number + + +def is_install_header(text): + """Install 列有 install / installs / Installations / Install(new device) 等写法。""" + name = clean(text).lower() + if not name.startswith("install"): + return False + return not any(word in name for word in INSTALL_BLOCKLIST) + + +def is_spend_header(text): + """Revenue 列写法:spend / Spend / Daily Spend / Spends USD / Cost。""" + name = clean(text).lower() + if name in SPEND_NAMES: + return True + if not (name.startswith("spend") or name.startswith("daily spend")): + return False + return not any(word in name for word in SPEND_BLOCKLIST) + + +def fetch_public(spreadsheet_id, gid): + url = ( + f"https://docs.google.com/spreadsheets/d/{spreadsheet_id}" + f"/export?format=csv&gid={gid}" + ) + request = urllib.request.Request(url, headers={"User-Agent": "AgentStage-Top10/1.0"}) + with urllib.request.urlopen(request, timeout=120) as response: + return list(csv.reader(io.StringIO(response.read().decode("utf-8-sig")))) + + +def fetch_private(spreadsheet_id, gid): + import gspread + from google.oauth2.service_account import Credentials + + candidates = [BASE / "credentials.json"] + [p / "credentials.json" for p in BASE.parents] + path = next((item for item in candidates if item.exists()), None) + if path is None: + raise FileNotFoundError("未找到 credentials.json") + creds = Credentials.from_service_account_file( + str(path), scopes=["https://www.googleapis.com/auth/spreadsheets.readonly"] + ) + spreadsheet = gspread.authorize(creds).open_by_key(spreadsheet_id) + for worksheet in spreadsheet.worksheets(): + if worksheet.id == gid: + return worksheet.get_all_values() + raise LookupError(f"未找到 gid={gid}") + + +def fetch_rows(spreadsheet_id, gid): + try: + rows = fetch_public(spreadsheet_id, gid) + if rows: + return rows, "public" + except Exception: + pass + return fetch_private(spreadsheet_id, gid), "credentials" + + +def find_blocks(rows): + """定位表头行与其中所有横向区块(同一行可能有多套 Date/Install/Spend)。""" + for index, row in enumerate(rows[:40]): + date_columns = [i for i, v in enumerate(row) if clean(v).lower() == "date"] + if not date_columns: + continue + blocks = [] + for position, start in enumerate(date_columns): + end = date_columns[position + 1] if position + 1 < len(date_columns) else len(row) + block = {"date": start} + for column in range(start, end): + name = cell(row, column) + if "install" not in block and is_install_header(name): + block["install"] = [column] + elif "spend" not in block and is_spend_header(name): + block["spend"] = [column] + if "install" in block or "spend" in block: + blocks.append(block) + if blocks: + return index, blocks + return None, [] + + +def single_index(value): + if value is None: + return None + if isinstance(value, int): + return value + text = clean(value).upper() + if not text: + return None + if text.isdigit(): + return int(text) + index = 0 + for char in text: + if not ("A" <= char <= "Z"): + return None + index = index * 26 + (ord(char) - 64) + return index - 1 + + +def column_index(value): + """支持单列或多列求和:'D' 或 ['D','Q','AD','AT']。""" + if value is None: + return None + if isinstance(value, (list, tuple)): + items = [single_index(item) for item in value] + items = [item for item in items if item is not None] + return items or None + index = single_index(value) + return None if index is None else [index] + + +def read_campaign_sheet(rows, start_date, end_date, label, overrides=None): + """按表头自动识别;overrides 可显式指定表头行与列,避免取到本币列。""" + overrides = overrides or {} + forced_row = overrides.get("header_row") + if forced_row: + header_row = int(forced_row) - 1 + if not 0 <= header_row < len(rows): + print(f" {label}: 指定的表头行 {forced_row} 超出范围,跳过") + return {} + block = {} + header = rows[header_row] + date_index = column_index(overrides.get("date_col")) + if date_index: + block["date"] = date_index[0] + for key, field in (("install", "install_col"), ("spend", "revenue_col")): + index = column_index(overrides.get(field)) + if index: + block[key] = index + if "date" not in block: + found = next((i for i, v in enumerate(header) if clean(v).lower() == "date"), None) + if found is None: + print(f" {label}: 第 {forced_row} 行未找到 Date 列,跳过") + return {} + block["date"] = found + if "install" not in block: + found = next((i for i, v in enumerate(header) if is_install_header(v)), None) + if found is not None: + block["install"] = [found] + if "spend" not in block: + found = next((i for i, v in enumerate(header) if is_spend_header(v)), None) + if found is not None: + block["spend"] = [found] + # 防护:Revenue 列不能是 FFR、比率或本币列 + for index in list(block.get("spend") or []): + name = clean(cell(header, index)).lower() + if any(word in name for word in ("ffr", "%", "rate", "r$")): + print(f" {label}: 拒绝把 {letter(index)}({name}) 当作 Revenue,已剔除") + block["spend"].remove(index) + if not block.get("spend"): + block.pop("spend", None) + + def describe(key): + indexes = block.get(key) + if not indexes: + return f" {key}=缺失" + parts = "+".join(f"{letter(i)}({clean(cell(header, i))})" for i in indexes) + return f" {key}={parts}" + + blocks = [block] + described = f"date={letter(block['date'])}" + describe("install") + describe("spend") + print(f" {label}: 指定表头第 {forced_row} 行,{described}") + return accumulate(rows, header_row, blocks, start_date, end_date, label) + + header_row, blocks = find_blocks(rows) + if header_row is None: + print(f" {label}: 未识别到表头,跳过") + return {} + described = "; ".join( + f"date={letter(b['date'])}" + + (f" install={letter(b['install'][0])}" if b.get("install") else "") + + (f" spend={letter(b['spend'][0])}" if b.get("spend") else "") + for b in blocks + ) + print(f" {label}: 表头第 {header_row + 1} 行,{len(blocks)} 个区块 [{described}]") + return accumulate(rows, header_row, blocks, start_date, end_date, label) + + +def accumulate(rows, header_row, blocks, start_date, end_date, label=""): + daily = defaultdict(lambda: {"installs": 0.0, "revenue": 0.0}) + parsed = 0 + in_range = 0 + sample = [] + found_dates = [] + for row in rows[header_row + 1:]: + for block in blocks: + raw = clean(cell(row, block["date"])) + day = parse_date(raw) + if day is None: + if raw and len(sample) < 3: + sample.append(raw) + continue + parsed += 1 + found_dates.append(day) + if not (start_date <= day <= end_date): + continue + in_range += 1 + item = daily[day.isoformat()] + for index in block.get("install") or []: + value = parse_number(cell(row, index)) + if value is not None: + item["installs"] += value + for index in block.get("spend") or []: + value = parse_number(cell(row, index)) + if value is not None: + item["revenue"] += value + if label and in_range == 0: + header = rows[header_row] if header_row < len(rows) else [] + column = blocks[0]["date"] if blocks else None + title = clean(cell(header, column)) if column is not None else "" + print( + f" 诊断 {label}: 日期列 {letter(column)}({title or '无表头'})," + f"可解析 {parsed} 行,落在区间 0 行" + ) + if found_dates: + print(f" 解析到的日期范围 {min(found_dates)} ~ {max(found_dates)}") + if sample: + print(f" 无法解析的样例 {sample}") + return daily + + +def read_king(sources, sheets, start_date, end_date): + """King 为长表:Date / Campaign Name / Installs / Cost 每行一条。""" + rows, source = fetch_rows(sheets[sources["sheet"]], sources["client_gid"]) + header_row = None + columns = {} + for index, row in enumerate(rows[:12]): + found = {} + for column, value in enumerate(row): + name = clean(value).lower() + if name == "date": + found.setdefault("date", column) + elif name in {"campaign name", "campaign"}: + found.setdefault("campaign", column) + elif is_install_header(value): + found.setdefault("install", column) + elif name == "cost": + found.setdefault("spend", column) + if len(found) == 4: + header_row, columns = index, found + break + if header_row is None: + raise SystemExit("King 表未识别到 Date / Campaign Name / Install / Cost") + + print(f" King: 表头第 {header_row + 1} 行,来源={source}") + per_campaign = defaultdict(lambda: defaultdict(lambda: {"installs": 0.0, "revenue": 0.0})) + for row in rows[header_row + 1:]: + name = clean(cell(row, columns["campaign"])) + if not name or any(mark in name.lower() for mark in SKIP_MARKS): + continue + day = parse_date(cell(row, columns["date"])) + if day is None or not (start_date <= day <= end_date): + continue + item = per_campaign[name][day.isoformat()] + install = parse_number(cell(row, columns["install"])) + revenue = parse_number(cell(row, columns["spend"])) + if install is not None: + item["installs"] += install + if revenue is not None: + item["revenue"] += revenue + return per_campaign + + +def read_existing_report(sources, start_date, end_date): + """Amazon:直接读取已有报表的 data.json。""" + url = sources["report_url"] + request = urllib.request.Request(url, headers={"User-Agent": "AgentStage-Top10/1.0"}) + with urllib.request.urlopen(request, timeout=90) as response: + data = json.loads(response.read().decode("utf-8")) + revenue_field = sources.get("revenue_field", "payable_spend") + install_field = sources.get("install_field", "install") + daily = defaultdict(lambda: {"installs": 0.0, "revenue": 0.0}) + cutoff = None + for row in data.get("daily", []): + day = parse_date(row.get("date")) + if day is None: + continue + if row.get("is_actual") is False: + continue + if cutoff is None or day > cutoff: + cutoff = day + if not (start_date <= day <= end_date): + continue + item = daily[day.isoformat()] + item["installs"] += float(row.get(install_field) or 0) + item["revenue"] += float(row.get(revenue_field) or 0) + print(f" Amazon: 使用 {revenue_field} 作为 Revenue,实际数据截止 {cutoff}") + return daily, cutoff + + +def read_targets(rows): + """Monthly FFR:上一行是分组名(Target/Actual),下一行是 Rev/GP/GP%。""" + metric_row = None + for index, row in enumerate(rows[:12]): + names = [norm(v) for v in row] + if "rev" in names and "gp" in names: + metric_row = index + break + if metric_row is None: + raise LookupError("未找到 Rev / GP 指标行") + + group_row = rows[metric_row - 1] if metric_row > 0 else [] + columns = {} + current = "" + for column, value in enumerate(rows[metric_row]): + label = clean(cell(group_row, column)) + if label: + current = label.lower() + metric = norm(value) + if metric in {"rev", "gp", "gp%"} and current: + columns.setdefault((current, metric), column) + + targets = {} + for row in rows[metric_row + 1:]: + name = clean(cell(row, 0)).lower() + if not name: + continue + + def pick(metric): + for (group, key), column in columns.items(): + if key == metric and "target" in group: + return parse_number(cell(row, column)) + return None + + targets[name] = {"revenue": pick("rev"), "gp": pick("gp"), "gp_rate": pick("gp%")} + return targets + + +def load_sands(): + candidates = [BASE / "sands_cost.json"] + [p / "sands_cost.json" for p in BASE.parents] + path = next((item for item in candidates if item.exists()), None) + if path is None: + previous = BASE / "data.json" + if previous.exists(): + try: + sands = json.loads(previous.read_text(encoding="utf-8")).get("sands") + except Exception: + sands = None + if sands: + sands = dict(sands) + sands["carried_over"] = True + print(f"Sands:沿用上一版(抓取于 {sands.get('fetched_at')})") + return sands + print("Sands:未找到 sands_cost.json,Cost 与 GP 将留空") + return None + data = json.loads(path.read_text(encoding="utf-8")) + by_pkg = {name: entry.get("cost") for name, entry in (data.get("by_pkg") or {}).items()} + print(f"Sands:{len(by_pkg)} 个包,抓取于 {data.get('fetched_at')}") + return { + "fetched_at": data.get("fetched_at"), + "source_url": data.get("source_url"), + "by_pkg": by_pkg, + "total_cost": data.get("total_cost"), + } + + +def account_cost(account, sands): + if not sands or not sands.get("by_pkg"): + return None, [] + by_pkg = sands["by_pkg"] + total = 0.0 + missing = [] + found = False + for pkg in account.get("pkgs", []): + value = by_pkg.get(pkg) + if value is None: + missing.append(pkg) + else: + total += float(value) + found = True + return (round(total, 4) if found else None), missing + + +def build_account(account, sheets, start_date, end_date, sands, targets): + key, name, layout = account["key"], account["name"], account.get("layout") + print(f"\n[{name}] layout={layout}") + campaigns = {} + cutoff = None + + if layout == "king": + per_campaign = read_king(account["sources"], sheets, start_date, end_date) + campaigns = {campaign: dict(days) for campaign, days in per_campaign.items()} + elif layout == "placeholder": + print(" 占位账号,无数据") + else: + # 同一个 KA 可以同时有已有报表和源表两种来源 + sources = account.get("sources") or {} + if sources.get("report_url"): + daily, cutoff = read_existing_report(sources, start_date, end_date) + if daily: + campaigns[sources.get("campaign_name", name)] = dict(daily) + for campaign in account.get("campaigns", []): + try: + rows, source = fetch_rows(sheets[campaign["sheet"]], campaign["gid"]) + except Exception as error: + print(f" {campaign['name']}: 读取失败 {type(error).__name__}: {error or '(无消息)'}") + continue + daily = read_campaign_sheet( + rows, start_date, end_date, f"{campaign['name']}({source})", campaign + ) + if daily: + campaigns[campaign["name"]] = dict(daily) + + # CPM 单的曝光不能与安装相加,单独统计 + impression_campaigns = { + campaign.get("name"): campaign.get("metric_label") + for campaign in account.get("campaigns", []) + if str(campaign.get("metric_label", "")).lower().startswith("impression") + } + + records = [] + campaign_summary = [] + for campaign, days in campaigns.items(): + is_impression = campaign in impression_campaigns + volume = round(sum(item["installs"] for item in days.values()), 2) + revenue = round(sum(item["revenue"] for item in days.values()), 4) + campaign_summary.append({ + "campaign": campaign, + "metric": "impression" if is_impression else "install", + "installs": 0 if is_impression else volume, + "impressions": volume if is_impression else 0, + "revenue": revenue, + "ecpi": None if is_impression or not volume else round(revenue / volume, 4), + "ecpm": round(revenue / volume * 1000, 4) if is_impression and volume else None, + }) + for date, item in sorted(days.items()): + value = round(item["installs"], 2) + records.append({ + "date": date, + "campaign": campaign, + "metric": "impression" if is_impression else "install", + "installs": 0 if is_impression else value, + "impressions": value if is_impression else 0, + "revenue": round(item["revenue"], 4), + }) + + campaign_summary.sort(key=lambda item: -item["revenue"]) + revenue = round(sum(item["revenue"] for item in campaign_summary), 4) + installs = round(sum(item["installs"] for item in campaign_summary), 2) + impressions = round(sum(item["impressions"] for item in campaign_summary), 2) + cost, missing_pkgs = account_cost(account, sands) + gp = round(revenue - cost, 4) if cost is not None else None + gp_rate = round(gp / revenue * 100, 2) if gp is not None and revenue else None + + target = dict(targets.get(account.get("target_ka", "").lower()) or {}) + if target.get("gp_rate") is not None and target["gp_rate"] <= 1: + target["gp_rate"] = round(target["gp_rate"] * 100, 2) + + def ratio(actual, goal): + if actual is None or not goal: + return None + return round(actual / goal * 100, 2) + + print( + f" Revenue={revenue} Install={installs} Impression={impressions} " + f"Cost={cost} GP={gp} Target Rev={target.get('revenue')}" + ) + if missing_pkgs: + print(f" Sands 缺少包:{missing_pkgs}") + + return { + "key": key, + "name": name, + "layout": layout, + "note": account.get("note", ""), + "pkgs": account.get("pkgs", []), + "data_cutoff": cutoff.isoformat() if cutoff else None, + "actual": { + "installs": installs, + "impressions": impressions, + "revenue": revenue, + "cost": cost, + "gp": gp, + "gp_rate": gp_rate, + }, + "target": { + "revenue": target.get("revenue"), + "gp": target.get("gp"), + "gp_rate": target.get("gp_rate"), + }, + "completion": { + "revenue": ratio(revenue, target.get("revenue")), + "gp": ratio(gp, target.get("gp")), + }, + "missing_pkgs": missing_pkgs, + "campaigns": campaign_summary, + "records": records, + } + + +def main(): + if len(sys.argv) < 2: + raise SystemExit("用法: update_report_data.py <输出文件>") + config = json.loads(CONFIG_FILE.read_text(encoding="utf-8")) + sheets = config["sheets"] + + now = datetime.now(TIMEZONE) + end_date = now.date() - timedelta(days=1) + start_date = end_date.replace(day=1) + days = (end_date - start_date).days + 1 + month_days = ((start_date.replace(day=28) + timedelta(days=4)).replace(day=1) - timedelta(days=1)).day + print(f"取数范围:{start_date} 至 {end_date}({days}/{month_days} 天)") + + sands = load_sands() + try: + target_rows, _ = fetch_rows(config["target_spreadsheet_id"], config["target_gid"]) + targets = read_targets(target_rows) + print(f"Target:命中 {len(targets)} 个 KA") + except Exception as error: + targets = {} + print(f"Target 读取失败({error})") + + accounts = [ + build_account(account, sheets, start_date, end_date, sands, targets) + for account in config["accounts"] + ] + active = [item for item in accounts if item["actual"]["revenue"] or item["actual"]["cost"]] + + totals = { + "installs": round(sum(item["actual"]["installs"] for item in active), 2), + "impressions": round(sum(item["actual"].get("impressions") or 0 for item in active), 2), + "revenue": round(sum(item["actual"]["revenue"] for item in active), 4), + "cost": round(sum(item["actual"]["cost"] or 0 for item in active), 4), + "target_revenue": round(sum(item["target"]["revenue"] or 0 for item in active), 4), + "target_gp": round(sum(item["target"]["gp"] or 0 for item in active), 4), + } + totals["gp"] = round(totals["revenue"] - totals["cost"], 4) + totals["gp_rate"] = round(totals["gp"] / totals["revenue"] * 100, 2) if totals["revenue"] else None + totals["completion"] = { + "revenue": round(totals["revenue"] / totals["target_revenue"] * 100, 2) if totals["target_revenue"] else None, + "gp": round(totals["gp"] / totals["target_gp"] * 100, 2) if totals["target_gp"] else None, + } + + payload = { + "title": "Top10 KA · 当月 FFR 与 GP", + "generated_at": now.isoformat(timespec="seconds"), + "timezone": "Asia/Shanghai", + "period": { + "start": start_date.isoformat(), + "end": end_date.isoformat(), + "days": days, + "month_days": month_days, + "time_progress_percent": round(days / month_days * 100, 2), + }, + "sands": sands, + "totals": totals, + "accounts": accounts, + "definitions": { + "revenue": "各 KA 日报表的 Daily Spend / Spend / Cost,客户口径消耗,即我们的 Revenue", + "cost": "Sands Report 2.0 按包名汇总的 Cost,需本地抓取", + "gp": "GP = Revenue − Cost;GP rate = GP ÷ Revenue × 100", + "target": "Oversea FY2627 Monthly FFR 表对应 KA 行的 Target Rev / GP / GP%", + "completion": "完成率 = 实际 ÷ Target × 100,仅用于 Revenue 与 GP", + "impressions": "CPM 单(如 CapitecFuneral)的曝光量,单独统计,不并入 Install", + }, + } + + with open(sys.argv[1], "w", encoding="utf-8") as handle: + json.dump(payload, handle, ensure_ascii=False, indent=2) + print( + f"\nOK accounts={len(accounts)} active={len(active)} " + f"revenue={totals['revenue']} cost={totals['cost']} gp={totals['gp']}" + ) + + +if __name__ == "__main__": + main()