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

The account spent $625.17 across five worldwide creatives and the German buy, and took 1,128 installs at $0.554. The day before it spent $446.00 for 785 at $0.568. Within-day revenue was $898.32 against $588.70. Our payment records read 0.98 of Meta's booked figure. Definitions of the report clock, the three revenue measures and a regime are in the appendix.

1Overview

spendinstallsCPIimpressionsCPMCTRbookedbROASwithin-daywROAScohort@24hcROAS
2026-08-04$446.00785$0.56835,85212.449.03%$921.862.07$588.701.32$817.431.83
2026-08-05$625.171,128$0.55453,52211.689.18%$1,427.512.28$898.321.44$923.621.48

Cohort@24h is 100% covered on 08-04 and 9% on 08-05, so those two columns are not comparable to each other. Within-day is sealed on both days and is the day-over-day measure.

The cohort gap is age, not performance, and it understates the newer day. A fixed horizon counts each install only to H hours of its own age, so a covered day does not drift: 08-04's installs were 26.5–50.4 h old at the cut and every one had reached 24 h. 08-05's were 2.5–26.4 h old, so most are counted at a fraction of the horizon and its 1.48 is a floor. Compared at H=6, which 08-05 covers 76–88%, pool5 reads 0.951 → 1.331 and bikini 0.241 → 0.256 — the newer day ahead, not behind. bodysuit falls at matched age too (0.750 → 0.496, ARPPU 16.82 → 8.01), so that decline is real.

2Hourly, 2026-08-05

Delivery columns are Meta's instrument on both sides of every ratio. ours is our own registration count, never crossed with Meta's installs. cov is cohort coverage at H=24 for that hour's installs.

hrspendimprCPMclicksCTRinstclk→iCPIourscovbookedbROASwithin-daywROASwPaycohort@24hcROAS
0$22.261,79212.421669.26%4728.3%$0.47444100%$4.990.22$66.622.994$66.622.99
1$20.391,95410.441889.62%4121.8%$0.49740100%$59.142.90$210.9410.351$210.9410.35
2$21.882,3409.352289.74%5925.9%$0.3715740%$166.927.63$20.880.953$20.880.95
3$25.002,5989.622138.20%6329.6%$0.397650%$159.726.39$94.493.789$97.483.90
4$28.042,60810.752248.59%5926.3%$0.475580%$58.292.08$42.841.532$42.841.53
5$31.342,88610.862649.15%4918.6%$0.640550%$67.882.17$5.010.161$5.010.16
6$32.212,46213.082239.06%5424.2%$0.596550%$93.432.90$20.770.644$20.770.64
7$46.063,18214.482768.67%5620.3%$0.822630%$29.430.64$27.910.615$27.910.61
8$0.785713.6858.77%8160.0%$0.098100%$42.6354.66$3.023.871$3.023.87
9$0.0000570%$25.99$0.000.000$0.000.00
10$0.0000210%$46.94$0.000.000$0.000.00
11$0.0000140%$0.00$0.000.000$0.000.00
12$0.0142.5000.00%30.0%$0.00330%$12.491248.98$0.000.000$0.000.00
13$6.3033218.983911.75%820.5%$0.78760%$10.391.65$0.000.000$0.000.00
14$43.473,10314.0132010.31%6219.4%$0.701620%$89.192.05$31.850.732$31.850.73
15$49.224,27011.5343610.21%8619.7%$0.572920%$43.050.87$29.990.615$29.990.61
16$37.753,51910.733249.21%6118.8%$0.619640%$50.881.35$16.510.443$16.510.44
17$43.763,96611.033318.35%8525.7%$0.515870%$38.000.87$45.991.055$45.991.05
18$47.344,20711.253748.89%7921.1%$0.599820%$62.271.32$27.910.595$31.470.66
19$39.503,54711.143168.91%8125.6%$0.488840%$168.434.26$141.623.5910$141.623.59
20$33.603,11110.802919.35%6823.4%$0.494730%$67.542.01$29.670.883$29.670.88
21$37.242,89312.872749.47%5821.2%$0.642630%$27.120.73$5.930.161$5.930.16
22$27.412,47711.072178.76%4721.7%$0.583540%$55.742.03$54.802.005$67.792.47
23$31.612,21414.282049.21%4622.5%$0.687550%$47.021.49$21.580.681$27.340.86
ALL$625.1753,52211.684,9139.18%1,12823.0%$0.5541,1849%$1,427.512.28$898.321.4470$923.621.48

