Daily campaign report — 2026-08-02, against 2026-08-01

Campaign bailingxia_meituan_ww_cvr_260730: one CBO ad set at $500/day, three creatives, worldwide, Android, optimised to Purchase. On a UTC day it spent $278.28 across 11 delivering hours, against $733.94 across 23 hours on 08-01. The report clock, the three revenue measures and regime are defined in the appendix, along with the one thing about this pair of days that bounds every comparison in the report: they are not regime-matched.

1Overview

08-0108-02change
delivering hours2311−12
spend$733.94$278.28−62.1%
installs1,963745−62.0%
cost per install$0.374$0.374−0.1%
booked$1,110.93 · 1.51 (Meta 1.59)$559.00 · 2.01 (Meta 2.19)+32.7%
within-day$980.99 · 1.34$272.13 · 0.98−26.8%
cohort at 24 h$1,163.16 · 1.58$360.61 · 1.30−18.2%

On the three revenue rows the change column is the change in ROAS, not in dollars. Dollars fell on all three, roughly with the spend.

The account bought less at the same price. Spend fell 62.1% and installs 62.0%, so cost per install landed within a tenth of a percent of the day before. Underneath that, CPM rose 21.1% and CTR rose 21.2% and cancelled exactly.

Booked rose while the day's own traffic earned less. 88.3% of the money arriving on 08-01 was earned by that day's installs against 48.7% on 08-02, so booked is measuring earlier buyers still paying. Within-day is sealed at 0.98 and cohort@24h agrees on direction at −18.2%.

The fall is real; its size depends on the measure. Within-day puts it at 26.8% and cohort@24h at 18.2%. The gap is the day's shape — delivery ended at 17:59 UTC, so late installs had hours rather than a day to pay, and within-day charges them for it.

No per-asset revenue row clears the payer bar, at 13, 10 and 9 payers, with one person holding 27% to 42% of each. §7 ranks them anyway, as directions.

2Hourly, 2026-08-02

Spend, impressions, clicks and installs sit on the delivery hour. Booked sits on the hour the money arrived. Within-day and cohort sit on the install hour: what that hour's traffic went on to earn. So only the within-day and cohort ratios divide an hour's revenue by that same hour's spend; the booked column is here so the day's total is traceable to where in the day it landed.

hour UTCspendimprCPMclicksCTRinstCPIbookedROASwithin-dayROAScohort 24 hROAS
00$7.13799$8.92688.51%16$0.446$14.512.03$14.512.03$14.512.03
01$0.00004$2.99$2.99$2.99
02$0.00003$36.50$2.99$2.99
03$0.00001$8.75$0.00$0.00
04$0.00003$20.27$0.00$0.00
05$0.00000$18.74$0.00$0.00
06$0.00005$29.49$4.99$4.99
07$0.00002$23.68$0.00$0.00
08$13.291,512$8.7916610.98%29$0.458$0.000.00$0.000.00$0.000.00
09$36.114,266$8.463738.74%82$0.440$7.120.20$42.581.18$42.581.18
10$41.414,119$10.053889.42%96$0.431$69.021.67$47.031.14$57.291.38
11$27.733,119$8.892949.43%80$0.347$26.360.95$16.150.58$82.262.97
12$30.762,573$11.952559.91%73$0.421$28.260.92$28.260.92$28.260.92
13$31.152,752$11.3230611.12%72$0.433$32.701.05$70.642.27$70.642.27
14$25.462,578$9.8827810.78%79$0.322$89.423.51$21.110.83$21.110.83
15$24.262,670$9.0927210.19%67$0.362$36.831.52$10.900.45$10.900.45
16$27.543,024$9.1131310.35%70$0.393$12.250.44$4.990.18$4.990.18
17$13.441,543$8.711409.07%43$0.313$32.912.45$0.000.00$0.000.00
18$0.000011$16.76$0.00$7.12
19$0.00002$11.96$0.00$0.00
20$0.00003$5.76$4.99$9.98
21$0.00002$15.99$0.00$0.00
22$0.00001$12.99$0.00$0.00
23$0.00001$5.76$0.00$0.00
total$278.2828,955$9.612,8539.85%745$0.374$559.002.01$272.130.98$360.611.30

Meta's own booked total for the day is $610.49 · 2.19, on its conversion clock. Installs in hours with zero delivery are conversion-clock residue from earlier hours; there are 38 of them.

