Two ad accounts bought this app in this window and both are ours: across the six UTC days 2026-08-10 to 2026-08-15 the portfolio spent $3,770.14, of which B1 took $3,329.00 and the two shared Nomad Node accounts, which began buying on 08-11, took $441.14. B1 got 3,550 installs at $0.938 against $3,812.43 and 5,663 at $0.673 in the same six days a week earlier; it booked $8,384.94 and sealed $2,542.76 inside the days themselves. The week is six days of seven, because 2026-08-16 had not closed when this was cut, and it is read against the matched six days of the week before. Our records read 1.09 of Meta's booked value on B1's own clock, outside the documented 0.91 to 1.06 band. Definitions, the report clock and the three revenue measures are in the appendix.
| 2026-08-03..2026-08-08 | 2026-08-10..2026-08-15 | change | |
|---|---|---|---|
| spend | $3,812.43 | $3,329.00 | −12.7% |
| impressions | 529,309 | 354,790 | −33.0% |
| CPM | 7.20 | 9.38 | +30.3% |
| clicks | 28,447 | 22,152 | −22.1% |
| CTR | 5.37% | 6.24% | +16.2% |
| installs (Meta) | 5,663 | 3,550 | −37.3% |
| click→install | 19.91% | 16.03% | −19.5% |
| CPI | $0.673 | $0.938 | +39.3% |
| registrations (ours) | 6,350 | 4,758 | −25.1% |
| booked | $8,146.98 (2.14) | $8,384.94 (2.52) | +2.9% |
| within-day | $3,976.77 (1.04) | $2,542.76 (0.76) | −36.1% |
| cohort @ 24h | $4,939.27 (1.30) at 100% | $3,227.88 (0.97) at 90% | not comparable — see Caveats |
| within-day payers | 296 | 213 | −83 |
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.6099 | $0.9397 | $1.3412 | $11.80 | $15.64 | $21.56 | 6,093 |
Portfolio spend, both windows: $3,812.43 then $3,770.14. The earlier window is B1 alone; the shared accounts had not started.
One campaign, Worldwide, took 100.0% of B1; the earlier window was not single-campaign. Any account-level line across the two carries a campaign-mix change.
Installs got two fifths dearer on slightly less money. CPI $0.673 → $0.938, spend −12.7%, installs −37.3%.
Booked rose while within-day fell — an ageing cohort. The share of booked revenue from installs inside the window went 48.8% to 30.3%.
The pooled CPM and CTR rows point the opposite way from the hour-matched read, and section 3 names the one hour behind it.
Click→install fell on both reads, and it is where the CPI rise sits. 19.91% to 16.03% pooled, lower in 23 of 24 matched hours.
Both accounts are ours: B1, act 1738541847343652, campaigns bailingxia_; and the two shared Nomad Node accounts, acts 835434076171203 and 3267486106793669, whose campaigns for this app are 0811_ and 0814_*. Those two accounts also carry other products and none of that is counted here. The shared pair started on 2026-08-11, so its column covers five of this window's six days while B1's covers all six. Spend is each account's own export; registrations and the three revenue measures are our own records, taken across everything each account's campaigns carried, which is why B1's row here does not match the ad-id-scoped totals in the sections below to the cent.
| account | spend | registrations | booked | bROAS | within-day | wROAS | cohort@24h | cROAS |
|---|---|---|---|---|---|---|---|---|
| B1 (ours) | $3,329.00 | 4,751 | $8,389.93 | 2.52 | $2,547.75 | 0.77 | $3,232.87 | 0.97 |
| Nomad Node (shared) | $441.14 | 1,710 | $921.51 | 2.09 | $669.74 | 1.52 | $825.68 | 1.87 |
| Portfolio | $3,770.14 | 6,461 | $9,311.43 | 2.47 | $3,217.49 | 0.85 | $4,058.55 | 1.08 |
Rank on within-day and cohort@24h, never booked; here the rankings disagree. Booked credits B1 with weeks of accumulated cohort the shared buy has not had.
A ninth of the money brought a quarter of the new users, which is what lifts the portfolio's two inheritance-free returns above B1's own.
The shared accounts' export carries no Ad ID, campaign name, clicks, leads or country. So sections 3 to 7 are B1 alone.
B1 alone, on the report clock. The axis is hour of day pooled across the six days of the window, not a clock: each bucket holds six instances of that hour, so this table is read for diurnal shape and never as a timeline. Delivery columns are Meta's instrument on both sides of every ratio. Payer rate, ARPU and ARPPU are ours on both sides. The two install counts are never crossed. ours is our registrations in that hour bucket; cov is that bucket's cohort coverage at H=24.
| hr | spend | impr | CPM | clicks | CTR | inst | clk→i | CPI | ours | cov | booked | bROAS | within | wROAS | wPay | cohort | cROAS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | $97.77 | 10,102 | 9.68 | 653 | 6.46% | 96 | 14.7% | $1.018 | 114 | 100% | $404.46 | 4.14 | $174.76 | 1.79 | 11 | $174.76 | 1.79 |
| 1 | $100.05 | 11,013 | 9.08 | 616 | 5.59% | 86 | 14.0% | $1.163 | 122 | 100% | $414.54 | 4.14 | $214.06 | 2.14 | 10 | $214.06 | 2.14 |
| 2 | $110.16 | 11,768 | 9.36 | 683 | 5.80% | 106 | 15.5% | $1.039 | 151 | 100% | $215.95 | 1.96 | $135.74 | 1.23 | 11 | $135.74 | 1.23 |
| 3 | $116.57 | 12,676 | 9.20 | 730 | 5.76% | 114 | 15.6% | $1.023 | 151 | 100% | $162.82 | 1.40 | $41.55 | 0.36 | 5 | $41.55 | 0.36 |
| 4 | $111.40 | 13,449 | 8.28 | 780 | 5.80% | 121 | 15.5% | $0.921 | 157 | 100% | $341.64 | 3.07 | $32.87 | 0.30 | 6 | $35.93 | 0.32 |
| 5 | $116.96 | 14,412 | 8.12 | 789 | 5.47% | 140 | 17.7% | $0.835 | 193 | 100% | $461.60 | 3.95 | $91.61 | 0.78 | 8 | $91.61 | 0.78 |
| 6 | $122.63 | 13,996 | 8.76 | 771 | 5.51% | 117 | 15.2% | $1.048 | 168 | 100% | $298.05 | 2.43 | $81.06 | 0.66 | 5 | $90.37 | 0.74 |
| 7 | $184.62 | 19,020 | 9.71 | 1,295 | 6.81% | 189 | 14.6% | $0.977 | 275 | 100% | $320.14 | 1.73 | $213.73 | 1.16 | 13 | $244.85 | 1.33 |
| 8 | $158.09 | 18,122 | 8.72 | 1,110 | 6.13% | 180 | 16.2% | $0.878 | 234 | 100% | $464.74 | 2.94 | $189.54 | 1.20 | 12 | $189.54 | 1.20 |
| 9 | $161.32 | 18,194 | 8.87 | 1,081 | 5.94% | 174 | 16.1% | $0.927 | 226 | 100% | $354.09 | 2.19 | $170.41 | 1.06 | 15 | $177.00 | 1.10 |
| 10 | $171.76 | 18,578 | 9.25 | 1,087 | 5.85% | 172 | 15.8% | $0.999 | 234 | 100% | $391.68 | 2.28 | $97.09 | 0.57 | 6 | $134.95 | 0.79 |
| 11 | $156.76 | 16,934 | 9.26 | 1,022 | 6.04% | 153 | 15.0% | $1.025 | 197 | 83% | $335.26 | 2.14 | $96.16 | 0.61 | 8 | $148.03 | 0.94 |
| 12 | $154.66 | 15,664 | 9.87 | 1,002 | 6.40% | 148 | 14.8% | $1.045 | 203 | 83% | $140.31 | 0.91 | $35.22 | 0.23 | 6 | $38.28 | 0.25 |
| 13 | $134.50 | 15,303 | 8.79 | 1,053 | 6.88% | 166 | 15.8% | $0.810 | 237 | 83% | $297.22 | 2.21 | $50.57 | 0.38 | 8 | $57.10 | 0.42 |
| 14 | $141.84 | 11,627 | 12.20 | 884 | 7.60% | 154 | 17.4% | $0.921 | 199 | 85% | $289.73 | 2.04 | $147.48 | 1.04 | 13 | $186.22 | 1.31 |
| 15 | $168.60 | 17,539 | 9.61 | 1,189 | 6.78% | 195 | 16.4% | $0.865 | 252 | 84% | $395.53 | 2.35 | $84.31 | 0.50 | 10 | $92.87 | 0.55 |
| 16 | $172.06 | 20,253 | 8.50 | 1,206 | 5.95% | 209 | 17.3% | $0.823 | 277 | 82% | $395.31 | 2.30 | $102.42 | 0.60 | 12 | $138.86 | 0.81 |
| 17 | $185.66 | 20,899 | 8.88 | 1,281 | 6.13% | 187 | 14.6% | $0.993 | 276 | 84% | $481.58 | 2.59 | $102.30 | 0.55 | 10 | $128.40 | 0.69 |
| 18 | $176.06 | 18,320 | 9.61 | 1,161 | 6.34% | 202 | 17.4% | $0.872 | 257 | 79% | $401.44 | 2.28 | $124.98 | 0.71 | 7 | $163.99 | 0.93 |
| 19 | $154.81 | 14,767 | 10.48 | 908 | 6.15% | 164 | 18.1% | $0.944 | 223 | 76% | $377.44 | 2.44 | $103.77 | 0.67 | 8 | $125.88 | 0.81 |
| 20 | $110.12 | 11,212 | 9.82 | 772 | 6.89% | 133 | 17.2% | $0.828 | 175 | 83% | $358.66 | 3.26 | $88.87 | 0.81 | 7 | $272.49 | 2.47 |
| 21 | $118.03 | 9,949 | 11.86 | 692 | 6.96% | 115 | 16.6% | $1.026 | 146 | 82% | $504.37 | 4.27 | $88.60 | 0.75 | 10 | $113.59 | 0.96 |
| 22 | $104.39 | 10,233 | 10.20 | 691 | 6.75% | 102 | 14.8% | $1.023 | 140 | 83% | $216.50 | 2.07 | $15.05 | 0.14 | 2 | $15.05 | 0.14 |
| 23 | $100.18 | 10,760 | 9.31 | 696 | 6.47% | 127 | 18.2% | $0.789 | 151 | 83% | $361.90 | 3.61 | $60.61 | 0.61 | 10 | $216.78 | 2.16 |
| all | $3,329.00 | 354,790 | 9.38 | 22,152 | 6.24% | 3,550 | 16.0% | $0.938 | 4,758 | 90% | $8,384.94 | 2.52 | $2,542.76 | 0.76 | 213 | $3,227.88 | 0.97 |
⚠ Payer counts per hour bucket run 0 to 9 on any one day. An hourly ARPPU on one payer is that payer's basket. Read the all row for level and the buckets for shape.
Coverage is 100% through bucket 10, 76% to 85% after it, 90% overall. Every cohort figure here can only rise, and 0.97 is a floor.
The buy sits in the account's morning. Buckets 7 to 19 each carry over $130 — on B1's UTC-7 clock, its own first thirteen hours.
Bucket 14 buys the thinnest, dearest impressions, and it is a standing feature: 08-14 alone 1,453 impressions at CPM 11.15, 08-15 alone 1,743 at 13.68.
CPI swings less across the clock than return, and part of return's swing is within-day censoring: buckets 20 and 23 more than triple on cohort@24h.
Hours both periods delivered in, on the UTC clock: 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23. Only the shared hours are compared. Each bucket pools that hour across the 6 days of the period, so the floor for reading one is 50 impressions a day, 300 across the period.
Counting which way each shared hour points, which needs no weighting and asks only for a direction:
| metric | hours 2026-08-10..2026-08-15 ran higher | hours it ran lower | sign test |
|---|---|---|---|
| CPM | 3 of 24 | 21 of 24 | p = 0.000 |
| CTR | 2 of 24 | 22 of 24 | p = 0.000 |
| click→install | 1 of 24 | 23 of 24 | p = 0.000 |
| CPI | 23 of 24 | 1 of 24 | p = 0.000 |
A sign test throws magnitude away and buys weight-free direction with it.
All four separate, and two contradict the pooled rows in section 5. When weighted and unweighted reads disagree this hard, the weights are the finding.
The weights sit in the earlier window's bucket 14 — the rejected spill build (DECISION_LOG.md #50), over a third of its impressions in one hour.
Click→install and CPI agree on both reads. The step from click to install is where this window lost its volume, and no weighting rescues it.
Every shared hour, 2026-08-03..2026-08-08 → 2026-08-10..2026-08-15. 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 |
|---|---|---|---|---|---|
| 00 | 8,955 → 10,102 | 11.45 → 9.68 | 7.59% → 6.46% | 24.7% → 14.7% | 0.611 → 1.018 |
| 01 | 10,919 → 11,013 | 9.30 → 9.08 | 7.62% → 5.59% | 20.9% → 14.0% | 0.583 → 1.163 |
| 02 | 12,427 → 11,768 | 9.17 → 9.36 | 7.13% → 5.80% | 21.0% → 15.5% | 0.613 → 1.039 |
| 03 | 13,421 → 12,676 | 9.02 → 9.20 | 7.19% → 5.76% | 22.2% → 15.6% | 0.566 → 1.023 |
| 04 | 14,359 → 13,449 | 10.17 → 8.28 | 7.16% → 5.80% | 23.2% → 15.5% | 0.611 → 0.921 |
| 05 | 15,996 → 14,412 | 10.33 → 8.12 | 7.26% → 5.47% | 22.4% → 17.7% | 0.635 → 0.835 |
| 06 | 15,413 → 13,996 | 10.34 → 8.76 | 7.64% → 5.51% | 24.9% → 15.2% | 0.544 → 1.048 |
| 07 | 13,858 → 19,020 | 11.04 → 9.71 | 7.23% → 6.81% | 21.6% → 14.6% | 0.709 → 0.977 |
| 08 | 13,214 → 18,122 | 9.83 → 8.72 | 6.84% → 6.13% | 21.0% → 16.2% | 0.683 → 0.878 |
| 09 | 14,187 → 18,194 | 9.55 → 8.87 | 6.34% → 5.94% | 23.7% → 16.1% | 0.636 → 0.927 |
| 10 | 13,758 → 18,578 | 10.42 → 9.25 | 6.45% → 5.85% | 22.2% → 15.8% | 0.728 → 0.999 |
| 11 | 12,601 → 16,934 | 10.67 → 9.26 | 6.56% → 6.04% | 22.8% → 15.0% | 0.715 → 1.025 |
| 12 | 11,642 → 15,664 | 11.06 → 9.87 | 6.52% → 6.40% | 20.8% → 14.8% | 0.815 → 1.045 |
| 13 | 13,030 → 15,303 | 11.36 → 8.79 | 6.63% → 6.88% | 22.9% → 15.8% | 0.748 → 0.810 |
| 14 | 196,105 → 11,627 | 1.42 → 12.20 | 2.07% → 7.60% | 6.5% → 17.4% | 1.057 → 0.921 |
| 15 | 18,977 → 17,539 | 10.03 → 9.61 | 7.88% → 6.78% | 19.5% → 16.4% | 0.652 → 0.865 |
| 16 | 19,049 → 20,253 | 9.63 → 8.50 | 7.24% → 5.95% | 18.7% → 17.3% | 0.711 → 0.823 |
| 17 | 22,084 → 20,899 | 9.70 → 8.88 | 6.90% → 6.13% | 20.4% → 14.6% | 0.691 → 0.993 |
| 18 | 20,398 → 18,320 | 10.62 → 9.61 | 7.26% → 6.34% | 21.4% → 17.4% | 0.683 → 0.872 |
| 19 | 16,922 → 14,767 | 11.62 → 10.48 | 7.59% → 6.15% | 23.1% → 18.1% | 0.662 → 0.944 |
| 20 | 15,110 → 11,212 | 11.62 → 9.82 | 8.13% → 6.89% | 24.8% → 17.2% | 0.576 → 0.828 |
| 21 | 13,332 → 9,949 | 12.72 → 11.86 | 8.69% → 6.96% | 23.5% → 16.6% | 0.624 → 1.026 |
| 22 | 12,338 → 10,233 | 12.74 → 10.20 | 8.54% → 6.75% | 23.8% → 14.8% | 0.626 → 1.023 |
| 23 | 11,214 → 10,760 | 13.22 → 9.31 | 8.05% → 6.47% | 22.6% → 18.2% | 0.727 → 0.789 |
(i) The portfolio by country, 2026-08-10..2026-08-16. 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 | $927.09 | 24.3% | 118,688 | $7.81 | 1,940 | $0.478 | $775.02 | 0.84 | 140 |
| US | $528.55 | 13.9% | 14,808 | $35.69 | 347 | $1.523 | $654.94 | 1.24 | 86 |
| GB | $148.82 | 3.9% | 6,569 | $22.65 | 149 | $0.999 | $257.47 | 1.73 | 22 |
| MX | $148.01 | 3.9% | 23,147 | $6.39 | 382 | $0.387 | $132.01 | 0.89 | 31 |
| ID | $140.69 | 3.7% | 24,701 | $5.70 | 596 | $0.236 | $52.88 | 0.38 | 20 |
| PH | $109.82 | 2.9% | 49,081 | $2.24 | 465 | $0.236 | $72.00 | 0.66 | 11 |
| TR | $91.18 | 2.4% | 5,037 | $18.10 | 191 | $0.477 | $161.77 | 1.77 | 17 |
| MY | $89.21 | 2.3% | 14,997 | $5.95 | 192 | $0.465 | $65.32 | 0.73 | 15 |
| AR | $85.51 | 2.2% | 6,983 | $12.25 | 174 | $0.491 | $42.91 | 0.50 | 15 |
| CA | $76.42 | 2.0% | 3,229 | $23.67 | 64 | $1.194 | $143.33 | 1.88 | 15 |
| AU | $70.93 | 1.9% | 2,735 | $25.93 | 56 | $1.267 | $48.79 | 0.69 | 9 |
| DE | $65.91 | 1.7% | 2,080 | $31.69 | 61 | $1.081 | $35.84 | 0.54 | 14 |
207 further countries are not listed, $1,331.59 between them (34.9% of this block).
Absent from the table above, by name: HR1. Their spend is in every day-grain table; only their country split is missing.
(ii) The same cut per account, 2026-08-10..2026-08-16.
B1
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| IN | $927.09 | 24.3% | 118,688 | $7.81 | 1,521 | $0.610 | $509.32 | 0.55 | 118 |
| US | $528.55 | 13.9% | 14,808 | $35.69 | 286 | $1.848 | $543.10 | 1.03 | 74 |
| GB | $148.82 | 3.9% | 6,569 | $22.65 | 129 | $1.154 | $245.39 | 1.65 | 20 |
| MX | $148.01 | 3.9% | 23,147 | $6.39 | 256 | $0.578 | $81.37 | 0.55 | 25 |
| ID | $140.69 | 3.7% | 24,701 | $5.70 | 315 | $0.447 | $27.94 | 0.20 | 15 |
| PH | $109.82 | 2.9% | 49,081 | $2.24 | 370 | $0.297 | $37.14 | 0.34 | 10 |
| TR | $91.18 | 2.4% | 5,037 | $18.10 | 132 | $0.691 | $128.74 | 1.41 | 11 |
| MY | $89.21 | 2.3% | 14,997 | $5.95 | 147 | $0.607 | $54.55 | 0.61 | 12 |
| AR | $85.51 | 2.2% | 6,983 | $12.25 | 131 | $0.653 | $32.93 | 0.39 | 13 |
| CA | $76.42 | 2.0% | 3,229 | $23.67 | 61 | $1.253 | $107.68 | 1.41 | 14 |
| AU | $70.93 | 1.9% | 2,735 | $25.93 | 48 | $1.478 | $14.52 | 0.20 | 7 |
| DE | $65.91 | 1.7% | 2,080 | $31.69 | 56 | $1.177 | $35.84 | 0.54 | 14 |
206 further countries are not listed, $1,331.59 between them (34.9% of this block).
Nomad Node
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| AE | $0.00 | 0.0% | 0 | — | 18 | $0.000 | $0.00 | — | 0 |
| AL | $0.00 | 0.0% | 0 | — | 1 | $0.000 | $0.00 | — | 0 |
| AM | $0.00 | 0.0% | 0 | — | 3 | $0.000 | $34.99 | — | 1 |
| AO | $0.00 | 0.0% | 0 | — | 1 | $0.000 | $0.00 | — | 0 |
| AR | $0.00 | 0.0% | 0 | — | 43 | $0.000 | $9.98 | — | 2 |
| AU | $0.00 | 0.0% | 0 | — | 8 | $0.000 | $34.28 | — | 2 |
| AZ | $0.00 | 0.0% | 0 | — | 3 | $0.000 | $0.00 | — | 0 |
| BA | $0.00 | 0.0% | 0 | — | 3 | $0.000 | $0.00 | — | 0 |
| BD | $0.00 | 0.0% | 0 | — | 8 | $0.000 | $0.00 | — | 0 |
| BE | $0.00 | 0.0% | 0 | — | 2 | $0.000 | $0.00 | — | 0 |
| BG | $0.00 | 0.0% | 0 | — | 4 | $0.000 | $5.74 | — | 1 |
| BN | $0.00 | 0.0% | 0 | — | 2 | $0.000 | $0.00 | — | 0 |
102 further countries are not listed, $0.00 between them (0.0% of this block).
KBM1
| cc | spend | share | impressions | CPM | registrations (ours) | cost/reg | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|
| US | $0.00 | 0.0% | 0 | — | 9 | $0.000 | $4.99 | — | 1 |
HR1 — no country block: it delivered nothing on this day, a measured zero.
Reconciliation over the period. Every per-country cell is an allocation across hours; every total is measured. Each account's raked country total equals its bought spend for these days: B1 $3,813.74; Nomad Node $631.70; KBM1 $20.22. The per-day reconciliations, naming the Meta days each figure was raked from, are on the daily pages.
Pooled over the 24 hours both periods 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..2026-08-08 | $3,812.43 | 529,309 | 7.20 | 28,447 | 5.37% | 5,663 | 19.91% | $0.673 |
| 2026-08-10..2026-08-15 | $3,329.00 | 354,790 | 9.38 | 22,152 | 6.24% | 3,550 | 16.03% | $0.938 |
Pooling across hours weights each hour by what it delivered. The hourly pairing is the unweighted read of the same two periods; where they disagree, the mix moved.
They disagree on two rows of four, and section 3 names why. Click→install and CPI agree on both reads; carry those two forward.
The mix-neutral account line, in section 6, reads CPM $6.73 → $9.38 on either mix: one campaign delivered here, so there is nothing to neutralise.
| measure | 2026-08-03..2026-08-08 | 2026-08-10..2026-08-15 | moves after the period closes? |
|---|---|---|---|
| booked | $8,146.98 (2.14) | $8,384.94 (2.52) | settled |
| within-day | $3,976.77 (1.04) | $2,542.76 (0.76) | never |
| cohort @ 24h | $4,939.27 (1.30) at 100% | $3,227.88 (0.97) at 90% | still rising |
The three measures disagree, and within-day is the one to read: it cannot inherit. Cohort is 90% covered, so its 0.97 is a floor.
| installed | 2026-08-03..2026-08-08 | 2026-08-10..2026-08-15 |
|---|---|---|
| the same day | $3,976.77 (48.8%) | $2,542.76 (30.3%) |
| one day earlier | $1,251.12 (15.4%) | $998.56 (11.9%) |
| two days earlier | $940.70 (11.5%) | $691.07 (8.2%) |
| three days earlier | $473.53 (5.8%) | $641.37 (7.6%) |
| four days earlier | $401.58 (4.9%) | $415.33 (5.0%) |
| five days earlier | $192.61 (2.4%) | $544.63 (6.5%) |
| six days earlier | $425.87 (5.2%) | $367.84 (4.4%) |
| seven days earlier | $282.05 (3.5%) | $602.49 (7.2%) |
Over one day the same-day row and the within-day total are the same number seen twice. Over a window the split is by how long each payer had been installed, and the lag-0 row is still exactly the within-day total, which is what makes the split worth drawing.
Under a third of B1's booked revenue came from arrivals inside the window. The five- and seven-day rows rose; every row inside three days fell.
Delivery is Meta's instrument on both sides of every ratio; every revenue measure is ours. Cohort horizon H=24h. Report clock UTC. Rank on CPM, cost per click and CPI only — geography is the treatment here, which is what makes those comparable across campaigns, while revenue still needs 16 payers (DECISION_LOG.md #37, #48) and a campaign under that bar carries a direction and never a magnitude.
| campaign | spend | share | impressions | impr share | CPM | clicks | CTR | cost/click | installs | CPI | within-day | wROAS | payers |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Worldwide | $3,329.00 | 100.0% | 354,790 | 100.0% | 9.38 | 22,152 | 6.24% | $0.150 | 3,550 | $0.938 | $2,529.09 | 0.76 | 210 |
Booking with no delivery, and excluded from every rate above: T1 (Jul 23) 0 installs (Meta), 1 registrations (ours), $0.00 within-day; T2 (Jul 23) 0 installs (Meta), 2 registrations (ours), $0.00 within-day; T3 (Jul 23) 0 installs (Meta), 13 registrations (ours), $0.00 within-day; T1 (Jul 25) 0 installs (Meta), 16 registrations (ours), $0.00 within-day; T2 (Jul 25) 0 installs (Meta), 22 registrations (ours), $0.00 within-day; T3 (Jul 25, India/SEA) 0 installs (Meta), 204 registrations (ours), $3.56 within-day; German (DE/AT/CH) 0 installs (Meta), 4 registrations (ours), $0.00 within-day; Earner (retired 08-03) 0 installs (Meta), 507 registrations (ours), $10.11 within-day. Counting them would put installs into the CPI denominator against spend that never happened.
Account CPM $6.73 → $9.38 (39.4%). Held to 2026-08-03..2026-08-08's campaign mix it is $9.38 (39.4%) — the difference between those two is the campaign mix.
One campaign delivered all six days; eight retired ones booked without delivering. Their revenue sits outside every rate above, lifting section 5's account total.
The standing charts for this section plot spend share, CPM and CPI by campaign across the run. One campaign has delivered on every day in the window, so all three would be a single flat line and the chart generator emits none.
B1's worldwide campaign, which took 100.0% of B1's spend across the window: $3,329.00, 354,790 impressions, 3,550 installs at $0.938, and $2,529.09 of within-day revenue at a return of 0.76 from 210 payers.
The five-cell split test ran into 08-11 and the campaign changed shape twice after it, so this window is not one regime.
Each asset sat alone in its own ad set, so the ad-set row is the asset row and the tables below are labelled by asset.
No per-asset comparison here is regime-matched: bikini and lounge ran only in the split test, bodysuit plus one day alone, pool5 mostly alone at three times the budget.
Sections 3 and 5 compare the whole of B1 across the two windows, and the earlier one also ran the earner and the German buys. Scoped to this campaign, both sides are the same campaign and the mix drops out.
Hours both periods delivered in, on the UTC clock: 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23. Only the shared hours are compared. Each bucket pools that hour across the 6 days of the period, so the floor for reading one is 50 impressions a day, 300 across the period.
Counting which way each shared hour points, which needs no weighting and asks only for a direction:
| metric | hours 2026-08-10..2026-08-15 ran higher | hours it ran lower | sign test |
|---|---|---|---|
| CPM | 5 of 24 | 19 of 24 | p = 0.007 |
| CTR | 3 of 24 | 21 of 24 | p = 0.000 |
| click→install | 1 of 24 | 23 of 24 | p = 0.000 |
| CPI | 23 of 24 | 1 of 24 | p = 0.000 |
A sign test throws magnitude away and buys weight-free direction with it.
Dropping the other campaigns loosens CPM and leaves the other three alone. Click to install holds on every cut of these two windows.
Every shared hour, 2026-08-03..2026-08-08 → 2026-08-10..2026-08-15. 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 |
|---|---|---|---|---|---|
| 00 | 8,845 → 10,102 | 10.97 → 9.68 | 7.60% → 6.46% | 24.0% → 14.7% | 0.603 → 1.018 |
| 01 | 10,847 → 11,013 | 9.07 → 9.08 | 7.58% → 5.59% | 20.9% → 14.0% | 0.572 → 1.163 |
| 02 | 12,320 → 11,768 | 8.85 → 9.36 | 7.13% → 5.80% | 20.9% → 15.5% | 0.593 → 1.039 |
| 03 | 13,224 → 12,676 | 8.52 → 9.20 | 7.18% → 5.76% | 22.3% → 15.6% | 0.531 → 1.023 |
| 04 | 13,567 → 13,449 | 9.38 → 8.28 | 7.02% → 5.80% | 23.2% → 15.5% | 0.576 → 0.921 |
| 05 | 13,679 → 14,412 | 9.63 → 8.12 | 6.94% → 5.47% | 23.1% → 17.7% | 0.602 → 0.835 |
| 06 | 12,631 → 13,996 | 9.31 → 8.76 | 7.43% → 5.51% | 24.0% → 15.2% | 0.523 → 1.048 |
| 07 | 10,607 → 19,020 | 9.96 → 9.71 | 6.91% → 6.81% | 21.0% → 14.6% | 0.686 → 0.977 |
| 08 | 9,649 → 18,122 | 9.66 → 8.72 | 6.45% → 6.13% | 19.8% → 16.2% | 0.758 → 0.878 |
| 09 | 10,284 → 18,194 | 9.26 → 8.87 | 5.78% → 5.94% | 22.1% → 16.1% | 0.727 → 0.927 |
| 10 | 10,397 → 18,578 | 10.28 → 9.25 | 6.05% → 5.85% | 21.0% → 15.8% | 0.809 → 0.999 |
| 11 | 11,415 → 16,934 | 10.51 → 9.26 | 6.23% → 6.04% | 21.1% → 15.0% | 0.800 → 1.025 |
| 12 | 11,484 → 15,664 | 10.65 → 9.87 | 6.53% → 6.40% | 20.0% → 14.8% | 0.815 → 1.045 |
| 13 | 12,902 → 15,303 | 11.06 → 8.79 | 6.65% → 6.88% | 22.1% → 15.8% | 0.751 → 0.810 |
| 14 | 195,854 → 11,627 | 1.36 → 12.20 | 2.06% → 7.60% | 6.4% → 17.4% | 1.034 → 0.921 |
| 15 | 18,683 → 17,539 | 9.24 → 9.61 | 7.89% → 6.78% | 19.2% → 16.4% | 0.610 → 0.865 |
| 16 | 18,794 → 20,253 | 9.17 → 8.50 | 7.28% → 5.95% | 18.5% → 17.3% | 0.681 → 0.823 |
| 17 | 21,871 → 20,899 | 9.29 → 8.88 | 6.88% → 6.13% | 20.1% → 14.6% | 0.670 → 0.993 |
| 18 | 20,176 → 18,320 | 10.32 → 9.61 | 7.30% → 6.34% | 21.3% → 17.4% | 0.663 → 0.872 |
| 19 | 16,758 → 14,767 | 11.41 → 10.48 | 7.63% → 6.15% | 22.9% → 18.1% | 0.653 → 0.944 |
| 20 | 14,962 → 11,212 | 11.29 → 9.82 | 8.14% → 6.89% | 24.6% → 17.2% | 0.563 → 0.828 |
| 21 | 13,003 → 9,949 | 11.99 → 11.86 | 8.72% → 6.96% | 23.1% → 16.6% | 0.595 → 1.026 |
| 22 | 12,042 → 10,233 | 12.08 → 10.20 | 8.61% → 6.75% | 23.6% → 14.8% | 0.594 → 1.023 |
| 23 | 11,047 → 10,760 | 12.33 → 9.31 | 8.07% → 6.47% | 22.3% → 18.2% | 0.685 → 0.789 |
Pooled over the 24 hours both periods 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..2026-08-08 | $3,399.41 | 505,041 | 6.73 | 26,479 | 5.24% | 5,133 | 19.39% | $0.662 |
| 2026-08-10..2026-08-15 | $3,329.00 | 354,790 | 9.38 | 22,152 | 6.24% | 3,550 | 16.03% | $0.938 |
Pooling across hours weights each hour by what it delivered. The hourly pairing is the unweighted read of the same two periods; where they disagree, the mix moved.
The account's headline movement survives taking the campaign mix out: almost the same money in both windows, a third fewer installs.
The $6.73 here is the baseline the mix-neutral line uses, against $7.20 for the account earlier; the difference is the earner and the German buys.
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/pool5 | $1,768.24 | 222,832 | 7.94 | 14,290 | 6.41% | 2,077 | 14.53% | $0.851 |
E2/bodysuit | $860.67 | 73,465 | 11.72 | 4,073 | 5.54% | 842 | 20.67% | $1.022 |
E2/bikini | $355.37 | 27,041 | 13.14 | 1,736 | 6.42% | 333 | 19.18% | $1.067 |
E2/lounge | $344.72 | 31,452 | 10.96 | 2,053 | 6.53% | 292 | 14.22% | $1.181 |
E2/mugshot | $0.00 | 0 | — | 0 | — | 0 | — | — |
E2/spill | $0.00 | 0 | — | 0 | — | 0 | — | — |
E2/spill2 | $0.00 | 0 | — | 0 | — | 6 | — | $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, 90% covered on this period. Report clock UTC.
| asset | booked | bROAS (Meta) | within-day | wROAS | cohort@H | cROAS | payers | payer% | ARPU | ARPPU | largest payer |
|---|---|---|---|---|---|---|---|---|---|---|---|
E2/pool5 | $3,250.19 | 1.84 (2.20) | $1,623.70 | 0.92 | $1,959.20 | 1.11 | 135 | 6.0% | 0.720 | 12.03 | 5.6% |
E2/bodysuit | $1,834.61 | 2.13 (1.99) | $530.54 | 0.62 | $675.84 | 0.79 | 51 | 5.2% | 0.544 | 10.40 | 7.2% |
E2/bikini | $565.22 | 1.59 (1.42) | $149.44 | 0.42 | $158.93 | 0.45 | 9 | 2.3% | 0.384 | 16.60 | 45.8% |
E2/lounge | $929.30 | 2.70 (2.61) | $225.41 | 0.65 | $268.59 | 0.78 | 15 | 4.8% | 0.718 | 15.03 | 18.9% |
E2/mugshot | $5.74 | — (—) | $0.00 | — | $0.00 | — | 0 | 0.0% | 0.000 | — | — |
E2/spill | $0.00 | — (—) | $0.00 | — | $0.00 | — | 0 | 0.0% | 0.000 | — | — |
E2/spill2 | $631.99 | — (—) | $0.00 | — | $148.31 | — | 0 | 0.0% | 0.000 | — | — |
The 16-payer bar (#37): any row above whose payer count is under 16 is a direction and never a magnitude.
Two rows clear the 16-payer bar and two do not, so lounge's 0.65 and bikini's 0.42 are directions; pool5 and bodysuit bought under different budgets.
pool5's revenue is the least concentrated the series has produced; nearly half of bikini's is one payer.
The instrument disagreement is per asset as well as per country. The account-level gate of 1.09 is the sum of rows pulling both ways.
⚠ 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/pool5 | $1,811.79 | 23.3% | 13.9% | 62.8% | 13.4% |
E2/bodysuit | $840.05 | 31.6% | 13.1% | 55.3% | 28.6% |
E2/bikini | $324.57 | 28.1% | 14.0% | 57.8% | 7.3% |
E2/lounge | $313.48 | 19.0% | 10.0% | 71.0% | 33.6% |
Only pool5's American revenue share is close to its spend share. Of the two readable rows, the higher return leans on the United States least.
India took a third of bodysuit's buy and a fifth of lounge's, at 0.53 within-day for the account — a lower ceiling before creative.
A regime is a stretch over which the ad set's daily budget did not change. It matters because the budget is a geography dial on this account: raising it buys wider and cheaper countries, so two creatives measured across a budget change are compared on different audiences (DECISION_LOG.md #47).
Three of them here, and no comparison in this window is regime-matched: four arms at $150 each until 07:00 UTC on 08-11, bodysuit alone at $450 from 20:22 UTC on 08-11, pool5 alone at $450 from 21:18 UTC on 08-12.
Money-chart markers are hollow where the point sits under 16 payers, and assets under 20 installs on the day are dropped from the composite and the region charts. Delivery is plotted hourly because CTR, click-to-install, CPI and CPM are single-clock quantities on hundreds to thousands of impressions an hour. Money is plotted per day, because payers run 0 to 2 per asset per hour and an hourly ARPPU is one person's basket. There is deliberately no hourly revenue chart.
⚠⚠ This is six of seven days and both windows are six days long on purpose. 2026-08-16 had not closed when the data was cut, so the week is 08-10 to 08-15. The week before it ran 08-03 to 08-09, and the comparison uses its matched six days, 08-03 to 08-08. Levels are therefore comparable between the two columns of every table on this page. Set against a full seven-day week, every total here would read as a fall that is nothing but the missing day.
⚠ The cohort figure is 90% covered, so every cohort number on this page is a floor. Coverage runs 100% through hour bucket 10 and 76% to 85% after it, because the payment cut is 2026-08-16 10:59 UTC and the last day's later installs have not lived their 24 hours. The 0.97 on this page will rise. It cannot be set against the earlier window's frozen 1.30 as though the two were the same kind of number, and every window-over-window claim above rests on within-day, which is sealed at midnight.
⚠ The instrument gate reads 1.09 on the META clock, outside the documented 0.91 to 1.06 band. Our records booked $8,255.22 on B1's own days against Meta's $7,594.11. That reading is B1-scoped on both sides: measures.py selects Meta rows by Ad ID against the run config's map and the shared accounts' ads are not in it, so the gap is B1's own. The gate bounds any sentence that compares our number against Meta's, and the bracketed (Meta) columns are the only place on this page it applies. It does not touch within-day or cohort@24h, which never read Meta's revenue column at all. The UTC-clock run prints its own ratio beside the campaign aggregate and marks it as not a valid check, because Meta's conversion value sits on its conversion hour and cannot be restitched into a UTC day. The figure quoted here is the META-clock one.
⚠ The two accounts are on different clocks and neither offset is assumed. B1 is fixed at UTC-7, so its UTC day is stitched from two account days. The Nomad Node accounts run on UTC+0, so their reporting day is the UTC day and nothing is stitched; stitching them on B1's offset would move their spend seven hours. Both offsets were recovered from data by correlating each account's hourly impressions against our own registrations from its campaigns, which are true UTC, and the derivation lives in ad_ops/daily_report_format.md.
⚠ The comparison window contains 2026-08-03, and one hour of it owns two of the pooled rows. The rejected spill build put 181,927 impressions into hour bucket 14 of that window at CPM 0.52 and CTR 1.60% on $95.44 of spend (DECISION_LOG.md #50). That is most of what holds the earlier window's pooled CPM at 7.20 and its pooled CTR at 5.37%, and it is why those two comparisons invert when the same hours are matched one to one. Nothing about this window's buying is in either baseline.
⚠ The window spans two budget changes and a change of arms. Four arms at $150 through 08-11, one arm at $450 after it, with the arm itself swapped on 08-12. No per-asset comparison on this page is regime-matched, and nothing here can say whether the account-level CPI rise came from the auction or from the budget.
The shared accounts enter section 2 and no other table on this page. Their export carries no Ad ID, so every table from section 3 down scopes to the ad ids in the run config and that traffic is not among them. Their column preset is not ours to control, and the only join key their files offer is the ad set name, which is not a key this report will select on. Their column also covers five days against B1's six, which is a further reason the two rows are read on rates.
The country section and table C are B1's own account days, seven hours offset from every other table. They are read for mix, never for level.
The FX table is two weeks old. Revenue in 33 currencies is converted at rates pulled on 2026-08-02, and it prices every day in this window.
Whether the auction got dearer or the budget bought it. CPI rose from $0.673 to $0.938 across a window that changed shape twice, and both explanations fit. A week left untouched at one budget on one arm answers it at no extra cost, and the account has been in that state since 08-12.
Whether the shared buy's 1.52 survives its own cohort ageing. It leads B1 on both measures that cannot inherit, on five days of history and a payer count this cut does not carry. Two more weeks of it under the same per-account battery would say whether the cheap install keeps paying or whether the lead is the youth of the cohort read from the other side.
Whether the 1.09 gate is the FX table. With the payment join repaired, the FX table's age is the last named candidate in the instrument reconciliation and it has never been tested. Repricing this window at current rates is an afternoon and it closes the file.
The next weekly inherits one arm at one budget, two ad accounts buying from its first hour to its last, and a cohort that will be fully matured when it is cut. It can do what this one cannot, which is read the CPI level as a fact about the buy.
It also inherits a comparison window free of the spill hour on both sides, so its pooled CPM and CTR rows will agree with its hour-matched ones or disagree for a reason that is about buying.
Report clock UTC. B1's exports are stamped in its own account zone (UTC-7), so every B1 delivery row is restitched from two Meta days; the Nomad Node exports are stamped UTC+0 and are not restitched. The country tables and table C are not restitched and are labelled where they appear.
| run | _runs/2026-08-16_periods/ |
|---|---|
| the account split, section 2 | _runs/2026-08-16_receipt_series/portfolio_split.py, window rows in portfolio_periods.txt; the shared accounts' hourly exports under acct2/ |
| payment cut | 2026-08-16 10:59 UTC, which is 2026-08-16 03:59 on B1's own clock |
| Meta exports | day and country×day pulled as one range; hourly per day, all 24 buckets verified |
| registrations | adjust_sink push merged onto the Telegram-parsed ledger, carrying the account UUID the payment join needs |
| payments | in-app-purchase API, full history, joined on the numeric user id where present and on the account UUID where not |
| FX | _runs/2026-08-02_today_read/fx_rates.json |
| regimes | the budget changes are taken from the 08-11 and 08-12 dailies, which recorded them from the campaign's activity history on the day |
python -m ad_ops.measures --config _runs/2026-08-16_periods/run_config.json \
--period 2026-08-10..2026-08-15 --prev-period 2026-08-03..2026-08-08
python -m ad_ops.report_tables --config _runs/2026-08-16_periods/run_config.json \
--period 2026-08-10..2026-08-15 --prev-period 2026-08-03..2026-08-08 --campaign-table
python -m ad_ops.report_charts --config _runs/2026-08-16_periods/run_config.json \
--period 2026-08-10..2026-08-15 --out ad_ops/figures/week_2026-08-10 \
--md _runs/2026-08-16_periods/chartblock_week_2026-08-10.md --relpath figures/week_2026-08-10
The same three instruments the dailies run, over a window instead of a day, on both the UTC and the META configs. The META run is what the instrument gate is read from; the UTC run is everything else on this page.
The report clock is a UTC day, and this report is six of them. Adjust reports in UTC, so a UTC-bucketed report lines up with the attribution dashboard without anyone converting in their head. B1 is fixed at UTC-7, so a UTC day on that account is account day D−1 17:00 to 23:59 plus account day D 00:00 to 16:59. The Nomad Node accounts run on UTC+0 and are not restitched.
The hourly axis is hour of day pooled across the window. Six days of an hour land in one bucket, so a bucket must clear 300 impressions before it is compared, against 50 on a single day. Read those tables and charts for diurnal shape and never as a timeline.
Three things the clock does not reach, each labelled where it appears. Table C's per-asset country mix cannot follow it: the rake is per ACCOUNT, against that account's own hourly margin, and an asset has no hourly margin of its own. The instrument check is invalid off the account's clock, because Meta's conversion value sits on its conversion hour and cannot honestly be restitched. And the estimator runs on Meta's clock deliberately, because its subject is delivery windows and a budget change is an instant on the account's own clock.
The three revenue measures, never one, never mixed, always labelled:
| measure | counts | moves after the period closes? |
|---|---|---|
| booked | revenue that arrived inside the window, whatever day its payer installed | settles about four hours after midnight, then fixed. Meta's own number is this basis |
| within-day | installed on a day and paid before that day closed | never. Sealed at midnight |
| cohort at H | each day's installs, counted within H hours of each person's own install. House horizon H=24 | rises until every install has lived H hours, then frozen. Always state coverage |
A window whose spend is falling reads high on booked and low on the other two, purely because the buyers it inherited are still paying. Use within-day for window-over-window, because it is immutable and needs no horizon. Use cohort at a fixed horizon to compare hours to each other, because within-day censors by hour of day. Booked is what Meta will quote at you, so it is reported to explain the gap and never to rank.
Over a window, booked splits by how long each payer had been installed. The lag-0 row of that split is exactly the within-day total, which is the identity that makes the split worth drawing.
Two install counts exist and they are never crossed. Meta's Leads and our own registrations disagree by 5 to 10%. Meta's is used for the delivery funnel, so CPI and click→install have both numerator and denominator on one instrument. Ours is used for payer rate and every revenue measure, so the payers and the installs they came from are the same population.
A regime is a stretch over which the ad set's daily budget did not change. The budget is a geography dial on this account, so two creatives measured across a budget change were compared on different audiences. This window holds three regimes: four arms at $150 each, bodysuit alone at $450, and pool5 alone at $450.
The 16-payer bar (DECISION_LOG.md #37): below roughly 16 payers a revenue figure is a direction and not a magnitude. Revenue per install on this account is a near-zero vector with rare large entries, so separating two creatives by 20% needs of the order of fifteen thousand installs per arm, which no arm on this account has reached.