Daily campaign report — 2026-08-14, against 2026-08-13

Two Meta ad accounts bought this app on this day and both are ours: the portfolio spent $506.46 for 982 new users, 82% of it from B1 and 18% from the two shared accounts. B1 alone bought $413.96 and got 451 installs at $0.918, against $469.10 and 538 at $0.872 the day before; its booked revenue was $1,147.14, down 11.4%, and within-day fell 26.2% to $242.81 on a spend cut of 11.8%. Our records read 1.05 of Meta's booked value on B1's own clock, inside the documented 0.91 to 1.06 band, and one campaign carried its whole day; definitions, the report clock and the three revenue measures are in the appendix.

1Overview

2026-08-132026-08-14change
spend$469.10$413.96−11.8%
impressions51,30352,682+2.7%
CPM$9.14$7.86−14.1%
clicks3,3603,430+2.1%
CTR6.55%6.51%−0.6%
installs (Meta)538451−16.2%
click→install16.01%13.15%−17.9%
CPI$0.872$0.918+5.3%
registrations (ours)681587−13.8%
booked$1,294.09 (2.76)$1,147.14 (2.77)−11.4%
within-day$328.81 (0.70)$242.81 (0.59)−26.2%
cohort @ 24h$375.97 (0.80) at 100%$311.66 (0.75) at 100%−17.1%
within-day payers3728−9

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

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

appARPU (d0)ARPU (d3)ARPU (d7)ARPPU (d0)ARPPU (d3)ARPPU (d7)installs
Vloom$0.4975$0.8018$1.3550$10.55$14.06$22.89912

Account spend split. B1 82% and the shared accounts 18% on 08-14, against 89% and 11% on 08-13; the portfolio spent $506.46 against $527.31.

B1's campaign spend split: Worldwide 100% on both days. The German buy and the retired earner spent nothing, so no section carries a mix change.

Impressions got 14.1% cheaper and fewer of the clicks they bought became installs. The two did not cancel: the install cost 5.3% more.

The click rate did not move, 6.55% to 6.51%. Whatever changed sits below the click, where section 3's hourly read puts it too.

Within-day fell 26.2%, roughly twice the spend cut, on 28 payers against 37. Both cohorts are fully matured, so no horizon caveat applies.

B1's own account day moved the other way: the UTC day inherited a weak evening from Meta 08-13 and handed a strong one to 08-15.

2The two ad accounts, side by side

B1 buys under bailingxia_; the two shared Nomad Node accounts buy this app under 0811_ and 0814_*, their greenvid and pixvoo campaigns excluded.

Spend and impressions are Meta's, read off each account's own export. DNU is our own registration count for that account, so CPI in this table is spend ÷ DNU on our instrument for both accounts and is not the $0.918 of section 3, which has Meta on both sides of the ratio. The two install counts are never crossed.

accountspendshareimpressionsCPMDNUCPIpayerspayer%
B1 (ours)$413.9882%52,685$7.86628$0.6599815.6%
Nomad Node (shared)$92.4818%36,676$2.52354$0.261123.4%
Portfolio$506.46100%89,361$5.67982$0.51611011.2%

Payers here are everyone who paid inside the day whoever brought them, which is the booked basis, so they are not the within-day payer counts used elsewhere on this page. ARPU and ARPPU below sit on that same basis: booked ÷ DNU and booked ÷ payers.

accountbookedbROASwithin-daywROAScohort@24hcROASARPUARPPU
B1 (ours)$1,187.972.87$246.370.60$315.220.76$1.892$12.12
Nomad Node (shared)$190.262.06$100.131.08$150.661.63$0.537$15.85
Portfolio$1,378.232.72$346.510.68$465.880.92$1.403$12.53

Four columns are missing from the shared accounts' export: clicks, Meta's leads, country and Ad ID. Everything below section 2 is therefore B1 alone.

Rank the two accounts on within-day or cohort@24h and never on booked. Booked puts B1 ahead, 2.87 against 2.06; the sealed measures reverse it.

The shared side sat at 12 payers, under the 16-payer bar, so its 1.08 and 1.63 are a direction and never a magnitude.

The shared buy wins on what a user costs and loses on what one is worth: $0.261 a registration against $0.659, ARPU $0.537 against $1.892.

3Hourly, 2026-08-14 — B1 only

This section and every one below it is B1's buy alone.

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, counted over the ads mapped in the run config, which is why it totals 587 against the 628 in section 2; cov is that hour's cohort coverage at H=24.