Analysis. The UTC day contains two dark blocks with two different causes. Hours 01–07 are the tail of Meta day 08-01, when the CBO ad set had already spent $505.93 against a $500/day budget by 17:59 on the account clock and stopped for the rest of its own day. Hours 18–23 are not that: the budget was unchanged at $500/day, only $271.15 of it had been spent by then, and the campaign delivered again later on the same account day, which a cap never does. Between the two blocks sits one contiguous run of ten delivering hours, 08:00 to 17:59, plus a single hour at 00:00 carried in from the end of the previous account day.

The thirteen hours that bought nothing booked $209.64, against $15.96 of within-day revenue. That is 37.5% of the day's booked total arriving while delivery was at zero, and 5.9% of its within-day total. Hour 02 alone booked $36.50 on no spend.

Within the delivering hours the buying is steady. CPM runs $8.46 to $11.95 and CTR 8.51% to 11.12%, with no trend across the block. Cost per install drifts from $0.458 down to $0.313. What the traffic did afterwards does not hold steady: within-day ROAS by hour runs 0.00 to 2.27 on materially identical delivery, and hour 11 reads 0.58 within-day against 2.97 at a 24-hour horizon on the same traffic.

That last pair is the censoring, visible in one row. Compare hours to each other on the cohort column, and one day to another on within-day.

2026-08-05T10:30:24.258157 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 35 40 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 100 installs (Meta Leads) The day's motion — whole account, 2026-08-02 (UTC)
The day's motion: spend by hour, and impressions against installs
2026-08-05T10:30:24.485138 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 CTR % CTR 0 4 8 12 16 20 hour (UTC) 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 USD per 1,000 impressions CPM 0 4 8 12 16 20 hour (UTC) 18 20 22 24 26 28 30 installs / clicks % Click → install 0 4 8 12 16 20 hour (UTC) 0.32 0.34 0.36 0.38 0.40 0.42 0.44 0.46 USD Cost per install Delivery by hour — whole account, 2026-08-02 (UTC)
CTR, CPM, click-to-install and CPI by hour, whole account

Against 2026-08-01, 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: 00, 08, 09, 10, 12, 13, 14, 15, 16, 17. 2026-08-02 additionally delivered in 11. 2026-08-01 additionally delivered in 01, 02, 03, 04, 05, 06, 07, 18, 19, 20, 21, 22, 23. 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-02 ran higherhours it ran lowersign test
CPM9 of 101 of 10p = 0.021
CTR9 of 101 of 10p = 0.021
click→install3 of 107 of 10p = 0.344
CPI8 of 102 of 10p = 0.109

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 price of an impression rose almost everywhere, and the click rate rose with it. CPM ran higher on 08-02 in nine of the ten shared hours and CTR in the same nine, both at p = 0.021. What happens after the click does not move that way: click-to-install ran lower in seven of ten at p = 0.344 and cost per install higher in eight of ten at p = 0.109, and neither separates. Some of the CTR movement is composition, because pool5 ran on 08-02 and not on 08-01, but composition cannot lift the impression price of one ad set held at one budget in nine hours out of ten.

The full hour-by-hour pairing, 2026-08-01 → 2026-08-02

Every shared hour, 2026-08-01 → 2026-08-02. 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
00370 → 79912.76 → 8.9216.76% → 8.51%38.7% → 23.5%0.197 → 0.446
087,863 → 1,5126.72 → 8.796.79% → 10.98%25.5% → 17.5%0.389 → 0.458
098,151 → 4,2666.83 → 8.466.31% → 8.74%25.1% → 22.0%0.431 → 0.440
105,917 → 4,1197.50 → 10.056.39% → 9.42%25.4% → 24.7%0.462 → 0.431
121,073 → 2,5737.79 → 11.957.74% → 9.91%26.5% → 28.6%0.380 → 0.421
132,469 → 2,7526.94 → 11.328.67% → 11.12%27.1% → 23.5%0.296 → 0.433
143,175 → 2,5787.80 → 9.889.17% → 10.78%27.8% → 28.4%0.306 → 0.322
153,452 → 2,6707.71 → 9.099.21% → 10.19%24.8% → 24.6%0.337 → 0.362
164,177 → 3,0247.04 → 9.118.55% → 10.35%23.8% → 22.4%0.346 → 0.393
175,594 → 1,5436.70 → 8.717.85% → 9.07%26.4% → 30.7%0.323 → 0.313

Hour 00 is the single exception, on both CPM and CTR, and it is the one hour not from the same account day as the rest. It is carried in from the tail of Meta day 08-01, it bought 370 impressions against 799, and its 16.76% CTR on 08-01 is the only reading above 16% anywhere in the pairing. Across the contiguous run from 08:00 to 17:59 every shared hour points the same way on both ratios, which is what leaves the sign test with a single dissenting hour rather than a split.

