This tutorial will show you the exact, step-by-step process to create recurring tasks in Notion and completely automate them.

That means you’ll be able to check off a task, and everything else simply happens for you – the due date gets moved, the Done checkbox becomes un-checked, and the task is ready and waiting for you the next time you need to do it.

Yes, seriously.

The method I’ll show you in this article requires no coding and can be done for free. Additionally, once you’ve completed the initial setup, you’re good to go – your recurring tasks will just work.

Here’s a breakdown of what we’ll be doing:

  1. Set up recurring tasks inside of Notion
  2. Automate those recurring tasks using either Make.com (free, formerly known as Integromat) or Automate.io (paid, but simpler setup)

The automation here is driven by the Notion API, and by using Make.com/Automate.io we’re able to leverage that API without writing any code. Neat!

Set up Recurring Tasks in Notion

Before you can automate your recurring tasks, you’ll need to set up a system to add recur settings to those tasks in the first place – e.g. “Every other day”, or “Every 2 months”.

Fortunately, we’ve done this work for you. My team and I have added a set of powerful recurring task features to Ultimate Tasks, my free task manager template. I recommend starting by adding the template to your workspace:

The Ultimate Task and Project Management Template for Notion

Use this template to move ALL of your task and project management into Notion.

Get it Free
Lasso Brag

Ultimate Tasks also has a ton of other features that will allow you to manage your tasks and projects completely in Notion:

  • Projects (with built-in progress bars)
  • Sub-Tasks
  • Smart Lists (Today, Next 7 Days, etc.)
  • Cold Tasks (long-overdue tasks get out of your way)

Ultimate Tasks also comes with a detailed wiki that includes tutorials and deeply detailed reference docs.

For the rest of the tutorial, I’ll assume you’re using Ultimate Tasks (or its big brother, Ultimate Brain).

However, if you want to implement the recurring tasks features from Ultimate Tasks into your own template, you can see all of them in my Advanced Recurring Task Dates template. This template exists as an educational proof-of-concept, so it’s less useful as an actual task manager.

Add Recur Intervals to Your Tasks

To set up a recur interval for a task, open the task as a page. You’ll see a Due Date property, as well as three properties for setting up a recurring task:

These give you all the tools you need to set almost any recur interval you could want.

  • Recur Interval – A simple number property that works with Recur Unit.
  • Recur Unit – The available recur units, including
    • Day(s)
    • Week(s)
    • Month(s)
    • Month(s) on the Last Day
    • Month(s) on the Last Weekday
    • Month(s) on the First Weekday
    • Year(s)
  • Days (Only if Set to 1 Day(s)) – this will let you set a task to recur on specific days on the week – e.g. Mon/Wed/Fri
    • Recur Unit must be set to Day(s) and Recur Interval must be set to 1.

Once you set up a recur interval, you’ll also see a property called Next Due. This shows the next due date for the recurring task.

Example Recur Settings

Here are a few examples of recur intervals you could set up using these three properties:

Due Every 3 Days:

  • Recur Interval : 3
  • Recur Unit: Day(s)

Due Every 2 Months on the Last Weekday

  • Recur Interval: 2
  • Recur Unit: Month(s) on the Last Weekday

Due Every Tuesday and Thursday

  • Recur Interval: 1
  • Recur Unit: Day(s)
  • Days (Only if Set to 1 Day(s)): Tuesday, Thursday

As you can see, there are many combinations of these three properties that will let you create most of the useful recur intervals that you could create in other apps like Todoist, Asana, or ClickUp.

Completing Recurring Tasks Manually

You can “complete” a recurring task directly inside of Notion simply by changing the Due Date property to the date displayed in the Next Due property after you finish the task.

Note that you do not need to click the Done checkbox property in this case, as it won’t do anything. If you want to be able to click Done and have the task automatically update its Due Date, then continue on to the next portion of the tutorial.

Set Up Automated Recurring Tasks in Notion

With the release of the Notion API, we can now automate all sorts of processes inside of Notion that used to be done manually. This includes processing recurring tasks!