hrspendimprCPMclicksCTRinstclk→iCPIourscovbookedbROASwithinwROASwPaycohortcROAS
0$11.871,2189.75655.34%57.7%$2.3746100%$35.893.02$7.990.672$7.990.67
1$10.971,4197.73694.86%57.2%$2.1947100%$80.767.36$0.000.000$0.000.00
2$11.511,6397.02996.04%1414.1%$0.82216100%$54.124.70$7.980.691$7.980.69
3$12.421,8226.82914.99%1213.2%$1.03514100%$0.000.00$0.000.000$0.000.00
4$11.822,1345.541145.34%1412.3%$0.84415100%$18.971.60$0.000.000$0.000.00
5$14.202,5375.601244.89%2116.9%$0.67634100%$176.8812.46$10.000.702$10.000.70
6$15.852,1197.481155.43%119.6%$1.44123100%$20.691.31$5.630.361$5.630.36
7$15.821,9748.011246.28%108.1%$1.58218100%$24.791.57$5.740.361$5.740.36
8$15.632,0137.761336.61%2115.8%$0.74426100%$49.583.17$44.482.852$44.482.85
9$16.342,0937.811326.31%1712.9%$0.96119100%$101.746.23$11.520.702$11.520.70
10$15.512,1527.211346.23%1813.4%$0.86226100%$3.290.21$22.961.481$39.712.56
11$14.482,1816.641426.51%1712.0%$0.85218100%$48.913.38$0.000.000$0.000.00
12$15.392,1747.081526.99%1610.5%$0.96223100%$17.961.17$0.000.000$0.000.00
13$19.272,5567.541897.39%2111.1%$0.91833100%$92.204.78$9.310.482$9.310.48
14$16.201,45311.151379.43%2719.7%$0.60033100%$88.005.43$21.391.321$21.391.32
15$19.232,5097.662058.17%2311.2%$0.83627100%$87.934.57$10.970.572$10.970.57
16$20.583,2536.332076.36%3315.9%$0.62434100%$34.241.66$6.320.311$15.700.76
17$21.212,8037.571836.53%2111.5%$1.01028100%$19.670.93$11.520.542$17.560.83
18$21.302,5938.211816.98%2011.0%$1.06531100%$10.750.50$0.000.000$5.760.27
19$32.212,65312.141726.48%2514.5%$1.28833100%$10.570.33$11.520.362$11.520.36
20$19.592,1679.041697.80%2313.6%$0.85228100%$48.922.50$27.291.392$33.221.70
21$20.182,1379.441316.13%2216.8%$0.91724100%$65.803.26$17.450.862$42.442.10
22$20.792,3598.811687.12%2213.1%$0.94535100%$22.421.08$0.000.000$0.000.00
23$21.592,7247.931947.12%3317.0%$0.65436100%$33.061.53$10.760.502$10.760.50
all$413.9652,6827.863,4306.51%45113.1%$0.918587100%$1,147.142.77$242.810.5928$311.660.75

⚠ Payer counts per hour run 0 to 9. An hourly ARPPU on one payer is that payer's basket and not a rate. Read the all row for level and the hours for shape.

The cohort column is complete across the whole clock. Every hour reads 100% coverage at H=24, and nothing in it can move again.

The day's first two hours are the worst the account has recorded: 00 and 01 are Meta 08-13 at 17:00 and 18:00, the previous evening.

Spend climbs across the second half while the install cost does not follow it. Hour 19 carries the day's peak spend and its dearest CPM.

2026-08-16T04:17:19.814501 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 3 6 9 12 15 18 21 hour (UTC) 0 5 10 15 20 25 30 USD Spend by hour 0 3 6 9 12 15 18 21 hour (UTC) 1250 1500 1750 2000 2250 2500 2750 3000 3250 impressions Impressions and installs by hour impressions installs 5 10 15 20 25 30 installs (Meta Leads) The day's motion — whole account, 2026-08-14 (UTC)
The day's motion: spend by hour, and impressions against installs
2026-08-16T04:17:19.946288 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 4 8 12 16 20 hour (UTC) 5 6 7 8 9 CTR % CTR 0 4 8 12 16 20 hour (UTC) 6 7 8 9 10 11 12 USD per 1,000 impressions CPM 0 4 8 12 16 20 hour (UTC) 8 10 12 14 16 18 20 installs / clicks % Click → install 0 4 8 12 16 20 hour (UTC) 0.75 1.00 1.25 1.50 1.75 2.00 2.25 USD Cost per install Delivery by hour — whole account, 2026-08-14 (UTC)
CTR, CPM, click-to-install and CPI by hour, whole account

Against the prior day, hour matched to hour

Hours both days delivered in, on the UTC clock: all 24. Only the shared hours are compared.

Counting which way each shared hour points, which needs no weighting and asks only for a direction:

metrichours 2026-08-14 ran higherhours it ran lowersign test
CPM7 of 2417 of 24p = 0.064
CTR8 of 2416 of 24p = 0.152
click→install3 of 2421 of 24p = 0.000
CPI13 of 2411 of 24p = 0.839

Only click→install survives the unweighted read, lower in 21 of 24 hours. CPM's 14.1% fall is partly mix; CPI's 5.3% rise is weighting alone.

The pooled 0.6% CTR fall and the unweighted 16 of 24 are the same non-finding read twice.

2026-08-16T04:17:20.094649 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 5 10 15 20 hour (UTC) 5 6 7 8 9 CTR % CTR 2026-08-13 2026-08-14 0 5 10 15 20 hour (UTC) 6 7 8 9 10 11 12 13 USD per 1,000 impressions CPM 0 5 10 15 20 hour (UTC) 8 10 12 14 16 18 20 22 installs / clicks % Click → install 0 5 10 15 20 hour (UTC) 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 USD Cost per install Delivery by hour — 2026-08-14 against 2026-08-13, shared hours only (UTC)
The same four ratios with the prior day laid over the day, shared hours only
The full hour-by-hour pairing, 2026-08-13 → 2026-08-14