⚠ Payer counts per hour run 0–10. An hourly ARPPU on one payer is that payer's basket, not a rate. Read the ALL row for level and the hours for shape only. Hours 08–12 carry booked revenue against no spend because booked sits on the payment hour while spend sits on the delivery hour. Those are earlier installs paying during the blackout, not delivery.

The blackout is the day's largest delivery fact, and it is a billing event. Hours 09–12 UTC, which is PT 02:00–05:00, took zero impressions and $0.00, and hour 08 took 57. The four hours either side ran 2,400–3,200 impressions each.

This account funds ads from a prepaid balance, so an exhausted balance stops delivery outright. The billing ledger for 08-05 carries a $990.00 top-up on MasterCard ····9617 marked Failed, alongside a second $990.00 top-up that funded, a $10.00 Visa top-up that funded, and a $540.93 charge drawn against the prepaid balance. A failed top-up on a prepaid account empties the runway and every ad stops until money lands.

That explains the two features of the hole that nothing else does: it hit all five arms at the same minute, and it was a hard zero rather than a taper — Meta pacing or budget exhaustion both taper (meta_ads_manager_driving.md records a monotonic $38 → $33 → $27 → … → $0 for a real cap). The activity history for Aug 3 → Aug 6, with the rendered range asserted, records no budget change and no ad-set status change across the window, which is consistent: a billing stop is account-level and writes nothing to a campaign log.

The ledger dates transactions but does not time them, so the minute the balance ran dry and the minute it was restored are not readable from Ads Manager. The card issuer's statement carries both.

2026-08-06T07:28:59.772171 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 3 6 9 12 15 18 21 hour (UTC) 0 10 20 30 40 50 USD Spend by hour 0 3 6 9 12 15 18 21 hour (UTC) 0 1000 2000 3000 4000 impressions Impressions and installs by hour impressions installs 0 20 40 60 80 installs (Meta Leads) The day's motion — whole account, 2026-08-05 (UTC)
The day's motion: spend by hour, and impressions against installs
2026-08-06T07:28:59.937716 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 4 8 12 16 20 hour (UTC) 8.5 9.0 9.5 10.0 10.5 11.0 11.5 CTR % CTR 0 4 8 12 16 20 hour (UTC) 10 12 14 16 18 USD per 1,000 impressions CPM 0 4 8 12 16 20 hour (UTC) 20 40 60 80 100 120 140 160 installs / clicks % Click → install 0 4 8 12 16 20 hour (UTC) 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 USD Cost per install Delivery by hour — whole account, 2026-08-05 (UTC)
CTR, CPM, click-to-install and CPI by hour, whole account

Against the prior day, hour matched to hour

Hours both days delivered in, on the UTC clock: 00, 01, 02, 03, 04, 05, 06, 07, 08, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23. 2026-08-04 additionally delivered in 09, 10, 11, 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-05 ran higherhours it ran lowersign test
CPM6 of 2014 of 20p = 0.115
CTR10 of 2010 of 20p = 1.000
click→install8 of 2012 of 20p = 0.503
CPI11 of 209 of 20p = 0.824

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.

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

