← All reports

Weekly report — 9 to 15 October 2026

Fri 09-10 to Thu 15-10 · excludes China unless stated · queries dashboard/weekly_sql_1016/

IAP revenue rose to $1,029 (+68%) on 468 DAU (-7%). Without the week's top payer it is $882 vs $546 (+62%), so this is not one whale. The payer count did not move (39 vs 40); each payer spent more.

v36 replaced v34 over 10–11 Oct and carried 51% of the week's DAU. It shipped 10 new packs; together they earned $89, 9% of IAP. Existing packs went from $608 to $940.

5 things worth noting

  1. Revenue is up and it is broad. +62% excluding the top payer; the gain is spread over Remove Ads (permanent and 30-day), the Tiny Guide pass, the mythic combo and loot storage, not a single SKU.
  2. The new packs are a small part of it so far. 10 SKUs first seen since 25 Sep earned $89. Flameborn pass ($30.70, 1 buyer) and Hero Growth ($22.48, 2) lead; Flameborn+, campaign.20.plus, campaign.65 and daily.challenge.key.3 have taps but no purchase yet. Most only had 3–5 days live.
  3. Campaign packs reached players earlier than planned. campaign.20 / .20.plus / .65 appear on v36 from 12–14 Oct; the build plan had them in B3 (rollout 19–21 Oct). Check with the production team whether the stage 20 / 150 difficulty change shipped too.
  4. Players are falling, not growing. DAU 818 → 468 in five weeks and installs are flat at ~843/week. Revenue per DAU is carrying the week; without new installs this does not compound.
  5. The week's top payer is on the old build. United States, v34, 17 purchases, $146.83. v34 still carried 30% of the week's DAU; by 15 Oct only 28 daily users were left on it.

Scoreboard

week from (Fri)DAUinstallsIAP $ad $total $eCPM
09-118181,6881,2981461,44354.4
09-186391,11587812199953.9
09-2552792559711371057.0
10-0250185161317478880.0
10-094688431,0291851,21487.4

Week starts Friday. IAP is gross (no refunds in the export). Payers: 39 this week, 40 last week.

Show the query
-- One row per day x app version x China flag, 2026-09-04 .. 2026-10-16: DAU, installs, IAP, payers, ads.
WITH ev AS (
  SELECT PARSE_DATE('%Y%m%d', event_date) d, user_pseudo_id u, event_name e, event_timestamp ts,
    app_info.version v, geo.country = 'China' cn, event_value_in_usd usd,
    (SELECT COALESCE(value.double_value, value.float_value, CAST(value.int_value AS FLOAT64))
       FROM UNNEST(event_params) WHERE key='value') val
  FROM `tiny-knightfall-idle-rpg-game.analytics_538412813.events_intraday_*`
  WHERE _TABLE_SUFFIX BETWEEN '20260904' AND '20261016'
),
ud AS (
  SELECT d, u,
    ARRAY_AGG(v IGNORE NULLS ORDER BY ts DESC LIMIT 1)[SAFE_OFFSET(0)] v,
    LOGICAL_OR(cn) cn,
    COUNTIF(e='first_open') > 0 installed,
    SUM(IF(e='in_app_purchase', usd, 0)) iap_usd,
    COUNTIF(e='in_app_purchase') iap_buys,
    SUM(IF(e='ad_impression_MAX', COALESCE(val, 0), 0)) ad_usd,
    COUNTIF(e='ad_impression_MAX') ad_imps
  FROM ev GROUP BY d, u
)
SELECT d, v, cn, COUNT(*) dau, COUNTIF(installed) installs, SUM(iap_usd) iap_usd, SUM(iap_buys) iap_buys,
  COUNTIF(iap_buys > 0) payers, SUM(ad_usd) ad_usd, SUM(ad_imps) ad_imps, COUNTIF(ad_imps > 0) ad_watchers
FROM ud GROUP BY d, v, cn
Show the query
-- IAP per payer, ex-China, two report weeks (02-08 Oct, 09-15 Oct).
SELECT IF(event_date >= '20261009', 'this', 'prev') wk, user_pseudo_id u, ANY_VALUE(geo.country) country,
  ANY_VALUE(app_info.version) v, COUNT(*) buys, SUM(event_value_in_usd) usd
FROM `tiny-knightfall-idle-rpg-game.analytics_538412813.events_intraday_*`
WHERE _TABLE_SUFFIX BETWEEN '20261002' AND '20261015' AND event_name = 'in_app_purchase' AND geo.country != 'China'
GROUP BY 1, 2

Builds running

buildavg DAUinstallsIAP $ad $share of DAU %first seen
3623760861713750.610-07
3414220741247.230.409-25
1018.71004.009-04
2111.113002.409-04
99.41002.009-04
247.90001.709-04
26.27.3000.1231.609-11
297700.8501.509-17

Builds with at least 5 average DAU. Builds other than v34 and v36 still hold ~90 DAU combined, all with zero IAP.

v34 → v36 changeover

dayv34 DAUv36 DAU
10-063300
10-073536
10-083982
10-094150
10-1031631
10-11120304
10-1255361
10-1331343
10-1430324
10-1528293

New IAP packs

SKUs whose first tap or purchase in the export is on or after 25 Sep, totals to 15 Oct.