While you could code an app to handle this (if you’re a programmer), it’s also possible with two no-code tools:

Essentially, an app can have an API (Application Programming Interface) that allows outsiders – including indie developers and even other apps – to work with certain pieces of its code.

Here’s an example of an API in action. In Slack, I can use the Giphy extension – which leverages the Giphy API – to paste a gif right in one of my conversations.

There are several tools – we can call them integration builders – that let you connect different app APIs together without having to write code yourself.

These include Zapier, IFTTT, Automate.io, Make.com, and others.

Amongst these, Make.com is one of the most powerful. It’s not as easy to use as IFTTT (the most basic, user-friendly one) or Zapier, but it gives you a lot more flexibility than those other tools do.

For that reason, automating recurring tasks in Notion with Make.com involves a more complicated setup than it does with Automate.io. However, the upside is that we can do it using their free plan.

In this section of the guide, I’ll walk you through the exact steps to create an automated recurring tasks script in each tool.

Unfortunately, this process is currently not possible using Zapier, due to the fact that Zapier hasn’t updated their Notion integration to support triggering a Zap when a database is updated.

How the Automation Works

Before we go on, I want to briefly explain how automation of recurring tasks works – both in Notion an in basically any productivity app.

When you set up a recurring task and check it off as “Done”, here’s what happens from the app’s perspective:

  • The user has checked “Done”, so run the recurring tasks script
  • Update the Due Date as specified by the user’s recur interval (e.g. “every other day”)
  • Uncheck the “Done” box

There’s another way an app could handle recurring tasks: Instead of editing the task you checked off, it could create a duplicate of that task with the new due date. However, most productivity apps use the method I’ve just described instead.

My Ultimate Tasks template contains all the logic needed to calculate the Next Due Date right within the template itself. This is very useful – it allows you to use the manual method of updating recurring tasks if you want, but it also saves us the trouble of adding very complex date calculation code to our automation.

Here’s all that our automation will be doing.

  • Step 1: Search through your tasks database in Notion, looking for tasks that have been marked Done and that have a date displayed in the Next Due property.
  • Step 2: For each found task that fits those two criteria, update the Due Date property to have the date displayed in the Next Due property, and then un-check the Done checkbox property.

That’s it!

Set Your Time Zone

For automated recurring tasks to work, you’ll need to set up a UTC Offset property in your workspace.

Feel free to skip this, but here’s a technical explanation for those who are curious.

When a Notion formula outputs a date, the Notion API will always see that date from the perspective of UTC time.

This presents a problem, because our Next Due formula has advanced logic that takes into account whether or not a task was overdue when it was completed.

Most task management apps do this, including Todoist and Asana. If they didn’t, then you can run into a situation like this:

  • A task is due Jan 1, and is set to recur every 3 days. Normally, it should be next due on Jan 4.
  • You ignore it for a long time, and finally check it off on May 6.
  • Now it shows as due Jan 4 – still way, way overdue.

A smarter task manager would realize that the task is overdue and take this into account. Instead of updating the due date to Jan 4, it should update it to be due on May 7.

Our Next Due formula does this, which is great… except it clashes with the Notion API’s insistence on seeing the output of Next Due in UTC time.

Here’s the problem… UTC time is often in a different day than your local time zone is.

For example, if it’s 7pm in Denver on May 6, it’s actually 2am in UTC time… on May 7, the next day.

This means that the your automated recurring tasks script (which we’ll build below) looks at the output of Next Due using the Notion API… and sees the task as overdue. You checked the task off on time (at 7pm), but the API sees it as 2am the next day.

Note: Our recurring tasks solution doesn’t officially support task times. They’ll work most of the time, but there are weird situations where they won’t (such as the day that Daylight Savings Time happens). But even without times on your tasks, the API looking at your workspace from UTC time-perspective can cause it to see your workspace from the perspective of the next day (or the previous, if you’re east of the UTC time zone and it’s very early in the morning).