Every shared hour, 2026-08-04 → 2026-08-05. 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
00844 → 1,79215.69 → 12.429.48% → 9.26%21.2% → 28.3%0.779 → 0.474
011,066 → 1,95411.44 → 10.447.50% → 9.62%23.8% → 21.8%0.642 → 0.497
021,111 → 2,34011.96 → 9.356.48% → 9.74%18.1% → 25.9%1.022 → 0.371
031,224 → 2,59811.73 → 9.629.31% → 8.20%33.3% → 29.6%0.378 → 0.397
041,281 → 2,60813.19 → 10.758.98% → 8.59%22.6% → 26.3%0.650 → 0.475
051,372 → 2,88612.76 → 10.867.43% → 9.15%40.2% → 18.6%0.427 → 0.640
061,276 → 2,46213.65 → 13.087.60% → 9.06%29.9% → 24.2%0.601 → 0.596
07671 → 3,18215.78 → 14.4810.43% → 8.67%25.7% → 20.3%0.588 → 0.822
081,316 → 5714.94 → 13.688.13% → 8.77%29.0% → 160.0%0.634 → 0.098
131,187 → 33214.80 → 18.989.86% → 11.75%26.5% → 20.5%0.567 → 0.787
141,114 → 3,10312.15 → 14.019.25% → 10.31%24.3% → 19.4%0.541 → 0.701
152,034 → 4,27010.49 → 11.5310.67% → 10.21%16.6% → 19.7%0.593 → 0.572
162,652 → 3,5199.11 → 10.738.60% → 9.21%17.5% → 18.8%0.604 → 0.619
172,512 → 3,96611.44 → 11.038.92% → 8.35%18.8% → 25.7%0.684 → 0.515
182,211 → 4,20711.82 → 11.258.68% → 8.89%24.0% → 21.1%0.568 → 0.599
191,877 → 3,54710.99 → 11.148.74% → 8.91%29.3% → 25.6%0.430 → 0.488
201,672 → 3,11111.44 → 10.8012.08% → 9.35%27.2% → 23.4%0.348 → 0.494
211,608 → 2,89312.90 → 12.8712.44% → 9.47%27.5% → 21.2%0.377 → 0.642
221,638 → 2,47716.07 → 11.0711.48% → 8.76%23.4% → 21.7%0.598 → 0.583
231,623 → 2,21412.61 → 14.2810.23% → 9.21%22.3% → 22.5%0.553 → 0.687
2026-08-06T07:29:00.127630 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 5 10 15 20 hour (UTC) 7 8 9 10 11 12 CTR % CTR 2026-08-04 2026-08-05 0 5 10 15 20 hour (UTC) 10 12 14 16 18 USD per 1,000 impressions CPM 0 5 10 15 20 hour (UTC) 20 40 60 80 100 120 140 160 installs / clicks % Click → install 0 5 10 15 20 hour (UTC) 0.2 0.4 0.6 0.8 1.0 USD Cost per install Delivery by hour — 2026-08-05 against 2026-08-04, shared hours only (UTC)
The same four ratios with the prior day laid over the day, shared hours only

Nothing separated. Every sign test is consistent with no change; the closest is CPM, lower in 14 of 20 hours at p = 0.115. A day that grew 40% moved no delivery ratio in a direction the pairing can distinguish from noise. Hour 08's 160% click→install is the blackout's edge: 8 installs against 5 clicks, where the installs are carry-back from earlier clicks.

3Country

META-day cut. Meta serves no hour × country grid, so per-country delivery cannot be restitched onto the UTC clock. Read this section for mix, never for level against §2 and §4.

ccspendinstallsCPIbookedbROAS (Meta)within-daywROAScohort@24hcROAS
IN$101.45196$0.518$237.652.34 (1.93)$125.001.23$134.321.32
DE$62.8526$2.417$21.850.35 (0.58)$21.850.35$21.850.35
US$44.0136$1.222$361.678.22 (3.36)$283.796.45$296.786.74
ID$18.9745$0.422$43.682.30 (2.05)$43.682.30$46.672.46
TR$17.2134$0.506$5.890.34 (0.34)$0.000.00$0.000.00
GB$16.5712$1.381$15.460.93 (0.93)$0.000.00$0.000.00
MX$13.9134$0.409$32.412.33 (0.41)$32.412.33$32.412.33
AR$11.7432$0.367$72.916.21 (1.96)$66.935.70$66.935.70
PH$9.9031$0.319$40.494.09 (2.62)$31.513.18$31.513.18
MY$9.2918$0.516$19.332.08 (1.50)$5.380.58$5.380.58
FR$9.079$1.008$0.000.00 (3.30)$0.000.00$0.000.00
ES$8.0317$0.473$67.038.34 (2.62)$9.991.24$9.991.24
2026-08-06T07:29:00.263345 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN DE US ID TR GB MX AR PH MY FR ES 0 50 100 150 200 250 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-05 spend within-day revenue
Spend against within-day revenue, by country
2026-08-06T07:29:00.323211 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN DE US ID TR GB MX AR PH MY FR ES 0.0 0.5 1.0 1.5 2.0 2.5 USD per install Cost per install by country — 2026-08-05 (META day)
Cost per install by country

