Daily campaign report — 2026-08-04, against 2026-08-03

The account bought web-to-app installs through a worldwide campaign of five creative arms, each in its own ad set, plus the first three delivering hours of a German-speaking buy that opened late in the day. On a UTC day it spent $446.00 for 785 installs at $0.568, against $445.83 and 766 at $0.582 the day before. The report clock, the three revenue measures and regime are defined in the appendix.

1Overview

2026-08-032026-08-04
spend$445.83$446.00
impressions213,05335,852
CPM$2.09$12.44
link clicks5,6493,238
CTR2.65%9.03%
installs (Meta)766785
click → install13.6%24.2%
CPI$0.582$0.568
registrations (ours)805824
booked$709.35 · ROAS 1.59 (Meta 1.66)$921.86 · ROAS 2.07 (Meta 1.93)
within-day$397.69 · ROAS 0.89$588.70 · ROAS 1.32
cohort @ 24h$474.05 · ROAS 1.06 (100% covered)$783.90 · ROAS 1.76 (35% covered)

Cohort value — ARPU and ARPPU at d0, d3 and d7

Keyed on the INSTALL day and measured from each user's own install stamp: dN is their first (N+1) x 24 h. ARPU is Adjust's own series, the one the partner's dashboard reports; ARPPU is our payment ledger, because Adjust exposes no cumulative distinct-payer count. A horizon the window has not lived through yet is left empty rather than written as zero.

appARPU (d0)ARPU (d3)ARPU (d7)ARPPU (d0)ARPPU (d3)ARPPU (d7)installs
Vloom$0.8048$1.0228$1.2639$15.76$18.07$20.33901

Ignore the impression columns. One broken build's single hour is 85.4% of 08-03's impressions; §2's hour-by-hour read finds nothing.

Read within-day. Cohort at 24h is 35% covered against 08-03's 100% and is not compared here (Caveats). Within-day is sealed both days: 0.89 → 1.32.

The day gained on basket size. 39 within-day payers both days, payer rate 4.8% to 4.7%, ARPPU $10.20 to $15.09 — the whole 48% gain.

A third of booked is inherited. Earlier installs paid 36.1% of 08-04's booked revenue, the gap between booked 2.07 and within-day 1.32; §4 splits it.

2Hourly, 2026-08-04

Delivery columns are Meta's on both sides of each ratio. Payer counts and revenue are ours. Booked sits on the payment hour; within-day and cohort sit on the install hour.

hrspendimprCPMCTRinstclk→iCPIbkd$bROASwd$wROASwPaycoh$cROAS
0013.2484415.699.48%1721.2%0.77957.714.3617.971.36117.971.36
0112.201,06611.447.50%1923.8%0.64226.652.180.000.0000.000.00
0213.291,11111.966.48%1318.1%1.02216.131.2116.131.21322.111.66
0314.361,22411.739.31%3833.3%0.3785.760.400.000.0000.000.00
0416.901,28113.198.98%2622.6%0.65013.810.8210.750.64210.750.64
0517.501,37212.767.43%4140.2%0.42718.541.065.710.3315.710.33
0617.421,27613.657.60%2929.9%0.60111.930.6917.861.03321.421.23
0710.5967115.7810.43%1825.7%0.58839.283.7154.165.11154.165.11
0819.661,31614.948.13%3129.0%0.63414.650.7550.672.58250.672.58
0918.651,35813.736.48%1820.5%1.03677.394.150.000.0000.000.00
1019.271,43513.436.97%2626.0%0.74163.193.28136.327.072140.007.26
1117.901,45512.307.22%1918.1%0.94252.712.9411.080.62279.994.47
1216.261,31512.378.14%3129.0%0.5259.320.575.760.3515.760.35
1317.571,18714.809.86%3126.5%0.56734.831.980.000.0000.000.00
1413.531,11412.159.25%2524.3%0.54121.951.625.930.44127.002.00
1521.342,03410.4910.67%3616.6%0.5938.890.425.760.27116.440.77
1624.162,6529.118.60%4017.5%0.60477.883.2223.640.98337.881.57
1728.732,51211.448.92%4218.8%0.68463.152.2022.420.78122.420.78
1826.142,21111.828.68%4624.0%0.56827.961.079.980.38212.970.50
1920.621,87710.998.74%4829.3%0.43079.213.8432.851.59348.032.33
2019.131,67211.4412.08%5527.2%0.34839.462.0627.051.41332.801.71
2120.751,60812.9012.44%5527.5%0.37749.422.3851.612.49251.612.49
2226.321,63816.0711.48%4423.4%0.59896.773.6871.362.71371.362.71
2320.471,62312.6110.23%3722.3%0.55315.260.7511.690.57254.872.68

Spend is close to flat across the clock, between $10.59 and $28.73, with no hour holding more than 6.4% of the day. CPI runs $0.348 to $1.036 with no clean diurnal shape on this clock: the four cheapest hours are 20, 21, 03 and 05. The revenue columns are not readable at this grain. Within-day payers run 0 to 3 per hour, so a single person moves an hour outright: hour 10 shows within-day ROAS 7.07 on two payers and hour 07 shows 5.11 on one.