That’s where our UTC Offset property comes in. Since I’m in Denver, I set my offset to -7, which subtracts 7 hours from the output of Next Due (but only if it’s being viewed from the perspective of UTC time – we thought ahead on that one).

This means the Notion API now sees the output of Next Due the same way we see it. In other words, the offset forces the API to look at Next Due as if it were in my local time zone (Denver).

Fortunately, Ultimate Tasks, Ultimate Brain, and my Advanced Recurring Tasks proof-of-concept templates all come with a UTC Offset property by default, so all you’ll need to do it edit it so that it matches your time zone.

If you happen to be using an older version of one of my templates that doesn’t contain this property, please see this upgrade guide to learn how to add it.

A UTC offset is just the number hours that your local time zone is behind or ahead of UTC (Coordinated Universal Time).

I live in Denver, Colorado, so my standard UTC offset (when not affected by Daylight Savings Time, the scourge of the modern world) is -7.

Hence, you see -7 in the UTC Offset property above.

You can find your own UTC Offset at the Time and Date website. Type in your location, then find the UTC Offset for your standard (not Daylight Savings) time zone.

Here, you can see that I’ve identified UTC-7 as my offset.

By default, my templates have their UTC Offset property set to 0. You’ll want to change it to match your actual UTC Offset.

In your All Tasks database, find the UTC Offset property by opening up any task and then clicking the more properties button:

You’ll find UTC Offset in under the ⏱ Recurring Divider property:

Edit UTC Offset so it contains your standard UTC offset (again, not your daylight savings time offset).

If you’re unable to edit this value, you’ll need to unlock the database you’re working on first.

With your UTC Offset set, you’re now ready to build your automation!

Automated Recurring Tasks with Make.com

Make.com is a powerful integration builder that gives you near-direct access to Notion’s API (as well as the APIs for many other apps).

Here are the steps you need to follow to create your recurring tasks automation using Make.com.

First, create a Make.com account if you don’t have one. You can stick with the free plan, as it’ll work perfectly for our purposes.

The only thing to be aware of regarding the free plan is its Operation limit. The free plan limits you to 1,000 operations per month.

We’ve found that it costs one operation each time you run the script (called a Scenario) we’ll be building, as well as one operation per recurring task that is updated.

By default, Make.com will set your Scenario to run every 15 minutes – however, that would result in 2,976 operations per month – without counting the operations needed to actually update your tasks!

For that reason, I set my Scenario to run once a day at 11:55pm (it needs to be before midnight). That’s 31 max operations per month, leaving 969 left over to update my tasks (and I don’t have even close to 969 recurring tasks in a month).

Armed with that knowledge, head to your Scenarios tab and Create a New Scenario.

Click the large + button and search for Notion.

From the list of actions that pops up, select Search Objects.

This will create the first part of a two-step automation that will help us automatically process recurring tasks.

The next step is to connect your Scenario to your Notion account. Click the Add button under Connection:

Ensure Notion Public is selected under Connection Type. The Connection Name doesn’t matter, so you can leave it as My Public Notion Connection if you want.

Now you’ll authenticate with Notion. Be sure you’ve selected the correct Workspace that contains your copy of Ultimate Tasks, then hit Select Pages.

Next, select your copy of Ultimate Tasks, or a page that contains it.

Remember that Notion has cascading permissions, which means that sub-pages inherit the permissions of their parent page unless you change them manually.

This works in our favor, as what we really need to give Make.com access to is the All Tasks database contained within Ultimate Tasks.

Once you’ve selected the correct page, click Allow Access.

Now we need to get the Database ID from our All Tasks database. This will tell our Scenario precisely with database to search.

You can find your Database ID by navigating to your All Tasks database within Ultimate Tasks.

Important: You must be on the actual All Tasks database page. Ensure that you’re not merely on another page that contains a Linked Database view.

Copy the URL of the All Tasks database to your clipboard. You can do this with Ctrl/⌘ + L or by hitting the three-dot menu in the top-right corner and then clicking Copy Link.

From there, you can find the Database ID by copying the part of the URL directly after the / character in notion.so/ and before the ? character:

