Every forecast INTARC makes is written down the day it is made and scored when the truth arrives.
About two weeks after each week of ad spend, INTARC makes a call on whether that spend will pay back, on revenue before store fees. On its own studio, every call and every revenue forecast behind it is written here before its outcome exists.
Aggregate only: no app, workspace or amount is shown. Figures as of 31 Oct 2026, 23:42 UTC.
Live record
546 forecasts on 126 distinct cohorts in 18 apps, made since 30 Oct 2026 by the frozen model; 0 scored, 546 waiting.
Of these: 38 30-day revenue forecasts, the first scored after 29 Nov 2026; 38 30-day profit forecasts, the first scored after 29 Nov 2026; 470 cohort revenue forecasts, the first scored after 3 Nov 2026.
The live record is INTARC's own studio. A studio outside it is never shown here; one that opts in appears only as a replay, under Studios the model never saw.
988 forecasts made 26 Oct to 29 Oct by an earlier model, not counted.
Nothing is scored yet: the first scores land after 3 Nov 2026, when the earliest truths arrive.
Studios the model never saw
Studios outside INTARC's own appear here only if they opt in, and only once at least twenty of their apps are in, as the privacy policy promises. Until then each studio sees its own replay on its Accuracy page.
Replay of the frozen model, not logged in advance
Git tag model-2026-10-30a, commit d2be28f, model fingerprint 0f79d1e8165d8abfe1b5de2baea0323cd2ce57b602afdaabd77f0c021c1dd92b, replay run y2-replay of the frozen commit's page, built page sha256 f7a268815e4e1fce; the served page carries its six model blocks byte for byte. Run over 27 Oct 2024 to 18 Oct 2026 at weekly cut-offs with only the data each day had, then scored on what followed: 18 apps forecast, 4 with scored revenue, 2 with 10+ scored weeks; 7,419 forecasts on 215 distinct cohorts at 104 cut-offs, 6,573 scored.
A replay cannot prove it was made in advance. The live record above is the test: forecasts written down before their truths exist.
Cohort revenue, forecast in the cohort's first week (age 0 to 6 days)
What a week's new customers pay by day 7, 30, 90, 180 and 365, against what they then paid. Beside INTARC's forecast: the payback ladder alone, and a trailing baseline, scored on the same rows.
| By day | Scored | Dollar-weighted error | Median error | Bias | Within 50% | In range | Model aloneerror · bias | Trailing baselineerror · bias |
|---|---|---|---|---|---|---|---|---|
| 7 | 207194 cohorts · 4 apps · 104 cut-offs | 11% | 17% | 0.96 | 85% | 91%width 1.96x | 27% · 0.94 | 28% · 0.91on 190 of 194 rows |
| 30 | 201189 cohorts · 3 apps · 101 cut-offs · 6 waiting | 16% | 26% | 0.97 | 74% | 93%width 2.80x | 28% · 0.96 | 30% · 0.91on 186 of 189 rows |
| 90 | 183174 cohorts · 3 apps · 92 cut-offs · 24 waiting | 19% | 31% | 0.99 | 63% | 93%width 3.38x | 31% · 1.00 | 34% · 0.90on 171 of 174 rows |
| 180 | 157151 cohorts · 3 apps · 79 cut-offs · 50 waiting | 26% | 40% | 1.04 | 59% | 92%width 4.06x | 36% · 1.02 | 35% · 0.88on 149 of 151 rows |
| 365 | 103101 cohorts · 2 apps · 52 cut-offs · 104 waiting | 30% | 45% | 1.12 | 57% | 93%width 4.85x | 29% · 1.02 | 31% · 0.92 |
Cohort revenue at later ages
| Age | By day | Scored | Dollar-weighted error | Median error | Bias | Within 50% | In range |
|---|---|---|---|---|---|---|---|
| 7 to 13 days | 30 | 203191 cohorts · 3 apps · 102 cut-offs · 5 waiting | 9% | 15% | 1.02 | 88% | 94%width 1.86x |
| 7 to 13 days | 90 | 185176 cohorts · 3 apps · 93 cut-offs · 23 waiting | 13% | 22% | 1.03 | 75% | 91%width 2.39x |
| 7 to 13 days | 180 | 159153 cohorts · 3 apps · 80 cut-offs · 49 waiting | 20% | 26% | 1.06 | 63% | 91%width 3.00x |
| 7 to 13 days | 365 | 105103 cohorts · 2 apps · 53 cut-offs · 103 waiting | 33% | 41% | 1.15 | 58% | 92%width 3.87x |
| 14 to 27 days | 30 | 205193 cohorts · 3 apps · 103 cut-offs · 2 waiting | 9% | 15% | 1.03 | 93% | 76%width 1.38x |
| 14 to 27 days | 90 | 187178 cohorts · 3 apps · 94 cut-offs · 20 waiting | 15% | 27% | 1.06 | 76% | 83%width 1.87x |
| 14 to 27 days | 180 | 161155 cohorts · 3 apps · 81 cut-offs · 46 waiting | 22% | 32% | 1.09 | 66% | 84%width 2.50x |
| 14 to 27 days | 365 | 107105 cohorts · 2 apps · 54 cut-offs · 100 waiting | 29% | 33% | 1.10 | 63% | 86%width 3.52x |
| 28+ days | 90 | 191182 cohorts · 3 apps · 96 cut-offs · 17 waiting | 14% | 23% | 1.06 | 77% | 81%width 1.82x |
| 28+ days | 180 | 165159 cohorts · 3 apps · 83 cut-offs · 43 waiting | 21% | 34% | 1.09 | 68% | 82%width 2.46x |
| 28+ days | 365 | 111109 cohorts · 2 apps · 56 cut-offs · 97 waiting | 24% | 35% | 1.05 | 61% | 85%width 3.49x |
Cohorts with 10 or more paying customers, and thin ones (age 0)
| By day | Paying customers | Scored | Dollar-weighted error | Median error | Bias | Within 50% | In range |
|---|---|---|---|---|---|---|---|
| 7 | 10 or more | 7070 cohorts · 2 apps · 64 cut-offs | 8% | 8% | 0.96 | 100% | 87%width 1.34x |
| 7 | thin, under 10 | 137124 cohorts · 4 apps · 91 cut-offs | 32% | 23% | 1.00 | 77% | 93%width 2.46x |
| 30 | 10 or more | 6868 cohorts · 2 apps · 62 cut-offs · 2 waiting | 12% | 13% | 0.97 | 96% | 90%width 1.64x |
| 30 | thin, under 10 | 133121 cohorts · 3 apps · 89 cut-offs · 4 waiting | 42% | 40% | 1.02 | 62% | 94%width 3.18x |
| 90 | 10 or more | 6262 cohorts · 2 apps · 56 cut-offs · 8 waiting | 13% | 14% | 0.97 | 92% | 95%width 2.33x |
| 90 | thin, under 10 | 121112 cohorts · 3 apps · 82 cut-offs · 16 waiting | 53% | 54% | 1.10 | 47% | 91%width 3.97x |
| 180 | 10 or more | 5353 cohorts · 2 apps · 47 cut-offs · 17 waiting | 18% | 18% | 1.00 | 85% | 98%width 3.43x |
| 180 | thin, under 10 | 10498 cohorts · 3 apps · 70 cut-offs · 33 waiting | 61% | 62% | 1.19 | 45% | 89%width 4.56x |
| 365 | 10 or more | 4343 cohorts · 2 apps · 37 cut-offs · 27 waiting | 23% | 21% | 1.13 | 79% | 98%width 4.85x |
| 365 | thin, under 10 | 6058 cohorts · 2 apps · 44 cut-offs · 77 waiting | 63% | 68% | 1.04 | 41% | 90%width 4.99x |
The next 30 days
Rows whose forecast and actual are both under 10 in the workspace's currency are left out of every column and counted under the floor.
| Next 30 days | Scored | Under the floor | Dollar-weighted error | Median error | Bias | Within 50% | In range | Sign right |
|---|---|---|---|---|---|---|---|---|
| Net profit, per app | 2925 cohorts · 5 apps · 101 cut-offs · 54 waiting | 1,526 | 53% | 47% | 1.06 | 52% | 44%width 1.31x | 85% |
| Net profit, per workspace | 1011 cohort · 1 app · 96 cut-offs · 3 waiting | 0 | 41% | 32% | 1.09 | 73% | 60%width 1.30x | 95% |
| Revenue, per app | 2906 cohorts · 6 apps · 101 cut-offs · 54 waiting | 1,528 | 41% | 43% | 1.01 | 55% | – | – |
| Revenue, per workspace | 1011 cohort · 1 app · 101 cut-offs · 3 waiting | 0 | 36% | 27% | 1.02 | 77% | – | – |
Calls on spend weeks
Two weeks after a week with spend closes, INTARC says how it is doing. Each call is scored on what that week's customers returned per unit of spend by day 90 and by a year; groups under 5 weeks print too few.
INTARC's paid share is the model's own split of a week's payers between the ads and organic, so it changed with the model: the model frozen on 29 Oct 2026 splits each day's payers by the ads' share, estimated from spend, network reports and countries reached; the models before it counted the payers above the organic floor. All customers needs no split, so it comes first.
| All customers, a ceiling | On INTARC's paid share | |||||||
|---|---|---|---|---|---|---|---|---|
| INTARC said | By day | Weeks | Median | Spend-weighted | At or above 1.0x | Median | Spend-weighted | At or above 1.0x |
| ahead | 90 | 254 episodes · 1 app | 1.83x | 1.74x | 100% | 1.67x | 1.57x | 96% |
| on track | 90 | 53 episodes · 1 app | 2.27x | 1.42x | 100% | 1.46x | 1.18x | 60% |
| behind | 90 | 62 episodes · 1 app | 2.92x | 2.27x | 100% | 2.09x | 1.57x | 100% |
| won't pay back | 90 | 269 episodes · 4 apps · 8 waiting | 0.83x | 1.00x | 42% | 0.36x | 0.55x | 0% |
| ahead | 365 | 182 episodes · 1 app · 7 waiting | 1.92x | 1.99x | 100% | 1.71x | 1.80x | 100% |
| on track | 365 | 22 episodes · 1 app · 3 waiting | too few (2) | too few (2) | ||||
| behind | 365 | 51 episode · 1 app · 1 waiting | 3.87x | 3.98x | 100% | 2.68x | 3.15x | 100% |
| won't pay back | 365 | 153 episodes · 2 apps · 19 waiting | 1.02x | 1.09x | 53% | 0.58x | 0.84x | 20% |
Weeks where INTARC said to check the data, shown apart
| All customers, a ceiling | On INTARC's paid share | |||||||
|---|---|---|---|---|---|---|---|---|
| INTARC said | By day | Weeks | Median | Spend-weighted | At or above 1.0x | Median | Spend-weighted | At or above 1.0x |
| check the data | 90 | 31 episode · 1 app · 1 waiting | too few (3) | too few (3) | ||||
| check the data | 365 | 04 waiting | none scored yet | none scored yet | ||||
The four cut rules
Stopping the weeks of one call, or of two, judged by day 90 or by a year: all four are shown, not the best one.
| Stop the weeks INTARC called | Judged by day | Weeks stopped | Weeks kept | Stopped weeks returnedall customers · paid share | Kept weeks returnedall customers · paid share |
|---|---|---|---|---|---|
| won't pay back | 90 | 269 episodes | 36 | 1.00x · 0.55x | 1.73x · 1.51x |
| won't pay back | 365 | 153 episodes | 25 | 1.09x · 0.84x | 2.11x · 1.89x |
| won't pay back or behind | 90 | 3210 episodes | 30 | 1.19x · 0.71x | 1.69x · 1.51x |
| won't pay back or behind | 365 | 204 episodes | 20 | 1.37x · 1.07x | 2.03x · 1.83x |
Concentration
| By day, age 0 | Scored rows | Largest app's share of scored revenue | Apps with 10+ scored rows | Error per appmin · median · max | Bias per appmin · median · max |
|---|---|---|---|---|---|
| 90 | 1743 apps | 84% | 2 | 12% · 34% · 55% | 0.96 · 1.05 · 1.15 |
| 365 | 1012 apps | 78% | 2 | 23% · 40% · 58% | 1.04 · 1.09 · 1.14 |
The largest app holds 90% of the 105 scored calls.
How it is scored
- What is scored, against what truth. Cohort revenue: what a week's new customers pay by day 7, 30, 90, 180 and 365, against RevenueCat's realized revenue for those seven days of customers, read once the youngest of them has lived that long. The next 30 days: net profit and revenue per app and per workspace, against INTARC's daily statement for the 30 days after the cut-off. Calls on spend weeks: against what the week's customers then paid by day 90 and by a year, on all customers and on INTARC's paid share; live calls made by this model also log the share the earlier models' organic floor rule gives.
- The figures. Dollar-weighted error is the sum of misses over the sum of actuals; median error is the middle miss as a share of its actual; bias is the sum of forecasts over the sum of actuals, 1.00 being unbiased; within 50% is the share of forecasts within half of the actual either way. All four use scored rows whose actual is above zero. In range is the share of those rows whose actual fell inside the range INTARC gave, over the rows that had a range; the median width (the top of the range over the forecast) stands beside it, since a wide enough range is always right.
- Ages. A cohort is forecast again every day until its truth arrives. Rows are grouped by the forecast's age, the days from the cohort week's last day to the cut-off: 0 to 6 (the headline), 7 to 13, 14 to 27, and 28 or more.
- Rows are not independent. The same cohort is re-forecast daily, so every table prints the distinct cohorts, apps and cut-offs behind its rows, and calls print their spend episodes (an app's weeks with no gap over 21 days).
- Thin cohorts. A cohort week with fewer than 10 paying customers is thin and shown apart.
- The floor. In the next 30 days, a row whose forecast and actual are both under 10 in the workspace's currency is left out of every column and counted; a percentage miss near zero says nothing. Sign right is the share of the remaining net profit forecasts with the same sign as the actual.
- Too few. A cell with fewer than 10 rows, or a calls group with fewer than 5 weeks, prints too few instead of a figure.
- Studios the model never saw. When a studio connects, INTARC replays the frozen model over the studio's own history: every Sunday from eight weeks after its first day of revenue to the last Sunday at least eight days before the replay runs, two years at most, each forecast made the morning after with only the data that day had (rows after the day removed, a cohort's to-date revenue removed, a fixed window kept only once the cohort had lived it). The same rules made the replay of INTARC's own studio. Those truths are already in the past, so the studio's replay is scored at once. Counted are studios outside INTARC's own, connected after the freeze, that opted in to anonymous benchmarks; each is shown apart by counts and ratios only.
- Before the freeze. The model judged on 29 Oct 2026 adds three parts to the one frozen on 27 Oct 2026: subscription status and renewals, a cohort's first days read day by day, and the ads' share of each day's customers from many signals; a fourth, benchmark priors for new apps, was tested apart and left out. The model frozen on 27 Oct 2026, which these parts build on, was itself replayed about fifteen times while it was built. The parts were built and tuned on year 1 alone, forecasts made before 27 Oct 2025, and every scored variant was logged as a look: 8, 8, 13 and 5 by the four parts' builders (the priors' 13 with their cold-start replays), then 8 while a review's findings were fixed (4 for subscription status, one of them replacing another, and a test of a fifth change that was not kept; 1 for the ads' share; 3 for the priors), and 1 on the combined page. Not in those counts: the checks that reproduced them, the offline year-1 analyses that chose the designs, and the replays of the merge and the review. One tool summed revenue and spend 24 days into year 2: totals, not scores. The page was then pinned by its hash and judged once on year 2, forecasts made from 27 Oct 2025, under a rule written down before, and it passed; year 2 had already judged an earlier model change and a learning layer on 27 and 28 Oct 2026, so it was not a fresh period, and some of the design was chosen on year 1's results, so year 1 flatters the parts. The model frozen on 29 Oct 2026 is that judged model changed in two ways, both chosen after that night's breakdown of its year-2 results was read. The ads' share is kept out of the blended forecast of a cohort's revenue, where it made cohorts two to four weeks old worse; it still sets the ads' paid share of each week, which the calls on spend weeks rest on, and the forecast of the next 30 days. And a subscription app in its first 28 days of revenue starts from published benchmark priors, the fourth part narrowed to new apps. The two changes took 8 more looks, all on year 1: 2 for the ads' share and 6 for the priors. The priors passed their own year-1 test, written down before they ran, on histories cut to their last 28 days; the rule written before their first run let them act up to 56 days of revenue, and the limit was moved to 28 after one of those looks showed no gain at 56. Before this model was chosen, its first change was also scored on year 2, and a rule for this choice, written down before that comparison, pointed to the judged model: in that comparison, with the change, forecasts at age 0 to 6, the headline, were worse by more than the rule allowed. Year 2 was read before either change was made, so it cannot judge them: the replay above is in sample for them, and this model's own record starts at its freeze, in the live record. The model frozen on the evening of 29 Oct 2026 changes that one in two ways. First, where a cohort forecast is read: a week resting on money to date is read three days before day n, as before, because its curve is indexed by its last day's age; every other week, whose curve is indexed by each install day's own age, is now read at day n. Before, every week was read three days early, which on an app whose trials charge at their end missed most of a first week's money; the replay above reads the same way. Second, each cohort forecast is blended, on the log scale, with the standard chain-ladder's forecast for the same week and day: each install day's money so far times the app's own development from that day to day n, the multiplier the model is compared with. The chain-ladder's weight is set by how much of the app's paying history has reached day n: none until one 84-day window of its cohorts has, an even split at two; nothing in it was fitted to a score. It was designed on INTARC's own studio data with truths before 27 Apr 2026, where 100 variants were scored, then written down with a rule and checked once on the forecasts whose truths came later, a period an earlier challenger had been scored on once: it passed against the model before it and against the chain-ladder, and two descriptive looks at that period followed. The rule's version also weighed each method's own record per app; the model frozen keeps the maturity weight alone, which scored within 0.1 points of it there. Later that evening the model was frozen again with two changes about renewals. A subscription plan's revenue after its first month is its renewals: a weekly or monthly plan now renews at the rate its newest subscribers keep renewing, read from RevenueCat's retention counts for that plan, not from ratios learned on its oldest cohorts, which had run far above what newer cohorts paid; and each later step of the app's own revenue ladder is corrected by how much the newest cohorts' step before it differs from the cohorts that step rests on. Both were chosen after that evening's checks were read, the earlier change's included, so no period of the studio's data is out of sample for them; this model's own record starts at its freeze. Early on 30 Oct 2026 the model was frozen again with one fix. When a plan had few recent transactions, part S priced its payments as the plan's money in its first days (days 0 to 7) over the subscriptions active on day 6; that leaves out every subscription that starts on day 7, when a 7-day trial converts, so on trial apps the price, and every renewal scheduled at it, came out tens of times too high. It now counts the larger of the subscriptions active on day 6 and on day 7. The fix was found and checked after that evening's results were read, under a rule written before its full test; this model's own record starts at its freeze. Other changes tried that night are not in this model, and comments in its code that named the studio's own apps or quoted their figures were reworded before the freeze, which changed the fingerprint but no forecast. The replays of the models frozen on 26 and 27 Oct 2026 are kept, archived, beside this one; the first was revised after a review found weeks whose one-time buyers went uncounted and forecasts that ran high beyond day 90. Inputs were corrected after the fact: three App Store days stored in the wrong currency, a year of data pulled again, one day set by hand, ad network history added to the replay's copy, and installs reported by ad networks used as settled values. All four cut rules are shown. The replay of INTARC's own studio is in sample; the live record and the studios the model never saw are the out-of-sample tests.
- Subscription status, read on 28 Oct 2026. The replay reads RevenueCat's subscription status, revenue by day since install and subscriber base as INTARC pulled them, read only, on 28 Oct 2026. A cut-off keeps a cohort's field only once the cohort has lived that long, so each forecast sees only what its day could know; but the values are as settled on 28 Oct, not as first reported, and a refund or a late change of status can still move a value after its day. Since the freeze the server pulls them itself every night and keeps each value as first read, so the live record forecasts on first readings.
Integrity
- Model fingerprint now served
0f79d1e8165d8abfe1b5de2baea0323cd2ce57b602afdaabd77f0c021c1dd92bsha256 of the 6 marked model blocks of /app.html; the frozen model- sha256 of /app.html
5ea81a8c075acd474af0562769bdfb7f3d2e777cf5b589a97dc2b62d5df5bd42- Digest chain
- 4 days from 27 Oct 2026; head 30 Oct 2026
269241fdfa363f7c5f18b1ee4ba1da3f0e33866890115bc158653d5015f81d8a - Rows removed
- 0 live and 0 replay rows removed, as when an app or an account is deleted; every live removal is counted in the digest chain.
- Check it yourself
- /proof.json · /proof/ledger.csv · /proof/digests.txt · verify.mjsRun
node verify.mjs https://intarc.appto recompute every figure on this page from the ledger and check every link of the chain.