2026-08-05T10:30:24.730644 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0.0 2.5 5.0 7.5 10.0 12.5 15.0 17.5 hour (UTC) 6 8 10 12 14 16 CTR % CTR 2026-08-01 2026-08-02 0.0 2.5 5.0 7.5 10.0 12.5 15.0 17.5 hour (UTC) 7 8 9 10 11 12 13 USD per 1,000 impressions CPM 0.0 2.5 5.0 7.5 10.0 12.5 15.0 17.5 hour (UTC) 20 25 30 35 installs / clicks % Click → install 0.0 2.5 5.0 7.5 10.0 12.5 15.0 17.5 hour (UTC) 0.20 0.25 0.30 0.35 0.40 0.45 USD Cost per install Delivery by hour — 2026-08-02 against 2026-08-01, shared hours only (UTC)
The same four ratios with the prior day laid over the day, shared hours only

3Country

This table is a META-day cut on its spend and install columns. 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 on the report's UTC clock, so every ratio in this table crosses seven hours. Read the table for mix, and read Meta's own bracketed figure when a level is wanted, because it is Meta's value over Meta's spend on Meta's day. Do not compare any level here against §1 or §4.

08-02, top by spend:

spendinstCPIbookedROAS(Meta)within-dayROAScohort 24 hROAS
IN$82.03181$0.453$105.631.291.58$50.980.62$58.100.71
US$16.7732$0.524$25.961.551.07$22.971.37$22.971.37
BR$15.9677$0.207$50.923.197.31$50.923.19$117.037.33
ID$14.1951$0.278$4.990.350.35$0.000.00$0.000.00
TR$11.1322$0.506$21.251.913.36$21.251.91$21.251.91
MY$8.5825$0.343$0.000.000.00$0.000.00$0.000.00
PH$7.4946$0.163$0.000.000.00$0.000.00$0.000.00
GB$7.185$1.436$0.000.000.00$0.000.00$0.000.00
IT$6.305$1.260$0.000.000.00$0.000.00$0.000.00
MX$6.2313$0.479$0.000.000.92$0.000.00$0.000.00
TH$5.8615$0.391$0.000.003.75$0.000.00$0.000.00
AU$5.752$2.875$22.083.840.00$22.083.84$28.674.98

The same countries a Meta day earlier:

08-01spendinstCPIbooked ROAS(Meta)within-day ROAScohort 24 h ROAS
IN$159.52394$0.4051.562.051.281.51
US$26.8825$1.0752.271.712.272.27
BR$20.7292$0.2253.501.973.503.50
ID$19.2876$0.2542.620.922.622.62
TR$16.6034$0.4881.280.921.281.28
MY$16.5645$0.3682.591.932.592.59
PH$10.7965$0.1665.121.875.125.12

Analysis. The mix moved toward the rest of the world. India took $159.52 of the ad account's $505.93 on the earlier Meta day and $82.03 of $321.07 on the later one, 31.5% falling to 25.5% on spend that itself fell 48.6%. India is also the most expensive install of any country with real volume, $0.453 against Brazil's $0.207 and the Philippines' $0.163.

A single day cannot carry a per-country verdict on this account. The loudest ratios sit on the smallest cells: Australia's 3.84 rests on two installs, and Great Britain's and Italy's zeroes on five each. The whole-run estimator answers the same question with a usable sample, on Meta's clock across 07-30 to 08-03 and 4,527 installs at a 12-hour horizon. Against a pooled account value of $0.463 per install it puts India at 1,283 installs and 0.87× the account's return, Brazil at 370 installs and 0.71×, Indonesia at 279 and 0.57×, the Philippines at 198 and 0.66×, Malaysia at 116 and 0.65×. The two countries that clear the account on that sample are the United States at 120 installs and 2.32× and Turkey at 119 and 1.78×.

That reframes the day's two loudest cells. Brazil's 7.33 in the cohort column is 77 installs of a country that returns 0.71× over five times the sample; Australia's 3.84 is two installs. Neither is a market fact.

2026-08-05T10:30:24.882114 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US BR ID TR MY PH GB IT MX TH AU 0 10 20 30 40 50 60 70 80 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-02 spend within-day revenue
Spend against within-day revenue, by country
2026-08-05T10:30:24.949170 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US BR ID TR MY PH GB IT MX TH AU 0.0 0.5 1.0 1.5 2.0 2.5 3.0 USD per install Cost per install by country — 2026-08-02 (META day)
Cost per install by country

4Aggregate, both days

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

