Looking for a way to create tasks with recurring due dates in Notion? Look no further.
I’ve been trying to move all of my task management into Notion for quite some time, but until now I’ve had a few problems that I didn’t quite know how to deal with.
One of these problems was Notion’s lack of a built-in recurring task feature. Currently, there’s no way to tell the Checkbox property to un-check itself on a certain date. Additionally, the Date property doesn’t allow for repeating dates.
However – as with many problems in Notion – there’s a workaround.
In this post and video tutorial, I’ll share a method for building a task manager with recurring tasks. You can also use this to build a calendar with recurring events as well!
Before we start: If you want a Notion task manager template with recurring tasks built in, check this one out:
Managing Recurring Tasks in Notion
Here’s a quick overview of how to actually manage your recurring tasks in Notion.
Essentially, you must set your Due date to the next due date (based on your day/time interval) once you finish the task.
As you’ll see below, I’ve made this as easy as possible by creating a template with a Next Due property. This takes your due date, you recur interval (in days), and today’s date (in the case of an overdue task) and figures out the next due date for the task.
When you finish a task, just take a look at the Next Due date, and set your Due date to that date.
That’ll automatically update the Next Due property – and by using Date filters in your task list view, you can make sure those tasks are hidden once you set the new due date.
“But what about checking a “Done” checkbox? Can’t I create a formula that will set the new due date once I’ve checked off the task?”
I’ve gotten this question a lot, and it’s also something I’d like to be able to do myself – but unfortunately, it’s not possible at this time.
The problem is that Notion does not allow database properties to be changed by both manual editing and formulas/automation.
It’s either-or; Formula and Rollup properties can be changed through scripting and by the state of other properties, but they can’t be edited directly. Conversely, every other property (Date, Checkbox, Select, Text, etc) can only be edited manually.
For this reason, you can’t check a checkbox and then have Notion un-check it for you later.
If this functionality gets added to Notion at a later date, I’ll let you know here!
Notion Recurring Task Dates Template
While the video tutorial above will show you how to build this setup from scratch, you can also save yourself the work and simply grab my free Notion Recurring Dates template here.
Here’s what the template looks like at a glance:
This template allows you to create tasks with either a One-Time or Recurring type. Any Recurring task will display a Next Due date, which is based on your chosen Due date and chosen Recur Interval.
One-Time tasks will not show a Next Due date, making them visually distinct in any view that shows both types.
Additionally, there’s a handy State property that lets you see at a glance which tasks are overdue (red), due today (green), or due in the future (blue).
Here’s how to use this template in your own Notion workspace.
- Duplicate the recurring tasks template into your own workspace.
Ideally, this database will serve as your central task list, so place it somewhere in your workspace that’s easy to find.
- Modify the filters for each view
By default, the main All Tasks view filters based on tasks assigned to me, so change that assignee value to you or whoever the intended assignee is. Alternatively, delete it.
I’d recommend leaving the Type filter group; by filtering for both possible types, Notion will assign each new task a Type by default instead of leaving it blank. The default option will be whichever is listed first; edit the property and drag the options around to edit this default setting.
- Create custom views for any date ranges you want.
I’ve included a One-Week view that shows all tasks that are due up to one week from now. One-time tasks that are checked off will disappear, as will Recurring tasks that have their due date set past a week from now.
If you’d like to use other date ranges – such as one month – simply duplicate this view and adjust the filter.
- Add your tasks.
Your database is now ready for you to fill it with tasks. Add them as you see fit.
- Add day intervals to the recurring tasks.
For any task that needs a recurring due date, add a number to the Recur Interval property. This will help determine how many days Next Due will be ahead of Due.
- Change your Due dates.
To “complete” a recurring task, change the Due date to the date displayed in Next Due. This will, in turn, cause Next Due to move forward to the next logical date. Next Due functions as as guide, always telling you how to set Due.
For One-Time tasks, simply check the Done box. Your view’s filters should ensure the checked One-Time tasks are hidden.
In order to get this template to work properly, I had to develop a couple of formulas for the Next Due and State properties.
If you’re just interested in using the template, you don’t need to understand these. They are contained within their respective properties in the template, so you can easily copy and paste them from there if you need to use them elsewhere in your workspace.
However, I’ve included tabbed, readable versions of their code and a brief explanation of each one in case you’re curious. If you take the time to learn what they do, your understanding of Notion will likely deepen, and you may even think of a better way of doing this than I have!
Here’s the formula within the Next Due property.
if( dateBetween( now(), prop("Due"), "days" ) >= 1 and unequal( formatDate( now(), "L" ), formatDate( prop("Due"), "L" ) ) and unequal( prop("Type"), "One-Time" ), if( equal( dateBetween( now(), prop("Due"), "days" ) / prop("Recur Interval (Days)"), ceil( dateBetween( now(), prop("Due"), "days" ) / prop("Recur Interval (Days)") ) ), dateAdd( prop("Due"), multiply( dateBetween( now(), prop("Due"), "days" ) / prop("Recur Interval (Days)") + 1, prop("Recur Interval (Days)") ), "days" ), dateAdd( prop("Due"), multiply( ceil( dateBetween( now(), prop("Due"), "days" ) / prop("Recur Interval (Days)") ), prop("Recur Interval (Days)") ), "days" ) ), dateAdd( prop("Due"), prop("Recur Interval (Days)"), "days" ) )
Wondering what this formula does? Essentially, it makes sure that the Next Due property always suggests the most logical date based on both your interval and today’s date. This is important. Consider these couple examples:
- Example 3: It is October 3. You have a task due on October 1 (so it’s overdue), and set to repeat every 3 days. In this case, you’d want Next Due to suggest October 4 as your next date – not October 6, which is what you’d get if you added your interval to today’s date.
- Example 2: It is October 4. You have a task due on October 1, and set to repeat every 3 days. In this case, you’d want Next Due to suggest October 7 as your next date. No use suggesting today! This means the original interval of 3 days doesn’t work here by itself. You need some way of telling Notion to multiply the interval enough times to get a new due date that is after today’s date.
- Example 1: It is October 6. Again, you have a task due on October 1, and set to repeat every 30 days. In this case, you want Next Due to suggest November 1. In this case, you actually do just want to use the interval.
As you can see, there are several considerations that need to be made in order for Next Due to always be accurate – even when you’re overdue.
Here’s how this formula takes care of those considerations:
- First, it checks to see if today’s date is later than the Due date. Currently this is a bit hard to do in Notion, as the
now()function always returns a date and a time value. This means that it’s always seen as “greater” than today’s date. So we do a couple of different checks.
- If the Due Date is today or later, Next Due simply uses the interval you’ve set for the task.
- If the task is overdue, the formula subtracts
now()from the Due date.
- This result is divided by the task’s Interval.
- The new result is compared against its
ceil()value, which is the nearest whole number greater than itself.
- If the result is equal with its
ceil()value, the formula adds 1 to it and then multiplies it by the task’s Interval.
- If the result is not equal with its
ceil()value, then the
ceil()value is multiplied by the Interval.
- The result of this step is added to the original Due date in order to get the Next Due date.
Next, we have the State property’s formula:
Code language: PHP (php)
if( empty( prop( "Due" ) ), "⚪️", if( formatDate( prop( "Due" ), "L" ) == formatDate( now( ), "L" ), "🟢", if( prop( "Due" ) < now( ), "🔴", "🔵" ) ) )
Here, we use a few nested if-statements to determine which color circle to display:
- White for tasks with no due date
- Green for tasks due today
- Red for overdue tasks
- Blue for future tasks
P.S. – if you write a lot of formulas in Notion, you may want to try writing them in a dedicated code editor like Atom and then minify them using this Excel Formula Beautifier (which has a minify function). Notion and Excel formulas are nearly identical, so this minifier works perfectly.
Some other great Notion content creators have also tackled the recurring tasks problem. Here are a few of them:
- Ruben Loan’s recurring tasks solution
- Marie Poulin’s recurring tasks solution
- Danny Hatcher’s recurring tasks solution
- August Bradley’s recurring tasks solution
I view Notion almost as a graphical programming language; with its many tools, there are almost always multiple ways to approach a problem. For that reason, I love seeing how others set up their workspaces as well.