The product is organised around narrow grammar sections, so a learner doesn’t just “practise German”. They practise adjective endings after articles, or verbs with fixed prepositions, or connectors in B2 texts. That changes what a useful reminder looks like. “Come back to the app” is noise. “Come back to the section you practised three days ago, here’s the link” is something a learner can act on.
One schedule per learner and section
Every completed exercise creates or updates exactly one schedule for that learner and that section. The schedule has four steps.
It isn’t an adaptive spaced-repetition model, on purpose. With the current base of active learners there isn’t enough data to fit one, and a fixed schedule is easy to reason about, easy to debug and easy to change later. The important property is the reset. If a learner returns to the section before the schedule finishes, the system doesn’t queue another reminder. The newest practice becomes the new starting point, so a schedule is a small state machine, never a growing pile of pending emails.
The useful work is in not sending
Before anything goes out, a processor that runs every hour asks a series of questions. Has the learner unsubscribed or paused? Have they already practised this section since the reminder was planned? Have they had their weekly maximum of emails? Have they been away so long that a gentler rhythm makes more sense? Is it the right hour where they live?
The “already practised” check matters most. Without it, the system produces the most irritating email possible: a reminder to review something you reviewed yesterday, on your own. Technically that is a small state mismatch. To a learner it says the product isn’t paying attention.
Local time matters more than template polish. Each schedule stores the learner’s preferred hour and timezone, taken from when they practised. A reminder that is on time in UTC but lands at 3 a.m. in someone’s day is mostly noise.
Measuring where it breaks
Every reminder is tracked through four states: sent, clicked, exercise started and exercise completed. “The email worked” is too coarse to act on. A click without a start points to a landing or routing problem. A start without a completion points to the exercise itself. A low click rate points to the subject line or to relevance.
If you’re building re-engagement
- Tie reminders to the specific thing the user was doing, with a link straight back to it.
- Prefer a simple schedule you understand over a model you can’t yet fit.
- Spend most of the design on when not to send.
- Track each stage separately, so you know where the drop happens.