spendimpressionsCPMclicksCTRinstallsclick→installCPI
2026-08-01$301.3942,2417.143,1907.55%82625.89%$0.365
2026-08-02$250.5525,8369.702,5599.90%62724.50%$0.400

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 the hourly section is the unweighted read of the same two days; where the two disagree, the mix moved.

On this pair of days the two reads agree. Pooled, CTR goes 7.55% to 9.90% at p = 0.000 and click-to-install 25.89% to 24.50% at p = 0.228; counted hour by hour in §2, CTR runs higher in nine of ten at p = 0.021 and click-to-install lower in seven of ten at p = 0.344. Both readings put CTR up and both leave click-to-install unresolved, and the pooled CPM and cost-per-install rows move in the direction their sign tests already gave. No single hour on either side of the pairing dominates the compared impressions, so the weighted and the unweighted read have nothing to pull apart.

Held to a single creative that ran on both days, the comparison can only be made on the ad account's own clock: the matched-hours work keys every cell on (campaign, ad set, ad, Meta day, Meta hour), and its shared-hours logic means something only against Meta's own delivery days. What follows is Meta day 08-02 against Meta day 08-01, a seven-hour-offset pair of windows against every other table in this report, and its levels do not reconcile against them. Only the nine hours both Meta days delivered are used, because the diurnal shape is the largest confound: 01, 02, 03, 05, 06, 07, 08, 09, 10.

Install counts here are cell-attributed with carry-back, which is a third basis from either Meta's Leads or a raw registration timestamp. Cohort coverage at H=24 on this subset is 100% on both days.

impressionsclicksCTRinstallsclick→installpayerspayer rateROAS
08-01 pooled41,8713,1287.47%89628.64%364.02%1.50
08-02 pooled25,0372,4919.95%67126.94%253.73%1.04
bodysuit 08-0125,6751,9977.78%55127.59%203.63%1.52
bodysuit 08-0212,8891,0738.32%31829.64%72.20%0.72
bikini 08-0110,9107626.98%23931.36%104.18%1.22
bikini 08-023,10531810.24%7222.64%68.33%1.25

bikini's shared window is four hours, 02, 03, 05 and 06; bodysuit's is all nine.

Nothing in that pooled funnel separates the days either. Click-to-install falls 6.0% at p = 0.156 and the payer rate falls 7.3% at p = 0.767. Held to bodysuit, click-to-install rises 7.4% at p = 0.230 and the payer rate falls 39.4% at p = 0.242, on seven payers.

bikini's click-to-install drop is basis-dependent and should not be quoted as settled. On the cell-attributed basis above it reads 31.36% → 22.64%, a 27.8% fall at p = 0.004. Recomputed over the same four hours on Meta's own clicks and installs it reads 25.72% → 20.75%, a 19.3% fall at p = 0.083. One creative, one funnel step, two defensible bases, two verdicts either side of the 0.05 line, on 72 installs. The sample is too thin to settle it, and bikini's payer rate moved 99% the other way over the same cells at p = 0.162.

So the funnel after the click is not meaningfully different between the two Meta days. What moved is the price of the impression.

Back on the report clock, the two days on all three measures:

08-0108-02
spend$733.94$278.28
installs1,963745
cost per install$0.374$0.374
booked$1,110.93 · 1.51 (Meta 1.59)$559.00 · 2.01 (Meta 2.19)
within-day$980.99 · 1.34$272.13 · 0.98
cohort at 24 h$1,163.16 · 1.58$360.61 · 1.30
cohort coverage at 24 h100%, complete100%, complete

Booked revenue split by the UTC day its payer actually installed:

payer installed08-01's booked revenue08-02's booked revenue
the day itself$980.99 (88.3%)$272.13 (48.7%)
one day earlier$129.94 (11.7%)$239.67 (42.9%)
two days earlier$47.20 (8.4%)

Analysis. The top row of that split table is within-day. $980.99 and $272.13 appear in both places. Within-day is the day's own share of its booked revenue, so the gap between the two measures is the inherited cohort and nothing else.

On 08-01 the two nearly agree, 1.51 against 1.34, because 88.3% of what arrived was earned that day. On 08-02 they diverge hard, 2.01 against 0.98, because less than half was. A day that spends less while the previous days' buyers keep paying will always read well on booked revenue, and better still on Meta's version of it. That is the measure behaving as defined.

Two things bound how far the 0.98 can be pushed:

Maturity is not available as an explanation on either side: both cohorts are 100% covered at a 24-hour horizon, the youngest 08-02 install being 61.4 hours old at the payment cut.