The United States is 7.0% of spend and 31.6% of within-day revenue. That is the day's largest single lever and it is a targeting position rather than a creative result. It rests on very few people: most of the American money landed in pool5, whose largest single payer is 38.7% of its revenue.

India is 16.2% of spend and 13.9% of within-day revenue, so 1.23 and near break-even, at the cheapest CPI of any large market at $0.518. It is not the drag the account has sometimes treated it as.

Germany is 10.1% of spend and 2.4% of within-day revenue at a CPI of $2.417, 4.4× the account. That cell is the German buy, and it changed mid-day.

4Aggregate, both days

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

spendimpressionsCPMclicksCTRinstallsclick→installCPI
2026-08-04$373.9230,28912.352,8389.37%69124.35%$0.541
2026-08-05$625.1653,51811.684,9139.18%1,11722.74%$0.560

Pooling across hours is a mix comparison. 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. The hour-by-hour pairing in §2 is the unweighted read of the same two days; where the two disagree, the mix moved.

measure2026-08-04ROAS2026-08-05ROAS
booked$921.862.07$1,427.512.28
within-day$588.701.32$898.321.44
cohort@24h$817.431.83 (100% cov)$923.621.48 (9% cov)
2026-08-06T07:29:00.389889 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ booked within-day cohort @ 24h 0 200 400 600 800 1000 1200 1400 USD 2.07 1.32 1.83 2.28 1.44 1.48 the number above each bar is that measure's ROAS against the same day's spend The three revenue measures, 2026-08-04 against 2026-08-05 (UTC) 2026-08-04 2026-08-05
The three revenue measures on both days, ROAS above each bar
2026-08-06T07:29:00.452243 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 2026-08-04 2026-08-05 0 200 400 600 800 1000 1200 1400 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
booked revenue on 08-05, by the UTC day its payer installed
installed 2026-08-05 — this is the within-day figure$898.3262.9%
installed 2026-08-04$244.6717.1%
installed 2026-08-03$101.027.1%
installed 2026-08-02$50.783.6%
installed 2026-08-01$100.137.0%
installed 2026-07-31$32.592.3%

37.1% of the day's booked revenue came from people who installed before it. That is the entire gap between booked 2.28 and within-day 1.44, and it is why a rising-spend day reads better on Meta's number than on ours.

5Per ad set, hourly

Rows sit at ad grain. spill runs two ads in one ad set, a replacement pair on the same creative that never both deliver on one day, so the delivering ad is the ad-set row on any single day. The German ad sets hold 10 and 15 ads and are not readable at this level; §7 covers them.

2026-08-06T07:29:00.527780 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 2.5 5.0 7.5 10.0 12.5 15.0 17.5 20.0 CTR % CTR by hour — every asset, 2026-08-05 (UTC) E2/pool5 E2/bodysuit E2/bikini E2/spill2 E2/lounge DE/turkish_mature DE/german_mature DEww/bodysuit
CTR by hour, one line per asset
2026-08-06T07:29:00.698887 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 5 10 15 20 25 30 35 40 installs / clicks % Click → install by hour — every asset, 2026-08-05 (UTC) E2/pool5 E2/bodysuit E2/bikini E2/spill2 E2/lounge DE/turkish_mature DE/german_mature DEww/bodysuit
Click-to-install by hour, one line per asset
2026-08-06T07:29:00.775522 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 1 2 3 4 5 6 7 8 USD Cost per install by hour — every asset, 2026-08-05 (UTC) E2/pool5 E2/bodysuit E2/bikini E2/spill2 E2/lounge DE/turkish_mature
Cost per install by hour, one line per asset
2026-08-06T07:29:00.612531 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 60 70 USD per 1,000 impressions CPM by hour — every asset, 2026-08-05 (UTC) E2/pool5 E2/bodysuit E2/bikini E2/spill2 E2/lounge DE/turkish_mature DE/german_mature DEww/bodysuit
CPM by hour, one line per asset

