Todoist to Notion (solved)

Hey Everyone.
I’ve been looking for a way to aggregate all the info I need into a single daily journal entry in Notion. The current step I’m stuck on is adding my tasks. I’ve tried IFTTT and Zapier, and they both do what I need them to do. IFTTT grabs the Todoist tasks and gets them to Notion, but can’t update them. Zapier can update them, but only on a paid plan.

I am on the free plan for Make, and it looks like it’s going to let me do what I need and all in one place. (Side note: when answering my question, please mention if what I’m trying to do will run into the limitations of the free plan. Thanks!).

:footprints: Steps I’ve taken:

  1. I realized that you don’t get the proper variables until you have a trigger module.
  • Todoist trigger: New Event
  • Notion trigger: Watch Database Items
  1. I’ve also realized that triggers must be the first module, limiting me to one trigger per scenario.
  2. I saw a forum post (here) that explains using the webhooks module to grab the relevant data in separate scenarios, then process that data in the third.
  3. I need both the triggers above to process the data coming from Todoist.
  4. I did notice that, if I link “Update Database Item” to the “Create a Database Item” I will get a Database Item ID Variable, which is what I need to find in order to update when the task is completed. I want to be able to say “If incoming task is uncompleted, create a new task; otherwise, update the incoming task.”

:trophy: My primary Goal:

I’d like to link notion and Todoist in such a way that data flows between the two. Ideally, that would mean creating, updating, or completing a task in either app updates it in both locations.

I’ll settle for managing the tasks in Todoist and linking the two so I can also view them in Notion.

:question::question: Main Question

I know what I need to do, but I don’t know how to do it. I need to know how to get around the limitation of one trigger per scenario. I understand that can be done using webhooks, but I haven’t the slightest clue how those work.

:camera_flash: Relevant Screen shots:

[The upper arm where it creates a database item works. I can even get it to add a Completed=true item as a new entry. But the “Update Database Item” requires a “Database Item ID” variable, which needs a second trigger to obtain, AFAIK.]

[Notion To-Do Database]

I think I have a breakthrough in this:

  1. I discovered the Data Store module.
  2. This allows me to:
  • create a unique key (the Todoist task ID)
  • Store the Database ItemID
  • Recall the specified Database ItemID Using the Task ID
  • Update the Item.

I then realized that my scenario was too simple for the way I’ll likely use this, so I’m nuking everything and starting over. I will now filter tasks by the type of event from Todoist, and restrict myself to only adding tasks in Todoist, to simplify things.

Filtering by type of event allows me to Add to the data store FIRST, and ensure no duplicate tasks are added to the store. Make ran into a problem when the keys (generated by task ID) were identical.

I have a plan and will report back!

1 Like

Nice, thanks for the update! My thought after looking at your screenshot and reading your question was to use the “Search objects” Notion module in Make to get the database item ID to pass to the subsequent module.

You could add the “Search objects” Notion module right after your Todoist trigger. And search by Task ID (which I see you already have in Notion). This means you would not need a Data Store.

1 Like

Thanks, Simo!
Unfortunately, this doesn’t work. The “update database item” specifically requests a “Database Item ID”. I believe I tried the search module yesterday, and plugged any variable I could find in there, and it wouldn’t update the item.

I did find a solution, and it utilizes the data store very effectively. (Explanation below for future passersby).


Todoist New event module pulls in five different types of events:

  1. Task added (item:added)
  2. Task updated (item:updated)
  3. Task deleted (item:deleted)
  4. Task completed (item:completed)
  5. Task uncompleted (item:uncompleted)

The three branches are explained below.

1. Task Added

I process “Task added” First, and add the result to a data store. The Data store uses the unique task ID as the Key, and the Database Item ID, and stores a few more variables, mostly for human clarity.

Expand to see screen shot.

2. Task Updated

Next I update the task if the trigger receives item:completed, item:uncompleted, or item:updated.

Data store recalls using the Task ID key, and the Notion “Update Database item” goes to town, using the Database item ID (blue). The rest is just plugging in data.

Expand to see screen shot.

Screen Shot 2023-05-16 at 12.53.56 PM

Note: I chose to not allow Make to directly update tags or check boxes or statuses in the Notion database. I don’t know exactly how I want to display that info yet, so I’m bringing the raw data into Notion and will use database formula kung-fu to make it pretty. :slight_smile:

3. Task Deleted.

When the trigger receives the item:deleted event, I chose to have it update a field in the database to retain the task (for archival purposes). Here, the Data store module is the same as the updating branch, and the Notion module, while still an “Update Database Item” Has one small change to archive the task.

Expand to see screen shot.

I have to manually add the “true” tag (see “Deleted?” field) and display the event for confirmation. I do this because, oddly, Todoist doesn’t actually change the Deleted tag to display true (To my knowledge) when you delete a task. (maybe that’s for when it’s deleted by an external API?)

Expand to see screen shot.

And that’s it! It connects pretty well, and we’ll see if it breaks over the next week or so of use!

Edit: If you’re on the free plan, you get 2 active Scenarios in total, and 1000 operations (API calls, or edits?) per month. In setting this up, I’ve used almost 50%, so we’ll see how this lasts through the month! I may contact support to see if they’ll reset me out of the kindness of their hearts, since this was all setup.

Hi, @rgbrobot! Welcome to the community! :wave:

I must say, you’ve done an outstanding job in getting this to work.

Also, I 100% appreciate your effort in breaking the solution down and sharing it with the community in such meticulous detail. This is fantastic!

Just wanted to chime in to bring another perspective, not sure why you need a data store?
Personnally, I achieved that without needing a local storage, just using a search request but maybe your use case is more complicated: