From 838b7a844b2dd91f816fd6518e827b75c35d7ae6 Mon Sep 17 00:00:00 2001 From: zouyun Date: Mon, 24 Aug 2026 16:51:55 +0800 Subject: [PATCH] Refine Amazon ZA daily tracker --- data.json | 189 ++++++++++++++++++++++++++++++++--------------------- index.html | 32 ++++----- update.sh | 34 ++++++++-- 3 files changed, 161 insertions(+), 94 deletions(-) diff --git a/data.json b/data.json index 6c1df36..53dfa9d 100644 --- a/data.json +++ b/data.json @@ -2,18 +2,18 @@ "meta": { "package": "com.amazon.mShop.android.shopping", "geo": "ZA", - "generated_at": "2026-08-24T08:27:15+00:00", + "generated_at": "2026-08-24T08:51:01+00:00", "date_start": "2026-08-01", "date_end": "2026-08-31", "data_cutoff": "2026-08-23", "currency": "USD", - "install_definition": "af_app_opened repostback", + "install_definition": "delivery repostback (attributed installs); af_app_opened excluded", "event_definition": "event1/event2 repostback", "rate_definition": "(event1 + event2) / Install", "payable_definition": "(event1 + event2) × $3" }, "totals": { - "install": 39149, + "install": 37796, "event1": 6208, "event2": 485, "e1e2": 6693, @@ -21,7 +21,7 @@ "midas_spend_zar": 321115.9, "payable_spend": 20079, "payable_spend_zar": 331303.5, - "e1e2_rate": 17.1 + "e1e2_rate": 17.71 }, "budget": { "monthly_budget_zar": 511500.0, @@ -43,17 +43,18 @@ "required_daily_budget_zar": 22524.56, "required_daily_events": 455, "projected_month_spend_zar": 446539.5, - "projected_month_variance_zar": 64960.5 + "projected_month_variance_zar": 64960.5, + "mtd_expected_ffr": 77.42 }, "daily": [ { "date": "2026-08-01", "is_actual": true, - "install": 1520, + "install": 1440, "event1": 281, "event2": 23, "e1e2": 304, - "e1e2_rate": 20.0, + "e1e2_rate": 21.11, "midas_spend": 920.34, "midas_spend_zar": 15185.61, "payable_spend": 912, @@ -61,16 +62,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 91.2, - "ecpi_usd": 0.6055 + "ecpi_usd": 0.6391 }, { "date": "2026-08-02", "is_actual": true, - "install": 1733, + "install": 1621, "event1": 94, "event2": 26, "e1e2": 120, - "e1e2_rate": 6.92, + "e1e2_rate": 7.4, "midas_spend": 1036.81, "midas_spend_zar": 17107.36, "payable_spend": 360, @@ -78,16 +79,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 36.0, - "ecpi_usd": 0.5983 + "ecpi_usd": 0.6396 }, { "date": "2026-08-03", "is_actual": true, - "install": 1781, + "install": 1652, "event1": 432, "event2": 26, "e1e2": 458, - "e1e2_rate": 25.72, + "e1e2_rate": 27.72, "midas_spend": 963.34, "midas_spend_zar": 15895.11, "payable_spend": 1374, @@ -95,16 +96,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 137.4, - "ecpi_usd": 0.5409 + "ecpi_usd": 0.5831 }, { "date": "2026-08-04", "is_actual": true, - "install": 1661, + "install": 1625, "event1": 170, "event2": 36, "e1e2": 206, - "e1e2_rate": 12.4, + "e1e2_rate": 12.68, "midas_spend": 686.46, "midas_spend_zar": 11326.59, "payable_spend": 618, @@ -112,16 +113,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 61.8, - "ecpi_usd": 0.4133 + "ecpi_usd": 0.4224 }, { "date": "2026-08-05", "is_actual": true, - "install": 1622, + "install": 1545, "event1": 141, "event2": 36, "e1e2": 177, - "e1e2_rate": 10.91, + "e1e2_rate": 11.46, "midas_spend": 651.98, "midas_spend_zar": 10757.67, "payable_spend": 531, @@ -129,12 +130,12 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 53.1, - "ecpi_usd": 0.402 + "ecpi_usd": 0.422 }, { "date": "2026-08-06", "is_actual": true, - "install": 1397, + "install": 1420, "event1": 0, "event2": 0, "e1e2": 0, @@ -146,16 +147,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 0.0, - "ecpi_usd": 0.4275 + "ecpi_usd": 0.4206 }, { "date": "2026-08-07", "is_actual": true, - "install": 1870, + "install": 1517, "event1": 516, "event2": 36, "e1e2": 552, - "e1e2_rate": 29.52, + "e1e2_rate": 36.39, "midas_spend": 637.97, "midas_spend_zar": 10526.51, "payable_spend": 1656, @@ -163,16 +164,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 165.6, - "ecpi_usd": 0.3412 + "ecpi_usd": 0.4205 }, { "date": "2026-08-08", "is_actual": true, - "install": 1506, + "install": 1435, "event1": 196, "event2": 27, "e1e2": 223, - "e1e2_rate": 14.81, + "e1e2_rate": 15.54, "midas_spend": 603.36, "midas_spend_zar": 9955.44, "payable_spend": 669, @@ -180,16 +181,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 66.9, - "ecpi_usd": 0.4006 + "ecpi_usd": 0.4205 }, { "date": "2026-08-09", "is_actual": true, - "install": 1633, + "install": 1569, "event1": 325, "event2": 6, "e1e2": 331, - "e1e2_rate": 20.27, + "e1e2_rate": 21.1, "midas_spend": 659.2, "midas_spend_zar": 10876.8, "payable_spend": 993, @@ -197,16 +198,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 99.3, - "ecpi_usd": 0.4037 + "ecpi_usd": 0.4201 }, { "date": "2026-08-10", "is_actual": true, - "install": 1661, + "install": 1634, "event1": 242, "event2": 20, "e1e2": 262, - "e1e2_rate": 15.77, + "e1e2_rate": 16.03, "midas_spend": 727.32, "midas_spend_zar": 12000.78, "payable_spend": 786, @@ -214,16 +215,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 78.6, - "ecpi_usd": 0.4379 + "ecpi_usd": 0.4451 }, { "date": "2026-08-11", "is_actual": true, - "install": 1668, + "install": 1617, "event1": 227, "event2": 16, "e1e2": 243, - "e1e2_rate": 14.57, + "e1e2_rate": 15.03, "midas_spend": 871.5, "midas_spend_zar": 14379.75, "payable_spend": 729, @@ -231,16 +232,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 72.9, - "ecpi_usd": 0.5225 + "ecpi_usd": 0.539 }, { "date": "2026-08-12", "is_actual": true, - "install": 1650, + "install": 1635, "event1": 266, "event2": 22, "e1e2": 288, - "e1e2_rate": 17.45, + "e1e2_rate": 17.61, "midas_spend": 881.7, "midas_spend_zar": 14548.05, "payable_spend": 864, @@ -248,16 +249,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 86.4, - "ecpi_usd": 0.5344 + "ecpi_usd": 0.5393 }, { "date": "2026-08-13", "is_actual": true, - "install": 1543, + "install": 1535, "event1": 41, "event2": 5, "e1e2": 46, - "e1e2_rate": 2.98, + "e1e2_rate": 3.0, "midas_spend": 827.89, "midas_spend_zar": 13660.18, "payable_spend": 138, @@ -265,16 +266,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 13.8, - "ecpi_usd": 0.5365 + "ecpi_usd": 0.5393 }, { "date": "2026-08-14", "is_actual": true, - "install": 1677, + "install": 1660, "event1": 176, "event2": 23, "e1e2": 199, - "e1e2_rate": 11.87, + "e1e2_rate": 11.99, "midas_spend": 895.51, "midas_spend_zar": 14775.91, "payable_spend": 597, @@ -282,16 +283,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 59.7, - "ecpi_usd": 0.534 + "ecpi_usd": 0.5395 }, { "date": "2026-08-15", "is_actual": true, - "install": 1839, + "install": 1822, "event1": 373, "event2": 15, "e1e2": 388, - "e1e2_rate": 21.1, + "e1e2_rate": 21.3, "midas_spend": 983.11, "midas_spend_zar": 16221.32, "payable_spend": 1164, @@ -299,16 +300,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 116.4, - "ecpi_usd": 0.5346 + "ecpi_usd": 0.5396 }, { "date": "2026-08-16", "is_actual": true, - "install": 1809, + "install": 1800, "event1": 273, "event2": 72, "e1e2": 345, - "e1e2_rate": 19.07, + "e1e2_rate": 19.17, "midas_spend": 971.76, "midas_spend_zar": 16034.04, "payable_spend": 1035, @@ -316,16 +317,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 103.5, - "ecpi_usd": 0.5372 + "ecpi_usd": 0.5399 }, { "date": "2026-08-17", "is_actual": true, - "install": 1675, + "install": 1683, "event1": 266, "event2": 8, "e1e2": 274, - "e1e2_rate": 16.36, + "e1e2_rate": 16.28, "midas_spend": 908.82, "midas_spend_zar": 14995.53, "payable_spend": 822, @@ -333,16 +334,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 82.2, - "ecpi_usd": 0.5426 + "ecpi_usd": 0.54 }, { "date": "2026-08-18", "is_actual": true, - "install": 1988, + "install": 1840, "event1": 370, "event2": 40, "e1e2": 410, - "e1e2_rate": 20.62, + "e1e2_rate": 22.28, "midas_spend": 993.6, "midas_spend_zar": 16394.4, "payable_spend": 1230, @@ -350,16 +351,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 123.0, - "ecpi_usd": 0.4998 + "ecpi_usd": 0.54 }, { "date": "2026-08-19", "is_actual": true, - "install": 1543, + "install": 1517, "event1": 438, "event2": 13, "e1e2": 451, - "e1e2_rate": 29.23, + "e1e2_rate": 29.73, "midas_spend": 812.35, "midas_spend_zar": 13403.77, "payable_spend": 1353, @@ -367,16 +368,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 135.3, - "ecpi_usd": 0.5265 + "ecpi_usd": 0.5355 }, { "date": "2026-08-20", "is_actual": true, - "install": 1737, + "install": 1720, "event1": 352, "event2": 8, "e1e2": 360, - "e1e2_rate": 20.73, + "e1e2_rate": 20.93, "midas_spend": 911.15, "midas_spend_zar": 15033.98, "payable_spend": 1080, @@ -384,16 +385,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 108.0, - "ecpi_usd": 0.5246 + "ecpi_usd": 0.5297 }, { "date": "2026-08-21", "is_actual": true, - "install": 1877, + "install": 1867, "event1": 265, "event2": 4, "e1e2": 269, - "e1e2_rate": 14.33, + "e1e2_rate": 14.41, "midas_spend": 989.64, "midas_spend_zar": 16329.06, "payable_spend": 807, @@ -401,16 +402,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 80.7, - "ecpi_usd": 0.5272 + "ecpi_usd": 0.5301 }, { "date": "2026-08-22", "is_actual": true, - "install": 1883, + "install": 1779, "event1": 435, "event2": 13, "e1e2": 448, - "e1e2_rate": 23.79, + "e1e2_rate": 25.18, "midas_spend": 942.89, "midas_spend_zar": 15557.68, "payable_spend": 1344, @@ -418,16 +419,16 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 134.4, - "ecpi_usd": 0.5007 + "ecpi_usd": 0.53 }, { "date": "2026-08-23", "is_actual": true, - "install": 1876, + "install": 1863, "event1": 329, "event2": 10, "e1e2": 339, - "e1e2_rate": 18.07, + "e1e2_rate": 18.2, "midas_spend": 987.64, "midas_spend_zar": 16296.06, "payable_spend": 1017, @@ -435,7 +436,7 @@ "daily_budget_zar": 16500.0, "daily_cap": 333, "ffr_rate": 101.7, - "ecpi_usd": 0.5265 + "ecpi_usd": 0.5301 }, { "date": "2026-08-24", @@ -573,5 +574,47 @@ "ffr_rate": 0.0, "ecpi_usd": null } + ], + "weekly": [ + { + "label": "Aug 01–Aug 02", + "install": 3061, + "event1": 375, + "event2": 49, + "e1e2": 424, + "payable_spend": 1272.0, + "midas_spend": 1957.15, + "e1e2_rate": 13.85 + }, + { + "label": "Aug 03–Aug 09", + "install": 10763, + "event1": 1780, + "event2": 167, + "e1e2": 1947, + "payable_spend": 5841.0, + "midas_spend": 4799.54, + "e1e2_rate": 18.09 + }, + { + "label": "Aug 10–Aug 16", + "install": 11703, + "event1": 1598, + "event2": 173, + "e1e2": 1771, + "payable_spend": 5313.0, + "midas_spend": 6158.79, + "e1e2_rate": 15.13 + }, + { + "label": "Aug 17–Aug 23", + "install": 12269, + "event1": 2455, + "event2": 96, + "e1e2": 2551, + "payable_spend": 7653.0, + "midas_spend": 6546.09, + "e1e2_rate": 20.79 + } ] } diff --git a/index.html b/index.html index f5ce3dd..a07f888 100644 --- a/index.html +++ b/index.html @@ -4,42 +4,42 @@ - Amazon ZA 每日交付报告 + Amazon - ZA daily tracker
-
Daily Delivery · ZA

