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%

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

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

appARPU (d0)ARPU (d3)ARPU (d7)ARPPU (d0)ARPPU (d3)ARPPU (d7)installs
Vloom$0.3736$0.6544$0.9786$9.74$15.35$20.86938

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

The account bought less at the same price. CPM rose 21.1% and CTR 21.2%, cancelling exactly.

Booked rose while the day's own traffic earned less. The share earned by that day's own installs fell 88.3% to 48.7%.

The fall is real; its size depends on the measure. Within-day reads 26.8%, cohort@24h 18.2%; the gap is how long late installs had to pay.

No per-asset revenue row clears the payer bar, at 13, 10 and 9 payers; §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.000—0—4—$2.99—$2.99—$2.99—
02$0.000—0—3—$36.50—$2.99—$2.99—
03$0.000—0—1—$8.75—$0.00—$0.00—
04$0.000—0—3—$20.27—$0.00—$0.00—
05$0.000—0—0—$18.74—$0.00—$0.00—
06$0.000—0—5—$29.49—$4.99—$4.99—
07$0.000—0—2—$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.000—0—11—$16.76—$0.00—$7.12—
19$0.000—0—2—$11.96—$0.00—$0.00—
20$0.000—0—3—$5.76—$4.99—$9.98—
21$0.000—0—2—$15.99—$0.00—$0.00—
22$0.000—0—1—$12.99—$0.00—$0.00—
23$0.000—0—1—$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. Hours 01–07 are the tail of Meta day 08-01, where the CBO ad set had spent $505.93 against a $500/day budget by 17:59.

Hours 18–23 are not a cap: only $271.15 was spent by then and the campaign delivered again later on the same account day.

The thirteen hours that bought nothing booked $209.64 against $15.96 of within-day revenue: 37.5% of booked and 5.9% of within-day.

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

Impression price rose almost everywhere, and the click rate with it. pool5 entered on 08-02, moving CTR by composition, but composition cannot move impression price.

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 the one hour carried in from Meta day 08-01's tail.

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

2026-08-23T12:43:18.238753 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US BR ID TR MY PH GB IT TH MX DE 0 10 20 30 40 50 60 70 USD delivery raked onto the report clock against two measured margins; revenue is the report day Spend against within-day revenue by country — 2026-08-02 spend within-day revenue
Spend against within-day revenue, by country
2026-08-23T12:43:18.275722 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ −0.04 −0.02 0.00 0.02 0.04 USD per install Cost per install by country — 2026-08-02 (report clock)
Cost per install by country

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

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$72.7126.1%13,199$5.51210$0.346$56.740.7825
US$14.815.3%317$46.7133$0.449$35.962.434
BR$14.475.2%1,162$12.4574$0.195$50.923.524
ID$12.544.5%1,832$6.8556$0.224$0.000.001
TR$9.143.3%471$19.4119$0.481$21.252.333
MY$7.182.6%825$8.7019$0.378$0.000.000
PH$6.352.3%1,431$4.4337$0.172$0.000.000
GB$6.192.2%184$33.626$1.032$0.000.000
IT$5.371.9%217$24.707$0.767$0.000.000
TH$5.151.9%584$8.8213$0.396$0.000.000
MX$5.111.8%458$11.1612$0.426$0.000.002
DE$4.921.8%126$39.009$0.547$0.000.000

178 further countries are not listed, $114.35 between them (41.1% of this block).

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

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

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

B1

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$72.7126.1%13,199$5.51210$0.346$56.740.7825
US$14.815.3%317$46.7133$0.449$35.962.434
BR$14.475.2%1,162$12.4574$0.195$50.923.524
ID$12.544.5%1,832$6.8556$0.224$0.000.001
TR$9.143.3%471$19.4119$0.481$21.252.333
MY$7.182.6%825$8.7019$0.378$0.000.000
PH$6.352.3%1,431$4.4337$0.172$0.000.000
GB$6.192.2%184$33.626$1.032$0.000.000
IT$5.371.9%217$24.707$0.767$0.000.000
TH$5.151.9%584$8.8213$0.396$0.000.000
MX$5.111.8%458$11.1612$0.426$0.000.002
DE$4.921.8%126$39.009$0.547$0.000.000

178 further countries are not listed, $114.35 between them (41.1% of this block).

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

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

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

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

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

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$237.9832.4%52,368$4.54700$0.340$203.940.8643
US$38.575.3%689$55.9750$0.771$60.911.587
BR$32.244.4%3,182$10.13146$0.221$72.622.254
ID$25.763.5%4,560$5.65123$0.209$50.551.963
TR$24.033.3%1,304$18.4344$0.546$21.250.883
MY$21.973.0%2,074$10.6067$0.328$42.811.953
GB$20.232.8%499$40.5324$0.843$0.000.000
MX$17.362.4%1,406$12.3531$0.560$5.710.333
PH$16.002.2%3,280$4.88101$0.158$55.243.454
DE$13.691.9%269$50.8712$1.141$0.000.000
AR$13.541.8%997$13.5836$0.376$24.931.842
PL$10.801.5%416$25.9819$0.568$35.813.323

182 further countries are not listed, $261.77 between them (35.7% of this block).

Reconciliation, what is measured and what is fitted. Every per-country cell is an allocation across hours; every total is measured. B1 (UTC-7) $235.14 from Meta 2026-07-31 and $498.80 from Meta 2026-08-01, a measured UTC-day total of $733.94.

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

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

B1

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$237.9832.4%52,368$4.54700$0.340$203.940.8643
US$38.575.3%689$55.9750$0.771$60.911.587
BR$32.244.4%3,182$10.13146$0.221$72.622.254
ID$25.763.5%4,560$5.65123$0.209$50.551.963
TR$24.033.3%1,304$18.4344$0.546$21.250.883
MY$21.973.0%2,074$10.6067$0.328$42.811.953
GB$20.232.8%499$40.5324$0.843$0.000.000
MX$17.362.4%1,406$12.3531$0.560$5.710.333
PH$16.002.2%3,280$4.88101$0.158$55.243.454
DE$13.691.9%269$50.8712$1.141$0.000.000
AR$13.541.8%997$13.5836$0.376$24.931.842
PL$10.801.5%416$25.9819$0.568$35.813.323

182 further countries are not listed, $261.77 between them (35.7% of this block).

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

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

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

4Aggregate, both days

Pooled over the 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 delivery, so where it disagrees with §2's unweighted pairing, the mix moved.

On this pair of days the two reads agree. Both put CTR up and leave click-to-install unresolved, and no single hour dominates the compared impressions.

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 not settled: 27.8% at p = 0.004 cell-attributed, 19.3% at p = 0.083 on Meta's own funnel.

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, so the gap between booked and within-day 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. Against bodysuit, pool5 pays 31.8% more per impression, wins 62.7% more clicks, converts 21.2% fewer: the three cancel to 2.8% on cost per install.

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.

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. Inside India and inside Brazil the creatives spread as widely as the countries do, on one or two payers a cell: nothing here separates.

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

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

assetspendIndia %US %other %US % of its revenue
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. 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, 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.

The day and the regime disagree about pool5, neither decisively. Its lead is ten payers and one basket; over R5 it finishes last, intervals overlapping.

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. The straddle comes from the UTC window reaching back into the previous account day. 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; without that guard the first seven hours of the UTC day come out short-filled. 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.