This report runs on 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 below is restitched from those two exports. On that clock 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. Together they spent $446.00 and Meta recorded 785 installs at $0.568 each, against $445.83 and 766 at $0.582 the day before.
Three revenue measures run through every table below and are never mixed. Booked is money that arrived inside the day whatever day its payer installed; it settles a few hours after midnight and is the basis Meta itself reports. Within-day counts people who installed that day and paid before that day closed; it is sealed and never moves again. Cohort at H counts that day's installs only to H hours of each person's own age, which makes it neutral to the hour someone arrived, and it is 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 ours-divided-by-Meta instrument gate cannot run on this clock, because Meta's conversion value sits on its conversion hour and is the one column that cannot be honestly restitched. 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 belongs in a daily report 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 being 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.
| 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) |
08-03's delivery columns are not a fact about the account. A single hour of one arm carrying a broken build took 181,927 of that day's 213,053 impressions, 85.4% of them, at $0.52 CPM. Every pooled impression-side contrast above is mostly that hour leaving, which is why CPM appears to rise sixfold and CTR to more than triple. The install-side columns are less affected and the revenue columns not at all. §2 shows the same two days hour by hour, where that single hour is visible rather than buried, and the two readings do not agree.
Cohort at 24 hours is 35% covered on 08-04 and cannot be read against 08-03's 100%. The payment cut is 10:59 UTC on 08-05, so only installs from the first ten hours of the day have lived a full 24 hours. The figure is still rising. Within-day is sealed on both days and is the honest day-over-day measure, and on it the account went 0.89 → 1.32.
The day gained on basket size, not on how many people paid. Both days closed with exactly 39 distinct within-day payers, on 805 registrations then 824, so the payer rate went 4.8% to 4.7%. Within-day ARPPU went $10.20 to $15.09, and that alone is the whole 48% revenue gain. The gain is also more concentrated: the largest single payer is 15.1% of the day against 10.4% the day before, and the top ten payers hold 67.2% against 56.0%.
Booked revenue on 08-04 splits by the day its payer installed: 63.9% from 08-04's own installs, 10.4% from 08-03, 12.6% from 08-02, 11.1% from 08-01 and 2.1% from 07-31. Inherited cohort is 36.1% of the day's booked money, which is the whole of the gap between booked 2.07 and within-day 1.32.
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 rather than being uniformly partial. 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 rather than paired with nothing. This runs on the report clock, from the same loader as the table above, because spend, impressions, clicks and installs sit on Meta's delivery hour and restitch across two account days exactly.
Hours both days delivered in, on the UTC clock: 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: it answers which way the day moved and never by how much.
Nothing separates. On the unweighted hour count, every one of the four delivery ratios is a coin flip between the two days. That is the opposite of what §4's pooled row says, where CTR reads +246.9% at p = 0.000, and the disagreement is the point of running both. The pooled row weights each hour by how much it delivered, and one hour on 08-03 delivered almost everything.
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 is the whole of the pooled contrast. On 08-03 it served 182,805 impressions at $0.59 CPM and 1.64% CTR, against a day otherwise running 515 to 3,726 impressions an hour at $7.98 to $19.05 and 6.98% to 12.33%. That single hour is 85.8% of 08-03's impressions across the compared window. It is the rejected spill build (DECISION_LOG.md #50), and any pooled comparison of these two days is mostly a report about it.
⚠ The spend and install columns are a META-day cut. Meta serves no hour × country grid, so per-country delivery exists only on the ad account's own UTC-7 day and cannot be restitched. The revenue columns are the UTC day split by country. The two sides are seven hours apart, so the ROAS columns here straddle two windows: read this table for mix, never for level against §1 or §4. Ordered by spend. Meta's booked value is bracketed.
| cc | spend (META day) | inst (META day) | CPI | booked | bROAS (Meta) | within | wROAS | cohort@24h | cROAS |
|---|---|---|---|---|---|---|---|---|---|
| IN | $119.29 | 192 | $0.621 | 184.84 | 1.55 (2.04) | 136.79 | 1.15 | 186.20 | 1.56 |
| US | $50.11 | 35 | $1.432 | 163.84 | 3.27 (5.70) | 136.89 | 2.73 | 211.78 | 4.23 |
| DE | $48.35 | 20 | $2.418 | 25.41 | 0.53 (0.53) | 25.41 | 0.53 | 25.41 | 0.53 |
| MX | $18.37 | 34 | $0.540 | 44.18 | 2.40 (3.55) | 40.77 | 2.22 | 40.77 | 2.22 |
| GB | $17.03 | 19 | $0.896 | 10.86 | 0.64 (0.64) | 0.00 | 0.00 | 0.00 | 0.00 |
| TR | $15.58 | 31 | $0.503 | 0.00 | 0.00 (0.00) | 0.00 | 0.00 | 0.00 | 0.00 |
| ID | $13.38 | 59 | $0.227 | 0.00 | 0.00 (0.60) | 0.00 | 0.00 | 0.00 | 0.00 |
| AR | $12.52 | 50 | $0.250 | 9.98 | 0.80 (4.79) | 4.99 | 0.40 | 4.99 | 0.40 |
| MY | $11.53 | 24 | $0.480 | 5.38 | 0.47 (0.47) | 5.38 | 0.47 | 5.38 | 0.47 |
| PH | $10.29 | 45 | $0.229 | 39.19 | 3.81 (5.25) | 0.00 | 0.00 | 0.00 | 0.00 |
| AU | $9.45 | 6 | $1.575 | 0.00 | 0.00 (1.64) | 0.00 | 0.00 | 0.00 | 0.00 |
| CA | $8.67 | 8 | $1.084 | 23.94 | 2.76 (1.50) | 4.99 | 0.57 | 4.99 | 0.57 |
The United States carries 23.3% of the day's within-day revenue on five people. Its $136.89 comes from five distinct payers, of whom the largest is 65.0% and the top two are 86.9%. Against the 16-payer bar this account uses (#37) the honest statement is that the level is not readable at this sample size, and what the row supports is a direction on where the money sits, not a magnitude.
India is the mirror image and holds the largest payer count of any country on the day: 13 distinct payers behind $136.79, the same share of the day's within-day revenue as the United States, bought at $0.621 an install against the United States at $1.432 on the same cut. Its largest payer is 32.8% of it, so even India sits under the bar. Germany at $2.418 an install is the dearest cell on this cut, 3.9 times India's, and is discussed in §8.
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 across hours is a mix comparison, and on these two days it is a misleading one. It weights each hour by how much it delivered, so a day that bought differently across the clock can move these rows without any hour changing. §2 counts the same two days hour by hour and finds neither ratio separating at all. Both p-values above are carried by hour 14 of 08-03 and should not be read as a change in how the account converts.
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, not as a second instrument.
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.
Exactly one ad delivered per ad set on this day, so the ad-set row is the ad row here and the rows are labelled by asset. That identity is a fact about the day and not about the campaign: the ..._d100_spill ad set holds two ads, vid_ww_spill_8s_9x16_v1 and its copy, and they are a replacement pair rather than a pair of arms — the first delivered on the ad account's 08-03 and the second from 08-04, never both at once. The German buy in §8 is the object on this account where the identity genuinely fails, at fifteen creatives in one ad set.
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 still finishes first on every revenue measure, and the cell carrying it holds two people. $93.94 of its $228.50 within-day revenue, 41.1%, is one United States cell, and that cell holds exactly two payers, at $88.95 and $4.99. The larger of the two is 94.7% of the cell and 38.9% of everything the asset earned all day. The same creative bought $15.17 of India on the same window and returned within-day 0.76 there.
That single payer is also 15.1% of the whole account's within-day revenue. Remove him 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 he is 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 a META-day cut, not a UTC one. Meta serves no hour × country grid, so per-country delivery exists only on the ad account's own UTC-7 day and cannot be restitched. It is a seven-hour-offset window against tables A and B above; read it for mix, never for level against them.
Why a row in B is readable or not. The last column is the share of that asset's own within-day revenue that came from the United States: where it far exceeds the US spend share, the asset bought a geography rather than earning a result.
| 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 on this day. The highest count in table B is pool5 at 12, then bodysuit at 11. Every revenue row above is therefore a direction, and the gap between an arm twelve payers deep and one eleven payers deep is not a result.
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 rather than 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 of its country cell. Against the 16-payer bar the honest sentence is that this sample cannot carry a ROAS.
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._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 rather than short-filling 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