Every shared hour, 2026-08-13 → 2026-08-14. All columns are Meta's instrument on both sides of each ratio. Revenue is deliberately absent: per-hour payer counts run 0 to 3, so an hourly revenue column would be one person's basket read as a rate.

hrimpressionsCPMCTRclick→installCPI
002,059 → 1,2187.67 → 9.757.24% → 5.34%20.1% → 7.7%0.527 → 2.374
012,060 → 1,4197.43 → 7.736.12% → 4.86%14.3% → 7.2%0.850 → 2.194
022,336 → 1,6398.06 → 7.025.27% → 6.04%15.4% → 14.1%0.991 → 0.822
032,545 → 1,8229.19 → 6.825.27% → 4.99%14.2% → 13.2%1.232 → 1.035
042,522 → 2,1346.96 → 5.546.07% → 5.34%13.1% → 12.3%0.878 → 0.844
052,601 → 2,5377.08 → 5.605.61% → 4.89%17.1% → 16.9%0.737 → 0.676
062,386 → 2,1197.17 → 7.485.78% → 5.43%13.0% → 9.6%0.951 → 1.441
072,369 → 1,9749.12 → 8.016.80% → 6.28%11.2% → 8.1%1.200 → 1.582
082,502 → 2,0137.73 → 7.766.71% → 6.61%16.7% → 15.8%0.690 → 0.744
092,182 → 2,0939.53 → 7.815.41% → 6.31%21.2% → 12.9%0.832 → 0.961
101,941 → 2,15210.31 → 7.216.75% → 6.23%19.8% → 13.4%0.770 → 0.862
112,287 → 2,1818.89 → 6.646.34% → 6.51%15.2% → 12.0%0.924 → 0.852
122,437 → 2,17412.56 → 7.086.52% → 6.99%17.6% → 10.5%1.093 → 0.962
132,055 → 2,55610.23 → 7.547.83% → 7.39%16.1% → 11.1%0.809 → 0.918
141,356 → 1,45313.37 → 11.159.44% → 9.43%17.2% → 19.7%0.824 → 0.600
151,868 → 2,50911.13 → 7.667.55% → 8.17%17.7% → 11.2%0.832 → 0.836
162,213 → 3,25310.55 → 6.336.60% → 6.36%19.2% → 15.9%0.834 → 0.624
172,693 → 2,8039.84 → 7.577.13% → 6.53%13.0% → 11.5%1.060 → 1.010
182,046 → 2,59310.48 → 8.217.82% → 6.98%22.5% → 11.0%0.596 → 1.065
191,408 → 2,65312.57 → 12.147.67% → 6.48%19.4% → 14.5%0.843 → 1.288
201,963 → 2,1676.77 → 9.046.98% → 7.80%11.7% → 13.6%0.830 → 0.852
211,963 → 2,13710.41 → 9.446.83% → 6.13%9.7% → 16.8%1.572 → 0.917
221,878 → 2,3598.39 → 8.816.71% → 7.12%13.5% → 13.1%0.927 → 0.945
231,633 → 2,7247.13 → 7.934.65% → 7.12%17.1% → 17.0%0.895 → 0.654

4Country, 2026-08-14

2026-08-23T12:43:21.272271 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ IN US MX ID PH GB AR TR CA MY AU FR 0 20 40 60 80 USD delivery raked onto the report clock against two measured margins; revenue is the report day Spend against within-day revenue by country — 2026-08-14 spend within-day revenue
Spend against within-day revenue, by country
2026-08-23T12:43:21.317625 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ −0.04 −0.02 0.00 0.02 0.04 USD per install Cost per install by country — 2026-08-14 (report clock)
Cost per install by country

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

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$93.9722.7%11,032$8.52211$0.445$94.541.0120
US$61.3814.8%1,957$31.3638$1.615$74.891.2223
MX$19.454.7%3,712$5.2455$0.354$0.000.000
ID$17.174.1%3,815$4.5098$0.175$9.980.586
PH$14.863.6%8,609$1.7369$0.215$5.630.382
GB$11.992.9%853$14.0619$0.631$6.040.503
AR$10.732.6%1,038$10.3420$0.537$0.000.002
TR$10.552.5%596$17.7027$0.391$30.712.913
CA$10.092.4%459$21.984$2.522$0.000.001
MY$9.242.2%2,129$4.3429$0.319$5.380.582
AU$7.741.9%307$25.216$1.290$0.000.002
FR$6.191.5%489$12.6710$0.619$0.000.001

176 further countries are not listed, $140.62 between them (34.0% 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) $88.64 from Meta 2026-08-13 and $325.34 from Meta 2026-08-14, a measured UTC-day total of $413.98.

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

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

B1

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$93.9722.7%11,032$8.52158$0.595$43.870.4717
US$61.3814.8%1,957$31.3634$1.805$64.911.0621
MX$19.454.7%3,712$5.2441$0.474$0.000.000
ID$17.174.1%3,815$4.5046$0.373$0.000.004
PH$14.863.6%8,609$1.7345$0.330$5.630.382
GB$11.992.9%853$14.0616$0.749$6.040.503
AR$10.732.6%1,038$10.3413$0.826$0.000.002
TR$10.552.5%596$17.7016$0.659$30.712.913
CA$10.092.4%459$21.984$2.522$0.000.001
MY$9.242.2%2,129$4.3418$0.513$0.000.001
AU$7.741.9%307$25.216$1.290$0.000.002
FR$6.191.5%489$12.678$0.774$0.000.001