spill holds its CTR lead across the whole clock, not in a handful of hours. The separation is a level difference, which is what makes it the one delivery gap on the day large enough to outlast the noise. bodysuit sits at the bottom of the same panel all day, for the same reason.

The blackout appears in every panel as one five-hour gap, in all arms simultaneously.

6Per ad set × country

META-day cut, as §3. Regions: US · India · other T1 (developed markets) · rest.

assetregionspendinstallsCPIwithin-day
pool5US$18.3724$0.765$273.81
pool5India$18.5534$0.546$11.52
pool5other T1$30.2542$0.720$34.69
pool5rest$35.1379$0.445$201.99
bodysuitUS$16.279$1.808$4.99
bodysuitIndia$26.7966$0.406$46.59
bodysuitother T1$11.7019$0.616$29.40
bodysuitrest$31.5265$0.485$42.83
bikiniUS$2.701$2.700$0.00
bikiniIndia$27.8659$0.472$38.11
bikiniother T1$2.120$0.00
bikinirest$10.2324$0.426$0.00
spillUS$2.361$2.360$0.00
spillIndia$11.4220$0.571$17.27
spillother T1$5.457$0.779$9.99
spillrest$14.1036$0.392$24.88
loungeUS$4.301$4.300$4.99
loungeIndia$16.8317$0.990$11.52
loungeother T1$10.148$1.267$0.00
loungerest$23.2534$0.684$27.29
2026-08-06T07:29:00.876653 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/pool5 E2/bodysuit E2/lounge E2/bikini E2/spill2 0 20 40 60 80 100 % of that asset's spend Where each asset bought — share of its own spend by region, 2026-08-05 (META day) IN DE US ID TR GB other
Where each asset bought: share of its own spend by region
2026-08-06T07:29:00.953034 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/pool5 E2/bodysuit E2/lounge E2/bikini E2/spill2 0 1 2 3 4 USD per install Cost per install by region — every asset, 2026-08-05 (META day) IN DE US ID TR GB
Cost per install by region, every asset
2026-08-06T07:29:01.006250 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/pool5 E2/bodysuit E2/lounge E2/bikini E2/spill2 0 50 100 150 200 250 USD Within-day revenue by region — every asset, 2026-08-05 (META day) IN US ID
Within-day revenue by region, every asset

The arms did not buy the same world, so their aggregate numbers are not comparable without this table. pool5 put 14.3% of its spend in the United States and drew $273.81 from it; bikini put 4.1% there and drew nothing. That single cell is 30.5% of the entire account's within-day revenue and is the whole of the difference between the two arms' headline ROAS.

bikini bought 48% India on the hour-matched window, the highest in the pack. Its low CPM is the same fact rather than a separate merit.

7Per ad set, aggregate, all three measures

A. Per asset — delivery

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

assetspendimpressionsCPMclicksCTRinstallsclick→installCPI
E2/pool5$149.0616,3339.131,5959.77%32220.19%$0.463
E2/bodysuit$146.2916,2299.011,0846.68%30027.68%$0.488
E2/bikini$83.659,6818.648538.81%19122.39%$0.438
E2/spill2$76.605,69613.4587715.40%19722.46%$0.389
E2/lounge$74.693,75119.9138010.13%8422.11%$0.889
DE/turkish_mature$56.001,02854.47706.81%1318.57%$4.308
DE/german$12.2323152.94156.49%533.33%$2.446
DE/german_mature$11.7723450.30187.69%211.11%$5.885
DEww/bodysuit$7.5719039.8494.74%111.11%$7.570
DE/german_6s$5.1810847.9676.48%342.86%$1.727
DEww/spill2$1.401782.35423.53%250.00%$0.700
DE/turkish_6s$0.39848.7500.00%0
DEww/bikini$0.221415.7117.14%00.00%
DEww/pool5$0.12260.0000.00%0
earner/bodysuit$0.00005$0.000
earner/bikini$0.00002$0.000
earner/pool5$0.00000
E2/spill$0.00000

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, 9% covered on this day. Report clock UTC.

