// design
Marketing Loops
Use when the user wants to build or diagnose a compounding growth loop — referral, viral, content, or paid-recycling — rather than optimize a linear funnel. Also use when the user mentions growth loops, viral loop, viral coefficient, k-factor, referral loop, content loop, network effects, compounding growth, flywheel, "how do we grow without spending more", or "why doesn't our growth compound". Computes the loop factor, shows what it buys in amplification and effective CAC, finds the throttling stage, and projects users over time.
npx skills add sarojkjha/aaj-marketing-skills --skill marketing-loops// when to use it
Use when the user wants to build or diagnose a compounding growth loop — referral, viral, content, or paid-recycling — rather than optimize a linear funnel. Also use when the user mentions growth loops, viral loop, viral coefficient, k-factor, referral loop, content loop, network effects, compounding growth, flywheel, "how do we grow without spending more", or "why doesn't our growth compound". Computes the loop factor, shows what it buys in amplification and effective CAC, finds the throttling stage, and projects users over time.
// what you give
The stages of one turn of the loop with their conversion rates, the output per completion (e.g. invites sent), and optionally a paid CAC and a paid feed rate for projection
// what you get
The loop factor k with a verdict, the amplification and effective-CAC it buys, the throttling stage to fix first, and a period-by-period projection decomposing loop-driven from paid-driven growth
Marketing Loops
Model growth that compounds because its output feeds back as input — not a funnel with the ends taped together.
Most of the catalog treats growth as a funnel: stages, hand-offs, leaks to plug, a linear path from stranger to customer. lifecycle-and-retention, onboarding-activation, and signup-flow-optimizer all optimize that path. This skill is for the other model. A loop is growth where each turn produces the input to the next turn — users invite users, content attracts people who make content, revenue funds acquisition that produces revenue.
The one question a funnel never asks, and a loop lives or dies on: does one turn of the loop produce more than one turn's worth of input? That ratio is the loop factor, k. It's the single number that separates a channel that compounds from one that merely converts. A funnel optimizer can improve every stage and still never know whether the thing loops, because "does output exceed input" is not a question the funnel frame contains.
The misconception this skill exists to correct is that k ≥ 1 is the goal. True virality — every user producing more than one new user, growth sustaining itself with no paid input — is rare, fragile, and usually the wrong target. The durable reality is sub-viral: a k of 0.5 to 0.8 that doesn't run on its own but more than doubles the value of every acquired user. A k=0.6 loop makes each paid acquisition do the work of 2.5. Teams chase k ≥ 1, miss it, and conclude they "don't have a loop" — when the sub-viral loop they do have is quietly the best line item in the model. This skill is built to surface that.
When to use
The user wants to build a referral or content loop, diagnose why growth isn't compounding, or decide whether a channel is a loop at all. For optimizing the linear conversion path, use onboarding-activation or signup-flow-optimizer. For whether the unit economics support paid acquisition in the first place, use unit-economics. For sequencing loop work into a broader plan, campaign-orchestrator routes here.
Before you start
- Draw one turn of the loop as stages. Not the funnel — the cycle. For referral: user sends invites → invite opened → clicked → signed up → (now sends invites). Each stage is a conversion rate; the last stage's output feeds the first.
- Get the output per completion. How many invites, shares, or pieces of content one completed turn produces. This is the branching factor, and it's what can push k above the stage-rate product.
- Have real rates, not hopes. k is a product of rates, so optimism at each stage multiplies into fantasy. Pull the numbers from analytics; if you're estimating, say so and treat the output as a scenario.
- Know whether you even have a loop. If the last stage's output doesn't become the first stage's input, it's a funnel. Model it as one and don't invent feedback that isn't there.
Method
k is the product of every stage rate times the output per turn. The math is deliberately simple; the discipline is in getting honest rates and reading the result correctly.
Two things the engine computes that change decisions:
Amplification — a decaying loop (k < 1) still sums to a finite multiplier, because a seed cohort yields N + Nk + Nk² + … = N/(1−k) total users. k=0.5 doubles; k=0.8 quintuples. This is the number that reframes a "failed" sub-viral loop as a working one.
The throttle — because k multiplies stage rates, the lowest rate caps the whole loop. A ten-point gain at the throttle lifts k more than a ten-point gain anywhere else. The engine names it, so effort goes to the stage that moves the number rather than the stage that's easiest to touch.
Run the engine
Paths assume you installed with
npx skills add. From a clone of this repo, useskills/marketing-loops/resources/…instead.
node .agents/skills/marketing-loops/resources/loop-model.js --demo # worked example, no args
node .agents/skills/marketing-loops/resources/loop-model.js score '<json>' # compute k for one loop
node .agents/skills/marketing-loops/resources/loop-model.js project '<json>' # compound it over time
node .agents/skills/marketing-loops/resources/loop-model.js --help
Score takes the loop's stages and branching factor, returns k, the verdict band, amplification, effective CAC (if a paid CAC is given), and the throttling stage. Project takes a k and a paid feed and shows users period by period, decomposing loop-driven from paid-driven growth so the compounding is visible rather than assumed.
Workflow
- Map one turn of the loop as stages with real rates, and the output per completion.
- Score it to get k and the verdict. Read the band honestly — sub-viral is the normal, workable case.
- Read the throttle and target it first; it's where a fixed amount of effort moves k most.
- Get the effective CAC if you run paid — the loop pays for k of every acquisition, and that lowered number is what should feed
unit-economicsandpaid-media-budget-allocation. - Project with a realistic paid feed to see the compounding, and to decompose how much growth is loop versus paid.
- Don't model compounding that isn't there. If k is near zero, say the channel is a funnel and route the work to the funnel skills.
Present the result
Lead with k and its verdict band, then what k buys — amplification and effective CAC — then the throttle. For a projection, show the paid-vs-loop decomposition; the gap between total and paid-alone is the entire argument for treating this as a loop.
Be explicit about the sub-viral point every time k lands below 1. Left unsaid, the user reads "k = 0.6" as failure. Said plainly, they read it as "every acquisition worth 2.5×," which is the truth.
Guardrails & common mistakes
- k ≥ 1 is usually the wrong goal. Sustained virality is rare and fragile. A strong sub-viral loop that amplifies paid is the durable win; don't dismiss it for missing 1.0.
- k is a product, so optimism compounds. Four stages each padded 10% inflates k by ~46%. Use measured rates; flag estimates as scenarios.
- A projection with k ≥ 1 runs away. The model imposes no saturation ceiling, so an exponential curve is real in shape but fictional in magnitude. Add a ceiling before planning against the number.
- Fix the throttle, not the easy stage. The lowest rate caps k. Effort anywhere else is worth less, however tempting the quick win.
- A funnel with the ends joined is not a loop. If the output doesn't genuinely re-enter as input, there's no feedback and no compounding. Don't force the frame.
- The loop lowers CAC; it doesn't make acquisition free. Effective CAC is paid CAC × (1−k), not zero. Feed the real number into the budget skills.
- Loops saturate. Every k is measured at a point in time and tends to fall as the addressable network fills. Re-measure; don't assume today's k holds at scale.
Related AAJ resources
- Interactive tool: https://aajconsult.com/tools/unit-economics-calculator
- Playbook: https://aajconsult.com/playbooks/geo-aeo-playbook
Related skills
unit-economics (where effective CAC and LTV:CAC get judged) · paid-media-budget-allocation (the paid feed a loop amplifies) · onboarding-activation and signup-flow-optimizer (the funnel model, for the linear path) · lifecycle-and-retention (retention, which raises loop rates by keeping users in the cycle) · campaign-orchestrator (routes here when the play is a loop).
// see it run
Examples
// prompt
node resources/loop-model.js --demo
// result
▸ DEMO 1 — score mode (compute the loop factor)
MARKETING LOOP — SCORE
══════════════════════════════════════════════════════════
Loop type Viral / referral — users invite users; k = invites × accept-rate
LOOP FACTOR k = 0.252
VERDICT CONTRIBUTING
k in [0.2, 0.5) — a real assist. The loop meaningfully lowers effective CAC
but won't carry growth alone. Worth improving; don't rely on it.
THE LOOP
stage rate
user sends invites 100.0%
invite opened 45.0%
clicks through 35.0% ← throttle
signs up 40.0%
× output per turn 4
────────────────────────────────
= loop factor k 0.252
WHAT k BUYS YOU
Amplification 1.34× every seeded user ultimately yields 1.34 users
Effective CAC 59.84 paid CAC 80 × (1 − k)
the loop pays for 25.2% of every acquisition
WHERE TO PUSH
The throttle is "clicks through" at 35.0%. Because k is the product
of every stage rate, the lowest rate caps the whole loop — a 10-point gain
there lifts k more than a 10-point gain anywhere else. Fix the throttle first.
WHAT THIS MEANS
A genuine assist, not an engine. Bank the lower effective CAC, but plan
growth around paid and treat the loop as leverage on it, not a substitute.
▸ DEMO 2 — project mode (compound it over 12 periods)
MARKETING LOOP — PROJECTION
══════════════════════════════════════════════════════════
Loop factor k 0.600
Seed users 1,000
Paid feed / period 500
Periods 12
CUMULATIVE USERS
period new total
1 1,100 2,100 ████
2 1,160 3,260 ██████
3 1,196 4,456 █████████
4 1,218 5,674 ███████████
5 1,231 6,904 █████████████
6 1,238 8,142 ████████████████
7 1,243 9,385 ██████████████████
8 1,246 10,631 ████████████████████
9 1,247 11,879 ███████████████████████
10 1,248 13,127 █████████████████████████
11 1,249 14,376 ████████████████████████████
12 1,249 15,626 ██████████████████████████████
WHERE THE GROWTH CAME FROM
Paid + seed alone 7,000
Added by the loop 8,626
Loop multiplier 2.23× the loop turned 7,000 into 15,626
WHAT THIS MEANS
The loop is doing more than half the work. Notice the total far exceeds
paid-alone — that gap is the compounding you'd miss modeling this as a
funnel. Fund the paid feed; the loop multiplies it.
(Demo data. Replace with your real loop stages and paid feed.)// faq
// install
npx skills add sarojkjha/aaj-marketing-skills --skill marketing-loops// run it
node .agents/skills/marketing-loops/resources/loop-model.js --demo// worked example
Get the worked example for marketing-loops
One email. The filled-in config, the output, and how to read it.
// sprint
Unit Economics & Retention Sprint — $3,500, 10 business days
This skill is one of the engines behind the Unit Economics & Retention Sprint — $3,500, ten business days.
LTV, CAC, payback and churn on your actual numbers — with a verdict, not a dashboard.
// human in the loop
Need a human in the loop?
AAJ builds the strategies, tools, and playbooks these skills are made of — with engagements for growth-stage and enterprise teams.
Skills