Push Notifications
Push notifications are an outside-the-app retention mechanic — the only way to win the user back from whatever else has their attention. Duolingo runs one of the most-copied playbooks in mobile.
This page covers the system underneath it: hook every push to a motivation the user already responds to, lean on social pull where it's available, and time the cycle to the user's actual day.
01OPERATING PRINCIPLE
Motivation Hooks
Notifications don't drive engagement on their own — they ride on top of features the user has already proven they care about. The hook does the work; the push just points back at it.
Vin 👀
3:39 PMYou're SO close to a 75 day streak
You're out of the top 5 😢
11:44 PMDon't give up! Keep practicing. Only the top 5 in your league move up!
🥉 Duo's got a prize for you
12:15 PMCongrats on getting bronze! Keep it up in the Ruby League.
Pushes hook into motivations, not features. Most apps treat the push itself as the persuasive object — "Open the app!", "Don't miss out!" Those messages don't reference anything the user cares about, so they get ignored. Duolingo's pushes invert this by hooking into a motivation the user has already invested in. Streaks are a proven hook for continuity. Leagues are a proven hook for competition. Friend streaks are a proven hook for social belonging. Badges are a proven hook for completion. Each push points back at a feature the user is already emotionally invested in. Strip the hook and the message is generic, and generic pushes get muted in a week. The pattern travels to any product: whatever your proven engagement features are — a streak, a status rank, a friendship, a milestone — the push has to point at one of them.
A portfolio of hooks beats a single hook. A single hook would mean every push pulls on the same emotional nerve, which fatigues fast. Duolingo runs a portfolio — continuity (streaks), competition (leagues), belonging (friend streaks), completion (monthly badges), reward (tier prizes) — and pulls from whichever hook a given user has invested in most. A long-streak user gets continuity pushes; a competitive user gets league pushes; a social user gets friend pushes. The portfolio is what makes the channel durable: one delivery engine, many motivational levers, rotated so no single hook gets worn out. Push fatigue is usually framed as a volume problem, but the deeper issue is hook monotony — the same nerve, hit too often. A portfolio of hooks solves it.
03OPERATING PRINCIPLE
Daily Push Cycle
A user's day has predictable opportunities to send a push. Duolingo builds a designed cycle around those — every push fires on a behavioral or state trigger, never on a fixed wall clock. Two slot types, two pushes a day max.
Hi, it's Duo
11:30 AMReady for today's lesson?
Sally
10:17 PMahsdkjfhsdk don't forget our streak!
🏃 Last chance to get promoted!
9:43 PMYou're on your way up to the next league. Earn more XP now!
🔥 Last chance!
10:00 PMYour 36 day streak ends in 10 minutes. One lesson saves it.
Routine notifs and save notifs split the day. Duolingo's notification system runs two named slot types, codified internally: *routine notifs* and *save notifs*. Routine notifs are the gentle, on-cadence pushes that fire around the user's habit window — a partner nudge, a casual Duo greeting, a low-stakes reminder that names the anchor and steps back. Save notifs are reserved for the moment something is about to be lost — the 10pm streak saver, the last-chance league promotion, the friend streak about to drop. Two slots, two purposes: the routine keeps the channel warm, the save catches imminent loss. Most apps blow this distinction by treating every push as urgent, which fatigues the channel inside weeks; Duolingo holds urgency back for the save and keeps the routine quiet. The discipline is in the split — and in the cap that holds it: two pushes a day, max.
Behavior triggers the cycle, not the clock. Every push has to clear a behavioral or state trigger to fire — there are no scheduled broadcasts. Routine notifs read the user's revealed habit window: they practiced at 6pm yesterday, the push fires at 5:30pm today. Save notifs read the state of the user's commitments: the streak about to expire, the league cycle about to close, the reward about to lapse. Earlier versions of the system asked users to pick their own reminder time, and the result wasn't users getting their preferred time — it was users missing their notifications because, as the team has put it, "life always gets in the way." The fix wasn't smarter user input; it was throwing user input out and reading actual behavior instead. Behavioral and state signals replace the wall clock because they're the only signals that predict whether the user can act on the push when it arrives. A push the user can't act on is wasted reach, and wasted reach is how a channel slowly burns out.
Motivation Hooks
Five pushes, four motivations — continuity (streak), competition (league), completion (badge), reward (prize). Each one points at a different feature the user has already invested in.
Daily Push Cycle
Routine notifs across different habit windows, plus save notifs at moments of imminent loss. Same engine, different behavioral and state triggers.