assetbookedbROAS (Meta)within-daywROAScohort@HcROASpayerspayer%ARPUARPPUlargest payer
E2/pool5$695.984.67 (4.59)$545.463.66$562.013.77247.0%1.58622.7338.7%
E2/bodysuit$176.551.21 (1.30)$152.201.04$152.201.04196.2%0.4968.0119.3%
E2/bikini$117.581.41 (2.15)$47.450.57$53.210.6483.8%0.2285.9319.6%
E2/spill2$102.921.34 (2.23)$81.981.07$84.981.11126.3%0.4296.8313.4%
E2/lounge$49.390.66 (0.98)$49.390.66$49.390.6666.7%0.5558.2343.7%
DE/turkish_mature$0.000.00 (0.00)$0.000.00$0.000.0000.0%0.000
DE/german$21.851.79 (1.79)$21.851.79$21.851.79120.0%4.37021.85100.0%
DE/german_mature$0.000.00 (0.00)$0.000.00$0.000.0000.0%0.000
DEww/bodysuit$0.000.00 (0.00)$0.000.00$0.000.0000.0%0.000
DE/german_6s$0.000.00 (0.00)$0.000.00$0.000.0000.0%0.000
DEww/spill2$0.000.00 (0.00)$0.000.00$0.000.0000.0%0.000
DE/turkish_6s$0.000.00 (0.00)$0.000.00$0.000.000
DEww/bikini$0.000.00 (0.00)$0.000.00$0.000.000
DEww/pool5$0.000.00 (0.00)$0.000.00$0.000.000
earner/bodysuit$168.10(—)$0.00$0.0000.0%0.000
earner/bikini$39.56(—)$0.00$0.0000.0%0.000
earner/pool5$30.61(—)$0.00$0.0000.0%0.000
E2/spill$24.97(—)$0.00$0.0000.0%0.000

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/pool5$128.0714.5%14.3%71.2%50.2%
E2/bodysuit$108.1724.8%15.0%60.2%3.3%
E2/bikini$66.2342.1%4.1%53.9%0.0%
E2/spill2$53.0821.5%4.4%74.0%0.0%
E2/lounge$78.9221.3%5.5%73.2%10.1%
DE/turkish_mature$35.970.0%0.0%100.0%
DE/german$2.020.0%0.0%100.0%0.0%
DE/german_mature$10.770.0%0.0%100.0%
DEww/bodysuit$8.840.0%0.0%100.0%
DE/german_6s$3.420.0%0.0%100.0%
DEww/spill2$1.960.0%0.0%100.0%
DE/turkish_6s$0.390.0%0.0%100.0%
DEww/bikini$0.280.0%0.0%100.0%
DEww/pool5$0.220.0%0.0%100.0%

D. Regime-matched, mix-neutral

mix-neutral is that ad's ROAS recomputed on the regime's own pooled country mix, keeping its own cost and revenue efficiencies. All four arms below delivered inside regime E2-R3 at $100/day.

adinstallsspendCPMCTRIndia%CPIRPIROASmix-neutral
bikini62$27.411.3211.08%31%$0.4420.3200.730.80
bodysuit76$35.911.719.17%9%$0.4721.3442.852.28
pool572$25.49.049.80%6%$0.3524.56512.969.81
spill65$26.315.4715.54%18%$0.4040.1860.460.94

DECISION_LOG.md #48 records that a single-table mix-neutral figure "reads −14% or −22% depending on which population the table is built from; neither is real." Read the column as a direction only.

