- View Completed Tasks Todoist
- Todoist Everyday Task Log
- Todoist Daily Tasks
- Todoist Task Duration
- Repeating Tasks Todoist
- Todoist Everyday Task Card
- Todoist Everyday Tasks
- Use Todoist to:. Capture and organize tasks the moment they pop into your head. Remember deadlines with reminders and due dates. Build lasting habits with.
- This should be the difference between 'Every Day' and 'Every! Day' but they both appear to do the same - 'Every! Day' works and 'Every Day' doesn't. I have multiple tasks like this and if I go away for a month I want to be able to work through the backlog without having to create 365 tasks (plus 1 for leap years) that recur annually.
Todoist is my favorite todo app but it’s missing one REALLY critical feature. The ability to see today’s tasks sorted by project.
Their default “Today” view is a total bummer. I find it unusable. Nobody goes into their Todo list to see tasks from various projects all jumbled together. If I’m working on a work project, I want to see all my urgent tasks grouped together by the context I’m working within, which is almost always by project.
It’s just too hard to get a coherent view of what you need to work on for the day when tasks are mixed together without context.
As you might suspect, I came up with an awesome solution that turns this
Into this!
I’m going to show you how to make the utimate “Today” filter view. All your tasks for the day separated by project. It requires some code but it’s automated. Do the work once and live forever with the perfect “Today” view.
Use ToDoist App to Improve Daily Habits and Self Care: Boy, the past year has been a wild ride, eh? Keeping up with regular good habits that improve your mental and physical health has been an even bigger challenge than normal. There is a lot of information out there about the benefits of regular sleep.
I’ve customized mine to include anything that is either
- Due today
- Overdue
- or Priority level 1
And I choose not to include subtasks (since they will be viewable under their parent task) or repeating tasks.
You of course can customize your “Today” filter to your liking as well.
The Manual Way
Ok before we jump into the automated stuff it’s important to understand how this stuff works.
If you wanted to setup a “Today” view with tasks grouped by project, you would have to create a filter with a query that includes every project.
A filter with the query #Project 1 & (today | overdue)
would show you everything due or overdue for Project 1.
A filter with the query #Project 1 & (today | overdue), #Project 2 & (today | overdue)
would give you a view that first shows Project 1 tasks grouped together and then Project 2 tasks.
So let’s say you’ve got 5 projects that each have tasks due today. You would have to create a filter query that lists each project out. And if you don’t happen to have tasks due for certain projects, they’re still going to show up uselessly in your view:
To make things even more annoying, you would need to update your filter every time you:
- Add a new project
- Delete a project
- Change the title of a project
Or the whole thing breaks. This is far too onerous to do manually. But it’s easy to keep this filter up-to-date automatically with the power of code and cloud functions!
So now that you understand how it works manually let’s get to the fun part.
How to Automate the Perfect “Today” Filter
Ok let me break down how this works. We’ll be writing a script that uses Todoist’s API to update your “Today” filter. We’ll make this script fire automatically in the cloud with something called a Google Cloud Function. Lastly we’ll create something that will trigger this Cloud Function every hour (or whatever interval you choose) so your “Today” view always stays up-to-date.
If you’re not very techie don’t worry I’ll walk you through it. But I always encourage everyone to at least learn the basics of code.
I’m not a developer and I definitely don’t code every day. But it is invaluable to know enough to be able to see where and how things like this might be automated.
If you just know enough to identify the possibility of a useful automation then you can get someone to help you make it very inexpensively.
If you just know enough to identify the possibility of a useful automation then you can get someone to help you make it very inexpensively.
Ok, onto the tutorial!
Create a Google Cloud Function
This step assumes you already have a Google Cloud Platform account that is set up. If you don’t, go set up your free account. Here’s a step-by-step guide on how to do that.
Go to console.cloud.google.com/functions (or get their by clicking the Menu > Cloud Functions) and click “Create Function.”
Give it a good name so you can figure out what it is in the future. You can’t edit the name later so take a moment to set it now.
You can leave the “Region” alone. It doesn’t really matter for our purposes.
Now under “Authentication” select Allow unauthenticated invocations
. Then click “Save.”
Now expand the “Variables, Networking and Advanced Settings” section, choose 128 MiB
for “Memory allocated”, and click “Next.”
Now select Python 3.7
as the “Runtime”. If Python 3.7 is not available to you just pick the lowest Python version available and let me know if you run into any issues.
Change “Entry point” to update
.
Erase everything in the code window on the right so we can start with a clean slate.
Now click on “requirements.txt” and add a new line containing todoist-python
.
This allows us to use special functionality that Todoist made for the Python language.
Now click on “main.py” to get back to the main file.
Ok before we go any further we’re going to have to do a couple things in Todoist to prepare.
Create the First Filter
We’re going to need to create 2 “Today” filters. The first is used to help our script figure out what tasks and projects need to be included in the second “Today” filter (the one you’re actually going to use.)
Other than that you won’t use the filter we’re creating in this step. So make sure you don’t accidentally delete it in the future or else the filter you do use will break.
Go create a new filter in Todoist. You can call it Today
if you like. Or call it something else. Changing the name won’t hurt anything.
If you just want to view tasks that are due today or overdue you can give it the query (today | overdue) & !subtask
. I recommend including !subtask
or else subtasks will show up twice (under the parent task and separately as their own entry.)
In my case I like to also include tasks with a priority of 1 and exclude tasks that are recurring. So I personally use the query (today | overdue | p1) & !subtask & !recurring
.
Click on your newly minted filter and take a look at your browser’s address bar. You should see something like todoist.com/app/#filter%2F2290276
. Jot down the number that appears after filter%2F
. In this example it would be 2290276
.
Create Your Main Filter
Now let’s create the filter you’ll actually be using! I like to call mine ⭐ Today
but call yours whatever you want. Just like you did in the previous step, write down the id number. In this example it would be 2344358
. Todoist requires that you put something in the query. Put whatever you want it will get overwritten later.
Get Your Todoist API Key
You can find your API key at todoist.com/prefs/integrations from your browser, or you can get to it by clicking on:
- The gear icon in the upper-right corner
- Settings
- Integrations
Scroll down and you’ll find your API key. It should look something like b0imfnc8mwsae3aaw6465jr50qtlx
. Copy and save it somewhere. We’ll need it later.
Write the Code
Ok head back to your Google Cloud Function. It’s time to write the code that makes the magic happen.
Copy and paste the following code into the code editor on the right, but change the following 3 things:
- the
key
value with your Todoist API key filter_today
with the filter id from the first filter we madefilter_today_new
with the filter id from the second filter we made
Please note that this code is customized to my personal preferences. I like my 'Today' filter to show everything that is due, overdue or of priority 1. If you don't want to see priority 1 tasks, just replace everything that says (today|overdue|p1)
with (today|overdue)
.
Or on the other hand you might want to include both priority 1 and priority 2 tasks. In this case just change every instance of (today|overdue|p1)
to (today|overdue|p1|p2)
... You get the idea.
In case you need it, you can brush up on Todoist filters here.
I also omit recurring tasks. If you don't want to do that just erase every instance of &!recurring
.
The Catch All
This code will be scheduled to run periodically. I set mine to run every hour. I'll show you how to do that in a moment.
But first you might be wondering... What if you create a new project and add a task that's due today? Do you have to wait until the script runs and updates your 'Today' filter before you can see it?
Or what if you add a task that is scheduled for today to an existing project? Do you have to wait until the script runs to update your filter?
Well I'm glad you asked. I added a catch_all
section to the end of the filter query. It looks for tasks that are due or overdue (plus whatever other criteria you specify) that does not belong to any of the projects it currently is looking for.
That way you always can see every task that you need to see for the day.
Any tasks in this 'catch all' section will automatically be added to their own project section the next time the code runs. But with this 'catch all' section you can feel confident that you'll never miss anything when using this 'Today' filter view.
Deploy Your Cloud Function
Once you're done customizing the code click on 'Deploy.'
In 3 to 5 minutes your Cloud Function should be deployed into the cloud. You'll see a green check mark if it's successful.
If it doesn't work make sure your indentations are exactly consistent. Python is a stickler for indentations. Even adding an extra space can throw things off.
If you get an error you can click on the cloud function and click on the 'Details' tab to see the errors. Try Googling them. Make sure you didn't erase anything small that might cause a syntax error.
Copy Your Trigger URL
Ok time to do something cool. Click on your Cloud Function. Then click on the 'Trigger' tab and copy your Trigger URL.
Anytime anyone or anything visits this URL, the code in your Cloud Function will run, updating your 'Today' filter. Go ahead and test it to make sure it works. Within a few moments of visiting the URL you should see your 'Today' filter in Todoist magically update.
You can save this URL in case you want to manually trigger it. I saved mine as a comment in my Inbox just to keep it handy.
Ok copy that URL we'll need it for the next step.
Schedule Your Code to Run Automatically
You want your Cloud Function to run and update your filter automatically of course. You can do this for free with Google's Cloud Scheduler or you can use IFTTT or Zapier.
It's easy to do. It takes like 2 minutes. Just make sure you have your trigger URL copied to your clipboard and follow this simple guide to schedule it: How to Schedule Triggering a Google Cloud Function
Caveats
Todoist filter queries have a limit of 1,024 characters. If you have a lot of projects that are all due now, the length of this filter could exceed 1,024 characters and break. It's never happened to me but it's certainly possible if you have a lot of projects with tasks due at once or if your project names are super long.
I wrote the code to be smart enough to not add the 'catch all' section if doing so would put you over the 1,024 character limit.
If you still end up exceeding the query length limit you'll get an error like this when viewing your filter in Todoist:
View Completed Tasks Todoist
If you edit your filter you'll clearly see whether the issue is going over your character limit:
This is all unlikely to happen but I want to be sure to address it in case it does.
You're All Set!
Todoist Everyday Task Log
I use this filter on the daily. Todoist is 1,000x better with this beautiful, custom 'Today' filter! Hopefully yours is too!
Hopefully Todoist will add this functionality to the app natively but in the meantime there's no reason you can't enjoy it starting today 😄.
Let me know how this works for you. I'd love to hear about it in the comments or on Twitter.
I've been using Todoist almost daily for the last 4 years. I've learned a lot of tips and tricks along the way, which I'd like to share with you. The official guide describes the basics to get started, but I want to cover some more advanced or lesser-known features in this post.
Update: Todoist also published a Hidden Features post, covering even more tips & tricks.
Customize your start page
As of version 949, custom queries were removed. You will have to create a custom filter and select it instead.By default, Todoist uses the 'Next 7 days' view. But it's also possible to define any project, filter or custom query as home page. Go to Settings → General and select Custom query as your Start page.
That's the query I'm using: overdue, 3 days, @next, p:Inbox
. This will show the following sections by default:
- overdue
- next 3 days
- tasks marked with
@next
label - the inbox (depends on your language, e.g. it's
p:Eingang
in German)
Recurring tasks based on completion date
Todoist offers many ways to create recurring tasks using the every
keyword. One overlooked feature is adding ! to every. Here's the difference:
every month
creates tasks based on the task's original date. This is useful for tasks with exact due dates, e.g. paying your rent.every! month
creates tasks based on the task's last completion date. This is more appropriate for tasks that must be completed at regular intervals, e.g. working out.
Let's say we create a recurring task on January 10 and complete it on January 15. When every
is used, the next occurrence is February 10, while every!
leads to February 15:
Postponing recurring tasks
Todoist Daily Tasks
In a perfect world we would always complete our scheduled tasks on time. But sometimes you can't or don't want to finish a task today. There are various ways to deal with this:
- Leave the task as overdue and finish it later. This may not be the best solution for passionate procrastinators, though. This also reduces your Karma points if you leave a task overdue for more than 4 days.
- Mark the task as completed. However, this will distort your Karma points (as you check off a task that you did not actually complete).
- By editing the date field or using smart date recognition you are able to re-define the task's schedule. This is not the preferred way to reschedule tasks, but it's possible using the
starting
keyword, e.g.every day starting tomorrow
- Much more convenient is the built-in postponing mechanism. Open the task's menu and click on the circle arrow to reschedule the task to its next due date. This will not alter your task's original date query.
Structure subtasks
Subtasks are handy to structure your tasks within a project. Let's improve the hierarchy visually by connecting the following features:
- A task starting with
*
(followed by a space) will hide its checkbox. This makes it perfect for subheadings. - Todoist supports basic Markdown formatting, so surround a text with
**Text**
to make it appear bold.
When combined, we are able to create a 'Scheduled' project with * **Monthly**
, * **Weekly**
and * **Daily**
sections:
This makes it easier to distinguish parent projects from subprojects.
Todoist Task Duration
Archive subtasks
Completed tasks are archived automatically. However, this does not apply to subtasks by default. Instead, checking off a subtask marks it as completed without removing it from the view:
This may make sense for some people, but I don't like seeing completed tasks on my todo list. You can select the task's menu and click Archive
, but there is an easier way to achieve it: Hold down Shift
on your keyboard while checking off a subtask to automatically archive it.
Expand / Collapse all tasks
Subtasks are not only useful to structure your tasks. They also allow you to hide/collapse all children tasks by clicking the black arrow.
It would be great to collapse/fold or expand all subtasks at once, especially when dealing with many tasks. Unfortunately, Todoist does not offer such a feature, but it's possible with Bookmarklets, small scripts stored as browser bookmarks.
Drag and drop these links onto your bookmark bar and click them while your Todoist web app is open:
Repeating Tasks Todoist
Projects comments (premium)
Todoist Everyday Task Card
You might have been using task comments already: hover over a task and click the speech bubble that appears next to the task name.
But did you know that you may also attach comments to projects? It's quite useful for generic notes or discussions.
Backup your data
I manage most of my tasks in Todoist, and I'd really hate losing any of them. If you're a Premium user, Todoist already creates automatic backups for all your active tasks. You can also try my Export tool for Todoist — an app I have written several years ago. It's free, open source and doesn't require a premium account. It also allows you to download all your data, including account information and archived tasks (JSON only).
Conclusion
Todoist is a simple yet powerful task manager. I hope my post helps you to get even more out of this app. If you're looking for more tips, visit the (unofficial) Todoist subreddit, where people are sharing a lot of useful knowledge.
If you know more useful tips and tricks, feel free to leave a comment below.
Todoist Everyday Tasks
Do you want to try out premium features? Use my referral link and get two free months of Todoist Premium!
Related posts
Want to leave a comment?
Join the discussion at Twitter. Feel free to drop me an email. 💌