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

This report runs on 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 below is restitched from those two exports. On that clock 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. Together they spent $446.00 and Meta recorded 785 installs at $0.568 each, against $445.83 and 766 at $0.582 the day before.

Three revenue measures run through every table below and are never mixed. Booked is money that arrived inside the day whatever day its payer installed; it settles a few hours after midnight and is the basis Meta itself reports. Within-day counts people who installed that day and paid before that day closed; it is sealed and never moves again. Cohort at H counts that day's installs only to H hours of each person's own age, which makes it neutral to the hour someone arrived, and it is 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 ours-divided-by-Meta instrument gate cannot run on this clock, because Meta's conversion value sits on its conversion hour and is the one column that cannot be honestly restitched. 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 belongs in a daily report 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 being 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.

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)

08-03's delivery columns are not a fact about the account. A single hour of one arm carrying a broken build took 181,927 of that day's 213,053 impressions, 85.4% of them, at $0.52 CPM. Every pooled impression-side contrast above is mostly that hour leaving, which is why CPM appears to rise sixfold and CTR to more than triple. The install-side columns are less affected and the revenue columns not at all. §2 shows the same two days hour by hour, where that single hour is visible rather than buried, and the two readings do not agree.

Cohort at 24 hours is 35% covered on 08-04 and cannot be read against 08-03's 100%. The payment cut is 10:59 UTC on 08-05, so only installs from the first ten hours of the day have lived a full 24 hours. The figure is still rising. Within-day is sealed on both days and is the honest day-over-day measure, and on it the account went 0.89 → 1.32.

The day gained on basket size, not on how many people paid. Both days closed with exactly 39 distinct within-day payers, on 805 registrations then 824, so the payer rate went 4.8% to 4.7%. Within-day ARPPU went $10.20 to $15.09, and that alone is the whole 48% revenue gain. The gain is also more concentrated: the largest single payer is 15.1% of the day against 10.4% the day before, and the top ten payers hold 67.2% against 56.0%.

Booked revenue on 08-04 splits by the day its payer installed: 63.9% from 08-04's own installs, 10.4% from 08-03, 12.6% from 08-02, 11.1% from 08-01 and 2.1% from 07-31. Inherited cohort is 36.1% of the day's booked money, which is the whole of the gap between booked 2.07 and within-day 1.32.

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 rather than being uniformly partial. 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 rather than paired with nothing. 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: it answers which way the day moved and never by how much.

Nothing separates. On the unweighted hour count, every one of the four delivery ratios is a coin flip between the two days. That is the opposite of what §4's pooled row says, where CTR reads +246.9% at p = 0.000, and the disagreement is the point of running both. The pooled row weights each hour by how much it delivered, and one hour on 08-03 delivered almost everything.

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 is the whole of the pooled contrast. On 08-03 it served 182,805 impressions at $0.59 CPM and 1.64% CTR, against a day otherwise running 515 to 3,726 impressions an hour at $7.98 to $19.05 and 6.98% to 12.33%. That single hour is 85.8% of 08-03's impressions across the compared window. It is the rejected spill build (DECISION_LOG.md #50), and any pooled comparison of these two days is mostly a report about it.

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

The spend and install columns are a META-day cut. 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. The revenue columns are the UTC day split by country. The two sides are seven hours apart, so the ROAS columns here straddle two windows: read this table for mix, never for level against §1 or §4. Ordered by spend. Meta's booked value is bracketed.

