Tags habit streakshabit trackerproduct designmotivationretentionapp design
All posts

habit streaks

Habit streaks punish the people who are best at them

Habit streaks get heavier the longer they run: one missed day costs 3 early on and 100 later. Here is what I shipped instead, with numbers.

August 11, 2026 6 min

When I started building a self-management app, habit streaks were the one feature I assumed I would ship. Count consecutive days, display the number large, done. Nearly every habit app does it, and it demonstrably works.

I ended up leaving it out. The reasoning turned out to be sharper than “streaks feel bad,” so it is worth writing down.

Habit streaks get heavier the better you are

Habit streaks run on loss aversion - the well-documented asymmetry where a loss weighs more than an equivalent gain, formalised in Kahneman and Tversky’s prospect theory (Econometrica, 1979). You have accumulated something, losing it hurts more than gaining it pleased you, and the bigger the number the harder you work to protect it.

That part functions exactly as advertised. The problem is what it implies about the price.

Miss a day on day three and you lose 3. Miss a day on day thirty and you lose 30. Miss one on day one hundred and you lose 100.

The penalty is indexed to your success. The mechanism holds its largest punishment in reserve for whoever has done the best - and it never stops growing.

And everyone eventually misses. Illness, travel, a day that simply got away. The counter goes to zero.

That is where the real damage happens. Someone who logged a hundred days and now sees a zero has a hard time starting at one tomorrow. The hundred days of actual work still happened. Nothing about their life was undone. But the number that represented that work is gone, so it feels undone.

The work did not disappear. The way of counting the work erased it.

So I changed what gets counted

My app counts accumulation, not consecutiveness. Finish a task, the total goes up by one, and it never goes down for any reason.

The centre of the home screen is a planet. Every completed task makes it react, and as the total grows things appear on its surface - it starts as a seed, then grass, then forest, then water, then a place with people living on it.

The stages matter less than the rules around them:

  • Levels never decrease.
  • Nothing anywhere counts days off.
  • There is no screen that compares you to anyone else.

Come back after a week away and the planet is exactly as you left it. Complete one task and it grows from there.

An app that greets a returning user with “7 days missed” and an app that greets them with the state they left produce different next actions. The first makes you feel you owe an apology before you can start. The second just lets you continue.

The part I got wrong, and the numbers that fixed it

That is the design. In practice I got one thing badly wrong.

The original stage thresholds were these:

StageOriginalCurrent
252
3208
46025
515075
6350175
7800400
82,0001,000

Then I looked at actual usage. The share of people who signed up and completed even one task was close to zero.

Which means almost nobody reached stage two. “The planet grows as you complete things” is a fine mechanic and it was, functionally, not shipping - people left before the growth existed.

So every threshold was cut to less than half. The one that matters most is stage two: five completions down to two. Two tasks and the screen visibly changes.

This is not making it easier. The total distance to stage eight is still long on purpose. It moves the moment of first feedback earlier, which is a different lever from difficulty.

The same axis controls what the app shows you

That growth number does one more job.

A new install has three tabs: tasks, planet, discover. At two lifetime completions the reading tab appears. At eight, the health tab appears.

Two reasons for that.

First, five tabs on first launch is a lot to parse when you do not yet know what the app is for. Cutting features was not an option - handling several areas of life in one place is the point of the product. So nothing is removed; some of it arrives later.

Second, the unlock is itself a reward moment. The alternative - a settings toggle - fails in practice because most people never open settings, which makes an opt-in feature effectively a non-existent one.

Unlocks are also one-way. Once a tab appears it never disappears, whatever happens to the underlying count. Counters can be read mid-update, a user can switch between goals, a cache can hydrate in an odd order. None of that is a good enough reason to remove a menu somebody used yesterday.

The re-engagement notifications follow the same rule

If you stop opening the app, you get a notification on day 3, day 7, and day 14 - one each, in the morning.

Three things they never do:

  • Count the days you missed.
  • Tell you to start over.
  • Compare you to any average.

They lean closer to “your planet is quietly waiting.” The intent is to communicate that one thing this week still counts, because under accumulation it genuinely does.

After day 14 they stop entirely. Continuing to ping is no longer an invitation, and by then it is quite possible the app is simply not a fit.

Routine reminders got the same treatment for a related reason. Evening routines get skipped not because they are hard but because they require abandoning whatever you are currently enjoying. So instead of “start at 22:00,” the copy says something closer to “leave what you are doing for a moment, pick it back up right after.” The wording itself has to say that the current activity is not being taken away permanently.

None of this makes habit streaks bad

Streaks work for a lot of people. If an unbroken number is what gets you to do one more thing tonight, nothing else replicates that pull.

My objection is to streaks as the only mechanism. In a streak-only app, once someone breaks the chain the app has nothing left to offer them - and worse, the first thing a returning user sees is a zero, which makes returning feel like a mistake.

Accumulation is the inverse trade. The motivational pull is weaker than a streak’s. In exchange there is no downside state at all, ever. For something people are supposed to use for years, I would rather have a structure that cannot break than a stronger pull that can.

StreakAccumulation
Motivational strengthHighModerate
After one missed dayResets to zeroUnchanged
Cost to your best usersGrows foreverNone
What a returning user seesA broken chainWhere they left off

Written 2026-08-11. The stage numbers above are the values currently shipping. I cannot yet tell you whether the change worked - the thresholds moved recently, and before/after has to be measured with the same instrument to mean anything. When there are numbers, I will write them up.

Previous A React Native Modal always wins: the new-user soft lock