The cohort column decays as the day goes on. Its coverage is 100% through hour 09, 96% at hour 10 and 0% from hour 11 onward, so every cohort figure after hour 10 counts only the payments already in hand and will rise.

2026-08-05T10:30:30.023766 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 3 6 9 12 15 18 21 hour (UTC) 0 5 10 15 20 25 30 USD Spend by hour 0 3 6 9 12 15 18 21 hour (UTC) 750 1000 1250 1500 1750 2000 2250 2500 2750 impressions Impressions and installs by hour impressions installs 20 30 40 50 installs (Meta Leads) The day's motion — whole account, 2026-08-04 (UTC)
The day's motion: spend by hour, and impressions against installs
2026-08-05T10:30:30.231979 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 4 8 12 16 20 hour (UTC) 7 8 9 10 11 12 CTR % CTR 0 4 8 12 16 20 hour (UTC) 9 10 11 12 13 14 15 16 USD per 1,000 impressions CPM 0 4 8 12 16 20 hour (UTC) 20 25 30 35 40 installs / clicks % Click → install 0 4 8 12 16 20 hour (UTC) 0.4 0.5 0.6 0.7 0.8 0.9 1.0 USD Cost per install Delivery by hour — whole account, 2026-08-04 (UTC)
CTR, CPM, click-to-install and CPI by hour, whole account

Against 2026-08-03, hour matched to hour

Only hours both days delivered in are compared. The diurnal shape is the largest confound in a day-over-day read on this account, so an hour one day is missing is dropped. This runs on the report clock, from the same loader as the table above, because spend, impressions, clicks and installs sit on Meta's delivery hour and restitch across two account days exactly.

Hours both days delivered in, on the UTC clock: 04, 05, 06, 07, 08, 09, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23. 2026-08-04 additionally delivered in 00, 01, 02, 03, 12. Only the shared hours are compared.

Counting which way each shared hour points, which needs no weighting and asks only for a direction:

metrichours 2026-08-04 ran higherhours it ran lowersign test
CPM12 of 197 of 19p = 0.359
CTR10 of 199 of 19p = 1.000
click→install10 of 199 of 19p = 1.000
CPI12 of 197 of 19p = 0.359

A sign test throws magnitude away and buys weight-free direction with it.

Nothing separates on the unweighted count. §4's pooled CTR of +246.9% at p = 0.000 disagrees; one hour of 08-03 is why.

The full hour-by-hour pairing, 2026-08-03 → 2026-08-04

Every shared hour, 2026-08-03 → 2026-08-04. All columns are Meta's instrument on both sides of each ratio. Revenue is deliberately absent: per-hour payer counts run 0-3, so an hourly revenue column would be one person's basket read as a rate.

hrimpressionsCPMCTRclick→installCPI
04515 → 1,28110.97 → 13.1911.26% → 8.98%17.2% → 22.6%0.565 → 0.650
052,009 → 1,3729.78 → 12.769.41% → 7.43%20.1% → 40.2%0.517 → 0.427
062,471 → 1,2769.97 → 13.658.98% → 7.60%27.5% → 29.9%0.404 → 0.601
072,804 → 6719.93 → 15.788.63% → 10.43%22.3% → 25.7%0.516 → 0.588
083,420 → 1,3168.81 → 14.947.78% → 8.13%23.3% → 29.0%0.486 → 0.634
093,726 → 1,3587.98 → 13.737.89% → 6.48%26.2% → 20.5%0.386 → 1.036
103,203 → 1,4359.22 → 13.437.81% → 6.97%24.4% → 26.0%0.484 → 0.741
111,046 → 1,4558.68 → 12.309.46% → 7.22%35.4% → 18.1%0.259 → 0.942
131,590 → 1,18711.85 → 14.806.98% → 9.86%22.5% → 26.5%0.754 → 0.567
14182,805 → 1,1140.59 → 12.151.64% → 9.25%2.0% → 24.3%1.757 → 0.541
15823 → 2,0349.84 → 10.499.23% → 10.67%27.6% → 16.6%0.386 → 0.593
161,080 → 2,65213.14 → 9.118.70% → 8.60%25.5% → 17.5%0.591 → 0.604
171,267 → 2,51212.65 → 11.448.13% → 8.92%23.3% → 18.8%0.668 → 0.684
181,181 → 2,21115.50 → 11.829.06% → 8.68%29.9% → 24.0%0.572 → 0.568
191,263 → 1,87716.98 → 10.999.58% → 8.74%27.3% → 29.3%0.650 → 0.430
201,141 → 1,67216.28 → 11.4410.17% → 12.08%34.5% → 27.2%0.464 → 0.348
211,046 → 1,60819.05 → 12.9012.33% → 12.44%26.4% → 27.5%0.586 → 0.377
22859 → 1,63815.90 → 16.0711.06% → 11.48%37.9% → 23.4%0.379 → 0.598
23771 → 1,62316.89 → 12.619.47% → 10.23%39.7% → 22.3%0.449 → 0.553