2026-08-06T07:29:01.106453 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-02 08-03 08-04 08-05 day (UTC) 0 1 2 3 4 5 6 7 8 payers / installs % Payer rate by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini earner/bodysuit E2/mugshot earner/bikini earner/pool5 E2/spill E2/spill2 E2/lounge
Payer rate by day, one line per asset
2026-08-06T07:29:01.205611 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-02 08-03 08-04 08-05 day (UTC) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 within-day USD per install ARPU by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini earner/bodysuit E2/mugshot earner/bikini earner/pool5 E2/spill E2/spill2 E2/lounge
ARPU by day, one line per asset
2026-08-06T07:29:01.292199 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-02 08-03 08-04 08-05 day (UTC) 0 5 10 15 20 25 within-day USD per payer ARPPU by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini earner/bodysuit E2/mugshot earner/bikini earner/pool5 E2/spill E2/spill2 E2/lounge
ARPPU by day, one line per asset
2026-08-06T07:29:01.409938 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-02 08-03 08-04 08-05 day (UTC) 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 revenue / spend Within-day ROAS by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini earner/bodysuit E2/mugshot earner/bikini earner/pool5 E2/spill E2/spill2 E2/lounge
Within-day ROAS by day, one line per asset
2026-08-06T07:29:01.495082 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-05 E2/pool5 E2/bodysuit E2/bikini E2/spill2 E2/lounge
Composite: every asset across every measure, normalised across the day

pool5's advantage is ARPPU, not payer rate. Its payer rate (7.0%) sits alongside bodysuit's (6.2%); what differs is what a payer is worth: $22.73 against $8.01, and $24.84 / $23.27 / $23.42 across the three days, stable to within a dollar on 42 pooled payers. That stability is the most reproducible revenue signal the campaign has produced. Half of it is American.

spill is the delivery leader and the weakest audience buy. CTR 15.40% against a pack running 6.7–10.1%, the cheapest CPI at $0.389, and the lowest expected revenue per install in the pack (0.648 on the hour-matched window). It wins attention cheaply; whether that attention converts is not answerable here.

bodysuit is the volume arm with a falling CTR, 7.53% → 7.63% → 6.68% across the three days, and last in the pack on the hour-matched window at 6.40%.

lounge is the most expensive arm on its first full day, at CPI $0.889 against a pack at $0.39–0.49, CPM 19.91, and 43.7% of its revenue is one payer. Its expected revenue per install is mid-pack, so it is buying expensively rather than badly.

The German buy is not readable. In the six hours after CBO went on, the whole German campaign spent $17.11 against a $100/day budget, and inside the new worldwide ad set bodysuit took 78% of it ($8.78 of $11.24). Impression counts run 2 to 190 per arm. Before it was paused, turkish_mature had taken $56.00 for 13 installs at $4.31 and returned nothing. The pauses did take: turkish_mature, turkish_6s and german_6s all stopped by PT hour 11 and took nothing afterwards.

8Caveats

9What would settle the open questions

questionwhat would settle it
Which creative is worth producing more ofThe five-cell A/B test — it randomises away the audience confound every observational read above is subject to
Whether spill's CTR edge convertsThe same test: cost per lead resolves 20% inside day 1
Whether pool5 is a creative or a geographyA US-held comparison, or the test's own non-overlapping split
Whether the US/India mix should be bought deliberatelyA targeting decision no creative test addresses — carried unresolved for four sessions
The exact window the balance was dryThe card issuer's statement for MasterCard ····9617 on 08-05; the Meta ledger dates transactions but does not time them
Whether the balance survives the five-cell testCurrent balance $239.87 against $850/day committed — under seven hours of runway. Top up before it stops the test
Whether the worldwide pack buys German impressions cheaperGen 7 after a full day, on CPM and cost per click only

10What this hands to the five-cell test

The test was scheduled to start 2026-08-06 00:00 PT and run five days across all five arms (bikini, bodysuit, pool5, spill, lounge) with cost per lead as the key metric.

The arms opened unequal and were equalised four hours in. bodysuit and pool5 started at $150/day and the other three at $100/day; at 04:05–04:06 PT on 08-06, bikini, spill and lounge were raised to $150, putting all five at $150/day and the test at $750/day. The first four hours ran at a 1.5:1 budget ratio and the remainder will not. Cost per install is what the test resolves first and it is exactly what this affects, so the day-1 read should be taken on the post-equalisation window rather than on the calendar day.