173 further countries are not listed, $140.62 between them (34.0% of this block).

Nomad Node

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
AE$0.000.0%0—3$0.000$0.00—0
AR$0.000.0%0—7$0.000$0.00—0
BD$0.000.0%0—1$0.000$0.00—0
BR$0.000.0%0—32$0.000$0.00—0
CL$0.000.0%0—10$0.000$0.00—0
CO$0.000.0%0—12$0.000$0.00—0
CR$0.000.0%0—2$0.000$0.00—1
DE$0.000.0%0—1$0.000$0.00—0
EC$0.000.0%0—3$0.000$0.00—0
EG$0.000.0%0—9$0.000$0.00—0
ES$0.000.0%0—2$0.000$0.00—0
FR$0.000.0%0—2$0.000$0.00—0

43 further countries are not listed, $0.00 between them (0.0% of this block).

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-13, the same two tables.

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

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$127.6927.2%15,623$8.17265$0.482$133.271.0427
US$55.2311.8%1,480$37.3332$1.726$85.941.5617
ID$20.384.3%3,077$6.6274$0.275$14.970.736
MX$19.944.3%2,697$7.3954$0.369$14.820.7410
PH$17.463.7%7,441$2.3568$0.257$5.630.322
GB$13.592.9%600$22.6716$0.849$6.040.448
MY$12.032.6%1,880$6.3925$0.481$3.180.264
CA$11.272.4%442$25.498$1.409$11.100.994
TR$11.182.4%612$18.2923$0.486$5.890.532
AR$10.622.3%970$10.9522$0.483$9.980.943
AU$8.391.8%402$20.855$1.678$0.000.003
FR$6.821.5%326$20.925$1.365$0.000.001

173 further countries are not listed, $154.50 between them (32.9% 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) $126.41 from Meta 2026-08-12 and $342.69 from Meta 2026-08-13, a measured UTC-day total of $469.10.

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

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

B1

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
IN$127.6927.2%15,623$8.17217$0.588$91.920.7225
US$55.2311.8%1,480$37.3326$2.124$85.941.5617
ID$20.384.3%3,077$6.6241$0.497$9.980.495
MX$19.944.3%2,697$7.3930$0.665$14.820.748
PH$17.463.7%7,441$2.3557$0.306$5.630.322
GB$13.592.9%600$22.6712$1.132$6.040.448
MY$12.032.6%1,880$6.3920$0.601$3.180.264
CA$11.272.4%442$25.498$1.409$11.100.994
TR$11.182.4%612$18.2917$0.658$5.890.532
AR$10.622.3%970$10.9520$0.531$9.980.943
AU$8.391.8%402$20.853$2.796$0.000.003
FR$6.821.5%326$20.925$1.365$0.000.001

172 further countries are not listed, $154.50 between them (32.9% of this block).

Nomad Node

ccspendshareimpressionsCPMregistrations (ours)cost/regwithin-daywROASpayers
AE$0.000.0%0—1$0.000$0.00—0
AM$0.000.0%0—1$0.000$34.99—1
AR$0.000.0%0—2$0.000$0.00—0
AU$0.000.0%0—2$0.000$0.00—0
BE$0.000.0%0—1$0.000$0.00—0
BG$0.000.0%0—2$0.000$0.00—0
BN$0.000.0%0—1$0.000$0.00—0
BO$0.000.0%0—1$0.000$0.00—0
BR$0.000.0%0—24$0.000$0.00—0
CL$0.000.0%0—3$0.000$5.93—1
CO$0.000.0%0—7$0.000$0.00—0
CR$0.000.0%0—4$0.000$18.04—1

43 further countries are not listed, $0.00 between them (0.0% of this block).

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.

5Aggregate, both days — B1 only

Both days are B1's buy. Pooled over the 24 hours both days delivered in, on the UTC clock. Meta's instrument on both sides of every ratio.

spendimpressionsCPMclicksCTRinstallsclick→installCPI
2026-08-13$469.1051,3039.143,3606.55%53816.01%$0.872
2026-08-14$413.9652,6827.863,4306.51%45113.15%$0.918

Pooling across hours is a mix comparison. Section 3's pairing is the unweighted read; where the two disagree, the mix moved.

The three measures side by side

measure2026-08-132026-08-14moves after the day closes?
booked$1,294.09 (2.76)$1,147.14 (2.77)settled
within-day$328.81 (0.70)$242.81 (0.59)never
cohort @ 24h$375.97 (0.80) at 100%$311.66 (0.75) at 100%frozen, both days

Booked held its return while the two install-day measures fell: a shrinking buy inherits more of yesterday's payers, and booked counts them.

The mix-neutral account line: CPM $9.14 → $7.86, and $7.86 again on 08-13's mix. One campaign delivered on both days, so nothing needs neutralising.

Booked revenue by the day its payer installed

installed2026-08-132026-08-14
the day itself$328.81 (25.4%)$242.81 (21.2%)
one day earlier$207.00 (16.0%)$74.36 (6.5%)
two days earlier$170.61 (13.2%)$132.09 (11.5%)
three days earlier$229.17 (17.7%)$142.60 (12.4%)
four days earlier$15.72 (1.2%)$154.52 (13.5%)
five days earlier$50.14 (3.9%)$10.68 (0.9%)

