All chapters Part II · Defining the product
Chapter 09

The Core Loop: Designing for Retention

Everything else in your product is decoration around one question: why does the user come back tomorrow? Get the loop right and mediocre features still work. Get it wrong and no amount of polish saves you.


The concept

A core loop is the shortest cycle a user repeats to get value. It has four parts, a framing popularised by Nir Eyal's Hooked:

        ┌──────────────────────────────────────────┐
        │                                          │
        ▼                                          │
   ┌─────────┐    ┌────────┐    ┌────────┐   ┌────────────┐
   │ TRIGGER │───▶│ ACTION │───▶│ REWARD │──▶│ INVESTMENT │
   └─────────┘    └────────┘    └────────┘   └────────────┘
    what brings     the         did it work?   what they leave
    them back       simplest    was it worth   behind that makes
    (external:      valuable    it?            the next loop
    notification;   thing                      better
    internal:                                  (data, history,
    a feeling)                                 setup, content)

The investment step is the one people skip, and it's what separates a product users leave from one they can't. Investment is anything the user puts in that makes the product better for them over time: their history, their preferences, their content, their connections, their progress. It's why leaving Spotify is harder than leaving a news site.

Frequency is a design constraint, not an aspiration

The single most common retention mistake is designing a daily product for a weekly problem.

Natural frequencyExamplesWhat retention looks likeDesign implication
Multiple dailyMessaging, social, emailDAU/MAU > 50%Must be genuinely fast; notifications matter enormously
DailyHabit, learning, fitness, journalingDAU/MAU 20-50%Streaks, reminders, a small daily unit of value
WeeklyPlanning, review, budgetingWAU/MAU high, DAU lowDon't fake dailiness; weekly ritual + digest
MonthlyInvoicing, reporting, taxesLow DAU, high retentionReliability over engagement; be there when needed
EpisodicTravel, moving, job hunting, weddingsBursty, then dormantOptimise for return, not continuity; be memorable

Forcing daily engagement onto a weekly product is how you train users to ignore your notifications, and once ignored, you don't get that channel back.

Be honest about your natural frequency. A budgeting app that pesters daily gets muted. A tax product that sends nothing for eleven months and is excellent in month twelve has great retention.

Retention curves: what "good" actually means

Plot the percentage of a cohort still active on day N. Three shapes:

 %                                    ┌─ SMILE: churns, then returns
 │  ╲                                 │   (episodic, seasonal)
 │   ╲___                             │
 │       ╲________ ← FLATTENS         ← what you want: a stable core
 │                                    │   who never leave
 │            ╲                       │
 │              ╲___ ← DECAYS TO ZERO ← no product-market fit
 └────────────────────────────────▶ days
   1    7    30   60   90

The flattening is the signal. A curve that decays to zero means you have a demo, not a product, no matter how good D1 looks. A curve that flattens at even 15% means a real group of people genuinely need this.

Rough consumer benchmarks (they vary hugely by category, use them as orientation, not targets):

D1D7D30
Excellent40%+20%+10%+
Good25-40%12-20%6-10%
Weak<20%<8%<4%

B2B SaaS is measured differently, logo retention and net revenue retention matter more than daily activity. NRR > 100% means existing accounts grow faster than others churn; that's the property that makes B2B revenue so valuable.

The most expensive design decision: creating deficits

Here is a failure pattern that shows up across habit apps, learning apps, fitness apps, and language apps:

  1. Product prescribes a daily quota
  2. User misses a day, because life
  3. App shows them a deficit ("you're 3 days behind")
  4. Deficit reads as failure
  5. Failure is unpleasant → they avoid the app
  6. Avoidance grows the deficit
  7. Death spiral

Step 3 is the load-bearing one, and it is usually a data-model decision, not a copy decision. If content is bound to calendar dates, the deficit is generated automatically. If content is an ordered queue with a resume point, a deficit is impossible, there's nothing to be behind.

 ❌ CALENDAR MODEL                     ✅ QUEUE MODEL

 Mon  Day 1  ✓                        ┌──────────────┐
 Tue  Day 2  ✓                        │ Item 1  ✓    │
 Wed  Day 3  ✗ MISSED                 │ Item 2  ✓    │
 Thu  Day 4  ✗ MISSED                 │ Item 3  ✓    │
 Fri  Day 5  ← you are here           │ ──────────   │
                                      │ Item 4  ← YOU│
 "You are 2 days behind."             │ Item 5  🔒   │
                                      └──────────────┘
 feels: debt, failure, dread
 does:  uninstalls                    "Continue where you left off."
                                      feels: momentum
                                      does:  taps continue

Same content, same pace, completely different emotional contract, and the difference is which field you store.

