Duolingo's CURR Framework: Building User Lifecycle Stages in Amplitude

Magnusson Analytica is active in the Amplitude community, whether that's hosting webinars and workshops or answering questions on the Amplitude Slack channel. A recent question there caught our attention: could Duolingo's CURR model be tracked in Amplitude, and was anyone already tracking users by state and by how they move between states, for example from engaged to disengaged?

It's something we do with a lot of clients, so rather than a quick reply, our founder Alexander Magnusson walked through the whole process on video, from the idea through to a finished dashboard.

Why lifecycle states matter

The goal of a lifecycle model is to understand where every user sits right now. Are they brand new? Active and coming back regularly? At risk of churning? Gone quiet entirely? And if they have gone quiet, can you bring them back?

We built something very similar for Brainly, straight out of Amazon Redshift, just before Brainly implemented Amplitude. Since then we've built the same logic directly in Amplitude for other clients, particularly in education, one of the sectors we focus on most.

The CURR model

CURR stands for Current User Retention Rate. Duolingo described the model on its blog in 2023. A user starts as new, becomes current as they keep using the app, and ideally stays there. At some point they may slip into being at risk within the week, then at risk within the month, and finally dormant. From any of those states they can come back: at-risk users can be reactivated, and dormant users can be resurrected, after which they return to being current.

The model uses seven mutually exclusive states:

State Definition
New Using the product for the first time ever
Current Active today, and also active at some point in the past week
Reactivated Active today, active in the past month, but not in the past week
Resurrected Active today, but not active in the past month
At risk (weekly) Active in the past week, but not today
At risk (monthly) Active in the past month, but not in the past week
Dormant Not active for at least 30 days

Active users or learners?

One nuance is worth calling out before building anything. Duolingo talks about learners, not active users, and our education clients usually do the same. A user might open the app, change a setting and browse some courses without getting any real value. What you actually want to know is how many become learners, because that's when the product is delivering.

At Brainly, for example, a learner was someone who spent enough time on an answer page to plausibly have read it — calculated from average reading speed multiplied by the word count of the answer, a practical proxy for whether an answer had actually been read.

The same logic holds outside education. An e-commerce app might count someone as active just for opening it, but opening an app isn't a core value action — searching for a product is closer to what actually matters. Whatever the product, the pattern is the same: pick the event that represents real use, not just presence, and define "active" from that.

For this walkthrough, use Amplitude's "any active event" to keep things simple, but in a real implementation, swap in the event that represents genuine value for your product.

Start with the built-in Lifecycle chart

Depending on your Amplitude plan, you may already have a shortcut. Under the additional chart types there's a Lifecycle chart that breaks your user base into new, current, resurrected and dormant users.

It's not the full CURR model, and the definitions differ slightly. Current users, for instance, are those active in this period and the previous one, rather than active today and in the past week. You can adjust the usage interval, and it's a decent first view of how your user base is shifting over time. But to answer the questions the CURR model asks, you need to go further.

Building the seven cohorts

Create each state as its own cohort, saved into a dedicated folder with a consistent naming prefix so they're easy to find later. After more than 30 Amplitude implementations, naming conventions are not something worth compromising on.

The trick throughout is the date range picker's offset setting, which lets you look at a window that excludes the most recent days. Here's how to define each cohort, using a seven-day week and a 30-day month. Whether you use six or seven days for a week is up to you; just be consistent.

  • New users 10:08 — Users who are new during the last one day. Build this as a cohort rather than using the "new users" option in the chart's segment picker, because once you start combining it with the other cohorts, segmenting everything by new users gets messy.
  • Current users 11:39 — Performed any active event in the last one day, and also performed any active event in the last six days offset by one day. The offset excludes today, so the second condition checks the rest of the week.
  • Reactivated users 13:39 — Performed any active event in the last one day, didn't perform any active event in the seven days before today, and did perform one in the 22 days before that (last 22 days offset by eight).
  • Resurrected users 16:26 — Performed any active event in the last one day, didn't perform any active event in the last 29 days offset by one, and isn't in the new users cohort. Excluding new users, rather than requiring activity within the past year, is cleaner because it also catches people returning after more than 365 days.
  • At risk (weekly) 19:36 — Performed any active event in the last six days offset by one, but didn't perform any active event in the last one day.
  • At risk (monthly) 20:56 — Performed any active event in the last 22 days offset by eight, but didn't perform any active event in the last seven days.
  • Dormant users 22:06 — Performed any active event in the last 365 days offset by 30, and didn't perform any active event in the last 30 days. Users dormant for more than a year are usually better handled in a lifecycle marketing platform such as Braze, Iterable, HubSpot or Klaviyo than analysed directly in Amplitude.

Building the dashboard

With all seven cohorts in place, the dashboard comes together quickly.

  • Cohort summary tiles 25:16 — One tile per state, laid out in a single row in journey order: new, current, at risk (weekly), at risk (monthly), reactivated, resurrected, dormant. Duolingo tracks these daily. At Brainly, weekly was enough to see how many current users there were in a typical week.
  • New user retention 27:12 — A standard retention chart over the last 30 days, which takes seconds to add.
  • Cohort populations over time 28:01 — This is where you see the trends: a steady base of current users, fluctuations in at-risk users and spikes in dormancy. One limitation to know about: Amplitude blocks cohort population charts for cohorts with a duration of more than 101 days, so the 365-day dormant cohort won't plot over time. For the trend chart, use a 60-day version, which is perfectly reasonable for spotting movement, and keep the wider definition for the overall total.
  • Funnels by lifecycle state 30:46 — Build a funnel from any active event to your core value event (in the demo, playing a song or video), then add a segment for each cohort. Comparing reactivated and resurrected users side by side shows whether returning users actually get value once they're back.
  • Campaign attribution for returning users 32:34 — Filter by the resurrected or reactivated cohort and group by UTM campaign to see which email, social or organic campaigns bring back the most users. That's where lifecycle data turns into a re-engagement strategy.

From there you can go deeper into resurrected and reactivated users with journeys, retention, personas, stickiness or the engagement matrix, to understand what actually brings people back.

Wrapping up

The CURR model is one of the clearest ways to see the health of a user base, and everything it needs can be built in Amplitude with cohorts, a few date offsets and a well-organised dashboard. The most important decision isn't technical, though: it's agreeing what "active" really means for your product.

For more tips, join the Amplitude community Slack, where our team answers questions regularly.

Want help defining lifecycle states that reflect real value in your product? Tell us your goals.

We use strictly necessary cookies to make this site work. We would also like to set analytics and marketing cookies to understand how the site is used and which channels bring people here. These are off unless you turn them on, and you can change your mind at any time from “Privacy Preferences” in the footer. Read our privacy policy