2026-08-05T10:30:25.031280 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ booked within-day cohort @ 24h 0 200 400 600 800 1000 1200 USD 1.51 1.34 1.58 2.01 0.98 1.30 the number above each bar is that measure's ROAS against the same day's spend The three revenue measures, 2026-08-01 against 2026-08-02 (UTC) 2026-08-01 2026-08-02
The three revenue measures on both days, ROAS above each bar
2026-08-05T10:30:25.098031 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 2026-08-01 2026-08-02 0 200 400 600 800 1000 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

This campaign runs one CBO ad set holding three ads, so the ad-set row would be the whole account and the level that separates is the ad; the rows here are labelled by creative.

Delivering hours only, single-clock metrics, on the UTC day. bodysuit delivered in 11 hours, pool5 in 10 and bikini in 9; all three ran together in the nine hours 09:00 to 17:59.

08-02spendimpressionsCPMclicksCTRinstallsclick→installCPI
ww_bodysuit_10s$129.1515,331$8.421,2648.24%36729.03%$0.352
ww_pool5_15s$77.056,942$11.1093113.41%21322.88%$0.362
ww_bikini_10s$72.086,682$10.796589.85%16525.08%$0.437

The two creatives that ran on both UTC days:

08-01spendimpressionsCPMclicksCTRinstallsclick→installCPI
ww_bodysuit_10s$432.4256,102$7.714,7338.44%1,23526.09%$0.350
ww_bikini_10s$301.5236,344$8.302,7827.65%72826.17%$0.414

Analysis. pool5 buys the most expensive impressions and converts them best; bodysuit the reverse. Against bodysuit, pool5 pays 31.8% more per impression, earns 62.7% more clicks from them, and turns 21.2% fewer of those clicks into installs. The three effects very nearly cancel and it arrives 2.8% behind on cost per install. bikini is a clear third at $0.437, paying nearly pool5's impression price for two thirds of its click rate.

Day over day, the two returning creatives moved differently. bodysuit's impression price rose 9.2% and its click rate slipped 2.4%, but it converted 11.3% more of its clicks, so its cost per install landed within 0.6% of the day before. bikini's impression price rose 30.0% and its click rate rose 28.8%, cancelling, and it paid 5.6% more per install. The account's flat pooled cost per install is therefore two creatives whose own moved 0.6% and 5.6%, plus pool5 entering at $0.362 on 27.7% of the spend. It is not an average concealing movement underneath.

2026-08-05T10:30:25.181663 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 6 8 10 12 14 16 CTR % CTR by hour — every asset, 2026-08-02 (UTC) earner/bodysuit earner/pool5 earner/bikini
CTR by hour, one line per asset
2026-08-05T10:30:25.332170 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 15 20 25 30 35 40 45 installs / clicks % Click → install by hour — every asset, 2026-08-02 (UTC) earner/bodysuit earner/pool5 earner/bikini
Click-to-install by hour, one line per asset
2026-08-05T10:30:25.399328 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.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 USD Cost per install by hour — every asset, 2026-08-02 (UTC) earner/bodysuit earner/pool5 earner/bikini
Cost per install by hour, one line per asset
2026-08-05T10:30:25.248271 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 8 10 12 14 USD per 1,000 impressions CPM by hour — every asset, 2026-08-02 (UTC) earner/bodysuit earner/pool5 earner/bikini
CPM by hour, one line per asset

6Per ad set × country

Spend and installs are the META-day cut described in §3; revenue is on the UTC day. Cells above $3 of spend, in spend order.

assetccspendinstCPIbookedwithin-dayROAScohort 24 hROAS
bodysuitIN$37.7892$0.411$51.09$11.520.30$11.520.30
pool5IN$23.9547$0.510$11.52$11.520.48$11.520.48
bikiniIN$20.2942$0.483$43.03$27.951.38$35.071.73
bodysuitUS$8.9818$0.499$7.98$4.990.56$4.990.56
bodysuitBR$6.8343$0.159$10.26$10.261.50$76.3711.18
bodysuitID$5.7627$0.213$4.99$0.000.00$0.000.00
pool5BR$5.5022$0.250$35.53$35.536.46$35.536.46
pool5ID$5.1014$0.364$0.00$0.000.00$0.000.00
bodysuitMY$5.0510$0.505$0.00$0.000.00$0.000.00
bodysuitPH$4.4228$0.158$0.00$0.000.00$0.000.00
bodysuitMX$4.3511$0.396$0.00$0.000.00$0.000.00
bikiniUS$4.137$0.590$17.98$17.984.35$17.984.35
bodysuitTR$4.084$1.020$5.89$5.891.44$5.891.44
bikiniTR$4.028$0.503$5.89$5.891.47$5.891.47
bodysuitAU$3.852$1.925$0.00$0.000.00$0.000.00
pool5US$3.667$0.523$0.00$0.000.00$0.000.00
bikiniBR$3.6312$0.303$5.13$5.131.41$5.131.41
bikiniTH$3.335$0.666$0.00$0.000.00$0.000.00
bikiniID$3.3310$0.333$0.00$0.000.00$0.000.00
pool5TR$3.0310$0.303$9.47$9.473.12$9.473.12

