t1k:marketing:analytics:greedygame-max-monthly-report
| Field | Value |
|---|---|
| Module | analytics |
| Version | 1.16.0 |
| Effort | low |
| Tools | — |
How to invoke
Section titled “How to invoke”/t1k:marketing:analytics:greedygame-max-monthly-reportGreedyGame — MAX GAM Placement Monthly Report
Section titled “GreedyGame — MAX GAM Placement Monthly Report”Pull one month of AppLovin MAX Google Ad Manager placement data and write a single Excel workbook. The breakdown grain is:
day × application × package name × platform × network × network placement × ad type
with impressions and estimated revenue (USD) summed per row, plus By Day and By App (incl. eCPM) summary tabs.
This is the placement-level companion to t1k:marketing:analytics:crawldata
(which does account-wide spend-vs-revenue). Here the scope is narrowed to GAM
placements (network_placement containing gampub/gamin) across both
GAM network entries: standard GOOGLE_AD_MANAGER_NETWORK and
GOOGLE_AD_MANAGER_NATIVE_NETWORK. The real network name is carried per row so
standard vs native GAM stays distinguishable.
Executed by
Section titled “Executed by”The pull and the table rendering are both fully specified before the run starts
— no interpretation happens until the workbook is read — so this is cheap-tier
work end to end (routing SSOT: rules/orchestration-rules.md
§ “Task-Type → Agent Routing”):
| Step | Agent |
|---|---|
Run max_gam_placements.js for the stated month and report row/impression/revenue totals | t1k-fact-fetcher |
| Assemble the By-Day / By-App summary tabs from the pulled rows | t1k-metrics-reporter |
| Investigate why a day’s or app’s numbers look wrong | t1k-debugger — reasoning tier, not cheap |
When to use
Section titled “When to use”- Monthly GAM placement reporting for the GreedyGame MAX account
- Any date range at day × placement × ad-format granularity (monthly is the common case)
- Investigating which GAM placements / apps / ad formats drove impressions + revenue
Prerequisites
Section titled “Prerequisites”- Node 18+ (built-in
fetch,fs,path— no npm install needed). - MAX Report Key for the target MAX account. Resolution order:
--key,MAX_REPORT_KEYenv var, or a.envfile in the working directory holdingMAX_REPORT_KEY=…. Never passed on a shared command line or committed — keep it in a gitignored.env. Get it from dash.applovin.com → Account → Keys → Report Key (NOT the Management or SDK key).
The runnable script is bundled under scripts/:
max_gam_placements.js (+ its only dependency xlsx_lite.js). Both are pure
Node built-ins — no third-party packages, cross-platform.
Run — last calendar month
Section titled “Run — last calendar month”Point a .env with MAX_REPORT_KEY=… at the run directory (or export the env
var), then give the first and last day of the target month:
# Example: report July 2026node scripts/max_gam_placements.js \ --start 2026-07-01 --end 2026-07-31 \ --xlsx GAM_placements_2026-07.xlsxTo pick “last month” relative to today, use the previous calendar month’s first
and last date (e.g. run in August → --start <prev-month>-01 --end <prev-month>-<lastDay>).
| Flag | Meaning |
|---|---|
--start / --end | Required. Inclusive day range, YYYY-MM-DD. |
--xlsx | Output path. Defaults to GAM_gampub_gamin_placements_<start>_<end>.xlsx. |
--key | MAX report key (prefer MAX_REPORT_KEY / .env over this). |
Days are fetched concurrently (pool of 5) and printed with per-day row counts.
The run ends with the kept-row count, a Networks matched: line, and the
impressions + revenue totals.
Output
Section titled “Output”One .xlsx, three tabs:
| Tab | Columns |
|---|---|
| GAM Placements | Day · Application · Package Name · Platform · Network · Network Placement · Ad Type · Impressions · Est. Revenue (USD) · + TOTAL row |
| By Day | Day · Impressions · Est. Revenue · + TOTAL |
| By App | Application · Impressions · Est. Revenue · eCPM · + TOTAL |
eCPM is recomputed as revenue / impressions × 1000 at the use site — never
averaged across rows.
Gotchas
Section titled “Gotchas”- 45-day look-back (hard limit). The MAX Reporting API rejects any
startolder than 45 days:"Start date is beyond our 45 day look back period". Run the monthly report within 45 days of month-end or the placement-level data ages out permanently (local pre-aggregated archives have nonetwork_placementdimension and can’t backfill). For older months the only route is a manual export from dash.applovin.com → Reports. - Account timezone is UTC+0. Days are the account’s UTC calendar days. This report does not re-bucket to a local offset; if you need a local-offset day boundary, apply the hourly-fetch + re-bucket pattern from the sibling crawldata skill.
- Both GAM networks included. Native GAM (
GOOGLE_AD_MANAGER_NATIVE_NETWORK) is counted alongside standard GAM. TheNetworks matched:console line shows the per-network row split so you can confirm the mix. - The most recent day may be partial if the month just ended.
- Totals tie out to the cent. Revenue cells store the full-precision
value with a 2-decimal display format, so Excel
=SUM(column)equals the TOTAL exactly. Pre-rounding each cell under-counts the month — thousands of sub-cent placement rows each rounded down to$0.00discard real revenue. The unrounded, round-once TOTAL is the correct figure; never re-round per cell before summing.
Security
Section titled “Security”- Never print, log, or commit the MAX report key. It lives only in a gitignored
.env(or theMAX_REPORT_KEYenv var) and is read at runtime. - This skill is read-only (MAX Reporting API) — no writes, no spend impact.
- iOS apps may appear with an App Store id (
id…) in the package field — that is expected, not a bug.
Related
Section titled “Related”t1k:marketing:analytics:crawldata— account-wide spend-vs-revenue Profit/ROAS crawl (Mintegral, Google Ads, Adjust, AppLovin MAX) + CloudX First Look floors.t1k:marketing:monetization:applovin-max— MAX mediation setup and concepts.