Hour 14 owns the pooled contrast. On 08-03 it served 182,805 impressions at $0.59 CPM, 1.64% CTR against 515–3,726 at $7.98–$19.05 and 6.98%–12.33%; 85.8% of 08-03's compared window, the rejected spill build (DECISION_LOG.md #50).

2026-08-05T10:30:30.520001 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 5.0 7.5 10.0 12.5 15.0 17.5 20.0 22.5 hour (UTC) 2 4 6 8 10 12 CTR % CTR 2026-08-03 2026-08-04 5.0 7.5 10.0 12.5 15.0 17.5 20.0 22.5 hour (UTC) 0.0 2.5 5.0 7.5 10.0 12.5 15.0 17.5 USD per 1,000 impressions CPM 5.0 7.5 10.0 12.5 15.0 17.5 20.0 22.5 hour (UTC) 5 10 15 20 25 30 35 40 installs / clicks % Click → install 5.0 7.5 10.0 12.5 15.0 17.5 20.0 22.5 hour (UTC) 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 USD Cost per install Delivery by hour — 2026-08-04 against 2026-08-03, shared hours only (UTC)
The same four ratios with the prior day laid over the day, shared hours only

3Country

2026-08-23T12:43:18.741892 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US DE MX GB TR MY ID AR PH AU FR 0 20 40 60 80 100 120 140 USD delivery raked onto the report clock against two measured margins; revenue is the report day Spend against within-day revenue by country — 2026-08-04 spend within-day revenue
Spend against within-day revenue, by country
2026-08-23T12:43:18.778214 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ −0.04 −0.02 0.00 0.02 0.04 USD per install Cost per install by country — 2026-08-04 (report clock)
Cost per install by country

(i) The portfolio by country, 2026-08-04. On the report clock. Meta serves no hour x country grid, so each country cut is raked from its own Meta day onto UTC; our own columns were already there.

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$102.9523.1%13,736$7.50193$0.533$136.791.3327
US$43.459.7%903$48.1336$1.207$136.893.159
DE$33.507.5%604$55.4417$1.970$25.410.761
MX$14.943.3%1,410$10.5925$0.597$40.772.735
GB$14.933.3%389$38.4019$0.786$0.000.001
TR$12.272.8%652$18.8222$0.558$0.000.000
MY$10.542.4%1,096$9.6220$0.527$5.380.511
ID$10.472.3%1,608$6.5139$0.268$0.000.000
AR$10.272.3%860$11.9438$0.270$4.990.492
PH$9.522.1%2,130$4.4735$0.272$0.000.001
AU$8.391.9%160$52.347$1.198$0.000.000
FR$7.841.8%300$26.1018$0.436$0.000.000

189 further countries are not listed, $166.94 between them (37.4% of this block).

Reconciliation, what is measured and what is fitted. Every per-country cell is an allocation across hours; every total is measured. B1 (UTC-7) $104.91 from Meta 2026-08-03 and $341.09 from Meta 2026-08-04, a measured UTC-day total of $446.00.

Absent from the table above, by name: Nomad Node, KBM1, HR1. Their spend is in every day-grain table; only their country split is missing.

(ii) The same cut per account, 2026-08-04.

B1

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$102.9523.1%13,736$7.50193$0.533$136.791.3327
US$43.459.7%903$48.1336$1.207$136.893.159
DE$33.507.5%604$55.4417$1.970$25.410.761
MX$14.943.3%1,410$10.5925$0.597$40.772.735
GB$14.933.3%389$38.4019$0.786$0.000.001
TR$12.272.8%652$18.8222$0.558$0.000.000
MY$10.542.4%1,096$9.6220$0.527$5.380.511
ID$10.472.3%1,608$6.5139$0.268$0.000.000
AR$10.272.3%860$11.9438$0.270$4.990.492
PH$9.522.1%2,130$4.4735$0.272$0.000.001
AU$8.391.9%160$52.347$1.198$0.000.000
FR$7.841.8%300$26.1018$0.436$0.000.000

189 further countries are not listed, $166.94 between them (37.4% of this block).

Nomad Node — no country block: it delivered nothing on this day, a measured zero.

KBM1 — no country block: it delivered nothing on this day, a measured zero.

HR1 — no country block: it delivered nothing on this day, a measured zero.

The prior day, 2026-08-03, the same two tables.

(i) The portfolio by country, 2026-08-03. On the report clock. Meta serves no hour x country grid, so each country cut is raked from its own Meta day onto UTC; our own columns were already there.

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$108.1524.3%91,101$1.19216$0.501$97.680.9033
US$33.097.4%762$43.4123$1.439$4.990.154
GB$14.243.2%986$14.4318$0.791$16.901.191
PH$13.993.1%12,670$1.1042$0.333$5.630.402
ID$13.363.0%3,374$3.9642$0.318$15.961.204
MY$12.872.9%3,555$3.6219$0.678$11.740.911
TR$12.802.9%826$15.5027$0.474$53.224.163
MX$11.352.5%2,365$4.8019$0.597$11.421.016
FR$11.002.5%1,530$7.1915$0.733$31.152.832
AR$10.072.3%1,695$5.9429$0.347$0.000.001
AU$8.021.8%257$31.266$1.337$0.000.001
ES$7.901.8%1,645$4.8015$0.526$38.844.922

