From 16be038cf030df8a24972b9daf1286bb81df9675 Mon Sep 17 00:00:00 2001 From: SHAREit Date: Tue, 1 Sep 2026 15:22:45 +0800 Subject: [PATCH] Publish top10 KA FFR report --- data.json | 799 ++++++++++++++++++++++++++++++------------ index.html | 20 +- update_report_data.py | 28 +- 3 files changed, 615 insertions(+), 232 deletions(-) diff --git a/data.json b/data.json index 74d5c1e..fe8a0c6 100644 --- a/data.json +++ b/data.json @@ -1,52 +1,257 @@ { "title": "Top10 KA · 当月 FFR 与 GP", - "generated_at": "2026-08-31T14:21:06+08:00", + "generated_at": "2026-09-01T14:03:54+08:00", "timezone": "Asia/Shanghai", "period": { "start": "2026-08-01", - "end": "2026-08-30", - "days": 30, + "end": "2026-08-31", + "days": 31, "month_days": 31, - "time_progress_percent": 96.77 + "time_progress_percent": 100.0 }, "sands": { - "fetched_at": "2026-08-31T14:21:04+08:00", + "fetched_at": "2026-09-01T13:06:15+08:00", "source_url": "https://sands.hellay.net/#/newSanReports2", "by_pkg": { - "com.Dominos": 0.0, + "net.myinfosys.PermataMobileX": 0.0, + "com.loadcomplete.slimeidle": 0.0, + "com.ubercab": 0.0, + "com.yandex.lavka": 6494.6501, + "com.mocamoca": 314.05, + "com.smartec.ft": 0.0, + "com.indokoala.transfez": 0.0, + "com.pp666.sha01": 0.0, "mx.com.paramia": 0.0, - "com.royal.mahjong": 0.0, - "ru.ideast.srochnodengi": 0.0, - "com.pesohere.fastcash": 0.0, - "com.alibaba.aliexpresshd": 2.4, - "com.taxsee.taxsee": 0.0, - "com.pinjoy.game.app": 0.0, - "io.silvrr.installment": 0.0, - "com.pesokuwento.lending.olp.ph": 0.0, + "com.hypergutura.tearthemall": 0.0, + "io.tr8.gotradeindo.android": 0.0, + "com.amazon.mShop.android.shoPping": 0.0, + "ru.yandex.androidkeyboard": 0.0, + "com.apnatime": 0.0, + "ru.yoo.money": 0.0, + "com.unicostudio.gemdoku": 0.0, + "com.cmcm.uangme": 0.0, + "ph.cashme.android": 0.0, + "in.startv.hotstar.dplus": 4323.9, + "com.myairtelapp": 0.0, + "com.ayoba.ayoba": 0.0, + "com.iss.client.cairin": 0.0, + "com.avalsolucionesdigitalessa.dale_app_embedded": 0.0, + "com.tui.fstravel": 0.0, + "com.zhiliaoapp.musically": 0.0, + "pk.pakrummy25.app": 136.99, + "com.lalamove.global.driver.sea": 3.7, + "com.emotibot.chatbotpro": 0.0, + "live.shorttv.apps": 0.0, + "com.gma.ball.sort.color.water.puzzle": 0.0, + "ru.mail.cloud": 7722.54, + "com.edadeal.android": 16877.7303, + "com.yandex.bank": 25922.5703, + "com.cloud.thailand": 0.0, + "com.BDjackpot2.app": 0.0, + "com.goibibo": 0.0, + "uiendfskjn.nzqifdgdpld.bxcvuwhe": 108.7, + "com.fxroyale.app": 202.4, + "com.kwento.loan.ph": 0.0, + "com.policybazaar": 1529.27, + "com.fintopia.idnEasycash.google": 0.0, + "com.alloapp.yump": 0.0, + "com.poonawallafincorp.loan.emi.payment.card.upi.mf": 0.0, + "com.eyecon.global": 0.0, + "prod1002.app_tk6bdtf2.com": 0.0, + "ru.ok.android": 0.0, + "com.fungames.sniper3d": 0.0, + "tech.jm": 6705.79, + "com.king.candycrushsaga": 40883.0306, + "com.mvp789.com2": 360.22, + "com.ocbcnisp.onemobileapp": 0.0, + "ph.pesoredee.mobile.android": 0.0, "com.g500": 0.0, - "org.xbet.client1": 0.0, + "com.grabtaxi.passenger": 0.0, + "com.yandex.mobile.drive": 0.0, + "com.Biubiufishing.vs": 0.0, + "com.mintq.gocash": 18.0, + "com.clipcd.clipgo": 3.1, + "com.support.excellenteralending": 0.0, + "id.co.myhomecredit": 0.0, + "com.color.juice.bar": 0.0, + "ru.megamarket.marketplace": 0.0, + "prod0151334412.app_m6myrh1.com": 9.29, + "prod3968651864.app_as777bdtf6.com": 117.06, + "com.hike.mazuma": 0.0, + "com.kwai.bulldog": 19354.7703, + "ru.instamart": 0.0, + "com.snapdeal.main": 0.0, + "com.winaxis.arionplayandroidapp": 630.88, + "com.kkii": 0.0, + "com.playfungame.dream": 0.0, + "com.amazon.mp3": 0.0, + "com.btpn.dc": 0.0, + "com.arrowout.linemasterpro": 0.0, + "com.disneyplus.ph": 1570.77, + "astrum.ent.m2alyona": 1199.59, + "com.astro.shop": 118.95, + "com.taurus.app.android": 0.0, + "com.fastmore.gold.loan.ph": 0.0, + "ru.rosfines.android": 1518.63, + "com.snakeattack.game": 0.0, + "io.jungleerummy.jungleegames": 0.0, + "com.juanhand.fast.cash.peso.loan.app": 0.0, + "com.jungleerummy.playcashgameonline": 0.0, + "com.personal.first.peso.wallet.loan.app": 0.0, + "pk.com.telenor.phoenix": 0.0, + "com.wings.bene.ph": 3204.0701, + "ru.yandex.weatherplugin": 6994.6999, + "com.espritgames.rpg.skg": 0.0, + "com.shopeepay.id": 0.0, + "com.binggo.gaple": 0.0, + "com.angkas.passenger": 0.0, + "com.callapp.contacts": 0.0, + "com.exness.android.go": 0.0, + "com.betsoftware.hwpremiumwrapped": 1865.6001, + "ru.kinopoisk": 17795.6007, + "ru.oneme.app": 0.0, + "com.ammana.app": 0.0, + "com.klik.klikUMKM": 0.0, + "com.whizdm.moneyview.loans": 13.75, + "com.lucky.fishing.ph": 241.28, + "com.cash.credit.marikaya": 403.41, + "com.seatech.bluebird": 902.96, + "com.touch.chat": 0.0, + "com.mobikwik_new": 0.0, + "com.kubi.kucoin": 35.85, "com.daki": 0.0, - "ru.yandex.weatherplugin": 255.35, - "com.mvp789.com2": 42.93, - "com.ic.ek77_85": 15.7, - "com.nagwa.classes": 103.52, - "ru.yandex.music": 435.65, - "com.quick.loan.center.vay.mau": 7.95 + "com.dbs.in.digitalbank": 0.0, + "com.canva.editor": 0.0, + "com.sgiggle.production": 0.0, + "com.treasury.apps": 0.0, + "com.lamoda.lite": 0.0, + "com.playkot.ageofmagic": 0.0, + "com.loan.cash.credit.easy.kilat.cepat.pinjam.uang.dana.rupiah": 0.0, + "com.axlebolt.standoff2": 0.0, + "com.pinjamwinwin": 0.0, + "com.stanfordtek.pinjamduit": 0.0, + "uz.uzum.tezkor": 0.0, + "com.cp.stots.id15352": 0.0, + "com.ph.pinoy.peso": 0.0, + "finance.empower": 0.0, + "uz.uzum.app": 0.0, + "mx.prestamos.urgente.dinero.online.peso.viva.credito.rapido": 306.9, + "com.loans.lending.onlinelend.easypln": 0.0, + "com.qiilncg.mhiw3505.khqqogx02": 0.0, + "com.intech.c66app": 0.0, + "com.ada.astrapay": 0.0, + "com.foreigncurrency.internationalfxeye": 746.16, + "cn.com.vau": 0.0, + "com.malasia.mlf01": 0.0, + "com.unicostudio.braintest": 0.0, + "com.reels.cash.video.app": 585.83, + "com.lf.mpicph": 0.0, + "com.eloelo": 0.0, + "sai.gac.hat": 0.0, + "com.espritgames.rpg.dragon.egg": 186.52, + "com.gp.hcr.happytime": 0.0, + "com.sahabatmikro": 0.0, + "ru.tutu.tutu_emp": 0.0, + "sports.caliente.mx.calientedeportes": 15158.6999, + "com.privalia.mex": 0.0, + "com.deliveryclub": 0.0, + "com.nagwa.classes": 2118.04, + "com.global.foodpanda.android": 0.0, + "com.conquian.parallax": 2.99, + "com.instantingot.finance.loan": 0.0, + "com.shopee.ph": 0.0, + "com.binance.dev": 0.0, + "com.frph.stonegrass": 0.0, + "com.truecaller": 0.0, + "prod4340509760.app_ckbg1bdtf5.com": 0.0, + "com.julofinance.juloapp": 0.0, + "com.money.credit.pilot.fin.app": 7.75, + "ru.aliexpress.buyer": 34477.5699, + "com.king.farmheroessaga": 0.0, + "com.tinder": 0.0, + "com.ic.ek77_85": 332.45, + "app.source.getcontact": 0.0, + "com.esprit.rpg.lttlefirykng": 2062.15, + "com.ravi36.castr5": 91.75, + "com.mobile.legends": 0.0, + "br.com.mercadobitcoin.android": 0.0, + "com.WeWorld.WeCard": 0.0, + "ru.uteka.app": 537.6, + "com.pinjoy.game.app": 47.65, + "com.neptune.domino": 0.0, + "com.royalplay.speedx8": 0.0, + "com.neptune.ludo": 0.0, + "ru.hh.android": 0.0, + "com.yogame.com": 272.5, + "com.pepolicity.tongitsclubs": 0.0, + "com.playmate.playzone": 2.4, + "com.icemobile.lenta.prod": 0.0, + "global.fwd.omne": 0.0, + "com.gp.hcr.moc": 0.0, + "com.uma.musicvk": 1466.5, + "com.gloriajeans.mobile": 1976.73, + "com.trademaxaustralia.tmgm": 30.0, + "com.mukuru.customer.android": 532.8, + "com.royal.mahjong": 0.0, + "com.exness.android.pa": 0.0, + "com.MadOut.BIG": 0.0, + "com.oakever.tiletrip": 0.3, + "com.krom.android": 7727.36, + "com.rk55.com2": 0.0, + "com.espritgames.rpg.chsrgn": 16.65, + "com.balancehero.truebalance": 0.0, + "com.ai.Daxin": 7.05, + "com.kreditpintar": 0.0, + "com.quick.loan.center.vay.mau": 217.5, + "com.vk.love": 3774.5401, + "com.huoys.royalcasinoonline": 0.0, + "com.vitastudio.mahjong": 0.3, + "com.notissimus.allinstruments.android": 1163.05, + "com.fgrsdakiufvgds.triunjvbggew": 71.27, + "ph.manginasal.order": 0.0, + "ru.ozon.app.android": 19725.9302, + "com.id6javo88.ntla59": 0.5, + "com.krrave.customer": 0.0, + "com.taxsee.taxsee": 0.0, + "com.luizalabs.mlapp": 0.0, + "com.avito.android": 0.0, + "ph.atome.paylater": 0.0, + "com.game77.fun.m9x": 0.0, + "com.levelinfinite.sgameGlobal": 0.5, + "com.bitget.exchange": 0.0, + "ph.onlineloans.mobile.android": 0.0, + "com.alibaba.aliexpresshd": 76.86, + "ru.ok.dating": 0.0, + "com.tencent.ig": 784.322, + "ru.ritmmedia.yappy": 0.0, + "com.sd.tamcgbh": 0.0, + "com.unicostudio.braintest2new": 0.0, + "com.pinjamango": 346.4, + "com.thof.stormrone": 0.0, + "com.addictivegames.jnw": 0.0, + "com.urpxf.mdsig": 0.0, + "pk.pakrummy24.app": 99.25, + "com.rkgg.com2": 83.87, + "com.igg.android.doomsdaylastsurvivors": 0.0, + "com.novapontocom.casasbahia": 0.0 }, - "total_cost": 863.5 + "total_cost": 262622.4445, + "fetched_date": "2026-09-01", + "lag_days": 0, + "stale": false }, "totals": { - "installs": 1082314.0, - "impressions": 663033.0, - "revenue": 675232.93, - "cost": 255.35, + "installs": 1112225.0, + "impressions": 681209.0, + "revenue": 692003.57, + "cost": 149600.5908, "target_revenue": 836050.0, "target_gp": 595439.0, - "gp": 674977.58, - "gp_rate": 99.96, + "gp": 542402.9792, + "gp_rate": 78.38, "completion": { - "revenue": 80.76, - "gp": 113.36 + "revenue": 82.77, + "gp": 91.09 } }, "accounts": [ @@ -61,12 +266,12 @@ ], "data_cutoff": null, "actual": { - "installs": 254017.0, + "installs": 262375.0, "impressions": 0, - "revenue": 104065.69, - "cost": null, - "gp": null, - "gp_rate": null + "revenue": 107260.9, + "cost": 40883.0306, + "gp": 66377.8694, + "gp_rate": 61.88 }, "target": { "revenue": 329376.0, @@ -74,38 +279,37 @@ "gp_rate": 64.0 }, "completion": { - "revenue": 31.59, - "gp": null + "revenue": 32.56, + "gp": 31.49 }, "missing_pkgs": [ - "com.king.candycrushsaga", "com.king.candycrushsodasaga" ], "campaigns": [ { "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", "metric": "install", - "installs": 28092.0, + "installs": 29089.0, "impressions": 0, - "revenue": 29462.8, - "ecpi": 1.0488, + "revenue": 30462.8, + "ecpi": 1.0472, "ecpm": null }, { "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", "metric": "install", - "installs": 71817.0, + "installs": 74176.0, "impressions": 0, - "revenue": 21545.1, + "revenue": 22252.8, "ecpi": 0.3, "ecpm": null }, { "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", "metric": "install", - "installs": 70284.0, + "installs": 73242.0, "impressions": 0, - "revenue": 21085.2, + "revenue": 21972.6, "ecpi": 0.3, "ecpm": null }, @@ -121,27 +325,27 @@ { "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", "metric": "install", - "installs": 12178.0, + "installs": 12579.0, "impressions": 0, - "revenue": 9162.11, - "ecpi": 0.7523, + "revenue": 9482.91, + "ecpi": 0.7539, "ecpm": null }, { "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", "metric": "install", - "installs": 52429.0, + "installs": 53960.0, "impressions": 0, - "revenue": 8753.21, + "revenue": 9013.48, "ecpi": 0.167, "ecpm": null }, { "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", "metric": "install", - "installs": 4896.0, + "installs": 5008.0, "impressions": 0, - "revenue": 832.32, + "revenue": 851.36, "ecpi": 0.17, "ecpm": null } @@ -387,6 +591,14 @@ "impressions": 0, "revenue": 881.4 }, + { + "date": "2026-08-31", + "campaign": "CCS_MY_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2958.0, + "impressions": 0, + "revenue": 887.4 + }, { "date": "2026-08-01", "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", @@ -627,6 +839,14 @@ "impressions": 0, "revenue": 1000.0 }, + { + "date": "2026-08-31", + "campaign": "ccs_de_android_test12112024_bauna_ua_kbroad_all_cpi", + "metric": "install", + "installs": 997.0, + "impressions": 0, + "revenue": 1000.0 + }, { "date": "2026-08-01", "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", @@ -867,6 +1087,14 @@ "impressions": 0, "revenue": 852.9 }, + { + "date": "2026-08-31", + "campaign": "CCS_TH_ANDROID_TTEST_SHAREIT_15012024", + "metric": "install", + "installs": 2359.0, + "impressions": 0, + "revenue": 707.7 + }, { "date": "2026-08-01", "campaign": "ccss_us_android_test16122025_bauna_ua_ all_all_cpi", @@ -1251,6 +1479,14 @@ "impressions": 0, "revenue": 352.8 }, + { + "date": "2026-08-31", + "campaign": "ccss_DE_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 401.0, + "impressions": 0, + "revenue": 320.8 + }, { "date": "2026-08-01", "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", @@ -1491,6 +1727,14 @@ "impressions": 0, "revenue": 23.46 }, + { + "date": "2026-08-31", + "campaign": "ccss_TH_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 112.0, + "impressions": 0, + "revenue": 19.04 + }, { "date": "2026-08-01", "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", @@ -1730,6 +1974,14 @@ "installs": 1931.0, "impressions": 0, "revenue": 300.0 + }, + { + "date": "2026-08-31", + "campaign": "ccss_BR_android_test16122025_bauna_ua_ all_all_cpi", + "metric": "install", + "installs": 1531.0, + "impressions": 0, + "revenue": 260.27 } ] }, @@ -1743,9 +1995,9 @@ ], "data_cutoff": "2026-08-23", "actual": { - "installs": 350757.0, + "installs": 358923.0, "impressions": 0, - "revenue": 278415.27, + "revenue": 284524.3, "cost": null, "gp": null, "gp_rate": null @@ -1756,7 +2008,7 @@ "gp_rate": 72.0 }, "completion": { - "revenue": 113.17, + "revenue": 115.66, "gp": null }, "missing_pkgs": [ @@ -1766,19 +2018,19 @@ { "campaign": "Amazon BR", "metric": "install", - "installs": 138890.0, + "installs": 141232.0, "impressions": 0, - "revenue": 150604.27, + "revenue": 153143.8, "ecpi": 1.0843, "ecpm": null }, { "campaign": "Amazon MENA", "metric": "install", - "installs": 174071.0, + "installs": 179895.0, "impressions": 0, - "revenue": 107732.0, - "ecpi": 0.6189, + "revenue": 111301.5, + "ecpi": 0.6187, "ecpm": null }, { @@ -2216,6 +2468,14 @@ "impressions": 0, "revenue": 2938.0 }, + { + "date": "2026-08-31", + "campaign": "Amazon MENA", + "metric": "install", + "installs": 5824.0, + "impressions": 0, + "revenue": 3569.5 + }, { "date": "2026-08-01", "campaign": "Amazon BR", @@ -2455,6 +2715,14 @@ "installs": 2131.0, "impressions": 0, "revenue": 2310.73 + }, + { + "date": "2026-08-31", + "campaign": "Amazon BR", + "metric": "install", + "installs": 2342.0, + "impressions": 0, + "revenue": 2539.53 } ] }, @@ -2468,12 +2736,12 @@ ], "data_cutoff": null, "actual": { - "installs": 190841.0, + "installs": 192400.0, "impressions": 0, - "revenue": 133588.7, - "cost": null, - "gp": null, - "gp_rate": null + "revenue": 134680.0, + "cost": 34477.5699, + "gp": 100202.4301, + "gp_rate": 74.4 }, "target": { "revenue": 140678.0, @@ -2481,19 +2749,17 @@ "gp_rate": 80.0 }, "completion": { - "revenue": 94.96, - "gp": null + "revenue": 95.74, + "gp": 89.04 }, - "missing_pkgs": [ - "ru.aliexpress.buyer" - ], + "missing_pkgs": [], "campaigns": [ { "campaign": "AliExpress", "metric": "install", - "installs": 190841.0, + "installs": 192400.0, "impressions": 0, - "revenue": 133588.7, + "revenue": 134680.0, "ecpi": 0.7, "ecpm": null } @@ -2503,9 +2769,9 @@ "date": "2026-08-01", "campaign": "AliExpress", "metric": "install", - "installs": 5573.0, + "installs": 5574.0, "impressions": 0, - "revenue": 3901.1 + "revenue": 3901.8 }, { "date": "2026-08-02", @@ -2519,41 +2785,41 @@ "date": "2026-08-03", "campaign": "AliExpress", "metric": "install", - "installs": 5888.0, + "installs": 5893.0, "impressions": 0, - "revenue": 4121.6 + "revenue": 4125.1 }, { "date": "2026-08-04", "campaign": "AliExpress", "metric": "install", - "installs": 6327.0, + "installs": 6329.0, "impressions": 0, - "revenue": 4428.9 + "revenue": 4430.3 }, { "date": "2026-08-05", "campaign": "AliExpress", "metric": "install", - "installs": 6166.0, + "installs": 6167.0, "impressions": 0, - "revenue": 4316.2 + "revenue": 4316.9 }, { "date": "2026-08-06", "campaign": "AliExpress", "metric": "install", - "installs": 6520.0, + "installs": 6521.0, "impressions": 0, - "revenue": 4564.0 + "revenue": 4564.7 }, { "date": "2026-08-07", "campaign": "AliExpress", "metric": "install", - "installs": 5997.0, + "installs": 6001.0, "impressions": 0, - "revenue": 4197.9 + "revenue": 4200.7 }, { "date": "2026-08-08", @@ -2567,177 +2833,185 @@ "date": "2026-08-09", "campaign": "AliExpress", "metric": "install", - "installs": 6341.0, + "installs": 6344.0, "impressions": 0, - "revenue": 4438.7 + "revenue": 4440.8 }, { "date": "2026-08-10", "campaign": "AliExpress", "metric": "install", - "installs": 6670.0, + "installs": 6676.0, "impressions": 0, - "revenue": 4669.0 + "revenue": 4673.2 }, { "date": "2026-08-11", "campaign": "AliExpress", "metric": "install", - "installs": 5928.0, + "installs": 5932.0, "impressions": 0, - "revenue": 4149.6 + "revenue": 4152.4 }, { "date": "2026-08-12", "campaign": "AliExpress", "metric": "install", - "installs": 6059.0, + "installs": 6060.0, "impressions": 0, - "revenue": 4241.3 + "revenue": 4242.0 }, { "date": "2026-08-13", "campaign": "AliExpress", "metric": "install", - "installs": 5798.0, + "installs": 5802.0, "impressions": 0, - "revenue": 4058.6 + "revenue": 4061.4 }, { "date": "2026-08-14", "campaign": "AliExpress", "metric": "install", - "installs": 5708.0, + "installs": 5711.0, "impressions": 0, - "revenue": 3995.6 + "revenue": 3997.7 }, { "date": "2026-08-15", "campaign": "AliExpress", "metric": "install", - "installs": 6424.0, + "installs": 6425.0, "impressions": 0, - "revenue": 4496.8 + "revenue": 4497.5 }, { "date": "2026-08-16", "campaign": "AliExpress", "metric": "install", - "installs": 6972.0, + "installs": 6975.0, "impressions": 0, - "revenue": 4880.4 + "revenue": 4882.5 }, { "date": "2026-08-17", "campaign": "AliExpress", "metric": "install", - "installs": 7494.0, + "installs": 7495.0, "impressions": 0, - "revenue": 5245.8 + "revenue": 5246.5 }, { "date": "2026-08-18", "campaign": "AliExpress", "metric": "install", - "installs": 7385.0, + "installs": 7386.0, "impressions": 0, - "revenue": 5169.5 + "revenue": 5170.2 }, { "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-20", + "campaign": "AliExpress", + "metric": "install", + "installs": 7151.0, + "impressions": 0, + "revenue": 5005.7 + }, + { + "date": "2026-08-21", + "campaign": "AliExpress", + "metric": "install", + "installs": 7295.0, + "impressions": 0, + "revenue": 5106.5 + }, + { + "date": "2026-08-22", + "campaign": "AliExpress", + "metric": "install", + "installs": 7321.0, + "impressions": 0, + "revenue": 5124.7 + }, + { + "date": "2026-08-23", + "campaign": "AliExpress", + "metric": "install", + "installs": 7922.0, + "impressions": 0, + "revenue": 5545.4 + }, { "date": "2026-08-24", "campaign": "AliExpress", "metric": "install", - "installs": 7612.0, + "installs": 7618.0, "impressions": 0, - "revenue": 5328.4 + "revenue": 5332.6 }, { "date": "2026-08-25", "campaign": "AliExpress", "metric": "install", - "installs": 6837.0, + "installs": 6844.0, "impressions": 0, - "revenue": 4785.9 + "revenue": 4790.8 }, { "date": "2026-08-26", "campaign": "AliExpress", "metric": "install", - "installs": 6510.0, + "installs": 6512.0, "impressions": 0, - "revenue": 4557.0 + "revenue": 4558.4 }, { "date": "2026-08-27", "campaign": "AliExpress", "metric": "install", - "installs": 5421.0, + "installs": 5427.0, "impressions": 0, - "revenue": 3794.7 + "revenue": 3798.9 }, { "date": "2026-08-28", "campaign": "AliExpress", "metric": "install", - "installs": 4828.0, + "installs": 4830.0, "impressions": 0, - "revenue": 3379.6 + "revenue": 3381.0 }, { "date": "2026-08-29", "campaign": "AliExpress", "metric": "install", - "installs": 5263.0, + "installs": 5269.0, "impressions": 0, - "revenue": 3684.1 + "revenue": 3688.3 }, { "date": "2026-08-30", "campaign": "AliExpress", "metric": "install", - "installs": 3610.0, + "installs": 5083.0, "impressions": 0, - "revenue": 2527.0 + "revenue": 3558.1 + }, + { + "date": "2026-08-31", + "campaign": "AliExpress", + "metric": "install", + "installs": 0.0, + "impressions": 0, + "revenue": 0.0 } ] }, @@ -2753,12 +3027,12 @@ ], "data_cutoff": null, "actual": { - "installs": 83165.0, + "installs": 85650.0, "impressions": 0, - "revenue": 33865.72, - "cost": null, - "gp": null, - "gp_rate": null + "revenue": 34953.94, + "cost": 12963.5801, + "gp": 21990.3599, + "gp_rate": 62.91 }, "target": { "revenue": 56580.0, @@ -2766,39 +3040,35 @@ "gp_rate": 85.0 }, "completion": { - "revenue": 59.85, - "gp": null + "revenue": 61.78, + "gp": 45.72 }, - "missing_pkgs": [ - "ru.mail.cloud", - "com.vk.love", - "com.uma.musicvk" - ], + "missing_pkgs": [], "campaigns": [ { "campaign": "MailCloud", "metric": "install", - "installs": 40676.0, + "installs": 42178.0, "impressions": 0, - "revenue": 14236.6, + "revenue": 14762.3, "ecpi": 0.35, "ecpm": null }, { "campaign": "VkLove", "metric": "install", - "installs": 18410.0, + "installs": 19094.0, "impressions": 0, - "revenue": 12887.0, + "revenue": 13365.8, "ecpi": 0.7, "ecpm": null }, { "campaign": "VKmusic", "metric": "install", - "installs": 24079.0, + "installs": 24378.0, "impressions": 0, - "revenue": 6742.12, + "revenue": 6825.84, "ecpi": 0.28, "ecpm": null } @@ -3044,6 +3314,14 @@ "impressions": 0, "revenue": 441.7 }, + { + "date": "2026-08-31", + "campaign": "MailCloud", + "metric": "install", + "installs": 1502.0, + "impressions": 0, + "revenue": 525.7 + }, { "date": "2026-08-01", "campaign": "VkLove", @@ -3284,6 +3562,14 @@ "impressions": 0, "revenue": 545.3 }, + { + "date": "2026-08-31", + "campaign": "VkLove", + "metric": "install", + "installs": 684.0, + "impressions": 0, + "revenue": 478.8 + }, { "date": "2026-08-01", "campaign": "VKmusic", @@ -3523,6 +3809,14 @@ "installs": 317.0, "impressions": 0, "revenue": 88.76 + }, + { + "date": "2026-08-31", + "campaign": "VKmusic", + "metric": "install", + "installs": 299.0, + "impressions": 0, + "revenue": 83.72 } ] }, @@ -3538,12 +3832,12 @@ ], "data_cutoff": null, "actual": { - "installs": 140894.0, + "installs": 147950.0, "impressions": 0, - "revenue": 69763.34, - "cost": 255.35, - "gp": 69507.99, - "gp_rate": 99.63 + "revenue": 73665.46, + "cost": 39411.9203, + "gp": 34253.5397, + "gp_rate": 46.5 }, "target": { "revenue": 17713.0, @@ -3551,39 +3845,36 @@ "gp_rate": 66.0 }, "completion": { - "revenue": 393.85, - "gp": 594.54 + "revenue": 415.88, + "gp": 292.99 }, - "missing_pkgs": [ - "com.yandex.bank", - "com.yandex.lavka" - ], + "missing_pkgs": [], "campaigns": [ { "campaign": "YandexBank", "metric": "install", - "installs": 67951.0, + "installs": 72375.0, "impressions": 0, - "revenue": 47475.05, - "ecpi": 0.6987, + "revenue": 50616.65, + "ecpi": 0.6994, "ecpm": null }, { "campaign": "YandexWeather", "metric": "install", - "installs": 31337.0, + "installs": 32509.0, "impressions": 0, - "revenue": 13440.29, - "ecpi": 0.4289, + "revenue": 13920.81, + "ecpi": 0.4282, "ecpm": null }, { "campaign": "YandexLavka", "metric": "install", - "installs": 41606.0, + "installs": 43066.0, "impressions": 0, - "revenue": 8848.0, - "ecpi": 0.2127, + "revenue": 9128.0, + "ecpi": 0.212, "ecpm": null } ], @@ -3828,6 +4119,14 @@ "impressions": 0, "revenue": 2468.4 }, + { + "date": "2026-08-31", + "campaign": "YandexBank", + "metric": "install", + "installs": 4424.0, + "impressions": 0, + "revenue": 3141.6 + }, { "date": "2026-08-01", "campaign": "YandexLavka", @@ -4068,6 +4367,14 @@ "impressions": 0, "revenue": 224.0 }, + { + "date": "2026-08-31", + "campaign": "YandexLavka", + "metric": "install", + "installs": 1460.0, + "impressions": 0, + "revenue": 280.0 + }, { "date": "2026-08-01", "campaign": "YandexWeather", @@ -4272,9 +4579,9 @@ "date": "2026-08-26", "campaign": "YandexWeather", "metric": "install", - "installs": 849.0, + "installs": 850.0, "impressions": 0, - "revenue": 348.09 + "revenue": 348.5 }, { "date": "2026-08-27", @@ -4288,25 +4595,33 @@ "date": "2026-08-28", "campaign": "YandexWeather", "metric": "install", - "installs": 859.0, + "installs": 860.0, "impressions": 0, - "revenue": 352.19 + "revenue": 352.6 }, { "date": "2026-08-29", "campaign": "YandexWeather", "metric": "install", - "installs": 1126.0, + "installs": 1128.0, "impressions": 0, - "revenue": 461.66 + "revenue": 462.48 }, { "date": "2026-08-30", "campaign": "YandexWeather", "metric": "install", - "installs": 1217.0, + "installs": 1221.0, "impressions": 0, - "revenue": 498.97 + "revenue": 500.61 + }, + { + "date": "2026-08-31", + "campaign": "YandexWeather", + "metric": "install", + "installs": 1164.0, + "impressions": 0, + "revenue": 477.24 } ] }, @@ -4321,9 +4636,9 @@ ], "data_cutoff": null, "actual": { - "installs": 3978.0, - "impressions": 663033.0, - "revenue": 10447.57, + "installs": 4109.0, + "impressions": 681209.0, + "revenue": 10758.37, "cost": null, "gp": null, "gp_rate": null @@ -4334,7 +4649,7 @@ "gp_rate": 100.0 }, "completion": { - "revenue": 48.04, + "revenue": 49.47, "gp": null }, "missing_pkgs": [ @@ -4346,17 +4661,17 @@ "campaign": "CapitecFuneral", "metric": "impression", "installs": 0, - "impressions": 663033.0, - "revenue": 6027.57, + "impressions": 681209.0, + "revenue": 6192.81, "ecpi": null, "ecpm": 9.0909 }, { "campaign": "Nedbank", "metric": "install", - "installs": 3978.0, + "installs": 4109.0, "impressions": 0, - "revenue": 4420.0, + "revenue": 4565.56, "ecpi": 1.1111, "ecpm": null } @@ -4602,6 +4917,14 @@ "impressions": 0, "revenue": 133.33 }, + { + "date": "2026-08-31", + "campaign": "Nedbank", + "metric": "install", + "installs": 131.0, + "impressions": 0, + "revenue": 145.56 + }, { "date": "2026-08-03", "campaign": "CapitecFuneral", @@ -4825,6 +5148,14 @@ "installs": 0, "impressions": 18033.0, "revenue": 163.94 + }, + { + "date": "2026-08-31", + "campaign": "CapitecFuneral", + "metric": "impression", + "installs": 0, + "impressions": 18176.0, + "revenue": 165.24 } ] }, @@ -4838,12 +5169,12 @@ ], "data_cutoff": null, "actual": { - "installs": 15918.0, + "installs": 16158.0, "impressions": 0, - "revenue": 31836.0, - "cost": null, - "gp": null, - "gp_rate": null + "revenue": 32316.0, + "cost": 15158.6999, + "gp": 17157.3001, + "gp_rate": 53.09 }, "target": { "revenue": 11268.0, @@ -4851,19 +5182,17 @@ "gp_rate": 63.0 }, "completion": { - "revenue": 282.53, - "gp": null + "revenue": 286.79, + "gp": 241.69 }, - "missing_pkgs": [ - "sports.caliente.mx.calientedeportes" - ], + "missing_pkgs": [], "campaigns": [ { "campaign": "Caliente", "metric": "install", - "installs": 15918.0, + "installs": 16158.0, "impressions": 0, - "revenue": 31836.0, + "revenue": 32316.0, "ecpi": 2.0, "ecpm": null } @@ -5108,6 +5437,14 @@ "installs": 331.0, "impressions": 0, "revenue": 662.0 + }, + { + "date": "2026-08-31", + "campaign": "Caliente", + "metric": "install", + "installs": 240.0, + "impressions": 0, + "revenue": 480.0 } ] }, @@ -5121,12 +5458,12 @@ ], "data_cutoff": null, "actual": { - "installs": 42744.0, + "installs": 44660.0, "impressions": 0, - "revenue": 13250.64, - "cost": null, - "gp": null, - "gp_rate": null + "revenue": 13844.6, + "cost": 6705.79, + "gp": 7138.81, + "gp_rate": 51.56 }, "target": { "revenue": 12682.0, @@ -5134,19 +5471,17 @@ "gp_rate": 50.0 }, "completion": { - "revenue": 104.48, - "gp": null + "revenue": 109.17, + "gp": 112.58 }, - "missing_pkgs": [ - "tech.jm" - ], + "missing_pkgs": [], "campaigns": [ { "campaign": "Joom", "metric": "install", - "installs": 42744.0, + "installs": 44660.0, "impressions": 0, - "revenue": 13250.64, + "revenue": 13844.6, "ecpi": 0.31, "ecpm": null } @@ -5391,6 +5726,14 @@ "installs": 2037.0, "impressions": 0, "revenue": 631.47 + }, + { + "date": "2026-08-31", + "campaign": "Joom", + "metric": "install", + "installs": 1916.0, + "impressions": 0, + "revenue": 593.96 } ] }, diff --git a/index.html b/index.html index 24b580e..d4f198b 100644 --- a/index.html +++ b/index.html @@ -33,6 +33,8 @@ tr.link{cursor:pointer}tr.link:hover{background:#f8fafc} .bar>b{position:relative;display:block;text-align:right;padding-right:4px;font-size:11px;line-height:16px} .bar.over>i{background:var(--blue)}.bar.low>i{background:var(--pink)} .notes{font-size:11px;color:#94a3b8;margin-top:8px;line-height:1.8} +.alert{margin-top:14px;padding:13px 16px;border-radius:12px;border:1px solid #fecaca;background:#fef2f2;color:#b42318;font-size:12px;line-height:1.8} +.alert b{color:#991b1b} .error{margin:40px auto;max-width:700px;text-align:center;padding:44px;color:#b42318} .footer{text-align:center;color:#94a3b8;font-size:11px;margin:18px} @media(max-width:1100px){.grid{grid-template-columns:repeat(3,1fr)}} @@ -40,6 +42,7 @@ tr.link{cursor:pointer}tr.link:hover{background:#f8fafc}

Top10 KA · FFR 与 GP

正在加载数据…

数据加载中
+
@@ -254,6 +257,21 @@ function renderView(){ drawChart(item); } +/* Cost 抓取时间晚于数据周期时提示,避免误用滞后的 GP */ +function renderAlert(){ + const sands=report.sands||{},p=report.period||{},box=$('alert'); + const messages=[]; + if(!sands.by_pkg&&!ok(sands.total_cost)) + messages.push('Cost 数据缺失:尚未抓取 Sands,GP 与 GP rate 无法计算。'); + else if(sands.stale) + messages.push(`Cost 数据滞后:Sands 抓取于 ${esc(sands.fetched_date||String(sands.fetched_at||'').slice(0,10))},` + +`数据周期到 ${esc(p.end||'—')},滞后约 ${num(sands.lag_days)} 天。` + +'GP 与完成率会偏高,请重新抓取后再用于汇报。'); + if(sands.carried_over) + messages.push('Cost 沿用上次抓取值:本次更新未包含新的 Sands 数据。'); + box.innerHTML=messages.length?`
${messages.join('
')}
`:''; +} + function render(){ const p=report.period||{},sands=report.sands||{}; $('period').textContent=`${p.start||'—'} 至 ${p.end||'—'} · ${num(p.days)}/${num(p.month_days)} 天 · 时间进度 ${pct(p.time_progress_percent)}`; @@ -261,7 +279,7 @@ function render(){ if(sands.fetched_at)parts.push(`Sands Cost 抓取于 ${esc(String(sands.fetched_at).replace('T',' '))}`); if(sands.carried_over)parts.push('Cost 沿用上次抓取值'); $('updated').innerHTML=parts.join('
'); - renderTabs();renderView(); + renderAlert();renderTabs();renderView(); } window.addEventListener('resize',()=>{if(report&¤t!=='overview')drawChart(findAccount(current))}); diff --git a/update_report_data.py b/update_report_data.py index 4f00380..83a4877 100644 --- a/update_report_data.py +++ b/update_report_data.py @@ -576,13 +576,35 @@ def main(): sheets = config["sheets"] now = datetime.now(TIMEZONE) - end_date = now.date() - timedelta(days=1) - start_date = end_date.replace(day=1) + # 默认当月 1 号至昨天;--month YYYY-MM 可指定月份(如已结束的月份则取整月) + month_arg = next((item.split("=", 1)[-1] for item in sys.argv[2:] if item.startswith("--month")), None) + if month_arg: + year, month = (int(part) for part in month_arg.split("-")[:2]) + start_date = datetime(year, month, 1).date() + else: + start_date = (now.date() - timedelta(days=1)).replace(day=1) + month_end = (start_date.replace(day=28) + timedelta(days=4)).replace(day=1) - timedelta(days=1) + end_date = min(month_end, now.date() - timedelta(days=1)) + if end_date < start_date: + raise SystemExit(f"指定月份 {start_date:%Y-%m} 尚无已结束的日期") days = (end_date - start_date).days + 1 - month_days = ((start_date.replace(day=28) + timedelta(days=4)).replace(day=1) - timedelta(days=1)).day + month_days = month_end.day print(f"取数范围:{start_date} 至 {end_date}({days}/{month_days} 天)") sands = load_sands() + # 判断 Cost 是否滞后于数据周期:抓取日在周期结束日当天或更早,说明未覆盖完整周期 + if sands and sands.get("fetched_at"): + try: + fetched = datetime.fromisoformat(sands["fetched_at"]).date() + except ValueError: + fetched = None + if fetched: + sands["fetched_date"] = fetched.isoformat() + lag = (end_date - fetched).days + 1 + sands["lag_days"] = max(0, lag) + sands["stale"] = lag > 0 + if sands["stale"]: + print(f"警告:Sands Cost 抓取于 {fetched},可能未覆盖到 {end_date},滞后约 {lag} 天") try: target_rows, _ = fetch_rows(config["target_spreadsheet_id"], config["target_gid"]) targets = read_targets(target_rows)