npx skills add ...
npx skills add revenuecat/ai-toolkit --skill revenuecat-forecasting
Use this skill whenever the user asks for a forecast, projection, extrapolation, or run-rate (MRR, ARR, revenue, or subscribers N months out; revenue to the end of the month or year), or asks what ad spend or acquisition is needed to hit a growth target. Load it before pulling charts for the projection.
npx skills add revenuecat/ai-toolkit --skill revenuecat-forecasting
Use revenuecat-charts for chart mechanics and metric interpretation. This skill covers turning
them into a projection. Prefer MCP get-chart-options-schema / get-chart-data over
rc charts show — the CLI surface does not expose expiration-month segmentation and selectors
this playbook needs.
Pick the section that matches the ask:
For month-by-month MRR or ARR — including solving for the spend or new subscriptions needed to hit a target, including when the user already gave you churned MRR, spend, or efficiency numbers, and including short asks like "what will MRR be in one month" or "in two months" — churned MRR in a month is:
"In one month" / "in two months" / "by next month" is still the churn line — N forward steps, not a rest-of-period run-rate and not an average of recent net MRR movement.
expiration_month Total MRR for every calendar month that overlaps the window
(e.g. remaining current month + next month for ~30 days out; two full months for "in two
months").churn[m] = due[m] × (1 − rate) per duration; roll P1M/P3M due past the snapshot;
leave empty annual months at zero due.MRR[m+1] = MRR[m] − churn[m] + inflow[m] — once for N=1, twice for N=2, …annual_base / 12.Correct — one month ahead (same idea for N=2 with two months in the loop):
Get the renewal rate from Subscription Retention or Cohort Explorer (chart literals only) —
not from observed_churned ÷ base, not from Set-to-Renew %. The rate applies to the due slice
for that duration (for monthlies due ≈ stock; for quarterlies and longer terms, never take
churned ÷ full base and then apply it to the due slice — that understates churn).
Get "MRR up for renewal" from Subscription Status for the current cycle of the live book:
Use the same get-chart-data pattern for Retention / Cohort Explorer / MRR / MRR Movement — but
do not copy Status-only fields (segment=expiration_month, limit_num_segments,
selectors.measure) onto those charts; take segment/filters/selectors from each chart's options
schema (get-chart-options-schema with "realtime": true).
Each segment is a calendar month when currently active subscriptions' periods end. Use Total
MRR only as due[m]. Set to Renew / Cancel / Billing Issue are near-term intent labels — not
forecast renewal rates. Status is a snapshot of the live book only — still model new / resub /
expansion from MRR Movement (or the user's spend plan) as inflows. If you cannot pull due at all,
ask for the renewal schedule rather than using annual_base / 12.
| Duration | Due (Status available) | Due (Status unavailable) | Rate |
|---|---|---|---|
| P1Y | Total MRR by expiration_month (first + repeat of the live book). Empty far months stay empty — do not invent fill-in. | Prior-year P1Y new + resub in M (misses repeat anniversaries — state that) | Retention Y1 / Cohort (subscription_type = new when using Retention) |
| P1M | Near-term expiration buckets, then roll ≈ standing monthly base each later month | Standing monthly base | Retention / Cohort (or movement churned / due where due ≈ base) |
| P3M / other fixed | Near-term buckets, then roll ≈ base / term-months | base / term-months | Retention / Cohort (or movement churned / due, never churned / full base) |
Wrong — annual due as a flat fraction of the stock:
Wrong — back-solving a residual so modeled churn matches observed:
Wrong — fixed-term rate on the full stock:
Wrong — second model after a gap (blended / net movement / "calibrated" churn):
Correct:
Do not use these steps for rest-of-period revenue run-rates — use that section instead.
product_duration for the current stocks.get-chart-data example above (selectors
{"measure": "mrr"}, segment=expiration_month, high limit_num_segments), filtered by
product_duration for each duration you model. Read Total MRR per expiration month into
the script as due only. Roll P1M/P3M due past the snapshot per the table; leave empty annual
months empty.due[m] × (1 − rate) — never project(net_fn) / a fit on net MRR movement /
mrr * (1 - blended_churn).For "revenue until the end of the month/year" and similar — not the MRR Steps above:
For low / base / high cases or "N months out":
Prediction Explorer models cohort LTV, not churn. Use it for payback or LTV cross-checks when the question asks for them; it does not replace the churn line above.