191 further countries are not listed, $188.99 between them (42.4% of this block).

Reconciliation, what is measured and what is fitted. Every per-country cell is an allocation across hours; every total is measured. B1 (UTC-7) $49.92 from Meta 2026-08-02 and $395.91 from Meta 2026-08-03, a measured UTC-day total of $445.83.

Absent from the table above, by name: Nomad Node, KBM1, HR1. Their spend is in every day-grain table; only their country split is missing.

(ii) The same cut per account, 2026-08-03.

B1

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$108.1524.3%91,101$1.19216$0.501$97.680.9033
US$33.097.4%762$43.4123$1.439$4.990.154
GB$14.243.2%986$14.4318$0.791$16.901.191
PH$13.993.1%12,670$1.1042$0.333$5.630.402
ID$13.363.0%3,374$3.9642$0.318$15.961.204
MY$12.872.9%3,555$3.6219$0.678$11.740.911
TR$12.802.9%826$15.5027$0.474$53.224.163
MX$11.352.5%2,365$4.8019$0.597$11.421.016
FR$11.002.5%1,530$7.1915$0.733$31.152.832
AR$10.072.3%1,695$5.9429$0.347$0.000.001
AU$8.021.8%257$31.266$1.337$0.000.001
ES$7.901.8%1,645$4.8015$0.526$38.844.922

191 further countries are not listed, $188.99 between them (42.4% of this block).

Nomad Node — no country block: it delivered nothing on this day, a measured zero.

KBM1 — no country block: it delivered nothing on this day, a measured zero.

HR1 — no country block: it delivered nothing on this day, a measured zero.

4Aggregate, both days

Pooled over the 19 hours both days delivered in, on the UTC clock. Meta's instrument on both sides of every ratio.

spendimpressionsCPMclicksCTRinstallsclick→installCPI
2026-08-03$445.54213,0202.095,6452.65%75713.41%$0.589
2026-08-04$376.6530,29212.432,7859.19%66723.95%$0.565

Pooling is a mix comparison: each hour weighted by what it delivered. §2's hour count separates neither ratio; both p-values are hour 14 of 08-03.

Held to a single creative that ran on both days, on the ad account's own clock, only two tests clear p < 0.05:

bikini (−10.2%, p = 0.224), pool5 (−11.9%, p = 0.240) and mugshot (−31.4%, p = 0.052) do not separate. No install → pay test on any single creative clears 0.05 on either day. These per-creative tests key on cells the estimator builds on Meta's clock, so their day boundaries are the account's and their totals do not reconcile against the tables above.

measure2026-08-03ROAS2026-08-04ROASmoves after the day closes?
booked$709.351.59$921.862.07settled
within-day$397.690.89$588.701.32never
cohort @ 24h$474.051.06 (100% cov)$783.901.76 (35% cov)rising on 08-04
Meta booked, for reference$738.831.66$862.961.93

Meta's bracketed figures on both rows are quoted on its own conversion clock and are shown so the day is traceable to what Meta will report.

Booked revenue on each day, split by the day its payer installed:

payer installed2026-08-032026-08-04
the day itself$397.69 (56.1%)$588.70 (63.9%)
one day earlier$109.64 (15.5%)$95.77 (10.4%)
two days earlier$137.54 (19.4%)$116.35 (12.6%)
three days earlier$58.74 (8.3%)$102.09 (11.1%)
four or more days earlier$5.74 (0.8%)$18.95 (2.1%)

The top row of each column is the within-day figure. That identity is why the gap between booked and within-day is exactly the inherited cohort and nothing else.

2026-08-05T10:30:30.865355 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ booked within-day cohort @ 24h 0 200 400 600 800 USD 1.59 0.89 1.06 2.07 1.32 1.76 the number above each bar is that measure's ROAS against the same day's spend The three revenue measures, 2026-08-03 against 2026-08-04 (UTC) 2026-08-03 2026-08-04
The three revenue measures on both days, ROAS above each bar
2026-08-05T10:30:30.925229 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 2026-08-03 2026-08-04 0 200 400 600 800 USD the bottom segment IS the within-day figure: the same number seen twice Booked revenue by the day its payer installed (UTC) the day itself one day earlier two days earlier three days earlier four or more
Booked revenue by the day its payer installed

5Per ad set, hourly

One ad per ad set delivered on this day, so the ad-set row is the ad row, labelled by asset. §8 is the exception.

A single-clock delivery cut in six-hour UTC blocks. All columns are Meta's instrument. No revenue column appears here because per-asset per-hour payer counts are 0 to 2 and carry nothing.