Here’s my database’s URL:

https://www.notion.so/97a4d9506d1840d2a00e186a3d2d632f?v=2cf8cd2d0caa47fd88e61de05cf9ee59
Code language: JavaScript (javascript)

Which means my Database ID is:

97a4d9506d1840d2a00e186a3d2d632f

Head back to your Scenario. Ensure that Search Objects is set to Database Items, and then paste your Database ID into the Database ID field. Note: The example ID shown in this post will not work for you – your Database ID must be from your own All Tasks database.

Next, add three Filters, ensuring the second and third are added as AND rules.

Filter 1:

  • Done (Checkbox)
  • Equals
  • True (drag the pink true Keyword from the popup. Ensure the gear-icon tab is active.)

Filter 2:

  • Next Due (Formula)
  • Formula sub-heading → Text – Is not empty (boolean) – Important: Select this option from under the Formula subheading in the dropdown menu.
  • True (drag the pink true Keyword from the popup. Ensure the gear-icon tab is active.)

Filter 3:

  • Next Due (Formula)
  • Formula sub-heading → Text – Does not equal
  • Paste Error in Recur Interval: Non-Whole or Negative Number in the third field. This is an error that Next Due will display in Notion if you happen to set your Recur Interval property to an incorrect number, like 1.5 or -42.

Finally, set the Limit to 100 and hit OK.

Note: Database needs to be from your own database. The example ID shown here will NOT work for you.

Before we move onto the next step, head back to your copy of Ultimate Tasks and ensure there is at least one recurring task that has been marked Done.

Your Make.com Scenario needs to find at least one Done recurring task in order to complete the search we just set up and grab data that we’ll need to finish building the automation.

Once you’ve done this, head back to your Scenario and hit the Run Once button in the bottom-left corner. Additionally, hit the Save icon in order to save your work.

If everything worked as expected, you should see a green checkmark under your Notion icon, as well as a number in the upper corner (this is the number of Done recurring tasks that the search found in your All Tasks database).

Additionally, there should be no errors displayed in the Log. If there are, the most likely error is that you didn’t have a recurring task in your All Tasks database that was marked Done before you hit Run Once. In this case, mark a recurring task Done and then hit Run Once again.

Next, we’ll create the second half of our Scenario which will actually update our All Tasks database and process the completed recurring tasks that were found in the search.

To the right of your Notion icon, click Add Another Module.

Click Notion, then choose Update a Database Item from the list of actions.

Under Enter a Database ID, change the dropdown option to Enter Manually.

Paste the same Database ID from before (the one from your All Tasks page URL) in the Database ID field.

Next, drag the id object from the pop-up and drop it into the Page ID field.

Note: The id object may also be called Page ID. I’ve seen it listed both ways, but it works either way.

Next, click Add Item under Fields. For Item 1, set it up as follows:

  • Key: Due (simply type this – it’s the name of your Due property in Ultimate Tasks)
  • Value Type: Date

In the Start Time field, do the following:

First, click over to the calendar menu icon in the popup, then drag in the parseDate(;) function to the Start Time field.

Next, click back to the star menu icon in the popup. Under properties_value and then Next Due, find the string object and drag it between the ( and ; in parseDate(;).

Finally, between the ; and ) symbols in parseDate(;), paste MMMM DD, YYYY.

The other fields – End Time and Include Time – can be left blank. This function simply updates the Due Date property in Ultimate Tasks with the date displayed in Next Due. Remember: Next Due is the Formula property that does all of the recurring date calculation directly in Notion for us!

Add one more item with the following values:

  1. Key: Done
  2. Value Type: Checkbox
  3. Value: No

This part of the function will automatically uncheck the Done checkbox.

Hit OK.

There’s just one more thing to do. Click the three dots between your two Scenario steps to create a filter. Give it the following settings:

  • Label: Check Results
  • Condition: Drag the id object into this field. Note: It may also be called Page ID.
  • Criteria: Exists