📐 The general principle: never show a user a deficit they can't clear. Progress bars that go backwards, streaks that reset to zero, "you missed 4 days," unread counts in the thousands. Each one is a small punishment for using your product imperfectly, and people avoid punishment by avoiding the product.

Streaks: powerful, and dangerous

Streaks work, loss aversion is real and Duolingo has published strong numbers on it. Streaks also cause churn when they break, because sunk cost inverts into "well, it's ruined now."

Design them soft:

  1. User-chosen goal. A streak you set yourself is a promise; one the app sets is a demand.
  2. Today never breaks it. Only a completed missed day should count. No 11pm dread.
  3. Freezes / repair. One free per month. Duolingo's streak freeze exists precisely to stop the guilt-churn spiral.
  4. Never make the streak the only progress. If breaking it erases everything, breaking it ends the relationship.

Derive, don't store

Anything computable from a source of truth should be computed: streak, level, progress percentage, day number, totals. Stored duplicates drift, you fix a bug and the stale value lives on in someone's device where you can't reach it. (Chapters 19-20.)


📐 Best practice

Write your core loop as one sentence before designing screens: "The user [trigger], does [action], gets [reward], and leaves behind [investment]."

Match your design to your natural frequency. Don't fake dailiness.

Design the investment step deliberately. What accumulates? What would they lose by leaving?

Make the first loop happen in the first session. Time-to-first-value is the strongest lever on D1 (Chapter 10).

Remove every deficit. Audit your product for anything that tells a user they're behind, and delete it.

Make the daily unit small. The minimum viable engagement should be completable in under two minutes on a bad day. Ambition kills consistency.

Instrument the loop before launch. You need the retention curve from day one; it isn't retroactive (Chapter 38).

Cohort your retention. Aggregate retention hides everything. Weekly cohorts show whether changes are working.


💀 Common mistakes

Adding features instead of fixing the loop. If people don't return, more features give them more reasons not to return.

Faking daily frequency. Trains users to ignore notifications permanently.

Streaks with hard resets. The #1 self-inflicted churn cause in habit products.

Gamification bolted on top. Points that don't connect to the value are noise; users see through them in a week.

No investment step. Nothing accumulates, so leaving is free.

Optimising D1 while D30 is zero. Onboarding tricks inflate D1. If the curve doesn't flatten, you've made the demo better.

Measuring aggregate retention. Mixes cohorts and hides regressions.

Notification spam. Each irrelevant notification permanently reduces the value of the channel. Mute is forever.

Treating retention as a growth-phase problem. It's the first problem. Acquisition into a leaky bucket is buying expensive proof that your product doesn't retain.


The professional workflow

 1. WRITE THE LOOP as one sentence

 2. IDENTIFY NATURAL FREQUENCY — honestly

 3. DESIGN EACH STEP
    trigger    — external (notification/email) AND internal (a feeling)
    action     — the smallest valuable unit. Under 2 min.
    reward     — visible, immediate, variable if possible
    investment — what accumulates and makes tomorrow better

 4. AUDIT FOR DEFICITS
    Anything that says "behind", resets, or goes backwards → remove

 5. DECIDE STREAK/PROGRESS MECHANICS
    user-chosen goal · today can't break it · freezes · not the only progress

 6. INSTRUMENT before launch (Chapter 38)
    loop completion · time-to-first-value · D1/D7/D30 by cohort

 7. MEASURE COHORTS WEEKLY. Watch for FLATTENING, not height.

 8. FIX THE LOOP BEFORE SPENDING ON ACQUISITION

Tools, websites & costs

NeedToolCost
Retention cohortsPostHog, Amplitude, MixpanelFree tiers (1M events / 50k MTU)
Mobile subscription retentionRevenueCat chartsFree under $2.5k/mo
Push / lifecycle messagingOneSignal, Braze, Customer.io$0-$$$
Local notificationsPlatform SDKFree
Session replayPostHog, FullStoryFree tier
BenchmarksRevenueCat State of Subscription Apps, Lenny's Newsletter benchmarksFree
ReadingHooked (Eyal); Duolingo's engineering blog on streaks~$15

Cost: essentially zero. Retention is a design problem, not a tooling problem, but you cannot improve it without the analytics.


Alternatives & trade-offs

Habit loop vs utility model. Not every product should be sticky-by-engagement. A tax filing tool has excellent retention with near-zero daily usage. Deciding which you are prevents a lot of wasted design.

Streaks vs cumulative progress. Streaks are stronger motivators and more fragile. Cumulative totals (lessons completed, words written, miles run) never break and motivate less. Many products use both: cumulative as the real progress, streak as the optional bonus.

Notifications vs email vs in-app. Push has the highest open rate and the lowest tolerance for irrelevance. Email is more forgiving and slower. In-app is free but requires them to already be there. Most products need all three at different frequencies.