assetblockspendimprCPMCTRclick→installCPI
bikini00–0516.041,42311.279.84%25.7%0.446
bikini06–1123.911,93812.347.28%24.8%0.683
bikini12–1737.283,22211.578.38%22.6%0.611
bikini18–2334.582,66212.9910.67%26.4%0.461
bodysuit00–0524.522,22211.046.26%33.8%0.522
bodysuit06–1127.362,39811.415.80%29.5%0.667
bodysuit12–1728.242,8709.847.80%25.4%0.495
bodysuit18–2333.163,02610.969.91%25.3%0.436
pool500–0526.582,12712.508.56%26.4%0.554
pool506–1126.701,89114.128.36%25.9%0.651
pool512–1724.201,90712.699.75%19.4%0.672
pool518–2326.012,8699.078.89%23.1%0.441
mugshot00–0520.351,12618.079.06%18.6%1.071
mugshot06–1123.121,08121.3910.27%16.2%1.284
mugshot12–1724.361,98712.2611.27%11.6%0.937
mugshot18–237.6547316.1710.57%20.0%0.765
spill206–112.4020311.828.87%27.8%0.480
spill212–177.518289.0711.11%23.9%0.341
spill218–2320.361,36014.9715.37%26.3%0.370
german_mature18–239.8820348.675.42%36.4%2.470
latina_true18–231.793649.728.33%33.3%1.790

spill2 holds the account's highest CTR in the 18–23 block at 15.37%, and the cheapest installs in both blocks where it ran with any volume, $0.341 and $0.370. mugshot runs 12 to 21 CPM against a pack of 9 to 15 and converts 11.6% to 20.0% of clicks against 19% to 34%, which keeps its CPI above every other arm in every block it ran. bodysuit, pool5 and mugshot each buy their cheapest installs in the 18–23 block, the ad account's late morning and afternoon; bikini is cheapest in 00–05 and spill2 in 12–17, so the diurnal pattern is not shared across the pack.

2026-08-05T10:30:31.010100 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 4 6 8 10 12 14 16 18 CTR % CTR by hour — every asset, 2026-08-04 (UTC) E2/bodysuit E2/bikini E2/pool5 E2/mugshot E2/spill2 DE/german_mature
CTR by hour, one line per asset
2026-08-05T10:30:31.218575 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 0 10 20 30 40 50 60 installs / clicks % Click → install by hour — every asset, 2026-08-04 (UTC) E2/bodysuit E2/bikini E2/pool5 E2/mugshot E2/spill2 DE/german_mature
Click-to-install by hour, one line per asset
2026-08-05T10:30:31.315723 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 USD Cost per install by hour — every asset, 2026-08-04 (UTC) E2/bodysuit E2/bikini E2/pool5 E2/mugshot E2/spill2
Cost per install by hour, one line per asset
2026-08-05T10:30:31.114267 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 10 20 30 40 50 USD per 1,000 impressions CPM by hour — every asset, 2026-08-04 (UTC) E2/bodysuit E2/bikini E2/pool5 E2/mugshot E2/spill2 DE/german_mature
CPM by hour, one line per asset

6Per ad set × country

⚠ Spend and installs are a META-day cut, as in §3; revenue is the UTC day. Cells above $5 of spend, ordered by spend. Revenue is within-day.

assetccspend (META day)inst (META day)CPIwithin $wROAS
bikiniIN42.10860.49044.341.05
bodysuitIN26.37440.59950.671.92
turkish_matureDE18.6936.2300.000.00
bodysuitUS18.3192.03437.962.07
spill2IN18.00300.60026.701.48
mugshotIN17.64111.6040.000.00
pool5IN15.17190.79911.520.76
pool5US14.10150.94093.946.66
bikiniUS11.0771.5814.990.45
german_matureDE10.3942.59825.412.45
germanDE9.2842.3200.000.00
bodysuitMX7.09140.50635.064.95
pool5GB5.4460.9070.000.00
pool5MX5.13120.4285.711.11

pool5 leads every revenue measure on a two-person cell. $93.94 of its $228.50 within-day revenue (41.1%) is one United States cell, $88.95 and $4.99: 94.7% of the cell and 38.9% of the asset's day is one person. Its India cell was $15.17 at wROAS 0.76.

That single payer is also 15.1% of the whole account's within-day revenue. Remove them and pool5 falls from within-day 2.21 to 1.35, below bodysuit's untouched 1.57. The ranking between the day's top two arms therefore turns on one person, and that is true whichever country they are in.

2026-08-05T10:30:31.436603 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/bodysuit E2/bikini E2/pool5 E2/spill2 E2/mugshot 0 20 40 60 80 100 % of that asset's spend Where each asset bought — share of its own spend by region, 2026-08-04 (META day) IN US DE MX GB TR other
Where each asset bought: share of its own spend by region
2026-08-05T10:30:31.550342 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/bodysuit E2/bikini E2/pool5 E2/spill2 E2/mugshot 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 USD per install Cost per install by region — every asset, 2026-08-04 (META day) IN US DE MX GB TR
Cost per install by region, every asset
2026-08-05T10:30:31.632235 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/bodysuit E2/bikini E2/pool5 E2/spill2 E2/mugshot 0 20 40 60 80 USD Within-day revenue by region — every asset, 2026-08-04 (META day) IN US MX
Within-day revenue by region, every asset

The region charts inherit §3's caveat and are drawn on the META-day country cut.

7Per ad set, aggregate, all three measures

The three tables below are the standing per-asset block, emitted by report_tables.py and pasted unedited. They carry the same columns in the same order in every report in this series, so any two days can be read against each other. Rows are every ad object with spend or installs on the day, including ones that took no spend and still attracted late-attributed installs.