Analysis. India is the biggest line for all three creatives and the three read 0.30, 0.48 and 1.73 in it at a 24-hour horizon. Brazil reads 11.18, 6.46 and 1.41. Both spreads are as wide as the spreads between countries, on one or two payers per cell, so at this cell size neither asset nor country is separable and the table is here to locate revenue, not to rank.

Locating it is what it does well. Each creative's within-day figure leans on one person. bodysuit's largest single payer is 42.3% of its $100.67, which is $42.58, the entire within-day total of hour 09. pool5's largest is 33.6% of its $105.65, which is $35.53, its entire Brazil cell. bikini's largest is 27.3% of its $65.81, which is $17.98, its entire United States cell. Three creatives, three single baskets sitting under three headline numbers.

bodysuit's Brazil row also shows the censoring directly: $10.26 within-day against $76.37 at 24 hours. Most of what that cell earned was paid after UTC midnight and inside a day of the buyer arriving.

2026-08-05T10:30:25.501344 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ earner/bodysuit earner/pool5 earner/bikini 0 20 40 60 80 100 % of that asset's spend Where each asset bought — share of its own spend by region, 2026-08-02 (META day) IN US BR ID TR MY other
Where each asset bought: share of its own spend by region
2026-08-05T10:30:25.578267 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ earner/bodysuit earner/pool5 earner/bikini 0.0 0.2 0.4 0.6 0.8 1.0 USD per install Cost per install by region — every asset, 2026-08-02 (META day) IN US BR ID TR MY
Cost per install by region, every asset
2026-08-05T10:30:25.641819 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ earner/bodysuit earner/pool5 earner/bikini 0 5 10 15 20 25 30 35 USD Within-day revenue by region — every asset, 2026-08-02 (META day) IN US BR TR
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.

A. Per asset — delivery

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

assetspendimpressionsCPMclicksCTRinstallsclick→installCPI
earner/bodysuit$129.1515,3318.421,2648.24%36729.03%$0.352
earner/pool5$77.056,94211.1093113.41%21322.88%$0.362
earner/bikini$72.086,68210.796589.85%16525.08%$0.437

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

assetbookedbROAS (Meta)within-daywROAScohort@HcROASpayerspayer%ARPUARPPUlargest payer
earner/bodysuit$350.232.71 (3.14)$100.670.78$175.441.36133.3%0.2577.7442.3%
earner/pool5$105.651.37 (1.34)$105.651.37$112.241.46104.4%0.47010.5733.6%
earner/bikini$103.121.43 (1.42)$65.810.91$72.931.0195.0%0.3687.3127.3%

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
earner/bodysuit$153.9424.5%5.8%69.6%5.0%
earner/pool5$85.6528.0%4.3%67.8%0.0%
earner/bikini$82.0724.7%5.0%70.2%27.3%

Analysis. Which creative is best depends on which measure is read, and the answers do not agree.

Booked revenue on the day puts bodysuit far ahead, 2.71 against 1.37 and 1.43, and Meta reads it higher still at 3.14. Its own traffic puts it last on within-day at 0.78. pool5 shows why: its booked and within-day figures are the same number, $105.65. It bought nothing at all on 08-01 UTC, and none of the buyers it picked up on 07-30 and 07-31 paid inside this UTC day, so every dollar credited to it came from someone who installed that day. bodysuit and bikini both delivered on the two UTC days before this one, and 71.3% of what bodysuit was credited with, against 36.2% of bikini's, was paid by people who installed earlier. On any day the spend falls, booked revenue promotes whichever creative holds the largest stock of earlier buyers still paying.

The hour-neutral measure narrows the gap rather than confirming it. At a 24-hour horizon pool5 leads at 1.46, bodysuit follows at 1.36 and bikini trails at 1.01. bodysuit's jump from 0.78 to 1.36 is the same censoring §4 describes: it delivered latest into the UTC day, and its Brazil cell alone goes from $10.26 within-day to $76.37 at 24 hours.