ccspend (META day)inst (META day)CPIbookedbROAS (Meta)withinwROAScohort@24hcROAS
IN$119.29192$0.621184.841.55 (2.04)136.791.15186.201.56
US$50.1135$1.432163.843.27 (5.70)136.892.73211.784.23
DE$48.3520$2.41825.410.53 (0.53)25.410.5325.410.53
MX$18.3734$0.54044.182.40 (3.55)40.772.2240.772.22
GB$17.0319$0.89610.860.64 (0.64)0.000.000.000.00
TR$15.5831$0.5030.000.00 (0.00)0.000.000.000.00
ID$13.3859$0.2270.000.00 (0.60)0.000.000.000.00
AR$12.5250$0.2509.980.80 (4.79)4.990.404.990.40
MY$11.5324$0.4805.380.47 (0.47)5.380.475.380.47
PH$10.2945$0.22939.193.81 (5.25)0.000.000.000.00
AU$9.456$1.5750.000.00 (1.64)0.000.000.000.00
CA$8.678$1.08423.942.76 (1.50)4.990.574.990.57

The United States carries 23.3% of the day's within-day revenue on five people. Its $136.89 comes from five distinct payers, of whom the largest is 65.0% and the top two are 86.9%. Against the 16-payer bar this account uses (#37) the honest statement is that the level is not readable at this sample size, and what the row supports is a direction on where the money sits, not a magnitude.

India is the mirror image and holds the largest payer count of any country on the day: 13 distinct payers behind $136.79, the same share of the day's within-day revenue as the United States, bought at $0.621 an install against the United States at $1.432 on the same cut. Its largest payer is 32.8% of it, so even India sits under the bar. Germany at $2.418 an install is the dearest cell on this cut, 3.9 times India's, and is discussed in §8.

2026-08-05T10:30:30.702793 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US DE MX GB TR ID AR MY PH AU CA 0 20 40 60 80 100 120 140 USD spend and installs are a META-day cut (no hour x country grid exists); 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-05T10:30:30.785709 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US DE MX GB TR ID AR MY PH AU CA 0.0 0.5 1.0 1.5 2.0 2.5 USD per install Cost per install by country — 2026-08-04 (META day)
Cost per install by country

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 across hours is a mix comparison, and on these two days it is a misleading one. It weights each hour by how much it delivered, so a day that bought differently across the clock can move these rows without any hour changing. §2 counts the same two days hour by hour and finds neither ratio separating at all. Both p-values above are carried by hour 14 of 08-03 and should not be read as a change in how the account converts.

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, not as a second instrument.

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

Exactly one ad delivered per ad set on this day, so the ad-set row is the ad row here and the rows are labelled by asset. That identity is a fact about the day and not about the campaign: the ..._d100_spill ad set holds two ads, vid_ww_spill_8s_9x16_v1 and its copy, and they are a replacement pair rather than a pair of arms — the first delivered on the ad account's 08-03 and the second from 08-04, never both at once. The German buy in §8 is the object on this account where the identity genuinely fails, at fifteen creatives in one ad set.

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 still finishes first on every revenue measure, and the cell carrying it holds two people. $93.94 of its $228.50 within-day revenue, 41.1%, is one United States cell, and that cell holds exactly two payers, at $88.95 and $4.99. The larger of the two is 94.7% of the cell and 38.9% of everything the asset earned all day. The same creative bought $15.17 of India on the same window and returned within-day 0.76 there.

That single payer is also 15.1% of the whole account's within-day revenue. Remove him 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 he is 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.00006$0.000
earner/bikini$0.00004$0.000
earner/pool5$0.00002$0.000
E2/spill$0.00001$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.12112.5%0.4453.56100.0%
earner/bikini$80.25(—)$0.00$0.0000.0%0.000
earner/pool5$0.00(—)$0.00$0.0000.0%0.000
E2/spill$73.33(—)$54.16$54.16150.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 a META-day cut, not a UTC one. 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.

Why a row in B is readable or not. 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 asset bought a geography rather than earning a result.

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 on this day. The highest count in table B is pool5 at 12, then bodysuit at 11. Every revenue row above is therefore a direction, and the gap between an arm twelve payers deep and one eleven payers deep is not a result.

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 rather than 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 of its country cell. Against the 16-payer bar the honest sentence is that this sample cannot carry a ROAS.

9Caveats

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).

12Reproduce

_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 rather than short-filling 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.