A. Per asset — delivery

Meta's instrument on both sides of every ratio. Our registrations never enter this table.

assetspendimpressionsCPMclicksCTRinstallsclick→installCPI
E2/bodysuit$113.2810,51610.778027.63%22127.56%$0.513
E2/bikini$111.819,24512.098359.03%20724.79%$0.540
E2/pool5$103.498,79411.777818.88%18423.56%$0.562
E2/mugshot$75.484,66716.1748710.43%7314.99%$1.034
E2/spill2$30.272,39112.6631913.34%8225.71%$0.369
DE/german_mature$9.8820348.67115.42%436.36%$2.470
DE/latina_true$1.793649.7238.33%133.33%$1.790
earner/bodysuit$0.000—0—6—$0.000
earner/bikini$0.000—0—4—$0.000
earner/pool5$0.000—0—2—$0.000
E2/spill$0.000—0—1—$0.000

B. Per asset — the three revenue measures

Ours on every column. Meta can express only booked, so it rides bracketed beside that column and never as a row. Payers are distinct people, never transactions. Cohort horizon H=24h, 35% covered on this day. Report clock UTC.

assetbookedbROAS (Meta)within-daywROAScohort@HcROASpayerspayer%ARPUARPPUlargest payer
E2/bodysuit$192.571.70 (1.91)$177.481.57$198.771.75114.9%0.78916.1325.3%
E2/bikini$77.590.69 (0.97)$54.670.49$89.240.8083.5%0.2416.8323.6%
E2/pool5$228.502.21 (1.95)$228.502.21$343.343.32126.2%1.19019.0438.9%
E2/mugshot$12.220.16 (0.38)$6.320.08$6.320.0811.3%0.0826.32100.0%
E2/spill2$38.611.28 (1.37)$38.611.28$59.541.9744.7%0.4499.6554.2%
DE/german_mature$25.412.57 (2.57)$25.412.57$25.412.57125.0%6.35125.41100.0%
DE/latina_true$0.000.00 (0.00)$0.000.00$0.000.0000.0%0.000——
earner/bodysuit$193.40— (—)$3.56—$7.12—112.5%0.4453.56100.0%
earner/bikini$80.25— (—)$0.00—$0.00—00.0%0.000——
earner/pool5$0.00— (—)$0.00—$0.00—00.0%0.000——
E2/spill$73.33— (—)$54.16—$54.16—150.0%27.08254.16100.0%

