Two campaigns bought inside this UTC day and they did not share a clock hour. The incumbent worldwide campaign delivered from 04:00 UTC until it was switched off at 11:20; a newly built campaign holding five ad sets, one creative each at $100/day, began delivering at 12:44 and ran to midnight. Together they spent $445.83 and bought 766 installs on Meta's count, 805 on ours; the report clock, the three revenue measures and regime are defined in the appendix.
| 2026-08-02 | 2026-08-03 | |
|---|---|---|
| spend | $278.28 | $445.83 |
| impressions | 28,955 | 213,053 |
| CPM | $9.61 | $2.09 |
| link clicks | 2,853 | 5,649 |
| CTR | 9.85% | 2.65% |
| installs (Meta) | 745 | 766 |
| click → install | 26.1% | 13.6% |
| cost per install | $0.374 | $0.582 |
| installs (ours) | 795 | 805 |
| booked | $559.00 · ROAS 2.01 (Meta $610.49 / 2.19) | $709.35 · ROAS 1.59 (Meta $738.83 / 1.66) |
| within-day | $272.13 · ROAS 0.98 | $397.69 · ROAS 0.89 |
| cohort @ 24h | $360.61 · ROAS 1.30 · 100% covered | $474.05 · ROAS 1.06 · 100% covered |
| within-day payers | 32 | 39 |
| within-day ARPU / ARPPU | $0.342 / $8.50 | $0.494 / $10.20 |
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.
| app | ARPU (d0) | ARPU (d3) | ARPU (d7) | ARPPU (d0) | ARPPU (d3) | ARPPU (d7) | installs |
|---|---|---|---|---|---|---|---|
| Vloom | $0.5289 | $0.8934 | $1.1111 | $10.30 | $14.29 | $16.06 | 896 |
⚠ The blended delivery columns are unusable. One ad, spill, took 85.7% of impressions, 99.6% of them inside one hour at $0.52 CPM. Excluding it:
| 08-02 | 08-03 blended | 08-03 less spill | |
|---|---|---|---|
| spend | $278.28 | $445.83 | $336.11 |
| impressions | 28,955 | 213,053 | 30,405 |
| CPM | $9.61 | $2.09 | $11.05 |
| CTR | 9.85% | 2.65% | 8.61% |
| click → install | 26.1% | 13.6% | 26.5% |
| cost per install | $0.374 | $0.582 | $0.485 |
Without spill, dearer at the same conversion rate. Impressions +5%, CPM +15%, click→install 26.5% against 26.1%, CPI +30%; spend +21%, Meta installs −7%.
All three revenue measures fall, so the direction is not a basis artifact. Booked 2.01 → 1.59, within-day 0.98 → 0.89, cohort@24h 1.30 → 1.06.
Delivery columns are Meta's on both sides; payer counts, ARPU and ARPPU are ours on both sides. The two install counts are never crossed. Booked sits on the payment hour; within-day and cohort sit on the install hour. Hours are UTC.
| hr | spend | impr | CPM | clicks | CTR | inst | clk→i | CPI | bkd$ | bROAS | wd$ | wROAS | wPay | coh$ | cROAS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.00 | 0 | — | 0 | — | 3 | — | — | 8.75 | — | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 1 | 0.00 | 0 | — | 0 | — | 1 | — | — | 60.76 | — | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 2 | 0.00 | 0 | — | 0 | — | 0 | — | — | 41.69 | — | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 3 | 0.00 | 0 | — | 0 | — | 1 | — | — | 26.21 | — | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 4 | 5.65 | 515 | 10.97 | 58 | 11.26% | 10 | 17.2% | 0.565 | 6.47 | 1.14 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 5 | 19.64 | 2,009 | 9.78 | 189 | 9.41% | 38 | 20.1% | 0.517 | 10.73 | 0.55 | 4.99 | 0.25 | 1 | 4.99 | 0.25 |
| 6 | 24.63 | 2,471 | 9.97 | 222 | 8.98% | 61 | 27.5% | 0.404 | 26.32 | 1.07 | 20.06 | 0.81 | 3 | 20.06 | 0.81 |
| 7 | 27.85 | 2,804 | 9.93 | 242 | 8.63% | 54 | 22.3% | 0.516 | 25.87 | 0.93 | 36.63 | 1.32 | 4 | 40.19 | 1.44 |
| 8 | 30.14 | 3,420 | 8.81 | 266 | 7.78% | 62 | 23.3% | 0.486 | 23.95 | 0.79 | 78.62 | 2.61 | 5 | 78.62 | 2.61 |
| 9 | 29.74 | 3,726 | 7.98 | 294 | 7.89% | 77 | 26.2% | 0.386 | 38.96 | 1.31 | 29.98 | 1.01 | 3 | 48.72 | 1.64 |
| 10 | 29.54 | 3,203 | 9.22 | 250 | 7.81% | 61 | 24.4% | 0.484 | 19.71 | 0.67 | 14.71 | 0.50 | 2 | 14.71 | 0.50 |
| 11 | 9.08 | 1,046 | 8.68 | 99 | 9.46% | 35 | 35.4% | 0.259 | 52.18 | 5.75 | 49.72 | 5.48 | 4 | 49.72 | 5.48 |
| 12 | 0.29 | 33 | 8.79 | 4 | 12.12% | 4 | 100.0% | 0.073 | 15.56 | 53.67 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 13 | 18.84 | 1,590 | 11.85 | 111 | 6.98% | 25 | 22.5% | 0.754 | 21.60 | 1.15 | 20.41 | 1.08 | 3 | 26.31 | 1.40 |
| 14 | 107.17 | 182,805 | 0.59 | 3,000 | 1.64% | 61 | 2.0% | 1.757 | 21.96 | 0.20 | 0.00 | 0.00 | 0 | 19.16 | 0.18 |
| 15 | 8.10 | 823 | 9.84 | 76 | 9.23% | 21 | 27.6% | 0.386 | 38.22 | 4.72 | 5.63 | 0.70 | 1 | 5.63 | 0.70 |
| 16 | 14.19 | 1,080 | 13.14 | 94 | 8.70% | 24 | 25.5% | 0.591 | 87.44 | 6.16 | 23.20 | 1.63 | 2 | 23.20 | 1.63 |
| 17 | 16.03 | 1,267 | 12.65 | 103 | 8.13% | 24 | 23.3% | 0.668 | 22.86 | 1.43 | 5.76 | 0.36 | 1 | 5.76 | 0.36 |
| 18 | 18.31 | 1,181 | 15.50 | 107 | 9.06% | 32 | 29.9% | 0.572 | 28.87 | 1.58 | 25.77 | 1.41 | 4 | 34.94 | 1.91 |
| 19 | 21.44 | 1,263 | 16.98 | 121 | 9.58% | 33 | 27.3% | 0.650 | 18.88 | 0.88 | 32.52 | 1.52 | 1 | 32.52 | 1.52 |
| 20 | 18.58 | 1,141 | 16.28 | 116 | 10.17% | 40 | 34.5% | 0.465 | 9.16 | 0.49 | 0.00 | 0.00 | 0 | 6.84 | 0.37 |
| 21 | 19.93 | 1,046 | 19.05 | 129 | 12.33% | 34 | 26.4% | 0.586 | 23.22 | 1.17 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 22 | 13.66 | 859 | 15.90 | 95 | 11.06% | 36 | 37.9% | 0.379 | 48.37 | 3.54 | 18.10 | 1.33 | 3 | 21.77 | 1.59 |
| 23 | 13.02 | 771 | 16.89 | 73 | 9.47% | 29 | 39.7% | 0.449 | 31.59 | 2.43 | 31.59 | 2.43 | 2 | 40.92 | 3.14 |
| ALL | 445.83 | 213,053 | 2.09 | 5,649 | 2.65% | 766 | 13.6% | 0.582 | 709.35 | 1.59 | 397.69 | 0.89 | 39 | 474.05 | 1.06 |
Hour 14 is the whole anomaly. $107.17 at $0.59 CPM against $8–$19; click→install 2.0% against 17%–40% in hours past a hundred clicks; zero within-day revenue; 24.0% of spend, 85.8% of impressions.
The first four rows carry booked revenue against no spend. Those are hours in which nobody was buying but yesterday's and the day before's installs were still paying, which only the booked basis counts.
Hourly payer counts run 0–5, so an hourly ARPPU is one person's basket. Read the ALL row for level and the hours for shape only. The CPM path is the clean signal in this table, because its denominator is impressions: the incumbent's hours (04:00–11:00) run $7.98 to $10.97 with no trend, and the new campaign's hours climb from $11.85 at 13:00 to $15.50 and $19.05 across 18:00–23:00.
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: 08, 09, 10, 11, 13, 14, 15, 16, 17. 2026-08-03 additionally delivered in 04, 05, 06, 07, 18, 19, 20, 21, 22, 23. 2026-08-02 additionally delivered in 00, 12. Only the shared hours are compared.
Counting which way each shared hour points, which needs no weighting and asks only for a direction:
| metric | hours 2026-08-03 ran higher | hours it ran lower | sign test |
|---|---|---|---|
| CPM | 5 of 9 | 4 of 9 | p = 1.000 |
| CTR | 1 of 9 | 8 of 9 | p = 0.039 |
| click→install | 5 of 9 | 4 of 9 | p = 1.000 |
| CPI | 7 of 9 | 2 of 9 | p = 0.180 |
A sign test throws magnitude away and buys weight-free direction with it.
Only CTR separates: lower in 8 of 9 shared hours, p = 0.039. CPM and click→install are coin flips; CPI leans dearer without clearing 0.05.
Every shared hour, 2026-08-02 → 2026-08-03. 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.
| hr | impressions | CPM | CTR | click→install | CPI |
|---|---|---|---|---|---|
| 08 | 1,512 → 3,420 | 8.79 → 8.81 | 10.98% → 7.78% | 17.5% → 23.3% | 0.458 → 0.486 |
| 09 | 4,266 → 3,726 | 8.46 → 7.98 | 8.74% → 7.89% | 22.0% → 26.2% | 0.440 → 0.386 |
| 10 | 4,119 → 3,203 | 10.05 → 9.22 | 9.42% → 7.81% | 24.7% → 24.4% | 0.431 → 0.484 |
| 11 | 3,119 → 1,046 | 8.89 → 8.68 | 9.43% → 9.46% | 27.2% → 35.4% | 0.347 → 0.259 |
| 13 | 2,752 → 1,590 | 11.32 → 11.85 | 11.12% → 6.98% | 23.5% → 22.5% | 0.433 → 0.754 |
| 14 | 2,578 → 182,805 | 9.88 → 0.59 | 10.78% → 1.64% | 28.4% → 2.0% | 0.322 → 1.757 |
| 15 | 2,670 → 823 | 9.09 → 9.84 | 10.19% → 9.23% | 24.6% → 27.6% | 0.362 → 0.386 |
| 16 | 3,024 → 1,080 | 9.11 → 13.14 | 10.35% → 8.70% | 22.4% → 25.5% | 0.393 → 0.591 |
| 17 | 1,543 → 1,267 | 8.71 → 12.65 | 9.07% → 8.13% | 30.7% → 23.3% | 0.313 → 0.668 |
Hour 14 owns the pooled row: 182,805 of the 198,960 impressions §4 pools for this day. It is the rejected spill build (DECISION_LOG.md #50).
(i) The portfolio by country, 2026-08-03. On the report clock. Meta serves no hour x country grid, so each country cut is raked from its own Meta day onto UTC; our own columns were already there.
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| IN | $108.15 | 24.3% | 91,101 | $1.19 | 216 | $0.501 | $97.68 | 0.90 | 33 |
| US | $33.09 | 7.4% | 762 | $43.41 | 23 | $1.439 | $4.99 | 0.15 | 4 |
| GB | $14.24 | 3.2% | 986 | $14.43 | 18 | $0.791 | $16.90 | 1.19 | 1 |
| PH | $13.99 | 3.1% | 12,670 | $1.10 | 42 | $0.333 | $5.63 | 0.40 | 2 |
| ID | $13.36 | 3.0% | 3,374 | $3.96 | 42 | $0.318 | $15.96 | 1.20 | 4 |
| MY | $12.87 | 2.9% | 3,555 | $3.62 | 19 | $0.678 | $11.74 | 0.91 | 1 |
| TR | $12.80 | 2.9% | 826 | $15.50 | 27 | $0.474 | $53.22 | 4.16 | 3 |
| MX | $11.35 | 2.5% | 2,365 | $4.80 | 19 | $0.597 | $11.42 | 1.01 | 6 |
| FR | $11.00 | 2.5% | 1,530 | $7.19 | 15 | $0.733 | $31.15 | 2.83 | 2 |
| AR | $10.07 | 2.3% | 1,695 | $5.94 | 29 | $0.347 | $0.00 | 0.00 | 1 |
| AU | $8.02 | 1.8% | 257 | $31.26 | 6 | $1.337 | $0.00 | 0.00 | 1 |
| ES | $7.90 | 1.8% | 1,645 | $4.80 | 15 | $0.526 | $38.84 | 4.92 | 2 |
191 further countries are not listed, $188.99 between them (42.4% of this block).
Reconciliation, what is measured and what is fitted. Every per-country cell is an allocation across hours; every total is measured. B1 (UTC-7) $49.92 from Meta 2026-08-02 and $395.91 from Meta 2026-08-03, a measured UTC-day total of $445.83.
Absent from the table above, by name: Nomad Node, KBM1, HR1. Their spend is in every day-grain table; only their country split is missing.
(ii) The same cut per account, 2026-08-03.
B1
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| IN | $108.15 | 24.3% | 91,101 | $1.19 | 216 | $0.501 | $97.68 | 0.90 | 33 |
| US | $33.09 | 7.4% | 762 | $43.41 | 23 | $1.439 | $4.99 | 0.15 | 4 |
| GB | $14.24 | 3.2% | 986 | $14.43 | 18 | $0.791 | $16.90 | 1.19 | 1 |
| PH | $13.99 | 3.1% | 12,670 | $1.10 | 42 | $0.333 | $5.63 | 0.40 | 2 |
| ID | $13.36 | 3.0% | 3,374 | $3.96 | 42 | $0.318 | $15.96 | 1.20 | 4 |
| MY | $12.87 | 2.9% | 3,555 | $3.62 | 19 | $0.678 | $11.74 | 0.91 | 1 |
| TR | $12.80 | 2.9% | 826 | $15.50 | 27 | $0.474 | $53.22 | 4.16 | 3 |
| MX | $11.35 | 2.5% | 2,365 | $4.80 | 19 | $0.597 | $11.42 | 1.01 | 6 |
| FR | $11.00 | 2.5% | 1,530 | $7.19 | 15 | $0.733 | $31.15 | 2.83 | 2 |
| AR | $10.07 | 2.3% | 1,695 | $5.94 | 29 | $0.347 | $0.00 | 0.00 | 1 |
| AU | $8.02 | 1.8% | 257 | $31.26 | 6 | $1.337 | $0.00 | 0.00 | 1 |
| ES | $7.90 | 1.8% | 1,645 | $4.80 | 15 | $0.526 | $38.84 | 4.92 | 2 |
191 further countries are not listed, $188.99 between them (42.4% of this block).
Nomad Node — no country block: it delivered nothing on this day, a measured zero.
KBM1 — no country block: it delivered nothing on this day, a measured zero.
HR1 — no country block: it delivered nothing on this day, a measured zero.
The prior day, 2026-08-02, the same two tables.
(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.
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| IN | $72.71 | 26.1% | 13,199 | $5.51 | 210 | $0.346 | $56.74 | 0.78 | 25 |
| US | $14.81 | 5.3% | 317 | $46.71 | 33 | $0.449 | $35.96 | 2.43 | 4 |
| BR | $14.47 | 5.2% | 1,162 | $12.45 | 74 | $0.195 | $50.92 | 3.52 | 4 |
| ID | $12.54 | 4.5% | 1,832 | $6.85 | 56 | $0.224 | $0.00 | 0.00 | 1 |
| TR | $9.14 | 3.3% | 471 | $19.41 | 19 | $0.481 | $21.25 | 2.33 | 3 |
| MY | $7.18 | 2.6% | 825 | $8.70 | 19 | $0.378 | $0.00 | 0.00 | 0 |
| PH | $6.35 | 2.3% | 1,431 | $4.43 | 37 | $0.172 | $0.00 | 0.00 | 0 |
| GB | $6.19 | 2.2% | 184 | $33.62 | 6 | $1.032 | $0.00 | 0.00 | 0 |
| IT | $5.37 | 1.9% | 217 | $24.70 | 7 | $0.767 | $0.00 | 0.00 | 0 |
| TH | $5.15 | 1.9% | 584 | $8.82 | 13 | $0.396 | $0.00 | 0.00 | 0 |
| MX | $5.11 | 1.8% | 458 | $11.16 | 12 | $0.426 | $0.00 | 0.00 | 2 |
| DE | $4.92 | 1.8% | 126 | $39.00 | 9 | $0.547 | $0.00 | 0.00 | 0 |
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
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| IN | $72.71 | 26.1% | 13,199 | $5.51 | 210 | $0.346 | $56.74 | 0.78 | 25 |
| US | $14.81 | 5.3% | 317 | $46.71 | 33 | $0.449 | $35.96 | 2.43 | 4 |
| BR | $14.47 | 5.2% | 1,162 | $12.45 | 74 | $0.195 | $50.92 | 3.52 | 4 |
| ID | $12.54 | 4.5% | 1,832 | $6.85 | 56 | $0.224 | $0.00 | 0.00 | 1 |
| TR | $9.14 | 3.3% | 471 | $19.41 | 19 | $0.481 | $21.25 | 2.33 | 3 |
| MY | $7.18 | 2.6% | 825 | $8.70 | 19 | $0.378 | $0.00 | 0.00 | 0 |
| PH | $6.35 | 2.3% | 1,431 | $4.43 | 37 | $0.172 | $0.00 | 0.00 | 0 |
| GB | $6.19 | 2.2% | 184 | $33.62 | 6 | $1.032 | $0.00 | 0.00 | 0 |
| IT | $5.37 | 1.9% | 217 | $24.70 | 7 | $0.767 | $0.00 | 0.00 | 0 |
| TH | $5.15 | 1.9% | 584 | $8.82 | 13 | $0.396 | $0.00 | 0.00 | 0 |
| MX | $5.11 | 1.8% | 458 | $11.16 | 12 | $0.426 | $0.00 | 0.00 | 2 |
| DE | $4.92 | 1.8% | 126 | $39.00 | 9 | $0.547 | $0.00 | 0.00 | 0 |
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.
Pooled over the 9 hours both days delivered in, on the UTC clock. Meta's instrument on both sides of every ratio.
| spend | impressions | CPM | clicks | CTR | installs | click→install | CPI | |
|---|---|---|---|---|---|---|---|---|
| 2026-08-02 | $240.39 | 25,583 | 9.40 | 2,530 | 9.89% | 618 | 24.43% | $0.389 |
| 2026-08-03 | $262.83 | 198,960 | 1.32 | 4,293 | 2.16% | 390 | 9.08% | $0.674 |
Pooling across hours weights each hour by what it delivered. The hourly pairing is the unweighted read of the same two days; where they disagree, the mix moved.
Click→install disagrees between the reads; CTR agrees. The pooled 62.8% fall is hour 14 alone; the 78.2% CTR fall survives both reads as a direction.
Held to the incumbent campaign's three creatives, on the ad account's own clock. Matched-hour delivery for a single creative has to be cut on the clock the exports are stamped in, so the hours below are the ad account's own UTC-7 hours. They land at 08:00–11:59 UTC inside both report days, so the block sits inside this report's day and inside the comparison day, but its hour labels are not the ones in §2, and its pooled rows are pooled over four Meta hours rather than the nine UTC hours above.
Delivering META hours — 08-02: [1–10, 21–23]; 08-03: [0–4]. Shared: [1, 2, 3, 4]. Maturity coverage at H=6 is 100% on both days. Only the incumbent campaign's three creatives existed on both days, so the comparison is held to them.
| held to | metric | 08-02 | 08-03 | change | p | verdict |
|---|---|---|---|---|---|---|
| pooled | click → install | 25.63% | 29.37% | +14.6% | 0.055 | not separable |
| pooled | payer rate | 2.88% | 5.24% | +82.4% | 0.145 | not separable |
| pooled | CPI | $0.379 | $0.369 | better | — | |
| pooled | RPI | $0.338 | $0.479 | better | — | |
| pooled | ROAS | 0.89 | 1.30 | better | — | |
bodysuit | payer rate | 1.81% | 6.45% | +257.0% | 0.041 | BETTER |
bikini | payer rate | 7.94% | 3.23% | −59.4% | 0.252 | not separable |
pool5 | payer rate | 1.19% | 3.57% | +200.0% | 0.341 | not separable |
On matched hours the incumbent is flat to better. Every pooled term moves in the account's favour and none of them separates.
This matters because the whole-day picture in §1 shows ROAS falling on all three bases. Both are true: the day as a whole delivered worse than 08-02, and the hours in which the same creatives ran on both days did not. The difference is composition. The report day bought twelve hours of a brand new campaign the comparison day has no counterpart for, at rising CPM, with one broken hour in the middle of it.
The three measures side by side, with the unbounded cohort figure below them for reference only:
| measure | 08-02 | 08-03 | moves after the day closes? |
|---|---|---|---|
| booked | $559.00 · 2.01 | $709.35 · 1.59 | settles a few hours after midnight, then fixed |
| within-day | $272.13 · 0.98 | $397.69 · 0.89 | never |
| cohort @ 24h | $360.61 · 1.30 | $474.05 · 1.06 | frozen once covered, 100% both days |
| cohort to date | $542.23 · 1.95 | $524.63 · 1.18 | rises ~72 h, reference only, never compared across days |
Booked revenue split by the UTC day its payer installed, whose top row is the within-day figure:
| payer installed on | 08-02's booked | 08-03's booked |
|---|---|---|
| the day itself | $272.13 (48.7%) | $397.69 (56.1%) |
| the day before | $239.67 (42.9%) | $109.64 (15.5%) |
| two days before | $47.20 (8.4%) | $137.54 (19.4%) |
| three days before | — | $58.74 (8.3%) |
| four days before | — | $5.74 (0.8%) |
Inherited revenue fell from 51.3% to 43.9% of the day's bookings, which is the whole gap between booked and within-day.
Rows are labelled by asset. On the new campaign each ad set holds one ad holding one asset, so the ad-set row is the asset row; the incumbent's three creatives are three ads inside a single ad set, so those rows sit one level below it.
Full per-asset hourly grids are in _runs/2026-08-05_0804_settled/utc_2026-08-03/measures_out.txt. The shape that matters is when each asset delivered, because no two campaigns share a clock hour on this day:
| asset | delivering hours (UTC) | spend |
|---|---|---|
earner/bodysuit | 04:00 – 11:00 | $88.59 |
earner/bikini, earner/pool5 | 05:00 – 11:00 | $48.16, $39.52 |
E2/bikini, E2/mugshot | 12:00 – 23:00 | $48.91, $54.49 |
E2/spill | 13:00 – 22:00 (99.6% of its impressions inside hour 14) | $109.72 |
E2/bodysuit, E2/pool5 | 18:00 – 23:00 | $24.16, $32.28 |
The incumbent took 39.5% of the day's spend and 55.0% of its Meta-counted installs at a blended CPI of $0.419; the new campaign took 60.5% of spend and 45.0% of installs at $0.781. Held to within-day revenue the incumbent returned 1.35 and the new campaign 0.59; at cohort@24h, 1.51 against 0.77. Excluding spill, the new campaign's CPI is $0.588, still 40% above the incumbent's.
The new campaign has no per-asset day-over-day comparison, because it did not exist on 08-02; §4's matched-hour block covers the incumbent's three creatives alone.
⚠ A META-day cut on spend and installs, like §3. Cells with spend over $1, ordered by spend; the full table is in _runs/2026-08-05_0804_settled/utc_2026-08-03/measures_out.txt. The head of it:
| asset | cc | spend | inst | CPI | within | wROAS | cohort@24 | cROAS |
|---|---|---|---|---|---|---|---|---|
E2/spill | IN | 23.69 | 4 | 5.923 | 0.00 | 0.00 | 0.00 | 0.00 |
E2/mugshot | IN | 23.56 | 19 | 1.240 | 0.00 | 0.00 | 0.00 | 0.00 |
E2/bikini | IN | 21.93 | 47 | 0.467 | 20.83 | 0.95 | 20.83 | 0.95 |
earner/bodysuit | IN | 19.59 | 50 | 0.392 | 59.57 | 3.04 | 81.87 | 4.18 |
E2/pool5 | IN | 9.52 | 17 | 0.560 | 0.00 | 0.00 | 0.00 | 0.00 |
E2/pool5 | US | 9.27 | 6 | 1.545 | 0.00 | 0.00 | 0.00 | 0.00 |
earner/bikini | IN | 9.12 | 29 | 0.314 | 5.76 | 0.63 | 5.76 | 0.63 |
E2/bodysuit | US | 8.82 | 6 | 1.470 | 0.00 | 0.00 | 0.00 | 0.00 |
E2/bodysuit | IN | 8.19 | 17 | 0.482 | 0.00 | 0.00 | 5.76 | 0.70 |
earner/pool5 | IN | 6.39 | 10 | 0.639 | 11.52 | 1.80 | 11.52 | 1.80 |
India is where the arms separate most on cost: earner/bodysuit $0.392 against E2/spill $5.923 and E2/mugshot $1.240, a fifteenfold spread inside one country.
India also holds the only three places where the same creative ran in both campaigns. bikini cost $0.314 for the incumbent and $0.467 for the new campaign, bodysuit $0.392 against $0.482, and pool5 $0.639 against $0.560. Two of the three favour the older ad set by 23% and 49%, which is what a fresh-ad-set premium looks like; the third runs the other way by 12%, so the premium is a tendency on three pairs and stops short of a measured rate.
The three region charts are drawn from the same country export as the table above, so they carry its META-day caveat and each says so on its own title.
The three tables below are emitted by report_tables.py and carry the same columns, in the same order, as every other report in this series, which is what lets one day be read against another. They are cut on the 2026-08-05 10:59 UTC payment cut. within-day is sealed at midnight and booked settles a few hours after it, so neither can move; cohort@24h is 100% covered on this day and is therefore frozen too. Rows are labelled by asset, on the same basis as §5.
Meta's instrument on both sides of every ratio. Our registrations never enter this table.
| asset | spend | impressions | CPM | clicks | CTR | installs | click→install | CPI |
|---|---|---|---|---|---|---|---|---|
E2/spill | $109.72 | 182,648 | 0.60 | 3,030 | 1.66% | 73 | 2.41% | $1.503 |
earner/bodysuit | $88.59 | 10,825 | 8.18 | 801 | 7.40% | 208 | 25.97% | $0.426 |
E2/mugshot | $54.49 | 3,394 | 16.05 | 287 | 8.46% | 69 | 24.04% | $0.790 |
E2/bikini | $48.91 | 4,375 | 11.18 | 374 | 8.55% | 102 | 27.27% | $0.480 |
earner/bikini | $48.16 | 4,670 | 10.31 | 452 | 9.68% | 128 | 28.32% | $0.376 |
earner/pool5 | $39.52 | 3,699 | 10.68 | 367 | 9.92% | 85 | 23.16% | $0.465 |
E2/pool5 | $32.28 | 1,809 | 17.84 | 215 | 11.89% | 53 | 24.65% | $0.609 |
E2/bodysuit | $24.16 | 1,633 | 14.79 | 123 | 7.53% | 48 | 39.02% | $0.503 |
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.
| asset | booked | bROAS (Meta) | within-day | wROAS | cohort@H | cROAS | payers | payer% | ARPU | ARPPU | largest payer |
|---|---|---|---|---|---|---|---|---|---|---|---|
E2/spill | $5.89 | 0.05 (0.11) | $5.89 | 0.05 | $25.05 | 0.23 | 1 | 1.3% | 0.075 | 5.89 | 100.0% |
earner/bodysuit | $340.67 | 3.85 (4.61) | $127.82 | 1.44 | $156.95 | 1.77 | 12 | 5.2% | 0.549 | 10.65 | 22.2% |
E2/mugshot | $10.70 | 0.20 (0.26) | $10.70 | 0.20 | $16.60 | 0.30 | 2 | 2.9% | 0.157 | 5.35 | 53.4% |
E2/bikini | $73.43 | 1.50 (1.65) | $73.43 | 1.50 | $80.51 | 1.65 | 9 | 8.6% | 0.699 | 8.16 | 23.0% |
earner/bikini | $159.56 | 3.31 (2.15) | $86.26 | 1.79 | $86.26 | 1.79 | 7 | 5.3% | 0.658 | 12.32 | 48.0% |
earner/pool5 | $43.34 | 1.10 (1.12) | $23.58 | 0.60 | $23.58 | 0.60 | 4 | 4.5% | 0.265 | 5.89 | 26.8% |
E2/pool5 | $44.60 | 1.38 (1.38) | $44.60 | 1.38 | $44.60 | 1.38 | 3 | 5.8% | 0.858 | 14.87 | 72.9% |
E2/bodysuit | $25.41 | 1.05 (1.05) | $25.41 | 1.05 | $40.49 | 1.68 | 1 | 2.1% | 0.529 | 25.41 | 100.0% |
The 16-payer bar (#37): any row above whose payer count is under 16 is a direction and never a magnitude.
⚠ 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.
| asset | spend | India % | US % | other % | US % of its revenue |
|---|---|---|---|---|---|
E2/spill | $110.05 | 21.5% | 4.5% | 74.0% | 0.0% |
earner/bodysuit | $57.11 | 34.3% | 3.0% | 62.7% | 0.0% |
E2/mugshot | $78.36 | 30.1% | 6.9% | 63.0% | 46.6% |
E2/bikini | $68.56 | 32.0% | 8.5% | 59.5% | 0.0% |
earner/bikini | $38.30 | 23.8% | 9.1% | 67.1% | 0.0% |
earner/pool5 | $30.95 | 20.6% | 6.8% | 72.6% | 0.0% |
E2/pool5 | $64.61 | 14.7% | 14.3% | 70.9% | 0.0% |
E2/bodysuit | $53.77 | 15.2% | 16.4% | 68.4% | 0.0% |
⚠ The incumbent's booked ROAS is inflated by inheritance and the new campaign's is not. The incumbent stopped buying at 11:20 UTC but collected payments all day from earlier install days; earner/bodysuit's booked 3.85 against within-day 1.44 is that gap. The new campaign's arms have no prior cohort at all, so their booked and within-day figures are identical by construction. Compare the arms on within-day or cohort, never on booked.
No row in table B clears the 16-payer bar. earner/bodysuit tops the day at 12 within-day payers, so the whole per-asset revenue ranking on this day is a set of directions.
Money is plotted per day across the run and never hourly, because payers run 0-2 per asset per hour and an hourly ARPPU is one person's basket. 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; all eight assets on this day cleared that gate, so none of them is missing.
META clock. The five arms held one $100/day regime, 08-03 05:44 → 08-04 00:01 PT. mix-neutral re-prices each arm's ROAS on that regime's pooled country mix; cells matured to H=6.
| ad | regime | $/day | inst | spend | CPM | CTR | IN% | CPI | RPI | ROAS | mix-neutral |
|---|---|---|---|---|---|---|---|---|---|---|---|
bikini | E2-R1 | 100 | 160 | 69.8 | 11.32 | 8.82% | 34% | 0.436 | 0.490 | 1.12 | 1.08 |
bodysuit | E2-R1 | 100 | 111 | 56.2 | 12.58 | 6.90% | 17% | 0.506 | 0.423 | 0.84 | 0.80 |
pool5 | E2-R1 | 100 | 111 | 66.7 | 14.88 | 9.93% | 15% | 0.601 | 0.599 | 1.00 | 0.81 |
mugshot | E2-R1 | 100 | 95 | 80.9 | 16.97 | 8.64% | 22% | 0.852 | 0.179 | 0.21 | 0.22 |
spill | E2-R1 | 100 | 85 | 111.1 | 0.61 | 1.67% | 7% | 1.308 | 0.069 | 0.05 | 0.08 |
The mix-neutral re-pricing moves no arm more than 0.19 of ROAS and reorders none, so geography does not drive this ranking.
Install days on the UTC clock, installs and payers on our own records. All eight arms are 100% covered at H=24 on this day. The payer rate and ARPPU columns are to-date figures and grow with a cohort's age, so they describe this day and may not be read across days; the H=24 column is the one that is comparable.
| arm | installs | payers | payer rate | ARPPU (to date) | ARPU @ H=24 |
|---|---|---|---|---|---|
earner/bodysuit | 233 | 13 | 5.6% | $12.89 | 0.674 |
earner/bikini | 131 | 9 | 6.9% | $10.95 | 0.658 |
earner/pool5 | 89 | 5 | 5.6% | $7.07 | 0.265 |
E2/bikini | 105 | 10 | 9.5% | $9.64 | 0.767 |
E2/bodysuit | 48 | 3 | 6.2% | $13.50 | 0.844 |
E2/pool5 | 52 | 3 | 5.8% | $14.87 | 0.858 |
E2/mugshot | 68 | 3 | 4.4% | $5.53 | 0.244 |
E2/spill | 79 | 2 | 2.5% | $12.53 | 0.317 |
The three incumbent creatives are the only ones with a prior day at the same horizon and the same coverage. At H=24, bodysuit moved 0.449 → 0.674 and bikini 0.407 → 0.658, while pool5 fell 0.499 → 0.265. Two of three up, one down, on 5 to 13 payers each. The new campaign's mugshot and spill sit at 0.244 and 0.317, below every other arm on the account, and they are the same two arms that sit last on cost per install.
bodysuit's payer-rate result (p=0.041) is not promoted. Three payers against eight, one hit in eight tests, dead under Holm.The five new ad sets became the arms of a randomised test when the budget-matched regime ended at 08-04 00:01 PT. This day is their observational baseline:
mugshot at $0.852 and spill at $1.308 against $0.436 to $0.601, and that ranking survives the mix-neutral re-pricing.The report day is a UTC day. Meta stamps its exports in the ad account's own zone, UTC-7, so this day is Meta's 08-02 17:00–23:59 stitched onto Meta's 08-03 00:00–16:59, and every delivery figure above is restitched across those two account days.
Three revenue measures run through every table and are never mixed.
| measure | counts | moves after the day closes? |
|---|---|---|
| booked | revenue that arrived inside the UTC day, whatever day its payer installed | settles a few hours after midnight, then fixed. Meta's own number is this basis |
| within-day | people who installed that day and paid before the day closed | never. Sealed at midnight |
| cohort at H | that day's installs counted only to H hours of each person's own age. House horizon H=24, where both days are 100% covered | rises until every install has lived H hours |
All three are read on our own payment records; Meta's figure appears bracketed beside the booked column and never as a row of its own.
The instrument gate runs on the META clock, because Meta's conversion value sits on its conversion hour and is the one column that cannot be honestly restitched into a UTC day. Held there, our records read 0.98 of Meta's booked value on 08-03 and 0.91 on 08-02, both inside the documented 0.91–1.06 band. The bracketed Meta figures in §1's table are shown for traceability, and the ratio between them is not a valid check on this clock.
A regime is a stretch over which an ad set's daily budget did not change. It matters because on this account the budget is a geography dial: raising it buys wider, cheaper countries, so two creatives measured across a budget change are compared on different audiences.
This day sat in two regimes that do not overlap in time. The incumbent campaign held a flat $500/day through 11:20 UTC, the same regime it held for the whole of 08-02, which is what makes the two days comparable at all. The new campaign then ran five ad sets at a flat $100/day each from 12:44 UTC to midnight, a regime with no counterpart on the comparison day. Nothing spans both, so no cross-regime comparison is attempted in this report.
CFG=_runs/2026-08-05_0804_settled/run_config.json # tz = UTC
MET=_runs/2026-08-05_0804_settled/run_config_meta.json # tz = META
# 1 — the three revenue measures, at campaign / hourly / country / asset
PYTHONIOENCODING=utf-8 python -m ad_ops.measures --config $CFG --day 2026-08-03 --prev 2026-08-02
# 1b — the instrument gate, which is only valid on Meta's clock
PYTHONIOENCODING=utf-8 python -m ad_ops.measures --config $MET --day 2026-08-03 --prev 2026-08-02
# 2 — matched clock hours at a fixed horizon, with two-proportion tests (META clock)
PYTHONIOENCODING=utf-8 python -m ad_ops.day_compare --config $MET \
--today 2026-08-03 --prev 2026-08-02 --h 6 \
--ads "ww_bikini_10s,ww_bodysuit_10s,ww_pool5_15s" \
--campaign "bailingxia_meituan_ww_cvr_260730"
# 3 — regimes, horizons, delivery overlap, the decidability gate (META clock)
PYTHONIOENCODING=utf-8 python -m ad_ops.asset_estimator hourly \
--meta _runs/2026-08-04_e2_start_and_0803_report/exports/ads_hourly_aug3_settled.csv \
_runs/2026-08-05_0804_settled/exports/ads_hourly_aug4_settled.csv \
--lum _runs/2026-08-05_0804_settled/lum \
--fx _runs/2026-08-02_today_read/fx_rates.json \
--ads "ww_bikini_10s,ww_bodysuit_10s,ww_pool5,ww_mugshot,ww_spill" \
--campaign "bailingxia_meituan_ww_cvr_260802" --horizon 6
# 4 — install-cohort ARPU and ARPPU, to date and at fixed horizons
PYTHONIOENCODING=utf-8 python -m ad_ops.cohort_arpu --config $CFG \
--days 2026-07-31,2026-08-01,2026-08-02,2026-08-03
# 5 — §7's three standing tables, §2's matched-hours pairing, §4's pooled funnel,
# and the nineteen standing charts
PYTHONIOENCODING=utf-8 python -m ad_ops.report_tables --config $CFG \
--day 2026-08-03 --prev 2026-08-02
PYTHONIOENCODING=utf-8 python -m ad_ops.report_charts --config $CFG \
--day 2026-08-03 --prev 2026-08-02 \
--days 2026-08-01,2026-08-02,2026-08-03 --out ad_ops/figures/2026-08-03 \
--md _runs/2026-08-05_0804_settled/chartblock_2026-08-03.md --relpath figures/2026-08-03
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 report clock is UTC and the ad account's is UTC-7, so a UTC pull needs one export more than a Meta-day pull: the previous Meta day's hourly file, every time. This day is stitched from ads_hourly_aug2_settled.csv hours 17–23 and ads_hourly_aug3_settled.csv hours 00–16, and the comparison day from ads_hourly_aug1_settled.csv hours 17–23 and ads_hourly_aug2_settled.csv hours 00–16. The estimator additionally loads ads_hourly_aug4_settled.csv so that post-midnight installs are not carried back into the last delivering cell of 08-03.
Meta exports were pulled after each day closed and settled, and each is verified by its own content, row count and the window read off Reporting starts / Reporting ends, never by filename. Country data comes from ads_country_day_jul1_aug5.csv, which is per Meta day and is the reason §3, §6, table C and the region charts cannot follow the report clock.
Payment records: Telegram exports of both notification channels, parsed with ad_ops/lum_notifications/parse_export.py. Payment data cut 2026-08-05 10:59 UTC, at which point both days' cohorts are 100% covered at H=24; ages at the cut run 35.0–58.1 h on 08-03 and 61.4–82.9 h on 08-02.
Selection is by Ad ID throughout, never by ad or ad-set name. The two campaigns run creatives with byte-identical names and a name filter over-attributes by about 70%.