30-04-2021



  • At its core, Todoist is a task management application that helps to manage your personal and professional productivity. You can use it to manage your tasks from a smartphone, tablet, or computer. And it also has a premium version that enables collaboration with other members of your team.
  • In Todoist, you can make sure you never miss a thing by adding due dates and/or times to your tasks. You can even create recurring or repeating due dates like “Send Mom a birthday card every July 19” and “Take out the recycling every other Wednesday”.

A task manager you can trust for life. In the 14 years and 84 days that we’ve been building Todoist, we’ve never considered selling out or becoming acquired. Our team is committed to staying independent and earning your trust for as long as you need our apps. Todoist is the productivity tool you need to get work and life organized. Collect tasks, organize projects, and plan your day. Using recurring and repeating tasks in Todoist is a great way to save time and stay on top of tasks that happen more than once.The basic set up is the same a.

Dates in Todoist can sometimes be a bit confusing. Here you will find a complete overview of the date formats and the ways of using dates in Todoist.

Note: I recommend to bookmark this post so that you can easily find it when you are struggling with dates in Todoist.

How to set dates in Todoist

You can set dates in Todoist using the calendar/date selector, or by using natural language.

Todoist will automatically recognize and add due dates as you type them into a task name. This feature is called Smart date recognition. You can turn this feature on or off by going to Settings / General / Smart date recognition.

Disabling Smart date recognition for a single task

Sometimes, Todoist’s Smart date recognition can be a source of irritation. Let’s say the task is “Finish monthly expense report” By the time you type “Finish mon” Todoist will have interpreted this as a task named “Finish” that is due on Monday. To avoid this, press backspace or delete on your keyboard, or tap the highlighted word on your phone or tablet.

Natural language formats

Daily

Relative dates

WriteTo get
todToday’s date
todayToday’s date
today at 9Today at 09:00 (or 9 am)
tomTomorrow’s date
tomorrowTomorrow’s date
tomorrow at 21:00Tomorrow at 21:00 (or 9 pm)
next weekNext Monday (or what you have specified as the start of the week in settings.)
end of monthThe last day of the current month
next monthThe first day of the next month

Specific dates

WriteTo get
25 feb25. February current year
feb 2525. February current year
25thThe 25th day of the current month
feb 13 201913. February 2019
13.02.201913. February 2019
13/02/201913. February 2019
2019/02/1313. February 2019
02/13/201913. February 2019
13-02-201913. February 2019
2019-02-1313. February 2019
02-13-201913. February 2019

Specific days

WriteTo get
monNext Monday
mondayNext Monday
tueNext Tuesday
tuesdayNext Tuesday
wedNext Wednesday
wednesdayNext Wednesday
thuNext Thursday
thursdayNext Thursday
friNext Friday
fridayNext Friday
satNext Saturday
saturdayNext Saturday
sunNext Sunday
sundayNext Sunday

Recurring due dates in Todoist

The only way to set recurring due dates in Todoist is by using natural language. I’m tempted to say that your imagination is the limit but to make it easy to get started, I have made some tables below.

Relative numbers

WriteTo get
everyEvery day, week, month, etc
every 2Every other day, week, month, etc
every otherEvery other day, week, month, etc
every 3Every third day, week, month, etc
every thirdEvery third day, week, month, etc
every 4Every fourth day, week, month, etc
every fourthEvery fourth day, week, month, etc
every 5Every fifth day, week, month, etc
every fifthEvery fifth day, week, month, etc
every 6Every sixth day, week, month, etc
every sixthEvery sixth day, week, month, etc
every 7Every seventh day, week, month, etc
every seventhEvery seventh day, week, month, etc
every 8Every eighth day, week, month, etc
every eighthEvery eighth day, week, month, etc
every 9Every ninth day, week, month, etc
every ninthEvery ninth day, week, month, etc
every 10Every tenth day, week, month, etc
every tenthEvery tenth day, week, month, etc

The use of ! (exclamation mark)

Thanks to the tip from Keith in the comment section, I can list a very useful function that was unknown to me: The format Every! will calculate the next occurrence from when you complete the task. Meaning that if you complete the task later than on the first due date, the next occurrence will be calculated from when you completed the previous task.

Specific dates and days

WriteTo get
every 1stEvery 1st of the month
every last dayEvery last day of the month
every other mondayEvery other Monday
every morningEvery day at 09:00 (9 am)
every eveningEvery day at 19:00 (7 pm)
every weekdayEvery Monday, Tuesday, Wednesday, Thursday, and Friday
every workdayEvery Monday, Tuesday, Wednesday, Thursday, and Friday

Setting start dates for non-recurring tasks in Todoist

Start dates for non-recurring tasks are actually not supported in Todoist. The dates above are all due dates. You have three options to get around this:

  1. Register the start date as the due date. When the task shows up, use the every day until <due date> to make the task repeat until the desired due date.
  2. Register the task with due date every day from <start date> to <due date> .
  3. Register the task with a due date and set a reminder for the start date.

Start and end dates for recurring tasks in Todoist

WriteTo get
every day starting december 01Every day from 1st of December
every day ending december 01Every day starting today, ending 1st of December
Every day for 4 weeksEvery day starting today, ending in 4 weeks
Every day for 5 monthsEvery day starting today, ending in 5 months
Every day from 01 december to 10 decemberEvery day starting 1st of December, ending on the 10th of December

Set due dates in Todoist with Smart Schedule

The Smart Schedule function in Todoist is an AI-based function that helps you schedule or re-schedule your tasks. It learns over time, making better and better predictions. Upgrade old macbook pro. To learn more about the Todoist Smart Schedule function, visit this help article from Todoist.

Dates in Todoist filters

For a complete overview of how to make filters in Todoist, please visit the below blog post.

The ultimate guide to Todoist filters

View
Here you will find everything worth knowing about Todoist filters. Filters are a great tool, both when you need an ..
Read More

Date formats

  • Given date: 15.01.2017
  • Given date US format: 01/15/2017, Jan 15th
  • Given date and time: 15.01.2017 16:00
  • Given date and time US format: 01/15/2017 4 pm, Jan 15th 4 pm
  • Relative date: yesterday, today, tomorrow
  • Due Date: 2 days (due in the next two days), -2 days, (due in the past two days)
  • Days of the week: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

Creation dates

  • created:
  • created before:
  • created after:

Due dates

  • due:
  • due before:
  • due after:
  • next X days
  • overdue
  • recurring
  • no date

Filtering on Creation dates

QueryShows
created: todayAll tasks created today
created before: -365All tasks created more than 365 days ago
created after: 01/15/2017All tasks created after Jan 15th, 2017

Filtering on Due dates

QueryShows
due todayAll tasks due today
due before: Jan 15All tasks due before January 15
due after: 01/15/2017All tasks due after Jan 15th, 2017
due in 2 dayAll tasks due in two days
next 10 daysAll tasks due in the next ten days
overdueAll tasks that are overdue
recurringAll tasks with recurring due date
no dateAll tasks without a due date
!no dateAll tasks with a due date

Todoist is my favorite todo app but it’s missing one REALLY critical feature. The ability to see today’s tasks sorted by project.

Daily task in todoist

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.

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:

Export Todoist Tasks

  • 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:

Repeating tasks todoist
  • the key value with your Todoist API key
  • filter_today with the filter id from the first filter we made
  • filter_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

Todoist Daily Tasks

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:

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!

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.