The prior this report hands over: spill leads on CTR by a margin nothing else here approaches; pool5 leads on money but half of that is an American position; bodysuit is fading on CTR; bikini buys the cheapest audience; lounge is the most expensive. None of it is a verdict, and the test exists because none of it can be.

11Reproduce

Window: UTC 2026-08-05 00:00–24:00, stitched from Meta days 08-04 (17:00–23:59) and 08-05 (00:00–16:59). Meta exports pulled 2026-08-05 19:23–19:26 PT: ads hourly for Meta day 08-05 (155 rows, hours 00–19), ads × day and ads × country × day for Jul 1 → Aug 5. Lum Telegram export taken on the laptop the same evening: 12,967 registrations, 1,306 payments, 7 unmatched. Payment data cut 2026-08-06 02:27 UTC. Activity history read for Aug 3 → Aug 6 with the rendered range asserted.

python -m ad_ops.measures       --config <run>/run_config.json --day 2026-08-05 --prev 2026-08-04
python -m ad_ops.day_compare    --config … --today 2026-08-05 --prev 2026-08-04 --h 6
python -m ad_ops.cohort_arpu    --config … --days 2026-08-01,…,2026-08-05
python -m ad_ops.report_tables  --config … --day 2026-08-05 --prev 2026-08-04
python -m ad_ops.report_charts  --config … --day 2026-08-05 --prev 2026-08-04 \
    --days 2026-08-02,…,2026-08-05 --out ad_ops/figures/2026-08-05 --relpath figures/2026-08-05
python -m ad_ops.asset_estimator hourly --meta <08-03,08-04,08-05 hourly> --lum <run>/lum --fx … \
    --ads ww_bikini_10s,ww_bodysuit_10s,ww_pool5,ww_mugshot,ww_spill,ww_lounge \
    --campaign bailingxia_meituan_ww_cvr_260802 --horizon 24

Working files: ../_runs/2026-08-05_0805_asset_candidates/.

12Appendix — definitions

The report clock is UTC. Adjust reports in UTC, so a UTC-bucketed report lines up with the attribution dashboard with no conversion in the head. Meta's ad account is fixed at UTC-7, so a UTC day is Meta day D-1 17:00–23:59 plus Meta day D 00:00–16:59. The window moves seven hours, and a UTC pull therefore needs the previous Meta day's hourly file as well as the day's own.

Three things the clock does not reach, each labelled where it appears. Country tables stay a META-day cut, because Meta serves no hour × country grid. The instrument check is invalid off the META clock, because Meta's conversion value sits on the conversion hour. The estimator and day_compare run on Meta's clock deliberately, since their subject is Meta-side delivery windows.

The three revenue measures, all read on our own payment records:

measurecountsmoves after the day closes?
bookedrevenue that arrived inside the day, whatever day its payer installedsettles ~4 h 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 within H hours of each person's own install. House horizon H=24rises until every install has lived H hours, then frozen. Always state coverage

Meta can express only booked, having no notion of an install-day cohort, so it rides bracketed beside that column and never as a row of its own. Within-day revenue is the "installed that day" row of the booked split in §4; the gap between booked and within-day is exactly the inherited cohort.

A regime is a stretch over which the ad set's daily budget did not change. It belongs in a daily report because the budget is a geography dial on this account: raising it buys wider, cheaper countries, so two creatives measured across a budget change are compared on different audiences (DECISION_LOG.md #47). This day contains one break, at ~PT 23:50 on Aug 4.

Two install counts exist. Meta's Leads and our own registrations disagree by 5–10%. Meta's is used for the delivery funnel (CPI and click→install) so numerator and denominator share one instrument. Ours is used for payer rate and every revenue measure, so payers and the installs they came from are the same population. They are never crossed.

The 16-payer bar (#37). Below roughly 16 payers a revenue figure is a direction, not a magnitude.

The composite chart is parallel coordinates, not a score. Cost axes are inverted so up is always better, revenue axes dashed and marked *, assets under 20 installs dropped, and money markers hollow where the point sits under 16 payers.

Internal — noindex. Not for distribution outside the team.