How Nag Mode Works: FocusCall's Escalation Ladder, Explained
Nag Mode is what happens when you don't pick up. Here's exactly what it does — the real mechanics, not the marketing version.
Nag Mode is the feature name for one specific behavior: FocusCall calling you again if you don't answer the first time. That sentence covers the pitch. What follows is what actually happens underneath it, attempt by attempt, because "it calls again" hides a handful of real decisions worth knowing about — especially if you're deciding whether to trust it with something that matters.
"I need it to not give up. One notification = zero notifications for me." — r/ADHD
That's the problem Nag Mode exists to solve. A single missed call closing the loop the same way a single dismissed notification does defeats the entire point of using a call instead of a banner.
What actually happens, step by step
- Your reminder fires. FocusCall places a call — attempt 1.
- The call ends in one of a few ways Twilio reports back to us: answered, no-answer, or busy.
- If the call wasn't answered and Nag Mode is on for that reminder, and there are attempts
left, the next call is scheduled for
nag_interval_minminutes later. - That repeats up to
nag_attemptstotal tries. - If none of the attempts get answered, the reminder doesn't vanish. It goes back to a normal pending state — waiting for its next scheduled trigger, or for you to do something about it yourself. It's never silently marked done, and it's never silently marked failed forever.
The defaults are 3 attempts, 10 minutes apart, with a 5-minute floor on the interval so it can't be set to something that amounts to constant ringing. Both numbers are set per reminder, not globally — a reminder you set up as gentler can use 2 attempts and a longer gap; one you want tighter can drop to the 5-minute floor. There's no fixed universal ladder; it's whatever you configure for that specific thing.
A no-answer and a busy signal count the same way here — whichever one Twilio reports back, the ladder treats it as an unreached attempt and moves toward the next try the same way. From the reminder's point of view, both outcomes mean the same thing: the task still hasn't been acknowledged.
A concrete run, with the defaults
Say a reminder with Nag Mode on and the default settings fires at 2:00pm and nobody picks up:
| Time | Attempt | What happens |
|---|---|---|
| 2:00pm | 1 of 3 | Reminder fires. No answer. |
| 2:10pm | 2 of 3 | 10 minutes later, as configured. Still no answer. |
| 2:20pm | 3 of 3 | Final attempt — the deterministic closing line, not a random one. Still no answer. |
| 2:20pm+ | — | Reminder returns to pending. It isn't retried again on its own — it waits for its next scheduled trigger or for you to act on it directly. |
Change either number and the shape of that table changes with it. A reminder set to 5 attempts, 5 minutes apart runs its whole ladder inside 20 minutes. One set to 2 attempts, 30 minutes apart spreads across an hour. Same mechanism, different pacing, chosen per reminder rather than fixed for the whole app.
The script doesn't stay the same — except once, on purpose
Every reminder call, including nag attempts, reads your task title inside a short spoken prompt pulled at random from a small set of different phrasings. That's deliberate: the whole reason a call works better than a notification is that it isn't yet a repeated, easy-to-dismiss signal, and a call that sounds identical every single time would start drifting toward exactly that.
There's one exception. The final attempt in a nag sequence — the last call before it gives up and the reminder falls back to pending — always uses the same fixed line instead of a random one. It's a small, deliberate design choice: the one moment in the sequence where the escalation is about to end is the one moment that shouldn't sound like every other call in it.
Why retries don't blow up the cost
Outbound calling is billed per connected minute. A call that goes to no-answer or hits a busy signal doesn't connect, so it doesn't rack up minutes — which means a missed nag attempt is close to free to place again. That's a big part of why Nag Mode can default to multiple tries without the pricing having to account for everyone's reminders getting answered on the third ring instead of the first.
What you control, and what you don't
You set, per reminder: whether Nag Mode is on at all, how many attempts (nag_attempts,
default 3), and how far apart they are (nag_interval_min, default 10 minutes, 5-minute
floor).
You don't get infinite retries, and that's intentional. The ladder always terminates back to a pending state rather than calling forever, because a reminder that never stops trying isn't meaningfully different from a notification that never goes away — eventually it's just noise arriving through a different channel, and the entire premise of this mechanism is that it isn't supposed to become that.
When to leave it off
Nag Mode is strongest when it's reserved for the handful of things that genuinely cannot slip — not switched on for your entire task list. The reasoning is the same one behind treating a phone call itself as a scarce tool rather than a replacement for a to-do list, which we go into more in ADHD Reminder Apps: What Actually Works. Turn it on for everything and you'll start declining the calls the way you'd swipe away a notification — and once a call's been declined once, it's been learned as declinable, which quietly undoes the whole mechanism.
Why it stops instead of escalating forever
It would be easy to build a version of this that never gives up — shorter and shorter
intervals, more and more attempts, closer to how a robocall dialer behaves. We deliberately
didn't. The 5-minute floor and the hard stop at nag_attempts exist so the mechanism
stays something you'd actually want on, rather than something that starts to feel like the
app is the one that can't take no for an answer. A tool that respects its own limits is
easier to trust with the two or three things you actually need it for — which is the whole
point of reserving it for those, instead of everything.