growth-model
Skill0 starsChanged 39 days agoMITView on GitHub
Builds a driver-based growth model - acquisition, activation, retention, monetization, and a loop factor - that projects users and revenue bottom-up, runs base/upside/downside scenarios, and names the one constraint to work on next. Use when someone asks "build me a growth model", "what should our user projection be", "which lever moves growth most", "model our viral loop", or wants projections driven by real inputs instead of a hockey-stick guess. Do NOT use for the SaaS MRR bridge, NRR, and revenue-forecasting mechanics - use revenue-modeling. Do NOT use for decomposing historical active-user change into new, retained, resurrected, and churned - use growth-accounting. Do NOT use for per-customer CAC/LTV math - use unit-economics.
3 other projects use a version of this.
Adopted by
Most recently taken up by
- menkesu/awesome-pm-skillstheir own version, first seen Oct 13, 2026
- RefoundAI/lenny-skillstheir own version, first seen Jul 15, 2026
- nandanosql/all_in_one_pm_skillstheir own version, first seen Feb 28, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- RefoundAI/lenny-skills★ 1.3ksame name
- menkesu/awesome-pm-skills★ 441same name
- nandanosql/all_in_one_pm_skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
- churn-reductionSkill
- customer-success-qbrSkill
- expansion-revenueSkill
- product-analyticsSkill
- saas-pricingSkill
- unit-economicsSkill
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 9 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 25
Use real cohort data wherever it exists (wire it from product-analytics).
- Distinctive: line 49
Every symbol maps to a driver a team can own.
- Distinctive: line 141
Do not grow revenue by a fixed percent with no driver behind it - that is a wish, not a model, and no team can act on it.
- Distinctive: line 142
Do not ignore retention decay.
- Distinctive: line 143
Do not model a loop factor at or above 1 without evidence - true sustained virality is rare, and an assumed k of 1+ makes any model explode …
- Distinctive: line 144
Do not draw the output curve first and back-fill drivers.
- Distinctive: line 145
Do not flex every input in scenarios.
- Distinctive: line 146
Do not use this to reconcile the MRR bridge or forecast SaaS revenue mechanics - that is revenue-modeling.
- Distinctive: line 150
Every driver in the equation has a data source (cohort data preferred) or an explicit guess label.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Growth Model
A growth model is not a revenue forecast with a hopeful curve. It is a driver-based system that shows how inputs (traffic, conversion, retention) compound into output (users, revenue) - and where the leverage is. The costly mistake this prevents: drawing the output curve first and back-filling assumptions to justify it, which produces a plan nobody can steer because no team owns an input.
Operating procedure
Order matters: the loop must be identified before the equation is written, and the equation before any projection - otherwise the model quietly becomes a fixed-percent guess with extra columns.
Step 1: gather inputs
- Current active users and the definition of "active" (a meaningful action, not a login).
- New users per period by channel, with each channel's volume and cost.
- Activation rate: the share of new users reaching first value. From real funnel data where it exists.
- Retention: the share of actives who stay each period - from cohort curves, never a flat assumption. If only aggregate churn exists, label the retention figure a guess.
- Revenue per retained user, including expansion.
- Any referral or loop evidence: invites sent, invite conversion, content-driven signups.
Use real cohort data wherever it exists (wire it from product-analytics); label everything else a guess and flag it for replacement.
Step 2: identify the primary loop
Funnels are linear and leak; loops compound - the output of one cycle feeds the input of the next. Name which loop is the primary engine:
- Viral loop: users invite users; each user brings k more.
- Content loop: usage creates content that attracts new users (SEO, user-generated pages).
- Paid loop: revenue funds acquisition that funds more revenue - works only if payback is shorter than the reinvestment cycle time.
- Sales loop: customers refer or expand, funding more sales capacity.
A business with no loop rents all its growth and stalls when spend stops. If no loop exists yet, say so in the model rather than inventing a loop factor.
Step 3: write the driver equation
Make the structure explicit before touching a spreadsheet. The canonical period-over-period form:
signups(t) = paid(t) + organic(t) + k × active(t-1) ← loop term
activated(t) = signups(t) × activation_rate
active(t) = active(t-1) × retention + activated(t)
revenue(t) = active(t) × ARPUEvery symbol maps to a driver a team can own. If a term in the model has no owner and no data source, it is decoration - delete it.
Step 4: project bottom-up and run the sensitivity
Project period over period from the equation - never draw the output curve first. Then run the sensitivity that decides where the roadmap points: retention compounds while acquisition is a one-time add, so a 5-point improvement in monthly retention usually beats a 20% increase in acquisition over a 12-month horizon. Model it explicitly (the calculator below does) so the team invests where the leverage is, not where it feels busy.
Step 5: build base / upside / downside scenarios
Flex only the two or three most sensitive drivers (usually retention, activation, and the loop factor) - not every input. Downside must include retention decay; assuming everyone acquired stays forever is the classic silent error.
Step 6: name the constraint and set driver targets
Identify the one driver that, if improved, unlocks the most growth, and point the roadmap there. Set targets per driver - not just a top-line number - so teams own inputs they control. Re-forecast monthly against actuals; a model never compared to reality is fiction.
Calculator
Self-contained Node script. Save as growth_model.js, edit the inputs block, run node growth_model.js. No dependencies.
// Growth model projection. Edit the inputs, then: node growth_model.js
const inputs = {
startingActive: 10000,
months: 12,
paidNewPerMonth: 2000, // signups from paid channels
organicNewPerMonth: 1000, // signups from organic/content
activationRate: 0.6, // share of signups reaching first value
monthlyRetention: 0.80, // share of actives who stay each month
loopFactor: 0.2, // k: new signups per active user per month
arpu: 8, // monthly revenue per active user
}
function project(i, overrides = {}) {
const p = { ...i, ...overrides }
let active = p.startingActive
const rows = []
for (let m = 1; m <= p.months; m++) {
const loopSignups = p.loopFactor * active
const signups = p.paidNewPerMonth + p.organicNewPerMonth + loopSignups
const activated = signups * p.activationRate
active = active * p.monthlyRetention + activated
rows.push({ m, signups, activated, active, revenue: active * p.arpu })
}
return rows
}
const fmt = n => Math.round(n).toLocaleString('en-US')
const base = project(inputs)
console.log('BASE CASE (retention 80%, k=0.2)')
for (const r of base.filter(r => [1, 3, 6, 12].includes(r.m)))
console.log(` month ${String(r.m).padStart(2)}: active ${fmt(r.active).padStart(7)} revenue $${fmt(r.revenue)}`)
// Sensitivity: retention +5 pts vs acquisition +20%
const retUp = project(inputs, { monthlyRetention: 0.85 })
const acqUp = project(inputs, {
paidNewPerMonth: inputs.paidNewPerMonth * 1.2,
organicNewPerMonth: inputs.organicNewPerMonth * 1.2,
})
const last = rows => rows[rows.length - 1].active
console.log('\nSENSITIVITY at month 12')
console.log(` base: ${fmt(last(base))} active`)
console.log(` retention +5 pts (85%): ${fmt(last(retUp))} active`)
console.log(` acquisition +20%: ${fmt(last(acqUp))} active`)
const winner = last(retUp) > last(acqUp) ? 'RETENTION' : 'ACQUISITION'
console.log(` higher-leverage driver: ${winner}`)Worked example output
With the inputs above the script prints:
BASE CASE (retention 80%, k=0.2)
month 1: active 11,000 revenue $88,000
month 3: active 12,766 revenue $102,131
month 6: active 14,921 revenue $119,364
month 12: active 17,904 revenue $143,233
SENSITIVITY at month 12
base: 17,904 active
retention +5 pts (85%): 25,308 active
acquisition +20%: 20,750 active
higher-leverage driver: RETENTIONRead it: five points of monthly retention adds ~7,400 actives at month 12, while 20% more acquisition spend adds ~2,800 - the retention gain compounds every period, the acquisition gain arrives once per period and then churns on the same curve. This is why the constraint in Step 6 is usually retention or activation, not the ad budget.
Deliverable
Produce a driver-based growth model containing: the primary loop named (or the honest statement that none exists yet), the written driver equation with an owner per driver, a 12-month bottom-up projection with base/upside/downside scenarios, the sensitivity table showing which driver wins, and the single named constraint with its per-driver target.
Do NOT
- Do not grow revenue by a fixed percent with no driver behind it - that is a wish, not a model, and no team can act on it.
- Do not ignore retention decay; assuming everyone acquired stays forever inflates every downstream number.
- Do not model a loop factor at or above 1 without evidence - true sustained virality is rare, and an assumed k of 1+ makes any model explode into fiction.
- Do not draw the output curve first and back-fill drivers; the direction of derivation is the entire point.
- Do not flex every input in scenarios; flex the two or three most sensitive drivers so the scenarios stay comparable.
- Do not use this to reconcile the MRR bridge or forecast SaaS revenue mechanics - that is revenue-modeling; and do not use it to explain last quarter's user change - that is growth-accounting.
Quality bar
- Every driver in the equation has a data source (cohort data preferred) or an explicit guess label.
- The projection reconciles: active(t) recomputes from active(t-1) via the stated equation for every period.
- The sensitivity was actually run, and the named constraint follows from it, not from opinion.
- Scenarios differ only in the flexed drivers, and the downside includes retention decay.
- A re-forecast cadence (monthly, against actuals from product-analytics) is written into the deliverable.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