packfirst seenfirst purchaseplayers who tappedbuysrevenue $builds
premium.pass.flameborn10-1110-151130.736
package.hero.growth10-0710-116222.535, 36
premium.pass.milestone10-1110-133221.036
special.hero.soul.stone10-0510-051210.934, 36
package.hero.toy10-1110-11015.636
campaign.2010-1210-12313.336
premium.pass.flameborn.plus10-11–30036
campaign.20.plus10-14–10036
campaign.6510-14–10036
daily.challenge.key.310-14–10036
Show the query
-- One row per product SKU x day x version (ex-China): store taps and purchases, plus each SKU's first day in the export.
WITH ev AS (
  SELECT PARSE_DATE('%Y%m%d', event_date) d, user_pseudo_id u, event_name e, app_info.version v,
    event_value_in_usd usd,
    COALESCE((SELECT value.string_value FROM UNNEST(event_params) WHERE key='product_id'),
             (SELECT value.string_value FROM UNNEST(event_params) WHERE key='position')) sku
  FROM `tiny-knightfall-idle-rpg-game.analytics_538412813.events_intraday_*`
  WHERE event_name IN ('in_app_purchase', 'purchase_click', 'first_purchase')
    AND geo.country != 'China'
),
x AS (SELECT * FROM ev WHERE sku LIKE 'com.idle.tiny.%'),
first_seen AS (SELECT sku, MIN(d) first_day, MIN(IF(e='in_app_purchase', d, NULL)) first_buy_day FROM x GROUP BY sku)
SELECT x.sku, f.first_day, f.first_buy_day, x.d, x.v,
  COUNTIF(e='purchase_click') taps, COUNT(DISTINCT IF(e='purchase_click', u, NULL)) tappers,
  COUNTIF(e='in_app_purchase') buys, COUNT(DISTINCT IF(e='in_app_purchase', u, NULL)) buyers,
  SUM(IF(e='in_app_purchase', usd, 0)) usd
FROM x JOIN first_seen f USING (sku)
WHERE x.d >= '2026-09-04'
GROUP BY 1, 2, 3, 4, 5

Existing packs: biggest moves this week

existing packthis week $last week $change $
pass.tiny.guide55.5055.5
package.combo.mythic46.2046.2
skip.ad.permanent13388.943.8
special.loot.storage42.410.032.4
skip.ad.30days10574.030.9
weekly.promotion30.0030.0
daily.challenge.key.128.736.2-7.5
package.adventure4.011.7-7.8
daily.promotion22.733.1-10.4
package.hero.doom30.442.6-12.2

Day-1 retention

wkinstallsd1_usersD1 %
09-182,04223211.4
09-251,52815410.1
10-021,48118912.8
10-091,02713513.1
install buildinstallsd1_usersD1 %
342963612.2
367059813.9

Returned on the day after install (any engagement). Installs on 15 Oct are excluded because their day 1 is incomplete. This query's definition differs from the earlier reports' first-session D1, so compare weeks within this table only.

Show the query
-- Day-1 return by install day and install build, ex-China, installs 2026-09-18 .. 2026-10-15.
WITH ev AS (
  SELECT user_pseudo_id u, PARSE_DATE('%Y%m%d', event_date) d, event_name e, event_timestamp ts,
    app_info.version v, geo.country country
  FROM `tiny-knightfall-idle-rpg-game.analytics_538412813.events_intraday_*`
  WHERE _TABLE_SUFFIX BETWEEN '20260918' AND '20261016'
),
inst AS (
  SELECT u, MIN(d) install_d, ARRAY_AGG(v ORDER BY ts LIMIT 1)[OFFSET(0)] v, ANY_VALUE(country) country
  FROM ev WHERE e = 'first_open' GROUP BY u
)
SELECT i.install_d, i.v, COUNT(*) installs,
  COUNT(DISTINCT IF(a.d = DATE_ADD(i.install_d, INTERVAL 1 DAY), i.u, NULL)) d1_users
FROM inst i LEFT JOIN (SELECT DISTINCT u, d FROM ev WHERE e = 'user_engagement') a USING (u)
WHERE i.country != 'China' AND i.install_d <= '2026-10-15'
GROUP BY 1, 2

Tracking

No event name was first seen between 2 and 15 Oct. The new packs log through the existing purchase_click / in_app_purchase events.

Show the query
-- Event names first seen on or after 2026-10-02 (whole export), with the build they first appear in.
WITH e AS (
  SELECT event_name, app_info.version AS v, PARSE_DATE('%Y%m%d', event_date) AS d, user_pseudo_id AS u
  FROM `tiny-knightfall-idle-rpg-game.analytics_538412813.events_intraday_*`
),
first_seen AS (
  SELECT event_name, MIN(d) AS first_day, ARRAY_AGG(v ORDER BY d LIMIT 1)[OFFSET(0)] AS first_version
  FROM e GROUP BY event_name
)
SELECT f.event_name, f.first_day, f.first_version,
  STRING_AGG(DISTINCT e.v ORDER BY e.v) AS versions_seen, COUNT(*) AS events, COUNT(DISTINCT e.u) AS users
FROM first_seen f JOIN e USING (event_name)
WHERE f.first_day >= '2026-10-02'
GROUP BY 1, 2, 3
ORDER BY f.first_day, events DESC