The account bought web-to-app installs through a worldwide campaign of five creative arms, each in its own ad set, plus the first three delivering hours of a German-speaking buy that opened late in the day. On a UTC day it spent $446.00 for 785 installs at $0.568, against $445.83 and 766 at $0.582 the day before. The report clock, the three revenue measures and regime are defined in the appendix.
| 2026-08-03 | 2026-08-04 | |
|---|---|---|
| spend | $445.83 | $446.00 |
| impressions | 213,053 | 35,852 |
| CPM | $2.09 | $12.44 |
| link clicks | 5,649 | 3,238 |
| CTR | 2.65% | 9.03% |
| installs (Meta) | 766 | 785 |
| click → install | 13.6% | 24.2% |
| CPI | $0.582 | $0.568 |
| registrations (ours) | 805 | 824 |
| booked | $709.35 · ROAS 1.59 (Meta 1.66) | $921.86 · ROAS 2.07 (Meta 1.93) |
| within-day | $397.69 · ROAS 0.89 | $588.70 · ROAS 1.32 |
| cohort @ 24h | $474.05 · ROAS 1.06 (100% covered) | $783.90 · ROAS 1.76 (35% covered) |
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.8048 | $1.0228 | $1.2639 | $15.76 | $18.07 | $20.33 | 901 |
Ignore the impression columns. One broken build's single hour is 85.4% of 08-03's impressions; §2's hour-by-hour read finds nothing.
Read within-day. Cohort at 24h is 35% covered against 08-03's 100% and is not compared here (Caveats). Within-day is sealed both days: 0.89 → 1.32.
The day gained on basket size. 39 within-day payers both days, payer rate 4.8% to 4.7%, ARPPU $10.20 to $15.09 — the whole 48% gain.
A third of booked is inherited. Earlier installs paid 36.1% of 08-04's booked revenue, the gap between booked 2.07 and within-day 1.32; §4 splits it.
Delivery columns are Meta's on both sides of each ratio. Payer counts and revenue are ours. Booked sits on the payment hour; within-day and cohort sit on the install hour.
| hr | spend | impr | CPM | CTR | inst | clk→i | CPI | bkd$ | bROAS | wd$ | wROAS | wPay | coh$ | cROAS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 13.24 | 844 | 15.69 | 9.48% | 17 | 21.2% | 0.779 | 57.71 | 4.36 | 17.97 | 1.36 | 1 | 17.97 | 1.36 |
| 01 | 12.20 | 1,066 | 11.44 | 7.50% | 19 | 23.8% | 0.642 | 26.65 | 2.18 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 02 | 13.29 | 1,111 | 11.96 | 6.48% | 13 | 18.1% | 1.022 | 16.13 | 1.21 | 16.13 | 1.21 | 3 | 22.11 | 1.66 |
| 03 | 14.36 | 1,224 | 11.73 | 9.31% | 38 | 33.3% | 0.378 | 5.76 | 0.40 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 04 | 16.90 | 1,281 | 13.19 | 8.98% | 26 | 22.6% | 0.650 | 13.81 | 0.82 | 10.75 | 0.64 | 2 | 10.75 | 0.64 |
| 05 | 17.50 | 1,372 | 12.76 | 7.43% | 41 | 40.2% | 0.427 | 18.54 | 1.06 | 5.71 | 0.33 | 1 | 5.71 | 0.33 |
| 06 | 17.42 | 1,276 | 13.65 | 7.60% | 29 | 29.9% | 0.601 | 11.93 | 0.69 | 17.86 | 1.03 | 3 | 21.42 | 1.23 |
| 07 | 10.59 | 671 | 15.78 | 10.43% | 18 | 25.7% | 0.588 | 39.28 | 3.71 | 54.16 | 5.11 | 1 | 54.16 | 5.11 |
| 08 | 19.66 | 1,316 | 14.94 | 8.13% | 31 | 29.0% | 0.634 | 14.65 | 0.75 | 50.67 | 2.58 | 2 | 50.67 | 2.58 |
| 09 | 18.65 | 1,358 | 13.73 | 6.48% | 18 | 20.5% | 1.036 | 77.39 | 4.15 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 10 | 19.27 | 1,435 | 13.43 | 6.97% | 26 | 26.0% | 0.741 | 63.19 | 3.28 | 136.32 | 7.07 | 2 | 140.00 | 7.26 |
| 11 | 17.90 | 1,455 | 12.30 | 7.22% | 19 | 18.1% | 0.942 | 52.71 | 2.94 | 11.08 | 0.62 | 2 | 79.99 | 4.47 |
| 12 | 16.26 | 1,315 | 12.37 | 8.14% | 31 | 29.0% | 0.525 | 9.32 | 0.57 | 5.76 | 0.35 | 1 | 5.76 | 0.35 |
| 13 | 17.57 | 1,187 | 14.80 | 9.86% | 31 | 26.5% | 0.567 | 34.83 | 1.98 | 0.00 | 0.00 | 0 | 0.00 | 0.00 |
| 14 | 13.53 | 1,114 | 12.15 | 9.25% | 25 | 24.3% | 0.541 | 21.95 | 1.62 | 5.93 | 0.44 | 1 | 27.00 | 2.00 |
| 15 | 21.34 | 2,034 | 10.49 | 10.67% | 36 | 16.6% | 0.593 | 8.89 | 0.42 | 5.76 | 0.27 | 1 | 16.44 | 0.77 |
| 16 | 24.16 | 2,652 | 9.11 | 8.60% | 40 | 17.5% | 0.604 | 77.88 | 3.22 | 23.64 | 0.98 | 3 | 37.88 | 1.57 |
| 17 | 28.73 | 2,512 | 11.44 | 8.92% | 42 | 18.8% | 0.684 | 63.15 | 2.20 | 22.42 | 0.78 | 1 | 22.42 | 0.78 |
| 18 | 26.14 | 2,211 | 11.82 | 8.68% | 46 | 24.0% | 0.568 | 27.96 | 1.07 | 9.98 | 0.38 | 2 | 12.97 | 0.50 |
| 19 | 20.62 | 1,877 | 10.99 | 8.74% | 48 | 29.3% | 0.430 | 79.21 | 3.84 | 32.85 | 1.59 | 3 | 48.03 | 2.33 |
| 20 | 19.13 | 1,672 | 11.44 | 12.08% | 55 | 27.2% | 0.348 | 39.46 | 2.06 | 27.05 | 1.41 | 3 | 32.80 | 1.71 |
| 21 | 20.75 | 1,608 | 12.90 | 12.44% | 55 | 27.5% | 0.377 | 49.42 | 2.38 | 51.61 | 2.49 | 2 | 51.61 | 2.49 |
| 22 | 26.32 | 1,638 | 16.07 | 11.48% | 44 | 23.4% | 0.598 | 96.77 | 3.68 | 71.36 | 2.71 | 3 | 71.36 | 2.71 |
| 23 | 20.47 | 1,623 | 12.61 | 10.23% | 37 | 22.3% | 0.553 | 15.26 | 0.75 | 11.69 | 0.57 | 2 | 54.87 | 2.68 |
Spend is close to flat across the clock, between $10.59 and $28.73, with no hour holding more than 6.4% of the day. CPI runs $0.348 to $1.036 with no clean diurnal shape on this clock: the four cheapest hours are 20, 21, 03 and 05. The revenue columns are not readable at this grain. Within-day payers run 0 to 3 per hour, so a single person moves an hour outright: hour 10 shows within-day ROAS 7.07 on two payers and hour 07 shows 5.11 on one.
The cohort column decays as the day goes on. Its coverage is 100% through hour 09, 96% at hour 10 and 0% from hour 11 onward, so every cohort figure after hour 10 counts only the payments already in hand and will rise.
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: 04, 05, 06, 07, 08, 09, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23. 2026-08-04 additionally delivered in 00, 01, 02, 03, 12. Only the shared hours are compared.
Counting which way each shared hour points, which needs no weighting and asks only for a direction:
| metric | hours 2026-08-04 ran higher | hours it ran lower | sign test |
|---|---|---|---|
| CPM | 12 of 19 | 7 of 19 | p = 0.359 |
| CTR | 10 of 19 | 9 of 19 | p = 1.000 |
| click→install | 10 of 19 | 9 of 19 | p = 1.000 |
| CPI | 12 of 19 | 7 of 19 | p = 0.359 |
A sign test throws magnitude away and buys weight-free direction with it.
Nothing separates on the unweighted count. §4's pooled CTR of +246.9% at p = 0.000 disagrees; one hour of 08-03 is why.
Every shared hour, 2026-08-03 → 2026-08-04. All columns are Meta's instrument on both sides of each ratio. Revenue is deliberately absent: per-hour payer counts run 0-3, so an hourly revenue column would be one person's basket read as a rate.
| hr | impressions | CPM | CTR | click→install | CPI |
|---|---|---|---|---|---|
| 04 | 515 → 1,281 | 10.97 → 13.19 | 11.26% → 8.98% | 17.2% → 22.6% | 0.565 → 0.650 |
| 05 | 2,009 → 1,372 | 9.78 → 12.76 | 9.41% → 7.43% | 20.1% → 40.2% | 0.517 → 0.427 |
| 06 | 2,471 → 1,276 | 9.97 → 13.65 | 8.98% → 7.60% | 27.5% → 29.9% | 0.404 → 0.601 |
| 07 | 2,804 → 671 | 9.93 → 15.78 | 8.63% → 10.43% | 22.3% → 25.7% | 0.516 → 0.588 |
| 08 | 3,420 → 1,316 | 8.81 → 14.94 | 7.78% → 8.13% | 23.3% → 29.0% | 0.486 → 0.634 |
| 09 | 3,726 → 1,358 | 7.98 → 13.73 | 7.89% → 6.48% | 26.2% → 20.5% | 0.386 → 1.036 |
| 10 | 3,203 → 1,435 | 9.22 → 13.43 | 7.81% → 6.97% | 24.4% → 26.0% | 0.484 → 0.741 |
| 11 | 1,046 → 1,455 | 8.68 → 12.30 | 9.46% → 7.22% | 35.4% → 18.1% | 0.259 → 0.942 |
| 13 | 1,590 → 1,187 | 11.85 → 14.80 | 6.98% → 9.86% | 22.5% → 26.5% | 0.754 → 0.567 |
| 14 | 182,805 → 1,114 | 0.59 → 12.15 | 1.64% → 9.25% | 2.0% → 24.3% | 1.757 → 0.541 |
| 15 | 823 → 2,034 | 9.84 → 10.49 | 9.23% → 10.67% | 27.6% → 16.6% | 0.386 → 0.593 |
| 16 | 1,080 → 2,652 | 13.14 → 9.11 | 8.70% → 8.60% | 25.5% → 17.5% | 0.591 → 0.604 |
| 17 | 1,267 → 2,512 | 12.65 → 11.44 | 8.13% → 8.92% | 23.3% → 18.8% | 0.668 → 0.684 |
| 18 | 1,181 → 2,211 | 15.50 → 11.82 | 9.06% → 8.68% | 29.9% → 24.0% | 0.572 → 0.568 |
| 19 | 1,263 → 1,877 | 16.98 → 10.99 | 9.58% → 8.74% | 27.3% → 29.3% | 0.650 → 0.430 |
| 20 | 1,141 → 1,672 | 16.28 → 11.44 | 10.17% → 12.08% | 34.5% → 27.2% | 0.464 → 0.348 |
| 21 | 1,046 → 1,608 | 19.05 → 12.90 | 12.33% → 12.44% | 26.4% → 27.5% | 0.586 → 0.377 |
| 22 | 859 → 1,638 | 15.90 → 16.07 | 11.06% → 11.48% | 37.9% → 23.4% | 0.379 → 0.598 |
| 23 | 771 → 1,623 | 16.89 → 12.61 | 9.47% → 10.23% | 39.7% → 22.3% | 0.449 → 0.553 |
Hour 14 owns the pooled contrast. On 08-03 it served 182,805 impressions at $0.59 CPM, 1.64% CTR against 515–3,726 at $7.98–$19.05 and 6.98%–12.33%; 85.8% of 08-03's compared window, the rejected spill build (DECISION_LOG.md #50).
(i) The portfolio by country, 2026-08-04. 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 | $102.95 | 23.1% | 13,736 | $7.50 | 193 | $0.533 | $136.79 | 1.33 | 27 |
| US | $43.45 | 9.7% | 903 | $48.13 | 36 | $1.207 | $136.89 | 3.15 | 9 |
| DE | $33.50 | 7.5% | 604 | $55.44 | 17 | $1.970 | $25.41 | 0.76 | 1 |
| MX | $14.94 | 3.3% | 1,410 | $10.59 | 25 | $0.597 | $40.77 | 2.73 | 5 |
| GB | $14.93 | 3.3% | 389 | $38.40 | 19 | $0.786 | $0.00 | 0.00 | 1 |
| TR | $12.27 | 2.8% | 652 | $18.82 | 22 | $0.558 | $0.00 | 0.00 | 0 |
| MY | $10.54 | 2.4% | 1,096 | $9.62 | 20 | $0.527 | $5.38 | 0.51 | 1 |
| ID | $10.47 | 2.3% | 1,608 | $6.51 | 39 | $0.268 | $0.00 | 0.00 | 0 |
| AR | $10.27 | 2.3% | 860 | $11.94 | 38 | $0.270 | $4.99 | 0.49 | 2 |
| PH | $9.52 | 2.1% | 2,130 | $4.47 | 35 | $0.272 | $0.00 | 0.00 | 1 |
| AU | $8.39 | 1.9% | 160 | $52.34 | 7 | $1.198 | $0.00 | 0.00 | 0 |
| FR | $7.84 | 1.8% | 300 | $26.10 | 18 | $0.436 | $0.00 | 0.00 | 0 |
189 further countries are not listed, $166.94 between them (37.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) $104.91 from Meta 2026-08-03 and $341.09 from Meta 2026-08-04, a measured UTC-day total of $446.00.
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-04.
B1
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| IN | $102.95 | 23.1% | 13,736 | $7.50 | 193 | $0.533 | $136.79 | 1.33 | 27 |
| US | $43.45 | 9.7% | 903 | $48.13 | 36 | $1.207 | $136.89 | 3.15 | 9 |
| DE | $33.50 | 7.5% | 604 | $55.44 | 17 | $1.970 | $25.41 | 0.76 | 1 |
| MX | $14.94 | 3.3% | 1,410 | $10.59 | 25 | $0.597 | $40.77 | 2.73 | 5 |
| GB | $14.93 | 3.3% | 389 | $38.40 | 19 | $0.786 | $0.00 | 0.00 | 1 |
| TR | $12.27 | 2.8% | 652 | $18.82 | 22 | $0.558 | $0.00 | 0.00 | 0 |
| MY | $10.54 | 2.4% | 1,096 | $9.62 | 20 | $0.527 | $5.38 | 0.51 | 1 |
| ID | $10.47 | 2.3% | 1,608 | $6.51 | 39 | $0.268 | $0.00 | 0.00 | 0 |
| AR | $10.27 | 2.3% | 860 | $11.94 | 38 | $0.270 | $4.99 | 0.49 | 2 |
| PH | $9.52 | 2.1% | 2,130 | $4.47 | 35 | $0.272 | $0.00 | 0.00 | 1 |
| AU | $8.39 | 1.9% | 160 | $52.34 | 7 | $1.198 | $0.00 | 0.00 | 0 |
| FR | $7.84 | 1.8% | 300 | $26.10 | 18 | $0.436 | $0.00 | 0.00 | 0 |
189 further countries are not listed, $166.94 between them (37.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-03, the same two tables.
(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.
Pooled over the 19 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-03 | $445.54 | 213,020 | 2.09 | 5,645 | 2.65% | 757 | 13.41% | $0.589 |
| 2026-08-04 | $376.65 | 30,292 | 12.43 | 2,785 | 9.19% | 667 | 23.95% | $0.565 |
Pooling is a mix comparison: each hour weighted by what it delivered. §2's hour count separates neither ratio; both p-values are hour 14 of 08-03.
Held to a single creative that ran on both days, on the ad account's own clock, only two tests clear p < 0.05:
bodysuit click → install fell 36.33% to 25.55%, a 29.7% decline, p = 0.001. This is the one genuine negative in the comparison. Its CPI is flat across the two days, $0.511 to $0.506, so what moved is the share of clicks that became installs and not the price of an install. Coverage at H=6 is 72% on 08-04. bodysuit also went from $100 to $150 per day inside the compared window, so the decline and a budget change share it and cannot be separated here.spill click → install rose 2.61% to 26.42%, p = 0.000. This is the rejected build being replaced by its copy, already recorded as DECISION_LOG.md #50. It is not new information and it is the source of the pooled improvement above.bikini (−10.2%, p = 0.224), pool5 (−11.9%, p = 0.240) and mugshot (−31.4%, p = 0.052) do not separate. No install → pay test on any single creative clears 0.05 on either day. These per-creative tests key on cells the estimator builds on Meta's clock, so their day boundaries are the account's and their totals do not reconcile against the tables above.
| measure | 2026-08-03 | ROAS | 2026-08-04 | ROAS | moves after the day closes? |
|---|---|---|---|---|---|
| booked | $709.35 | 1.59 | $921.86 | 2.07 | settled |
| within-day | $397.69 | 0.89 | $588.70 | 1.32 | never |
| cohort @ 24h | $474.05 | 1.06 (100% cov) | $783.90 | 1.76 (35% cov) | rising on 08-04 |
| Meta booked, for reference | $738.83 | 1.66 | $862.96 | 1.93 |
Meta's bracketed figures on both rows are quoted on its own conversion clock and are shown so the day is traceable to what Meta will report.
Booked revenue on each day, split by the day its payer installed:
| payer installed | 2026-08-03 | 2026-08-04 |
|---|---|---|
| the day itself | $397.69 (56.1%) | $588.70 (63.9%) |
| one day earlier | $109.64 (15.5%) | $95.77 (10.4%) |
| two days earlier | $137.54 (19.4%) | $116.35 (12.6%) |
| three days earlier | $58.74 (8.3%) | $102.09 (11.1%) |
| four or more days earlier | $5.74 (0.8%) | $18.95 (2.1%) |
The top row of each column is the within-day figure. That identity is why the gap between booked and within-day is exactly the inherited cohort and nothing else.
One ad per ad set delivered on this day, so the ad-set row is the ad row, labelled by asset. §8 is the exception.
A single-clock delivery cut in six-hour UTC blocks. All columns are Meta's instrument. No revenue column appears here because per-asset per-hour payer counts are 0 to 2 and carry nothing.
| asset | block | spend | impr | CPM | CTR | click→install | CPI |
|---|---|---|---|---|---|---|---|
| bikini | 00–05 | 16.04 | 1,423 | 11.27 | 9.84% | 25.7% | 0.446 |
| bikini | 06–11 | 23.91 | 1,938 | 12.34 | 7.28% | 24.8% | 0.683 |
| bikini | 12–17 | 37.28 | 3,222 | 11.57 | 8.38% | 22.6% | 0.611 |
| bikini | 18–23 | 34.58 | 2,662 | 12.99 | 10.67% | 26.4% | 0.461 |
| bodysuit | 00–05 | 24.52 | 2,222 | 11.04 | 6.26% | 33.8% | 0.522 |
| bodysuit | 06–11 | 27.36 | 2,398 | 11.41 | 5.80% | 29.5% | 0.667 |
| bodysuit | 12–17 | 28.24 | 2,870 | 9.84 | 7.80% | 25.4% | 0.495 |
| bodysuit | 18–23 | 33.16 | 3,026 | 10.96 | 9.91% | 25.3% | 0.436 |
| pool5 | 00–05 | 26.58 | 2,127 | 12.50 | 8.56% | 26.4% | 0.554 |
| pool5 | 06–11 | 26.70 | 1,891 | 14.12 | 8.36% | 25.9% | 0.651 |
| pool5 | 12–17 | 24.20 | 1,907 | 12.69 | 9.75% | 19.4% | 0.672 |
| pool5 | 18–23 | 26.01 | 2,869 | 9.07 | 8.89% | 23.1% | 0.441 |
| mugshot | 00–05 | 20.35 | 1,126 | 18.07 | 9.06% | 18.6% | 1.071 |
| mugshot | 06–11 | 23.12 | 1,081 | 21.39 | 10.27% | 16.2% | 1.284 |
| mugshot | 12–17 | 24.36 | 1,987 | 12.26 | 11.27% | 11.6% | 0.937 |
| mugshot | 18–23 | 7.65 | 473 | 16.17 | 10.57% | 20.0% | 0.765 |
| spill2 | 06–11 | 2.40 | 203 | 11.82 | 8.87% | 27.8% | 0.480 |
| spill2 | 12–17 | 7.51 | 828 | 9.07 | 11.11% | 23.9% | 0.341 |
| spill2 | 18–23 | 20.36 | 1,360 | 14.97 | 15.37% | 26.3% | 0.370 |
| german_mature | 18–23 | 9.88 | 203 | 48.67 | 5.42% | 36.4% | 2.470 |
| latina_true | 18–23 | 1.79 | 36 | 49.72 | 8.33% | 33.3% | 1.790 |
spill2 holds the account's highest CTR in the 18–23 block at 15.37%, and the cheapest installs in both blocks where it ran with any volume, $0.341 and $0.370. mugshot runs 12 to 21 CPM against a pack of 9 to 15 and converts 11.6% to 20.0% of clicks against 19% to 34%, which keeps its CPI above every other arm in every block it ran. bodysuit, pool5 and mugshot each buy their cheapest installs in the 18–23 block, the ad account's late morning and afternoon; bikini is cheapest in 00–05 and spill2 in 12–17, so the diurnal pattern is not shared across the pack.
⚠ Spend and installs are a META-day cut, as in §3; revenue is the UTC day. Cells above $5 of spend, ordered by spend. Revenue is within-day.
| asset | cc | spend (META day) | inst (META day) | CPI | within $ | wROAS |
|---|---|---|---|---|---|---|
| bikini | IN | 42.10 | 86 | 0.490 | 44.34 | 1.05 |
| bodysuit | IN | 26.37 | 44 | 0.599 | 50.67 | 1.92 |
| turkish_mature | DE | 18.69 | 3 | 6.230 | 0.00 | 0.00 |
| bodysuit | US | 18.31 | 9 | 2.034 | 37.96 | 2.07 |
| spill2 | IN | 18.00 | 30 | 0.600 | 26.70 | 1.48 |
| mugshot | IN | 17.64 | 11 | 1.604 | 0.00 | 0.00 |
| pool5 | IN | 15.17 | 19 | 0.799 | 11.52 | 0.76 |
| pool5 | US | 14.10 | 15 | 0.940 | 93.94 | 6.66 |
| bikini | US | 11.07 | 7 | 1.581 | 4.99 | 0.45 |
| german_mature | DE | 10.39 | 4 | 2.598 | 25.41 | 2.45 |
| german | DE | 9.28 | 4 | 2.320 | 0.00 | 0.00 |
| bodysuit | MX | 7.09 | 14 | 0.506 | 35.06 | 4.95 |
| pool5 | GB | 5.44 | 6 | 0.907 | 0.00 | 0.00 |
| pool5 | MX | 5.13 | 12 | 0.428 | 5.71 | 1.11 |
pool5 leads every revenue measure on a two-person cell. $93.94 of its $228.50 within-day revenue (41.1%) is one United States cell, $88.95 and $4.99: 94.7% of the cell and 38.9% of the asset's day is one person. Its India cell was $15.17 at wROAS 0.76.
That single payer is also 15.1% of the whole account's within-day revenue. Remove them and pool5 falls from within-day 2.21 to 1.35, below bodysuit's untouched 1.57. The ranking between the day's top two arms therefore turns on one person, and that is true whichever country they are in.
The region charts inherit §3's caveat and are drawn on the META-day country cut.
The three tables below are the standing per-asset block, emitted by report_tables.py and pasted unedited. They carry the same columns in the same order in every report in this series, so any two days can be read against each other. Rows are every ad object with spend or installs on the day, including ones that took no spend and still attracted late-attributed installs.
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/bodysuit | $113.28 | 10,516 | 10.77 | 802 | 7.63% | 221 | 27.56% | $0.513 |
E2/bikini | $111.81 | 9,245 | 12.09 | 835 | 9.03% | 207 | 24.79% | $0.540 |
E2/pool5 | $103.49 | 8,794 | 11.77 | 781 | 8.88% | 184 | 23.56% | $0.562 |
E2/mugshot | $75.48 | 4,667 | 16.17 | 487 | 10.43% | 73 | 14.99% | $1.034 |
E2/spill2 | $30.27 | 2,391 | 12.66 | 319 | 13.34% | 82 | 25.71% | $0.369 |
DE/german_mature | $9.88 | 203 | 48.67 | 11 | 5.42% | 4 | 36.36% | $2.470 |
DE/latina_true | $1.79 | 36 | 49.72 | 3 | 8.33% | 1 | 33.33% | $1.790 |
earner/bodysuit | $0.00 | 0 | — | 0 | — | 6 | — | $0.000 |
earner/bikini | $0.00 | 0 | — | 0 | — | 4 | — | $0.000 |
earner/pool5 | $0.00 | 0 | — | 0 | — | 2 | — | $0.000 |
E2/spill | $0.00 | 0 | — | 0 | — | 1 | — | $0.000 |
Ours on every column. Meta can express only booked, so it rides bracketed beside that column and never as a row. Payers are distinct people, never transactions. Cohort horizon H=24h, 35% covered on this day. Report clock UTC.
| asset | booked | bROAS (Meta) | within-day | wROAS | cohort@H | cROAS | payers | payer% | ARPU | ARPPU | largest payer |
|---|---|---|---|---|---|---|---|---|---|---|---|
E2/bodysuit | $192.57 | 1.70 (1.91) | $177.48 | 1.57 | $198.77 | 1.75 | 11 | 4.9% | 0.789 | 16.13 | 25.3% |
E2/bikini | $77.59 | 0.69 (0.97) | $54.67 | 0.49 | $89.24 | 0.80 | 8 | 3.5% | 0.241 | 6.83 | 23.6% |
E2/pool5 | $228.50 | 2.21 (1.95) | $228.50 | 2.21 | $343.34 | 3.32 | 12 | 6.2% | 1.190 | 19.04 | 38.9% |
E2/mugshot | $12.22 | 0.16 (0.38) | $6.32 | 0.08 | $6.32 | 0.08 | 1 | 1.3% | 0.082 | 6.32 | 100.0% |
E2/spill2 | $38.61 | 1.28 (1.37) | $38.61 | 1.28 | $59.54 | 1.97 | 4 | 4.7% | 0.449 | 9.65 | 54.2% |
DE/german_mature | $25.41 | 2.57 (2.57) | $25.41 | 2.57 | $25.41 | 2.57 | 1 | 25.0% | 6.351 | 25.41 | 100.0% |
DE/latina_true | $0.00 | 0.00 (0.00) | $0.00 | 0.00 | $0.00 | 0.00 | 0 | 0.0% | 0.000 | — | — |
earner/bodysuit | $193.40 | — (—) | $3.56 | — | $7.12 | — | 1 | 12.5% | 0.445 | 3.56 | 100.0% |
earner/bikini | $80.25 | — (—) | $0.00 | — | $0.00 | — | 0 | 0.0% | 0.000 | — | — |
earner/pool5 | $0.00 | — (—) | $0.00 | — | $0.00 | — | 0 | 0.0% | 0.000 | — | — |
E2/spill | $73.33 | — (—) | $54.16 | — | $54.16 | — | 1 | 50.0% | 27.082 | 54.16 | 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/bodysuit | $136.98 | 19.3% | 13.4% | 67.4% | 21.4% |
E2/bikini | $120.55 | 34.9% | 9.2% | 55.9% | 9.1% |
E2/pool5 | $104.14 | 14.6% | 13.5% | 71.9% | 41.1% |
E2/mugshot | $51.69 | 34.1% | 3.2% | 62.7% | 0.0% |
E2/spill2 | $62.87 | 28.6% | 7.9% | 63.4% | 0.0% |
DE/german_mature | $12.14 | 0.0% | 0.0% | 100.0% | 0.0% |
DE/latina_true | $1.79 | 0.0% | 0.0% | 100.0% | — |
No arm reaches the 16-payer bar. Table B's best are pool5 at 12 and bodysuit at 11, so every revenue row is a direction.
Read the three tables together and the day splits cleanly. Table A says spill2 bought the cheapest installs on the account at $0.369 and the highest CTR at 13.34%, and that mugshot converted 14.99% of clicks against a 24–28% pack at roughly twice the price. Table B says pool5 leads the five worldwide arms on all three revenue measures and on both per-person measures, at a 6.2% payer rate and $19.04 ARPPU. Table C says 41.1% of pool5's revenue came from a country holding 13.5% of its spend, a gap of 28 points; bodysuit is the only other arm on the positive side of that gap, at eight points.
A further caution on table B's level: $57.72 of the day's $588.70 within-day revenue, 9.8%, came from two arms that spent nothing at all, on installs attributed late to builds that were switched off. The five worldwide arms that actually bought media returned $505.58 on $434.33 of spend, a within-day ROAS of 1.16 against the day's headline 1.32.
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.
From the framework read at H=12, on the ad account's clock. mix-neutral is each ad's ROAS recomputed on its regime's pooled country mix, holding its own cost and revenue efficiency, so it removes the geography confound that §6 exposes:
| asset | regime | installs | spend | CPM | CTR | India share | CPI | ROAS | mix-neutral |
|---|---|---|---|---|---|---|---|---|---|
| bikini | E2-R1 | 160 | 69.8 | 11.32 | 8.82% | 34% | 0.436 | 1.12 | 1.00 |
| bodysuit | E2-R1 | 111 | 56.2 | 12.58 | 6.90% | 17% | 0.506 | 1.05 | 1.08 |
| pool5 | E2-R1 | 111 | 66.7 | 14.88 | 9.93% | 15% | 0.601 | 1.00 | 0.81 |
| mugshot | E2-R1 | 95 | 80.9 | 16.97 | 8.64% | 22% | 0.852 | 0.21 | 0.25 |
| spill | E2-R1 | 85 | 111.1 | 0.61 | 1.67% | 7% | 1.308 | 0.05 | 0.07 |
| bikini | E2-R2 | 132 | 72.0 | 12.08 | 8.29% | 40% | 0.545 | 0.54 | 0.63 |
| bodysuit | E2-R2 | 106 | 57.9 | 10.17 | 7.02% | 25% | 0.546 | 1.12 | 1.17 |
| pool5 | E2-R2 | 81 | 54.1 | 12.39 | 8.59% | 15% | 0.668 | 3.34 | 1.93 |
| mugshot | E2-R2 | 50 | 49.0 | 14.92 | 10.95% | 22% | 0.981 | 0.00 | — |
| spill | E2-R2 | 35 | 10.8 | 9.34 | 10.64% | 23% | 0.309 | 2.46 | 3.81 |
| bikini | E2-R3 | 23 | 8.8 | 11.67 | 12.43% | 35% | 0.383 | 0.96 | 0.97 |
| bodysuit | E2-R3 | 32 | 11.0 | 11.24 | 12.00% | 12% | 0.343 | 2.39 | 2.06 |
| pool5 | E2-R3 | 37 | 8.6 | 9.60 | 10.60% | 0% | 0.232 | 2.16 | 1.89 |
| spill | E2-R3 | 24 | 9.0 | 14.92 | 15.18% | 12% | 0.377 | 0.64 | 0.98 |
In E2-R1, the only stretch this account has ever run with every arm on the same budget, pool5's raw 1.00 becomes 0.81 once its country mix is neutralised, putting it below bikini at 1.00 and bodysuit at 1.08. In E2-R2 its 3.34 falls to 1.93 and in E2-R3 its 2.16 falls to 1.89. The mix-neutral column moves pool5 down in all three regimes and moves no other arm down by more than 0.33, which is the same conclusion §6 reaches from the other direction. E2-R3's rows hold 23 to 37 installs each and carry correspondingly little.
Whether revenue can carry a per-asset verdict at all: across 1,596 installs and 81 payers (5.1%, mean $0.690, sd $5.321) the coefficient of variation is 7.72, and required sample scales with its square.
| to resolve a difference of | installs per arm | media per arm |
|---|---|---|
| 50% | 3,739 | $1,309 |
| 30% | 10,384 | $3,634 |
| 20% | 23,363 | $8,177 |
| 10% | 93,452 | $32,708 |
The largest regime-matched arm in the account holds 160 installs, which is 1% of what resolving a 20% difference needs. Every per-asset revenue figure in this report is a direction and never a magnitude.
The buy opened late enough in the ad account's day that this UTC day catches only its first three delivering hours, in the 18–23 block. Two of its creatives took any spend inside the window. It runs as a single ad set holding fifteen creatives, so it is the one object on the account where the ad-set row and the asset row are not the same thing.
| ad | spend | installs | CPI | within $ |
|---|---|---|---|---|
german_mature_10s | $9.88 | 4 | $2.470 | 25.41 |
latina_true_10s | $1.79 | 1 | $1.790 | 0.00 |
| total | $11.67 | 5 | $2.334 | 25.41 |
Two observations, neither of which is about which creative is better:
turkish_mature took $18.69 in Germany on that window, more than any other German creative including the two here.Its break-even position is not readable. One payer, $25.41 within-day, 100% of its own asset and country cell; under the 16-payer bar, no ROAS.
The cohort figure below was published at 35% coverage and has since completed. At the full 24-hour horizon 2026-08-04's cohort is $817.43, the figure the 2026-08-05 report carries in its prior-day column; what this page shows is a lower-coverage read of the same cohort, not a different number. Against 08-03's completed $474.05 the day reads +72.4% — the comparison this page declined. Within-day and booked are unaffected; they were sealed and settled when this page shipped.
..._d100_spill holds two ads, vid_ww_spill_8s_9x16_v1 and its copy, a replacement pair: the first delivered on the ad account's 08-03 and the second from 08-04, never both at once, so the ad-set row is the ad row on this day only.spill is at $25 and then bodysuit at $150. Any cross-arm comparison spanning the whole day is partly a comparison of budgets.bodysuit's click-to-install decline shares a window with its own budget change, so the two cannot be separated on this data.Payment error and the toolbar carried "This ad account has a balance that needs to be paid before you can take this action." Delivery continued through it.pool5 needs to be read on a matched country mix or not at all. Its raw result leads the account and its mix-neutral result is the lowest of the three same-shot arms in the only budget-matched regime available. One of those is an artifact and the mix-neutral column says which.E2_ww_creative_5cell_260806 starts at 00:00 PT on 08-06 with cells bikini, bodysuit, pool5, spill and lounge, running five days (experiment_designs.md §7b).
bodysuit and pool5, the two arms at $150, are the two this report shows most exposed to the mix confound: pool5's result is a two-payer United States cell and bodysuit carries the only significant funnel decline in the matched-hours comparison. A five-day result on unmatched arms is partly a budget contrast, and budget is a geography dial on this account.lounge enters with no history at all. It took no spend and served no impression inside this UTC day, so cell E begins from nothing while the other four carry two days of learning.The report day is a UTC day. Meta stamps its hourly exports in the ad account's own zone, UTC-7, so a UTC day is the account's 17:00–23:59 on 08-03 plus its 00:00–16:59 on 08-04, and every delivery figure above is restitched from those two exports. The clock is UTC so the report lines up with Adjust without anyone converting in their head.
Three revenue measures run through every table and are never mixed.
| measure | counts | moves after the day closes? |
|---|---|---|
| booked | money that arrived inside the day, whatever day its payer installed | settles a few hours after midnight, then fixed. Meta's own number is this basis |
| within-day | installed that day and paid before that day closed | never. Sealed at midnight |
| cohort at H | that day's installs, counted only to H hours of each person's own age, so it is neutral to the hour someone arrived | rises until every install has lived H hours. Quoted only with its coverage |
All three are read on our own payment records. Meta can express only booked, so its figure appears bracketed beside that column and never as a row of its own.
The instrument gate does not run on this clock. Meta's conversion value sits on its conversion hour and is the one column that cannot be honestly restitched into a UTC day. Run on the ad account's own clock the gate reads 1.04 on 08-04 and 0.98 on 08-03, inside the documented 0.91–1.06 band.
A regime is a stretch over which an ad set's daily budget did not change. It matters because budget acts as a geography dial on this account: raising it buys wider and cheaper countries, so two creatives measured across a budget change are compared on different audiences (DECISION_LOG.md #47). Regimes are recorded on the ad account's clock. This UTC day opens inside E2-R1 and holds its final seven hours, then runs the whole of E2-R2 and the first four hours of E2-R3. E2-R1 is the account's only stretch with every arm on the same $100 budget; E2-R2 runs spill at $25 against the rest at $100, and E2-R3 puts bodysuit at $150. Seventeen of the day's twenty-four hours are therefore unmatched.
_runs/2026-08-05_0804_settled/
exports/ads_hourly_aug4_settled.csv Meta, ads x hour, account day 08-04, settled
exports/ads_hourly_aug5.csv Meta, ads x hour, account day 08-05
exports/ads_day_jul1_aug5.csv Meta, ads x day, 36 days
exports/ads_country_day_jul1_aug5.csv Meta, ads x country x day
../2026-08-04_e2_start_and_0803_report/exports/ads_hourly_aug3_settled.csv
Meta, ads x hour, account day 08-03, settled
lum/{users,payments,joined}.csv our registrations and payments, cut 10:59 UTC 08-05
A UTC day needs the previous account day's hourly export as well as its own. UTC 08-04 is account 08-03 17:00–23:59 plus account 08-04 00:00–16:59, so ads_hourly_aug3_settled.csv is load bearing here and measures.py raises by name if it is missing.
Instruments, run from the repository root with PYTHONIOENCODING=utf-8:
python -m ad_ops.measures --config _runs/2026-08-05_0804_settled/run_config.json \
--day 2026-08-04 --prev 2026-08-03
python -m ad_ops.cohort_arpu --config _runs/2026-08-05_0804_settled/run_config.json \
--days 2026-07-31,2026-08-01,2026-08-02,2026-08-03,2026-08-04
python -m ad_ops.report_tables --config _runs/2026-08-05_0804_settled/run_config.json \
--day 2026-08-04 --prev 2026-08-03
python -m ad_ops.report_charts --config _runs/2026-08-05_0804_settled/run_config.json \
--day 2026-08-04 --prev 2026-08-03 \
--days 2026-08-01,2026-08-02,2026-08-03,2026-08-04 \
--out ad_ops/figures/2026-08-04 --relpath figures/2026-08-04
report_tables --prev emits §2's matched-hours pairing and §4's pooled funnel as well as §7's three standing tables. report_charts writes all nineteen charts and a per-section block of image links.
§4's per-creative tests and the regime table run on the ad account's clock and use the sibling config run_config_meta.json, which differs from the UTC one only in tz:
python -m ad_ops.day_compare --config _runs/2026-08-05_0804_settled/run_config_meta.json \
--today 2026-08-04 --prev 2026-08-03 --h 6
python -m ad_ops.asset_estimator hourly \
--config _runs/2026-08-05_0804_settled/run_config_meta.json