2026-08-05T10:30:25.733114 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:25.824986 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:25.925764 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:26.022938 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:26.123626 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-02 earner/bodysuit earner/pool5 earner/bikini
Composite: every asset across every measure, normalised across the day

The regime-matched, mix-neutral cut

The estimator keys every cell on a Meta day and hour, and its regimes are Meta wall-clock instants: a budget was changed at 04:10 on the account's clock, and that is the event. The table below is therefore on Meta's clock and spans whole regimes rather than a day, at a 12-hour horizon. mix-neutral re-prices each creative's return on its regime's own pooled country mix, answering "how would this asset have done if it had bought the same countries as its siblings".

assetregime$/dayinstallsspendCPMCTRIndia shareCPIcohort 12 h ROASmix-neutral
ww_bikini_10sR5500352$135.1$10.169.57%27%$0.3841.521.54
ww_bodysuit_10sR55001,430$501.2$8.578.37%29%$0.3511.181.20
ww_pool5_15sR5500309$116.6$10.9512.20%19%$0.3771.111.02
ww_bikini_10sR4875732$286.7$8.337.62%32%$0.3921.171.17
ww_bodysuit_10sR4875488$144.2$6.167.86%39%$0.2961.451.45

Inside R5 the two largest arms carry 95% confidence intervals of 0.73–2.51 for bikini and 0.82–1.60 for bodysuit, and the estimator's own audience test finds their country mixes worth +1.5% of each other with an interval spanning zero.

Held to whole budget regimes on Meta's clock, the ordering changes again. Inside R5, where all three ran at $500/day, bikini leads at 1.52 with bodysuit at 1.18 and pool5 last at 1.11, and the mix-neutral column says none of that is a country-mix artifact: it moves bikini and bodysuit up 0.02 each and pool5 down 0.09. pool5 bought the cheapest mix of the three across R5, 19% India, and still finishes last once that advantage is removed. bikini meanwhile is 1.17 in R4 at $875/day against 1.52 in R5 at $500/day, with India share moving 32% to 27%: the budget is a geography dial, and a verdict taken across a budget change is a verdict about the budget.

So the day and the regime disagree about pool5, and neither is decisive. Its lead is on one UTC day, ten payers, and a single basket worth a third of its revenue. Its regime-matched figure covers the whole of R5 and puts it behind both siblings, on 309 installs against bodysuit's 1,430. The R5 confidence intervals overlap almost entirely. What can be said without a sample argument is that pool5 leads on CTR by more than half and comes within 3% of the cheapest cost per install, and that it has never yet been read on a day where it carried an inherited cohort of its own.

8Caveats

9What would settle the open questions

QuestionWhat is needed
Is pool5's within-day lead real or newness?A day on which it carries an inherited cohort of its own. Its regime-matched figure over the whole of R5 is 1.11, behind both siblings, so the day-level lead is not yet corroborated
How large is India's discount?The whole-run read puts India at 0.87× the account on 1,283 installs, a real discount and a far smaller one than any single day suggests. Its own ad set with its own budget would settle whether it can be bought around
Is Brazil's spike real?More payers. Over 370 run-wide installs Brazil returns 0.71× the account, so the day's figure is a basket, not a market
Which creative actually wins?E2's randomised split. Nothing in this campaign's structure separates three creatives inside one CBO ad set at these payer counts

10What this hands to E2

The CBO ad set stopped delivering at 04:20 on 08-03, Meta clock, and was replaced by E2, a randomised creative test running one creative per ABO ad set.

The baseline to beat is within-day ROAS 0.98 at $0.374 cost per install on the UTC clock, or 1.30 at a 24-hour horizon. It is not the 2.01 booked or the 2.19 Meta books. Every E2 arm is brand new and therefore has no inherited cohort, exactly as pool5 collected none on 08-02, so comparing an E2 arm against a booked figure from this campaign compares a flow against a stock and will make E2 look worse than it is. Compare within-day to within-day, and cohort at 24 h to cohort at 24 h. India stays a quarter of the buy at 0.87× the account's value, and no creative test addresses that.

11Appendix — the clock, the measures, and regime

The report day is a UTC day, to line up with Adjust. Meta stamps its hourly exports in the ad account's own zone, UTC-7, so every delivery figure above is restitched from two account days: 08-01 17:00–23:59 and 08-02 00:00–16:59.

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

measurecountsmoves after the day closes?
bookedrevenue that arrived inside the UTC day, whatever day its payer installed. It inherits earlier buyerssettles a few hours after midnight, then fixed. Meta's own number is this basis
within-daypeople who installed that day and paid before that day closednever. Sealed at midnight
cohort at 24 hthat day's installs counted within 24 hours of each person's own install, which removes the advantage a morning install has over an evening onerises until every install has lived 24 h. Complete on both days here