Variable vs fixed rewards. Variable rewards (unpredictable achievements, surprise content) are more engaging, the research is unambiguous, and shade into manipulation faster (Chapter 14).

Social vs solo loops. Social loops retain harder (other people are the trigger) but need critical mass and bring moderation obligations. Solo loops work at N=1, the right choice for a first product.


Checklist


📓 Case Study: a data-model decision that was really a retention decision

Project: SOLIS, a 90-day course app, a category the research described bluntly: "retention is the whole game; the category dies at week 2-4."

The churn hypothesis came before the product. On day 2, before any real code:

"im thinking if we make it 5 lessons each day then the user is bound to miss few and then user might lose interst in the app"

That's the deficit spiral, predicted in advance. What makes this case study useful is what was done with the prediction.

The fix was architectural, not cosmetic. Rather than softening the copy around missed days, the data model was changed so a deficit could not exist:

The path is a queue, not a calendar. The user has one resume point. Each day they continue the next up-to-5 lessons in sequence. Miss a day? Nothing breaks. You're never "behind on Day 4", you simply continue.

Day number became a derived display rather than a schedule:

function windowStart(){ return Math.floor(currentIdx() / DAILY_CAP) * DAILY_CAP; }
function dayNum(){ return Math.floor(windowStart() / DAILY_CAP) + 1; }

Complete 20 lessons in one sitting and you're on "Day 5." Take three weeks off and you come back to "Day 5." The number is a milestone, never a deadline.

Notice what the implementation doesn't contain: no scheduler, no catch-up logic, no deficit calculation, no "days behind" state. The forgiving behaviour isn't a feature that was built, it's what you get for free when content isn't bound to dates.

The transferable principle: good architecture makes the desired behaviour the default rather than a feature. If you find yourself writing code to suppress a bad feeling, check whether a different data model removes the feeling entirely.

The cap as a feature. A hard limit of five lessons per day, with further content visible but locked ("returns at dawn"). This makes the product worse by the obvious metric, you can consume less, and it exists to manufacture tomorrow. Locked-but-visible was deliberate: hiding removes anticipation, greying-out creates it.

The forgiving streak. Three softening decisions, all from the best-practice list above: the user picks their own daily goal (1, 3 or 5), today can never break the streak (the loop walks backwards from today and a zero today doesn't reset), and the streak is not the only progress, pillars, rank and totals all accumulate independently.

Where the loop met the money. The paywall sits at the day-8 lock, which is not a pricing decision that happened to land there. At that moment the user has completed 35 lessons, holds a 7-day streak, and has watched four progress bars grow. You are not asking a stranger to pay; you are asking an invested person not to lose momentum. Same price, entirely different question.

⚠️ Deviation: the loop was never measured.

This is the deviation that matters most, and it undercuts everything above.

The product plan named the right metrics on day 4, "D1/D7/D30 retention (the only numbers that matter pre-marketing), quiz→paywall view rate, paywall→purchase conversion, day-8 lock → upgrade rate."

None were implemented. No product analytics, no funnel instrumentation, no cohorts. The queue model, the cap, the forgiving streak, all of it is well-reasoned design based on published research from other companies, and none of it was ever tested against a real retention curve.

So the honest reading of this case study is: it demonstrates how to reason about a retention loop and encode it structurally, and it demonstrates nothing about whether these particular choices worked. The five-lesson cap might be wrong. The 90-day length might be wrong. Nobody knows, because nothing was measured (Chapter 38).

🚩 Unvalidated. Zero users at last entry. Treat the reasoning as instructive and the outcome as unknown.


Lessons

  1. The loop is the product. Everything else is decoration around "why do they come back tomorrow?"
  2. Deficits are usually data-model decisions. Bind content to dates and you generate guilt automatically.
  3. Never show a user a deficit they can't clear.
  4. Good architecture makes the right behaviour the default, not a feature you had to build.
  5. A cap can be a feature. Making your product less consumable can make it more valuable.
  6. Lock but show. Anticipation is free retention.
  7. Streaks need a user-set goal, a today-can't-break rule, and freezes, or they become the churn mechanism.
  8. Design the loop and the paywall together. The best paywall moment is a loop moment.
  9. Match design to natural frequency. Faking dailiness costs you the notification channel permanently.
  10. Retention design without measurement is a hypothesis. Instrument before launch, the curve is not retroactive.

Work this chapter with Claudea prompt to run on your own project
You're my product-design partner. My product and its v1 scope from the earlier step (paste it, or describe it if you're starting here): [fill in]. Help me design why users come back: 1. Define the loop for my product: trigger, action, reward, investment. 2. Show where that loop should live in my data model, not just the UI. 3. Point out the weakest link that would break retention.
Open Claude ↗

Next: Chapter 10: Onboarding and Activation →

Useful? Share this chapter