Amazon ZA 每日交付报告

包名:com.amazon.mShop.android.shopping。聚焦 repostback 交付、E1+E2 转化与 Midas / Payable spend。

正在载入数据…
-

Executive Summary

载入中…
+
Daily Delivery · ZA

Amazon - ZA daily tracker

包名:com.amazon.mShop.android.shopping。聚焦 repostback 交付、E1+E2 转化与 Midas / Payable spend。

正在载入数据…

核心指标

8 月预算消耗

月度预算使用进度
预算按 E1+E2 × 49.50 ZAR 扣减
-

每日交付与转化

如何阅读:柱状图展示本月截至数据日的逐日 repostback 交付;结合 E1+E2% 判断每日转化效率,整月完整日期则保留在下方明细表。
每日 Install、Event1 与 Event2
均取 repostback;按 ZA 日期汇总
InstallEvent1Event2
每日 E1+E2%
(Event1 + Event2) ÷ Install
-

消耗对比

Midas spend 与 Payable spend
USD;Payable spend = (E1 + E2) × $3
Midas spendPayable spend
-

8 月每日明细

日期InstallEvent1Event2TotalEvent ratePayable (ZAR)日预算FFRMidas (USD)eCPI
+

每日交付与转化

如何阅读:Install 仅取交付 repostback,不包含 app open;消耗趋势对比每日 Midas 与 Payable spend,转化趋势用于定位 Event rate 波动。
本月每日消耗趋势
USD;Midas spend 与 Payable spend
Midas spendPayable spend
每日 Install
仅取 delivery repostback,排除 af_app_opened
E1+E2% 趋势
(Event1 + Event2) ÷ Install
+