The 16-payer bar (#37): any row above whose payer count is under 16 is a direction and never a magnitude.

C. Per asset — country mix

⚠ This table is cut on the META day, while every other table on this page is on the UTC clock. Meta serves no hour × country grid, so per-country delivery exists only on the ad account's own UTC-7 day and cannot be restitched. It is a seven-hour-offset window against tables A and B above; read it for mix, never for level against them.

The last column is the share of that asset's own within-day revenue that came from the United States: where it far exceeds the US spend share, the return is a property of the geography the asset bought.

assetspendIndia %US %other %US % of its revenue
E2/bodysuit$136.9819.3%13.4%67.4%21.4%
E2/bikini$120.5534.9%9.2%55.9%9.1%
E2/pool5$104.1414.6%13.5%71.9%41.1%
E2/mugshot$51.6934.1%3.2%62.7%0.0%
E2/spill2$62.8728.6%7.9%63.4%0.0%
DE/german_mature$12.140.0%0.0%100.0%0.0%
DE/latina_true$1.790.0%0.0%100.0%—

No arm reaches the 16-payer bar. Table B's best are pool5 at 12 and bodysuit at 11, so every revenue row is a direction.

Read the three tables together and the day splits cleanly. Table A says spill2 bought the cheapest installs on the account at $0.369 and the highest CTR at 13.34%, and that mugshot converted 14.99% of clicks against a 24–28% pack at roughly twice the price. Table B says pool5 leads the five worldwide arms on all three revenue measures and on both per-person measures, at a 6.2% payer rate and $19.04 ARPPU. Table C says 41.1% of pool5's revenue came from a country holding 13.5% of its spend, a gap of 28 points; bodysuit is the only other arm on the positive side of that gap, at eight points.

A further caution on table B's level: $57.72 of the day's $588.70 within-day revenue, 9.8%, came from two arms that spent nothing at all, on installs attributed late to builds that were switched off. The five worldwide arms that actually bought media returned $505.58 on $434.33 of spend, a within-day ROAS of 1.16 against the day's headline 1.32.

2026-08-05T10:30:31.734620 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-01 08-02 08-03 08-04 day (UTC) 0 1 2 3 4 5 6 7 8 payers / installs % Payer rate by day — every asset (UTC) earner/bodysuit earner/bikini E2/bikini E2/bodysuit E2/pool5 E2/mugshot earner/pool5 E2/spill E2/spill2
Payer rate by day, one line per asset
2026-08-05T10:30:31.835193 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-01 08-02 08-03 08-04 day (UTC) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 within-day USD per install ARPU by day — every asset (UTC) earner/bodysuit earner/bikini E2/bikini E2/bodysuit E2/pool5 E2/mugshot earner/pool5 E2/spill E2/spill2
ARPU by day, one line per asset
2026-08-05T10:30:31.936165 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-01 08-02 08-03 08-04 day (UTC) 0 5 10 15 20 25 within-day USD per payer ARPPU by day — every asset (UTC) earner/bodysuit earner/bikini E2/bikini E2/bodysuit E2/pool5 E2/mugshot earner/pool5 E2/spill E2/spill2
ARPPU by day, one line per asset
2026-08-05T10:30:32.063870 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-01 08-02 08-03 08-04 day (UTC) 0.0 0.5 1.0 1.5 2.0 revenue / spend Within-day ROAS by day — every asset (UTC) earner/bodysuit earner/bikini E2/bikini E2/bodysuit E2/pool5 E2/mugshot earner/pool5 E2/spill E2/spill2
Within-day ROAS by day, one line per asset

Hollow markers on the four charts above sit under the 16-payer bar, which on this day is every marker. Assets under 20 installs are left off the composite below and off §6's region charts: one payer on four installs reaches 1.0 on a normalised revenue axis and squashes every real arm into the bottom of the chart.

2026-08-05T10:30:32.204487 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ CTR click→install CPI payer rate * ARPU * wROAS * 0.0 0.2 0.4 0.6 0.8 1.0 normalised across the day (1.0 = best of the pack) * axis sits under the 16-payer bar on most days: direction only, never a level. Assets under 20 installs on the day are not plotted. Composite — every asset across every measure, 2026-08-04 E2/bodysuit E2/bikini E2/pool5 E2/mugshot E2/spill2
Composite: every asset across every measure, normalised across the day

The regime-matched, mix-neutral cut

From the framework read at H=12, on the ad account's clock. mix-neutral is each ad's ROAS recomputed on its regime's pooled country mix, holding its own cost and revenue efficiency, so it removes the geography confound that §6 exposes:

assetregimeinstallsspendCPMCTRIndia shareCPIROASmix-neutral
bikiniE2-R116069.811.328.82%34%0.4361.121.00
bodysuitE2-R111156.212.586.90%17%0.5061.051.08
pool5E2-R111166.714.889.93%15%0.6011.000.81
mugshotE2-R19580.916.978.64%22%0.8520.210.25
spillE2-R185111.10.611.67%7%1.3080.050.07
bikiniE2-R213272.012.088.29%40%0.5450.540.63
bodysuitE2-R210657.910.177.02%25%0.5461.121.17
pool5E2-R28154.112.398.59%15%0.6683.341.93
mugshotE2-R25049.014.9210.95%22%0.9810.00—
spillE2-R23510.89.3410.64%23%0.3092.463.81
bikiniE2-R3238.811.6712.43%35%0.3830.960.97
bodysuitE2-R33211.011.2412.00%12%0.3432.392.06
pool5E2-R3378.69.6010.60%0%0.2322.161.89
spillE2-R3249.014.9215.18%12%0.3770.640.98

In E2-R1, the only stretch this account has ever run with every arm on the same budget, pool5's raw 1.00 becomes 0.81 once its country mix is neutralised, putting it below bikini at 1.00 and bodysuit at 1.08. In E2-R2 its 3.34 falls to 1.93 and in E2-R3 its 2.16 falls to 1.89. The mix-neutral column moves pool5 down in all three regimes and moves no other arm down by more than 0.33, which is the same conclusion §6 reaches from the other direction. E2-R3's rows hold 23 to 37 installs each and carry correspondingly little.

Whether revenue can carry a per-asset verdict at all: across 1,596 installs and 81 payers (5.1%, mean $0.690, sd $5.321) the coefficient of variation is 7.72, and required sample scales with its square.

to resolve a difference ofinstalls per armmedia per arm
50%3,739$1,309
30%10,384$3,634
20%23,363$8,177
10%93,452$32,708

The largest regime-matched arm in the account holds 160 installs, which is 1% of what resolving a 20% difference needs. Every per-asset revenue figure in this report is a direction and never a magnitude.

8The German-speaking buy

The buy opened late enough in the ad account's day that this UTC day catches only its first three delivering hours, in the 18–23 block. Two of its creatives took any spend inside the window. It runs as a single ad set holding fifteen creatives, so it is the one object on the account where the ad-set row and the asset row are not the same thing.

adspendinstallsCPIwithin $
german_mature_10s$9.884$2.47025.41
latina_true_10s$1.791$1.7900.00
total$11.675$2.33425.41

Two observations, neither of which is about which creative is better:

  1. Impressions cost four times the worldwide buy. German CPM is $48.83 against $12.20 across the five worldwide arms on the same window, and CPI is $2.334 against $0.566, a factor of 4.1. This is the buy's real constraint and it is legible on three hours.
  2. Its remaining first-day delivery falls into 08-05. Three further German creatives spent on the ad account's 08-04, all of it after 17:00 account time, so it belongs to the next UTC day and is not in any table above. §3 and §6 show it because they are a META-day cut: turkish_mature took $18.69 in Germany on that window, more than any other German creative including the two here.

Its break-even position is not readable. One payer, $25.41 within-day, 100% of its own asset and country cell; under the 16-payer bar, no ROAS.

9Caveats

The cohort figure below was published at 35% coverage and has since completed. At the full 24-hour horizon 2026-08-04's cohort is $817.43, the figure the 2026-08-05 report carries in its prior-day column; what this page shows is a lower-coverage read of the same cohort, not a different number. Against 08-03's completed $474.05 the day reads +72.4% — the comparison this page declined. Within-day and booked are unaffected; they were sealed and settled when this page shipped.

10What would settle the open questions

11What this hands to the five-arm test

E2_ww_creative_5cell_260806 starts at 00:00 PT on 08-06 with cells bikini, bodysuit, pool5, spill and lounge, running five days (experiment_designs.md §7b).

12Appendix — the clock, the measures, and regime

The report day is a UTC day. Meta stamps its hourly exports in the ad account's own zone, UTC-7, so a UTC day is the account's 17:00–23:59 on 08-03 plus its 00:00–16:59 on 08-04, and every delivery figure above is restitched from those two exports. The clock is UTC so the report lines up with Adjust without anyone converting in their head.

Three revenue measures run through every table and are never mixed.

measurecountsmoves after the day closes?
bookedmoney that arrived inside the day, whatever day its payer installedsettles a few hours after midnight, then fixed. Meta's own number is this basis
within-dayinstalled that day and paid before that day closednever. Sealed at midnight
cohort at Hthat day's installs, counted only to H hours of each person's own age, so it is neutral to the hour someone arrivedrises until every install has lived H hours. Quoted only with its coverage

All three are read on our own payment records. Meta can express only booked, so its figure appears bracketed beside that column and never as a row of its own.

The instrument gate does not run on this clock. Meta's conversion value sits on its conversion hour and is the one column that cannot be honestly restitched into a UTC day. Run on the ad account's own clock the gate reads 1.04 on 08-04 and 0.98 on 08-03, inside the documented 0.91–1.06 band.

A regime is a stretch over which an ad set's daily budget did not change. It matters because budget acts as a geography dial on this account: raising it buys wider and cheaper countries, so two creatives measured across a budget change are compared on different audiences (DECISION_LOG.md #47). Regimes are recorded on the ad account's clock. This UTC day opens inside E2-R1 and holds its final seven hours, then runs the whole of E2-R2 and the first four hours of E2-R3. E2-R1 is the account's only stretch with every arm on the same $100 budget; E2-R2 runs spill at $25 against the rest at $100, and E2-R3 puts bodysuit at $150. Seventeen of the day's twenty-four hours are therefore unmatched.

13Reproduce

_runs/2026-08-05_0804_settled/
  exports/ads_hourly_aug4_settled.csv        Meta, ads x hour, account day 08-04, settled
  exports/ads_hourly_aug5.csv                Meta, ads x hour, account day 08-05
  exports/ads_day_jul1_aug5.csv              Meta, ads x day, 36 days
  exports/ads_country_day_jul1_aug5.csv      Meta, ads x country x day
  ../2026-08-04_e2_start_and_0803_report/exports/ads_hourly_aug3_settled.csv
                                             Meta, ads x hour, account day 08-03, settled
  lum/{users,payments,joined}.csv            our registrations and payments, cut 10:59 UTC 08-05

A UTC day needs the previous account day's hourly export as well as its own. UTC 08-04 is account 08-03 17:00–23:59 plus account 08-04 00:00–16:59, so ads_hourly_aug3_settled.csv is load bearing here and measures.py raises by name if it is missing.

Instruments, run from the repository root with PYTHONIOENCODING=utf-8:

python -m ad_ops.measures      --config _runs/2026-08-05_0804_settled/run_config.json \
                               --day 2026-08-04 --prev 2026-08-03
python -m ad_ops.cohort_arpu   --config _runs/2026-08-05_0804_settled/run_config.json \
                               --days 2026-07-31,2026-08-01,2026-08-02,2026-08-03,2026-08-04
python -m ad_ops.report_tables --config _runs/2026-08-05_0804_settled/run_config.json \
                               --day 2026-08-04 --prev 2026-08-03
python -m ad_ops.report_charts --config _runs/2026-08-05_0804_settled/run_config.json \
                               --day 2026-08-04 --prev 2026-08-03 \
                               --days 2026-08-01,2026-08-02,2026-08-03,2026-08-04 \
                               --out ad_ops/figures/2026-08-04 --relpath figures/2026-08-04

report_tables --prev emits §2's matched-hours pairing and §4's pooled funnel as well as §7's three standing tables. report_charts writes all nineteen charts and a per-section block of image links.

§4's per-creative tests and the regime table run on the ad account's clock and use the sibling config run_config_meta.json, which differs from the UTC one only in tz:

python -m ad_ops.day_compare   --config _runs/2026-08-05_0804_settled/run_config_meta.json \
                               --today 2026-08-04 --prev 2026-08-03 --h 6
python -m ad_ops.asset_estimator hourly \
                               --config _runs/2026-08-05_0804_settled/run_config_meta.json
Internal — noindex. Not for distribution outside the team.