How I Built a First-Time Todoist Setup That Mostly Stuck
1. Creating a project that doesn’t end up as a junk drawer
The first time I opened Todoist, I made a project called “Life Admin” and then immediately abandoned it six days later. It had birthdays, DMV renewal notes, something about taxes in July, and a vague reminder to reply to Rachel. That project still exists — untouched — because it was too vague to ever actually interact with.
If you’re starting from scratch, don’t make a project just because it sounds tidy. Make them based on where you’re physically or mentally located when you need the task. Like, don’t lump groceries and critical work deliverables into “Errands” just because they both happen after lunch.
What actually works better:
- Have two separate projects for “Quick Decisions” and “Open Loops” — split by whether other people are bottlenecks
- Reserve “Inbox” for whatever your phone thought was important enough for six taps at midnight
- Only create shared projects if the other person has used Todoist before. Otherwise you’re making a ghost note system nobody opens
It’s tempting to use all caps or symbols in project names. Don’t. For whatever reason, when I added an asterisk to make “*High Priority”, Todoist’s API treated it differently while bulk editing on mobile. It visually looked right in the app but didn’t update the label ID when modified from web later.
2. Why labels break your brain faster than they help
I honestly think I added the “@email” label to twenty tasks in a row, then sat back like I’d really done something. Spoiler: I hadn’t. The next day, I was still scanning all tasks manually.
Here’s the problem: labels only help if you sort by them later. And Todoist doesn’t exactly make that frictionless. On mobile, finding all @email tasks means navigating back to the main menu, tapping Labels → confirm → accidentally open yesterday’s version because of lag → now you’re just annoyed.
Also: label-based filters don’t update consistently when used in multiple tabs. I had two browser windows open — one filtered by @deepwork, one by @urgent — and edited a task’s label in one tab. The other tab didn’t reflect the change even after manual refresh. The data had shifted, but the task remained ghosted in the previous filter view. It was cleared in the API, but not visible in the UI.
If you treat labels as action verbs, like “@reply” or “@review,” the system improves a bit — but only if you also commit to using filters regularly. Otherwise, the cleanup cost outweighs the benefit within a week.
3. Getting recurring tasks to repeat without losing context
Todoist’s recurring syntax is powerful, but a little too magic-feeling sometimes. Like, you write every other Monday at 9am
and it feels right — until you realize it actually means “every second Monday from the day I created it,” not from the calendar week’s Monday number.
One task I’d set for “every 1st Monday” somehow showed up on the 8th the next month. It turns out it wasn’t a bug — I just typed “every Monday starting Feb 1” during setup. Todoist uses the starting day as its baseline offset.
Another little behavioral oddity: If your recurring task includes addition (“every 1st and 3rd Friday”), and you check it off early using the mobile widget, sometimes it overrides and re-dates both instances to “today.” It’s replicable with Android’s pixel launcher widget and a fast tap network lag.
Eventually I started creating recurring tasks with more specific natural language, like:
“Reconcile credit card – every 7th of the month at 6pm”
For midweek flexibility tasks, using stuff like “every Mon, Wed, Fri at 8am” actually works better than “every weekday,” because the former creates tasks you can safely delay one at a time without messing up the others.
4. Using filters that don’t collapse under real-time changes
This part is genuinely fragile, depending how complex your filters get. I had a favorite view called “Today + Overdue + No label,” like this:
((today | overdue) & !@waiting)
After refreshing the app mid-day, tasks stopped appearing that clearly fit the criteria. Turns out: if you’re combining logic with OR and AND, the parsing engine sometimes defaults to evaluating left-to-right without parentheses consistency. It’s not documented behavior, but it’s repeatable if you watch closely.
Also, if you’re editing a filter while offline (e.g., train tunnel) and then save it, the sync fails silently. I didn’t realize this until the filter showed no results and I almost deleted it completely. Later, checking the web version, I saw that the new logic never applied — it just kept showing the prior filter without warning.
A few working tips:
- Use parentheses even if you think you don’t need them
- Never use more than one NOT operator unless you enjoy guessing
- Use relative dates like “next 3 days” instead of “today | tomorrow”
- Pin filters to mobile favorites manually — they don’t sync by default
Once I figured out you could use “p1 to p3” as a proxy for urgency, it clicked. You can simulate a priority queue without adding another label just by working top-down from high to low.
5. Sub-tasks and why nesting usually punishes your future self
There is a seductive logic to nesting tasks: Break this big item into pieces, add dates to each one, move things forward in chunks. But Todoist still treats sub-tasks inconsistently depending on which view you’re in.
Try this: mark a parent task as complete in the Today filter. Boom — now all sub-tasks get auto-marked done, even if you haven’t touched them. That’s not a setting; it’s assumed behavior in certain filters, specifically on older iOS versions. I lost about six little sub-tasks after accidentally marking a parent before wrapping up.
I stopped trusting deeply nested tasks and went flat. Instead of:
• Submit proposal
• Draft outline
• Get Alex’s feedback
• Attach budget
I now do this:
• Submit proposal - Draft outline
• Submit proposal - Get Alex’s feedback
• Submit proposal - Attach budget
Yes, it’s dirty and duplicates the prefix, but search and filtering love it. It’s easier to spot items, and you don’t lose progress when something collapses under a parent update.
6. When your mobile and desktop versions start gaslighting
This probably only hits if you’re bouncing between phone and laptop constantly. I had recurring tasks that synced fine on desktop, but showed misdated or duplicated on mobile. Example: I’d mark “Send weekly update” as complete in the web app, and hours later it’d reappear as overdue on Android.
Todoist’s sync interval isn’t as realtime as you think, especially on battery-saver Android settings. If low power mode de-prioritizes background refresh, you’ll check off something and it’ll uncross ten minutes later — not because of conflict, just delayed propagation.
I found this by diving into “Active Sync” logs via the developer console on desktop — not officially documented, but it’s exposed via keyboard shortcut Ctrl+Shift+I
, then going to Network tab and filtering by ‘sync.’ It showed stale timestamps on mobile actions not getting confirmed server-side until the next foreground launch.
Solution? Force open the mobile app and pull down to refresh before trusting anything critical. It’s ugly, but I stopped missing deadlines once I started forcing active syncs manually around time-sensitive things.
7. Quick capture setups that don’t require thinking at all
You want fast capture — no sorting, no choosing. I’ve tried a lot of combos but fell into something kinda reliable:
- Use the Quick Add button with a default project like “📥 Temp Drop”
- Set default priority to p3 so it has at least mild visual urgency later
- If it starts with “buy,” use an automation to move it to Groceries
The automation’s hacky. I pushed Todoist to Notion via Make, ran a regex on task names, and moved them using the API if they included shopping verbs. Doesn’t always fire on time, but caught about 80% correctly.
The weirdest bug I hit? Google Assistant integration with Todoist sometimes interpreted “add eggs to my list” as a new label called “to my list” and dumped “eggs” in the Inbox with no context. Only started happening after I reconnected the integration under a different Google account.