This filter will keep the Scenario from throwing an error (and sending you an annoying email) in the event that it doesn’t find any completed recurring tasks when it performs its search.

At this point, you can hit Run Once in order to test your script. Watch your All Tasks database: Any Done recurring tasks should be automatically un-checked and have their Due dates updated.

Once you’ve verified the test was successful, head back to Make.com to set your Scenario’s schedule.

I recommend running it once per day to minimize the actions it takes up.

Note that your Scenario must run during the current day, so I recommend setting it to 11:55pm.

This way, your scheduled Scenario runs will only use a maximum of 31 Operations per month (one per day), leaving 969 (1,000 – 31) leftover to process your completed recurring tasks.

Note that on Make.com’s free plan, 15 minutes is the smallest interval you can use for your Scenarios. Keep this in mind when building other Scenarios that may need more frequent updating or faster response times.

Finally, switch the Scenario to On, and save your work.

Congratulations! You’ve just set up completely automated recurring tasks in Notion.

The last thing you may want to do is edit the Type property in your All Tasks database if you’re using Ultimate Tasks or Ultimate Brain. Replace its formula with this one:

if(empty(prop("Recur Interval")), "⏳One-Time", "⏳One-Time")
Code language: PHP (php)

These templates contain filters that will prevent tasks with a Type of 🔄Recurring from leaving your task views when the Done checkbox is checked.

This is a bit of error-prevention, since many users don’t know that checking Done on a recurring task won’t do anything by default.

But now that you’ve set up automatic recurring tasks, checking Done actually does do something!

So we can now get rid of this error-checking, and the easiest way to do it is to edit the Type formula as described above. Otherwise, you’d have to go around and edit the filters in every view of Ultimate Tasks.

Automated Recurring Tasks with Automate.io

Important: Automate.io announced on May 3, 2022 that they will be shutting down their service in October of 2022. As a result, I highly recommend using Make.com for this process instead of Automate.io. I’ll be removing these instructions in October 2022.

If you’re already paying for Automate.io, or you’re willing to pay $9.99/mo for their Personal plan, you can set up an automated recurring tasks script with a lot less hassle than is required for Make.com.

If you skipped down to this part of the tutorial, though, I’ll note that the Make.com route isn’t hard. My explanation above shows every step in exact detail. It just takes a bit longer on initial setup.

Once your script is set up – on both Make.com and Automate.io – you shouldn’t have to do anything ever again. It’ll just run on the schedule you set.

If you are set on using Automate.io to process your recurring tasks, here’s how to do it.

First, note Automate.io’s pricing:

The reason we can’t use their free plan for processing automated tasks is because doing so requires a Multi Action Bot, which requires a paid plan.

Additionally, the $9.99/mo Personal plan gets you 600 actions. Our testing has found that an Action is only counted for each updated recurring task – which means you can process up to 600 recurring tasks a month using this plan.

To start building your recurring tasks Bot, first head to the Apps tab and click Add a New App.

Locate Notion and click Authorize.

Ensure you’ve selected the Workspace that contains your copy of Ultimate Tasks, and then click Select Pages.

Next, select your copy of Ultimate Tasks, or at page that contains it.

Remember that Notion has cascading permissions, which means that sub-pages inherit the permissions of their parent page unless you change them manually.

This works in our favor, as what we really need to give Automate.io access to is the All Tasks database contained within Ultimate Tasks.

Once you’ve selected the correct page, click Allow Access. You’ll get an Authentication Successful message if everything went as expected. Hit Save.

Next, head to the Bots tab in the top menu and click Create a Bot.

For your Trigger app, select Notion. If it doesn’t show up right away, you can search for it.

Choose Updated Database Item as the trigger criteria. Then set the Input Fields like so:

  • Database: Use Custom Value
  • Database ID: Get the Database ID from your All Tasks database inside of Ultimate Tasks and paste here. Read on to learn how to find your Database ID.

You can find your Database ID by navigating to your All Tasks database within Ultimate Tasks.

Important: You must be on the actual All Tasks database page. Ensure that you’re not merely on another page that contains a Linked Database view.