All three are read on our own payment records, with Meta's figure bracketed beside booked and never given a row of its own. The instrument check between the two runs on Meta's clock, where its conversion value can be read against the day it belongs to; there our records are 0.94 and 0.91 of Meta's booked value on the two account days, inside the documented 0.91–1.06 band.

The two measures count different install populations. Meta attributes 1,963 and 745 installs; our own records tie 2,134 and 795 registrations to these ads. Every ROAS in this report is revenue over spend and uses neither count. The install and cost-per-install rows are Meta's.

A regime is a stretch of time over which the ad set's daily budget did not change. It matters 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 being compared on different audiences.

These two days are not regime-matched, and that bounds every comparison in the report. 08-02 sits wholly inside one regime, R5 at $500/day, which ran 08-01 04:10 to 08-03 04:20 on Meta's clock. 08-01 does not: its window opens on the tail of an earlier $500/day setting, runs at $875/day, and returns to $500/day at 11:10 UTC, with $435.60 of its spend falling before that change and $298.34 after. That is a consequence of the clock rather than of the buying. Regimes are read from Ads Manager's activity history and cannot be recovered from any export.

12Reproduce

Report day 2026-08-02 00:00 → 24:00 UTC, restitched from Meta account days 08-01 17:00–23:59 and 08-02 00:00–16:59, the account being fixed at UTC-7. A UTC pull therefore needs the previous Meta day's hourly export as well as the day's own. Payment records cut 2026-08-05 10:59 UTC, which gives 08-02's installs 61.4 to 82.9 hours and 08-01's 83.1 to 106.9 hours, so both 24-hour cohorts are complete. Country figures come from one account-wide Country × Day pull and are a Meta-day cut.

Meta rows are selected by Ad ID, not by ad-set or creative name: E2 carries byte-identical creative names to this campaign's, and its first ad set was itself named ww_broad_purchase_adv_cbo150 for ten hours on 08-02–08-03. A name filter over-attributes by ~70%.

cd C:/Projects/VideoGenAI_Related
CFG=_runs/2026-08-05_0804_settled/run_config.json          # tz: UTC
python -m ad_ops.measures      --config $CFG --day 2026-08-02 --prev 2026-08-01
python -m ad_ops.cohort_arpu   --config $CFG --days 2026-07-31,2026-08-01,2026-08-02
python -m ad_ops.report_tables --config $CFG --day 2026-08-02 --prev 2026-08-01
python -m ad_ops.report_charts --config $CFG --day 2026-08-02 --prev 2026-08-01 \
    --days 2026-07-31,2026-08-01,2026-08-02 \
    --out ad_ops/figures/2026-08-02 --relpath figures/2026-08-02

# META clock — the instrument gate, §4's per-creative tests, and the regime table
python -m ad_ops.measures --config _runs/2026-08-05_0804_settled/run_config_meta.json \
    --day 2026-08-02 --prev 2026-08-01
python -m ad_ops.day_compare --config $CFG --today 2026-08-02 --prev 2026-08-01 --h 24 \
    --campaign bailingxia_meituan_ww_cvr_260730 --ads ww_bikini_10s,ww_bodysuit_10s,ww_pool5
python -m ad_ops.asset_estimator hourly --horizon 12 \
    --meta ad_ops/_data/b1_meta_exports/B1-Ads-Jul-30-2026-Jul-30-2026.csv \
           ad_ops/_data/b1_meta_exports/B1-Ads-Jul-31-2026-Jul-31-2026.csv \
           _runs/2026-08-03_aug2_hourly/exports/ads_hourly_aug1_settled.csv \
           _runs/2026-08-03_aug2_hourly/exports/ads_hourly_aug2_settled.csv \
           _runs/2026-08-04_e2_start_and_0803_report/exports/ads_hourly_aug3_settled.csv \
    --lum _runs/2026-08-05_0804_settled/lum \
    --fx  _runs/2026-08-02_today_read/fx_rates.json \
    --ads ww_bikini,ww_bodysuit,ww_pool5

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.

The measures run raises by name if the previous Meta day's hourly export is missing, rather than short-filling the first seven hours of the UTC day. The 08-03 hourly file is required by the estimator for the same reason in the other direction: the campaign delivered past midnight, and without it attach_cohorts carries every post-midnight install back into the last 08-02 cell.

Internal — noindex. Not for distribution outside the team.