posts

I Argued Myself Into Sending an Email Nobody Wanted

I wrote a fix to stop Tobi's daily digest from sending on days with zero tasks, then canceled it with a confident argument about why users needed those emails. Three days later a TestFlight tester told me the zero-task email made no sense, and the original fix shipped the same day.

Tobi sends a daily digest email to every household: what’s due today, what’s overdue, and what’s coming up over the next two weeks. In late June I was working in the digest code and noticed what that email looks like on a day when nothing is due. The subject line reads “You have 0 tasks to do around the house today.”

Nothing about it is broken. The email renders fine and the upcoming list in it is accurate. It just didn’t seem useful to email someone about the zero things they need to do, even with upcoming tasks below the fold. So I filed a ticket: skip the send entirely when the today and overdue count is zero.

Talking myself out of my own fix

A week and a half later I picked the ticket up, wrote the fix, and opened a pull request. Then, the same day, I closed the PR unmerged and canceled the ticket as invalid. From my cancellation comment:

A household with zero today/overdue tasks but at least one upcoming task still needs the digest sent, since that’s the only way the user finds out what’s coming up. Gating the send on today/overdue count alone would silently drop those emails entirely.

That felt solid when I wrote it. The digest is the only email Tobi sends about upcoming work, so if a quiet day means no email, a household with nothing due never hears about what’s approaching. Skipping the send looked like it would break the feature for exactly the people who keep their schedules tidy.

Nobody else reads my issue tracker. The only person that comment had to convince was me, and it worked. The fix I’d already written got thrown away, and the zero-task emails kept going out.

A tester said what I first thought

Three days later, a TestFlight tester sent me feedback on Discord:

The email notifications are good, the format is perfect, simple and also helps with the engagement, though having a notification when there are 0 tasks might not make a lot of sense, so my suggestion will be adding a bit more granularity to the notification configuration so I can decide whether to be notified when no tasks are due or not.

I saw it immediately. My cancellation comment treated the upcoming list as something worth a daily email on its own, and here was a person actually receiving those emails saying it isn’t. The upcoming tasks are useful when they ride along on a digest that has real work in it. They aren’t worth an email by themselves.

The fix shipped the same day, and it’s the one the ticket described in the first place: no tasks due today, nothing overdue, no email.

// Upcoming items alone never warrant a digest, so skip before
// spending reads on the household.
if (todayDocs.length === 0 && overdueDocs.length === 0) continue;

Upcoming items still appear in every digest that goes out. They just never trigger one on their own. I also removed the “Nothing due today.” fallback from the email template, since no email can reach that state anymore.

Why I didn’t build the setting they asked for

The tester didn’t actually ask me to stop sending the email. They asked for a setting, so each person could decide whether to get the zero-task version. I shipped the hard skip instead.

Part of it is that the skip was easier to do right now, and I don’t think having an option for everything makes for a good product. The bigger reason is that a setting is a commitment. Once it exists, I have to respect it going forward, through every future change to how the digest works. Skipping the email outright gives me more to play with later and test against. If it turns out some people do want a heads-up on quiet days, I can find that out from real behavior instead of designing around a toggle I guessed at.

What I’m taking away

Don’t be afraid to be wrong. My first instinct, the one in the original ticket, was right, and I killed it with two sentences of plausible reasoning about what users need. What that reasoning was missing was an actual user. One Discord message from a person receiving the emails settled what I’d been debating with myself for two weeks.

Jul 10, 2026 analyticstobiship-a-ton
Why Weekly Active Users Is the Number I Watch in Tobi
Tobi went to public beta this week. Before it did, I picked one number to watch: weekly active users.
Jul 8, 2026 workflowaiship-a-tontobi
Idea to TestFlight in Three Weeks
Three weeks ago Tobi was an idea in my head. Yesterday it hit feature complete on TestFlight. Here's the AI workflow that got it there.
Jul 6, 2026 typescriptemailanalytics
The Emails My App Swore It Sent
Tobi's email logs in Firestore said every daily digest went out. Resend had never seen a single one. The bug was a domain verification assumption, but the real story is how my own logging hid the failure for weeks.