Copy the URL of the All Tasks database to your clipboard. You can do this with Ctrl/⌘ + L or by hitting the three-dot menu in the top-right corner and then clicking Copy Link.

From there, you can find the Database ID by copying the part of the URL directly after the / character in notion.so/ and before the ? character:

Here’s my database’s URL:

https://www.notion.so/ce4917cf81e4417383c26670091e1e7b?v=abb848e24e4449529c6ad2fb5129ff5f
Code language: JavaScript (javascript)

Which means my Database ID is:

ce4917cf81e4417383c26670091e1e7b

Ensure your specific Database ID is pasted into the Database ID field. Note: The example ID shown in this post will not work for you – your Database ID must be from your own All Tasks database.

Next, we need to create a series of Filter steps in our Bot that will ensure the Bot only acts on completed recurring tasks within our Ultimate Tasks database. Specifically, we’ll look for tasks where:

  • The Done checkbox is checked
  • The Next Due property isn’t empty and isn’t throwing an error

Under Action 1, select the Filters app (in the Apps by Automate.io subheading) and choose the Continue Only If option. Under Condition 1, set:

  • Parameter 1: Page Property Done
  • Operator: Equals (string)
  • Parameter 2: true

Add another Action with the + icon, again choosing the Filters app and the Continue Only If option. Set Condition 1 as follows:

  • Operator: Not Empty
  • Parameter: Page Property Next Due

Add yet another Action, once again choosing Filters and the Continue Only If option. Set Condition 1 as follows:

  • Parameter 1: Page Property Next Due
  • Operator: Not Equals (string)
  • Parameter 2: Paste in Error in Recur Interval: Non-Whole or Negative Number

Next, add another Action and choose the Formatter app (which also lives under the Apps by Automate.io subheading). Set the option to Format Date, and set the Input Fields as follows:

  • Input Date/Time: Page Property Next Due
  • Input Format: Auto Detect
  • Target Format: Use Custom Value
  • Target Format ID: Paste in DD-MMM-YYYY
  • Target Timezone: UTC

Finally, add another Action and choose Notion as the app. Choose the Update Database Item option.

Under Database, choose Use Custom Value and paste in your Database ID (the exact same ID from the Trigger setup).

Under Item Details, set Page/Item to Use Custom Value and set Page/Item ID to Item ID (ensure the Notion app icon is next to it, indicating the Item ID is coming from Notion).

Under the Done heading, select No. This will let your Bot un-check the Done checkbox in Notion.

Under the Due heading, add the Formatted Date/Time option to the Start Date field.

Click Save on your Bot to save your automation.

Turn the Bot on when prompted, and then try out your Bot by testing with live data when prompted by Automate.

To make this work, ensure you see the Test Using Live Data screen on Automate.io, and then go check off one or more recurring tasks in your All Tasks database. Then hit I’m Done.

If everything is set up correctly, you’ll see Automate.io run though a confirmation of each step in the Bot.

Then you’ll see your tasks update automatically in Notion:

Congrats – you’ve set up a fully automated recurring tasks system using Automate.io!

Why Can’t I Use Zapier to Automate Recurring Tasks?

I’d love to add Zapier to this tutorial, and by all accounts you should be able to automate your recurring tasks using their platform.

There’s just one problem – Zapier’s Notion integration only supports the New Database Item trigger as of this writing.

This means we can’t have an automation trigger when a page or database item is updated, which is crucial for automating recurring tasks.

Until Zapier adds the triggers that Automate.io and Make.com already have, we won’t be able to use them for this purpose – or for any other Zap that needs a page/database item updated trigger.

That’s the end of this tutorial, but if you want to learn more and take your Notion workspace to the next level, check out some of my other tutorials:

Also, if you enjoy this content and want more, consider joining my Notion Tips email list! I’ll keep you up to speed on my Notion courses, but also let you know when I publish new free tutorials and templates:

Notion Tips Newsletter

Get updates about my Notion templates and tutorials. Easily unsubscribe at any time.