The top row of this table is the within-day figure. They are the same number seen twice, which is why the gap between booked and within-day is exactly the inherited cohort and nothing else.

A fifth of the account's booked revenue came from people who arrived on 08-14, against a quarter before; the six rows cover 66.0% against 77.4%.

2026-08-16T04:17:20.326452 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ booked within-day cohort @ 24h 0 200 400 600 800 1000 1200 USD 2.76 0.70 0.80 2.77 0.59 0.75 the number above each bar is that measure's ROAS against the same day's spend The three revenue measures, 2026-08-13 against 2026-08-14 (UTC) 2026-08-13 2026-08-14
The three revenue measures on both days, ROAS above each bar
2026-08-16T04:17:20.372771 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 2026-08-13 2026-08-14 0 200 400 600 800 1000 1200 USD the bottom segment IS the within-day figure: the same number seen twice Booked revenue by the day its payer installed (UTC) the day itself one day earlier two days earlier three days earlier four or more
Booked revenue by the day its payer installed

6The campaigns, side by side — B1 only

Every campaign in this section is B1's; the shared accounts' two campaigns are in section 2 and nowhere below it. 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, while revenue still needs 16 payers (DECISION_LOG.md #37, #48).

campaignspendshareimpressionsimpr shareCPMclicksCTRcost/clickinstallsCPIwithin-daywROASpayers
Worldwide$413.96100.0%52,682100.0%7.863,4306.51%$0.121451$0.918$239.820.5827

Booking with no delivery, and excluded from every rate above: German (DE/AT) 0 installs (Meta), 2 registrations (ours), $0.00 within-day; Earner (retired 08-03) 0 installs (Meta), 64 registrations (ours), $0.00 within-day. Counting them would put installs into the CPI denominator against spend that never happened.

The retired earner still produces 64 registrations a day on no spend, thirteen days after it was switched off, down from 71 and earning nothing.

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.

7Inside the worldwide campaign — B1 only

B1's only delivering campaign on the day, walked down to the ad.

Structure on this day

One ad delivered, alone in its own ad set, for all 24 hours. The ad-set row is therefore the ad row on this day, and the tables below are labelled by asset. That identity is a property of this day's cut alone, and it has to be re-checked on any day two ads deliver together.

Eleven further ads sit in the account's mapped set and none of them delivered. Three carry registrations with no spend, which is the same conversion-hour effect the appendix describes, one level down.

A. Per asset — delivery

Meta's instrument on both sides of every ratio. Our registrations never enter this table.

assetspendimpressionsCPMclicksCTRinstallsclick→installCPI
E2/pool5$413.9652,6827.863,4306.51%44613.00%$0.928
E2/bodysuit · E2/spill2$0.000—0—2 each—$0.000
E2/lounge$0.000—0—1—$0.000
E2/bikini · E2/mugshot · E2/spill · earner/bodysuit · earner/bikini · earner/pool5 · DE/turkish_mature · DE/german_6s$0.000—0—0——

B. Per asset — the three revenue measures

Ours on every column. Meta can express only booked, so it rides bracketed beside that column and never as a row. Payers are distinct people, never transactions. Cohort horizon H=24h, 100% covered on this day. Report clock UTC.

assetbookedbROAS (Meta)within-daywROAScohort@HcROASpayers (d0)payer% (d0)ARPU (d0)ARPPU (d0)largest payer
E2/pool5$451.871.09 (1.77)$233.840.56$302.690.73296.0%0.63110.4415.0%
E2/spill2$193.78—$0.00—$0.00—00.0%0.000——
E2/bodysuit$199.86—$5.97—$5.97—14.8%0.2845.97100.0%
E2/lounge$116.93—$0.00—$0.00—00.0%0.000——
earner/bodysuit$118.04—$2.99—$2.99—12.3%0.0702.99100.0%
E2/bikini$52.08—$0.00—$0.00—00.0%0.000——
earner/bikini$12.99—$0.00—$0.00—00.0%0.000——
earner/pool5 · E2/mugshot · E2/spill · DE/turkish_mature · DE/german_6s$0.00—$0.00—$0.00—00.0%0.000——

The 16-payer bar (#37): any row above whose payer count is under 16 is a direction and never a magnitude. pool5 clears it with 25, against 37 the day before. Nothing else on this page does.

What each payer spent fell; their number barely moved. ARPPU is 9.35 against 12.60, the payer rate 6.6% to 6.0%.

C. Per asset — country mix

⚠ This table is cut on the META day, a seven-hour-offset window against tables A and B. Read it for mix, never for level against them.

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

assetspendIndia %US %other %US % of its revenue
E2/pool5$468.5921.7%15.3%63.0%25.2%

pool5 bought less India and more United States than on any prior full day, 21.7% against 26.0%, and earned less.

Its American revenue share is 25.2% against 28.2%: whatever moved sits inside the countries, with India and the United States each giving back about half.

2026-08-16T04:17:20.650259 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/pool5 0 20 40 60 80 100 % of that asset's spend Where each asset bought — share of its own spend by region, 2026-08-14 (META day) IN US MX PH ID AR other
Where each asset bought: share of its own spend by region
2026-08-16T04:17:20.687865 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/pool5 0.0 0.5 1.0 1.5 2.0 2.5 USD per install Cost per install by region — every asset, 2026-08-14 (META day) IN US MX PH ID AR
Cost per install by region, every asset
2026-08-16T04:17:20.721147 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ E2/pool5 0 10 20 30 40 50 60 USD Within-day revenue by region — every asset, 2026-08-14 (META day) IN US PH
Within-day revenue by region, every asset

The regime read — the cost advantage over its whole regime

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

The campaign's activity history was re-read for 08-12 to 08-16 before this report was written, and the page rendered its range as Aug 12 to Aug 15. It holds three rows, all of them stamped Aug 12 at 2:17 and 2:18 PM account time: the budget going $150 to $450 on the pool5 ad set, that ad set going Inactive to Active, and the bodysuit ad set going Active to Inactive. Nothing was recorded on 08-13, 08-14 or 08-15, so E2-R10 ran the whole of this report's day untouched and is now in its third day.

Cells matured to H=6h, read on the account's own clock, which is where the estimator works. Both regimes are now read over their full span.

adregime$/daymatured installsspendCPMCTRIndia %CPIRPIROAS
bodysuitE2-R9$450545$529.3011.735.45%37%$0.9710.7270.75
pool5E2-R10$4501,349$1,066.808.286.58%25%$0.7910.6070.77

pool5 wins on cost for the seventh consecutive read, and the two margins moved differently: impressions 29.4% cheaper against 25.5% yesterday, installs 18.5% against 17.8%.

On revenue the two arms are level, and level is not a verdict either. What remains is a cost separation with no revenue separation.

Revenue per install has a coefficient of variation of 6.73, so separating the arms by 20% needs 17,775 installs each; the larger is at 8%.

The arms are unmatched on sample, E2-R10 having run more than twice as long, and that matters only for revenue — already barred.

The day across the run

2026-08-16T04:17:20.793753 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-11 08-12 08-13 08-14 day (UTC) 0 2 4 6 8 10 payers / installs % Payer rate by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini E2/lounge earner/bodysuit earner/bikini
Payer rate by day, one line per asset
2026-08-16T04:17:20.866959 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-11 08-12 08-13 08-14 day (UTC) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 within-day USD per install ARPU by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini E2/lounge earner/bodysuit earner/bikini
ARPU by day, one line per asset
2026-08-16T04:17:20.913820 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-11 08-12 08-13 08-14 day (UTC) 0 5 10 15 20 within-day USD per payer ARPPU by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini E2/lounge earner/bodysuit
ARPPU by day, one line per asset
2026-08-16T04:17:20.958812 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 08-11 08-12 08-13 08-14 day (UTC) 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 revenue / spend Within-day ROAS by day — every asset (UTC) E2/pool5 E2/bodysuit E2/bikini E2/lounge
Within-day ROAS by day, one line per asset
2026-08-16T04:17:21.009160 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ CTR click→install CPI payer rate * ARPU * wROAS * 0.0 0.2 0.4 0.6 0.8 1.0 normalised across the day (1.0 = best of the pack) * axis sits under the 16-payer bar on most days: direction only, never a level. Assets under 20 installs on the day are not plotted. Composite — every asset across every measure, 2026-08-14 E2/pool5
Composite: every asset across every measure, normalised across the day

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. On this day that leaves one line.

2026-08-16T04:17:20.415821 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 5 6 7 8 9 CTR % CTR by hour — every asset, 2026-08-14 (UTC) E2/pool5
CTR by hour, one line per asset
2026-08-16T04:17:20.521273 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 6 8 10 12 14 16 18 20 installs / clicks % Click → install by hour — every asset, 2026-08-14 (UTC) E2/pool5
Click-to-install by hour, one line per asset
2026-08-16T04:17:20.567971 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 0.5 1.0 1.5 2.0 2.5 USD Cost per install by hour — every asset, 2026-08-14 (UTC) E2/pool5
Cost per install by hour, one line per asset
2026-08-16T04:17:20.459442 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0 2 4 6 8 10 12 14 16 18 20 22 hour (UTC) 6 7 8 9 10 11 12 USD per 1,000 impressions CPM by hour — every asset, 2026-08-14 (UTC) E2/pool5
CPM by hour, one line per asset

8Caveats

⚠⚠ The instrument discarded a fifth of this day's payments, and this page was republished once that was fixed. measures.py builds its payment list by looking each payment's user up in the registration ledger and skipping what does not resolve, so an unattributable payment is absent from all three measures. Earlier reports in this series stated that such payments were still in booked. They were not, and on those days it made no difference because the share was two or three percent.

It was not two or three percent here. The Telegram export carried the payer on essentially every row and stopped at 14:50 UTC on 08-13; from there the payment API is the whole record, and it leaves the payer field empty on about a quarter of its rows. What it does populate on every row is an account UUID, and the registration feed has been sending that same UUID alongside the numeric user id since the push began. Nothing on our side was keeping it. Joining the two recovers the payments.

The share of each account day's payments that resolves to a payer, before the repair and after it:

META daypaymentsresolved beforeresolved afterours ÷ Meta booked, after
2026-08-1220298.0%98.0%—
2026-08-1320890.9%93.8%0.99
2026-08-1419770.1%90.4%1.05
2026-08-15234—93.6%1.01

The gate was reading the join rate. This day published at 0.86, outside the 0.91 to 1.06 band and the widest breach the series had recorded; on the repaired record it is 1.05 and inside. Nothing about the account or about Meta's number changed. What is still unrecoverable is payments from people who registered before the push began on 2026-08-13 18:52 UTC, because no feed we hold carries their UUID. That residue is 69 payments across the whole history and it shrinks to irrelevance as the push accumulates.

What moved on this page. Booked went $1,069.12 to $1,147.14, within-day $164.79 to $242.81 and its return 0.40 to 0.59, the cohort $227.60 to $311.66, the day's payer count 16 to 28, and pool5's payer rate 4.0% to 6.0%. The comparison day moved too, by less: 08-13's within-day is $328.81 against the $314.52 its own page carried. Every delivery figure is unchanged, because delivery is Meta's instrument on both sides of every ratio and never touched this.

pool5's payer rate on the repaired record runs 6.6%, 6.0% and 6.0% across 08-13, 08-14 and 08-15. The first version of this page put 08-14 at 4.0% and read the day as a collapse in people paying at all; that number was the instrument.

⚠ The 08-13 figures on this page differ from the 08-13 report as published, for two reasons. The delivery difference is one re-pull of a settled day: that page carried $468.95, 51,292 impressions, 3,357 clicks and click→install 16.03%, against $469.10, 51,303, 3,360 and 16.01% here, which is what a settled Meta day moves by on a second export. The revenue difference is the repair above, and it is larger: within-day $328.81 against the $314.52 that page published. A measure described as sealed moved, and it moved because the instrument could suddenly see payments it had been throwing away.

The country section and table C are the account's own day, seven hours offset from every other table. They are read for mix, never for level. This matters more than usual on this day, because the account day and the UTC day moved in opposite directions: $431.33 and 471 leads on account day 08-13 against $468.59 and 531 on account day 08-14.

The FX table is thirteen days old. Revenue in 33 currencies is converted at rates pulled on 2026-08-02, and it prices days through 08-14. It is the other open candidate in the instrument reconciliation, and it is now the one that has not been given a mechanism.

The shared accounts' export runs a different column preset and we do not control it. The only join key its files offer is the ad set name, which this report refuses to select on, so the shared side carries no CTR or click→install row anywhere on this page.

The two accounts run on different clocks, and section 2 only works because each is stitched on its own. B1 is fixed at UTC-7, so its UTC day is built from two Meta days. The two shared accounts run on UTC+0, so their reporting day already is the UTC day and no stitch applies; giving them B1's offset would move their spend seven hours. Both offsets were derived from data, by correlating each account's hourly impressions against our own registrations from its campaigns, which are true UTC: the method recovers the known seven-hour offset on B1 at r = 0.878 and returns zero on the shared accounts at r = 0.744.

Rank the two accounts on within-day or cohort@24h and never on booked. Booked counts everyone who paid inside the day whatever day they installed, so it credits B1 with three weeks of accumulated cohort and the shared buy, open only since 08-11, with almost none. Section 2's booked column is reported to explain that gap and is not a ranking. The shared side also sat at 12 payers on this day, under the 16-payer bar, so its returns are a direction and never a magnitude.

The shared accounts grew on the day B1 weakened, and opened two more campaigns. Traffic under ad ids ending 334 produced 354 registrations on 08-14 against 278 on 08-13, and two new campaigns appear alongside 0811_vl_bailingxia_srfhjyd-rain-chuva: a 0814_vl_ twin of it and a 0814_vl_bailingxia_srfhjyd_maimai. No figure from section 3 down is affected, because every table there scopes to the ad ids in the run config. Whether the two buys contest the same auctions, and what that costs, is the standalone report of 2026-08-14; this day is consistent with that reading and does not test it.

A further ad account of ours has not delivered in this window. The KBM1 campaign published on 08-15 produced no registrations on 08-14 and sits in a different ad account, so it enters none of Meta's exports here. It will appear in the registration ledger as unmapped traffic once it spends.

37% of registrations never enter a revenue measure and that is true of every day in this series. Every "ours" figure from section 3 down means registrations attributable to a mapped Meta ad. It is internally consistent, because the payer rate divides our payers by that same population.

One draft sits unpublished on the account. The manage view reads Review and publish (1). Nothing on this page depends on it and it was not touched.

This report was written about four hours before the scheduled staging window. Running at 18:10 PT would have put the day's cohort at 100% coverage instead of 86%. Nothing else on the page would move, because within-day is sealed and every delivery figure comes from a closed Meta day.

9What would settle the open questions

The 69 payments that still resolve to nobody. They belong to people who registered before the push began, so no feed we hold carries their UUID and no query will recover them. They are a fixed historical residue, and they sit almost entirely in days before 08-13. The open question is whether the payment API can populate the user field directly, which would remove the join from the path altogether.

Whether the instrument gate has anything left in it. On the repaired record the four account days read 0.99, 1.05 and 1.01 against a 0.91 to 1.06 band, so the drift that four earlier reports described was the join rate throughout. The FX table's age remains a named candidate and has never been tested; repricing one settled day at current rates would settle it in an afternoon, and there is now no larger effect sitting on top of it.

Nothing about pool5 against bodysuit on revenue, at this account's volume. The requirement is 17,775 installs an arm and the larger arm is at 1,349. Running longer at $450 does not close that, and on the repaired record the two arms are level on return anyway.

This page was republished on 2026-08-16 after a defect in the payment instrument was found and fixed, and every revenue figure on it moved. The measure discards any payment it cannot tie to a person, and a fifth of this day's payments were arriving identified only by an account UUID that nothing on our side was keeping. The registration feed had been carrying that UUID all along. With the two joined, this day's within-day revenue goes $164.79 to $242.81 and its return 0.40 to 0.59, the payer count 16 to 28, and the instrument gate 0.86 to 1.05. The delivery half of the report never moved, because it is Meta's instrument on both sides of every ratio. Caveats has the measurement and what is still unrecoverable.

10What this hands to the next read

The 08-15 report inherits the strong account evening this day handed forward: Meta day 08-14 spent $468.59 and booked 531 leads, and its last seven hours land inside UTC 08-15. It also inherits a repaired payment instrument and is the first day measured on it from the start.

E2-R10 goes into its third full day with a cost advantage that has widened on seven consecutive reads and a return that is now level with the arm it replaced. The useful thing to watch is click→install, which fell 17.9% on this day at p = 0.001 and is the one movement that survived both the pooled and the unweighted read.

11Reproduce

Report clock UTC; B1's Meta exports are stamped in that account's zone (UTC-7), so every delivery row from section 3 down is restitched from two Meta days. The country tables and table C are not restitched and are labelled where they appear.

run_runs/2026-08-16_2026-08-14_daily_auto/ (republished; first cut _runs/2026-08-15_2026-08-14_daily_auto/)
payment cut2026-08-16 11:17 UTC, on the repaired join
Meta exportsday and country×day 2026-07-01_2026-08-16 pulled 2026-08-15 21:10 UTC; hourly per day, all 24 buckets verified
registrationsadjust_sink push, pulled 2026-08-13T18:52Z onward, merged onto the Telegram-parsed ledger of 2026-08-14. Carries the account UUID, which is what the payment join needs
paymentsin-app-purchase API, full history, joined onto the export base
FX_runs/2026-08-02_today_read/fx_rates.json
regimescampaign activity history re-read for 2026-08-12_2026-08-16; rendered range Aug 12 to Aug 15; newest row Aug 12 at 2:18 PM account time
python -m ad_ops.daily_pipeline --day 2026-08-14
python -m ad_ops.asset_estimator hourly \
    --meta _runs/2026-08-12_0811_daily/exports/ads_hourly_aug11_settled.csv \
           _runs/2026-08-14_2026-08-13_daily_auto/exports/ads_hourly_2026-08-12.csv \
           _runs/2026-08-14_2026-08-13_daily_auto/exports/ads_hourly_2026-08-13.csv \
           _runs/2026-08-15_2026-08-14_daily_auto/exports/ads_hourly_2026-08-14.csv \
    --lum _runs/2026-08-15_2026-08-14_daily_auto/lum --fx _runs/2026-08-02_today_read/fx_rates.json \
    --ads "ww_bikini_10s,ww_bodysuit_10s,ww_pool5,ww_mugshot,ww_spill,ww_lounge" \
    --campaign bailingxia_meituan_ww_cvr_260802 --horizon 6

The pipeline runs measures, day_compare, cohort_arpu, asset_estimator, report_tables and report_charts in the fixed order, on both the UTC and the META configs it writes, and it now chains the payment and registration ledgers forward from the previous run. It stages two hourly exports; the estimator is re-run above across four, so that E2-R9 and E2-R10 are each measured over their whole span.

day_compare's own output is not quoted on this page. It reads installs from our own registration ledger, and its window reaches seven hours past the report day, so it answers a different question on a different clock from section 5's pooled funnel.

12Appendix — definitions

The report clock is a UTC day. Adjust reports in UTC, so a UTC-bucketed report lines up with the attribution dashboard without anyone converting in their head. B1's ad account is fixed at UTC-7, so a UTC day is Meta day D−1 17:00 to 23:59 plus Meta day D 00:00 to 16:59. The two clocks are not close: on a measured day the same figures differed by 14.6% on spend and 40.7% on within-day revenue, and on this day they differ in direction.

Three things the clock does not reach, and each is 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:

measurecountsmoves after the day closes?
bookedrevenue that arrived inside the day, whatever day its payer installedsettles about four hours after midnight, then fixed. Meta's own number is this basis
within-dayinstalled that day and paid before that day closednever. Sealed at midnight
cohort at Hthat day's installs, counted within H hours of each person's own install. House horizon H=24rises until every install has lived H hours, then frozen. Always state coverage

A day whose spend is falling reads high on booked and low on the other two, purely because yesterday's buyers are still paying. Use within-day for day-over-day, 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.

All three are read on our own payment records, and all three count only payments the record can tie to a person who installed through one of our mapped ads. Meta can express only booked, so it appears bracketed beside that column and never as a row of its own.

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 day held one throughout: E2-R10, pool5 alone at $450, open since 2026-08-12 14:18 account time.

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, with a coefficient of variation near 6.7, so separating two creatives by 20% needs about 17,775 installs per arm. The largest regime-matched arm this account has produced is 1,349.

Internal — noindex. Not for distribution outside the team.