8 月每日明细

日期InstallEvent1Event2TotalEvent ratePayable (ZAR)日预算FFRMidas (USD)
+

自然周汇总

自然周(周一至周日)InstallEvent1+2Event1+2%Payable spendMidas spend

建议关注

  • 优先关注 FFR 明显低于 100% 的日期,判断是流量不足、事件率下降还是日 cap 执行问题。
  • 剩余预算需要的日均消耗已高于当前日预算;如目标是完整消耗月预算,需要确认是否提高每日 cap。
  • 对比 Payable spend 与 Midas spend 的日级差额,排查差额扩大日期的事件质量和计费口径。
diff --git a/update.sh b/update.sh index 42f73dc..470d077 100755 --- a/update.sh +++ b/update.sh @@ -23,12 +23,14 @@ unit_price_zar = 49.5 fx_zar_per_usd = 16.5 spend = defaultdict(float) +repostback_installs = defaultdict(int) with (root / "source-delivery.csv").open(encoding="utf-8-sig", newline="") as f: for row in csv.DictReader(f): if row.get("广告包") == package and row.get("国家") == geo: day = row.get("日期", "") if len(day) == 8 and day.isdigit(): spend[day] += float(row.get("平台消耗") or 0) + repostback_installs[day] += int(float(row.get("归因安装") or 0)) events = defaultdict(lambda: defaultdict(int)) with (root / "source-events.csv").open(encoding="utf-8-sig", newline="") as f: @@ -38,7 +40,7 @@ with (root / "source-events.csv").open(encoding="utf-8-sig", newline="") as f: if len(row) < 7 or row[2] != package or row[3] != geo: continue name, day = row[0], row[1] - if name not in {"af_app_opened", "event1", "event2"}: + if name not in {"event1", "event2"}: continue # The source export leaves its last three headers blank. The second # numeric column after midas_campaign_id is the repostback count. @@ -46,8 +48,7 @@ with (root / "source-events.csv").open(encoding="utf-8-sig", newline="") as f: repostback = int(float(row[6] or 0)) except (ValueError, TypeError): repostback = 0 - key = "install" if name == "af_app_opened" else name - events[day][key] += repostback + events[day][name] += repostback source_days = sorted(set(spend) | set(events)) data_cutoff = source_days[-1] if source_days else None @@ -58,7 +59,7 @@ while cursor <= launch_end: cursor += timedelta(days=1) daily = [] for day in days: - install = events[day]["install"] + install = repostback_installs[day] event1 = events[day]["event1"] event2 = events[day]["event2"] conversions = event1 + event2 @@ -123,8 +124,30 @@ budget = { "required_daily_events": round(remaining_budget_zar / remaining_days / unit_price_zar) if remaining_days else 0, "projected_month_spend_zar": round(projected_month_spend, 2), "projected_month_variance_zar": round(monthly_budget_zar - projected_month_spend, 2), + "mtd_expected_ffr": round(min(datetime.now().day, 31) / 31 * 100, 2), } +weeks = [] +for row in actual_daily: + row_date = datetime.strptime(row["date"], "%Y-%m-%d").date() + week_start = row_date - timedelta(days=row_date.weekday()) + week_end = week_start + timedelta(days=6) + label_start = max(week_start, launch_start) + label_end = min(week_end, launch_end) + key = week_start.isoformat() + if not weeks or weeks[-1]["key"] != key: + weeks.append({"key": key, "label": f"{label_start.strftime('%b %d')}–{label_end.strftime('%b %d')}", "install": 0, "event1": 0, "event2": 0, "e1e2": 0, "payable_spend": 0.0, "midas_spend": 0.0}) + week = weeks[-1] + for metric in ("install", "event1", "event2", "e1e2"): + week[metric] += row[metric] + week["payable_spend"] += row["payable_spend"] + week["midas_spend"] += row["midas_spend"] +for week in weeks: + week["e1e2_rate"] = round(week["e1e2"] / week["install"] * 100, 2) if week["install"] else None + week["payable_spend"] = round(week["payable_spend"], 2) + week["midas_spend"] = round(week["midas_spend"], 2) + week.pop("key", None) + payload = { "meta": { "package": package, @@ -134,7 +157,7 @@ payload = { "date_end": daily[-1]["date"] if daily else None, "data_cutoff": f"{data_cutoff[:4]}-{data_cutoff[4:6]}-{data_cutoff[6:]}" if data_cutoff else None, "currency": "USD", - "install_definition": "af_app_opened repostback", + "install_definition": "delivery repostback (attributed installs); af_app_opened excluded", "event_definition": "event1/event2 repostback", "rate_definition": "(event1 + event2) / Install", "payable_definition": "(event1 + event2) × $3", @@ -142,6 +165,7 @@ payload = { "totals": totals, "budget": budget, "daily": daily, + "weekly": weeks, } tmp = root / "data.json.tmp"