Tasks in two apps always in sync — both ways

Change a task in one app — the scenario mirrors it in the other right away, both ways, and emails you a daily summary of what changed.

  • Two-way task sync
  • Changes carried over instantly
  • Nothing gets duplicated
  • A daily summary to your email
Notionn8n FormWebhookRedisTodoist

How it works

To keep Gmail and Notion in sync, connect them with a ready-made scenario — changes flow automatically.

  1. Starts when: OAuth redirect
  2. Then: Get variables
  3. Check: Verify security token
  4. If yes: Exchange Tokens
  5. Starts when: Respond with success
  6. Starts when: Respond with error
  7. Then: Get Notion Databases
  8. Then: Prep Dropdown
  9. Then: Choose Notion Database
  10. Then: Get Notion Database ID
  11. Then: Get projects
  12. Then: Prep Dropdown1
  13. Then: Choose Todoist Project
  14. Then: Get Todoist Project ID
  15. Then: Get sections
  16. Then: Generate config
  17. Then: Return config JSON
  18. Then: Generate security token
  19. Then: Store variables
  20. Then: Redirect to Auth Page
  21. Starts when: Notion-Todoist Sync Setup Helper
  22. Starts when: Todoist Webhook Setup Helper
  23. Then: Notion
  24. Then: Map Notion to Todoist
  25. Then: Compare Datasets
  26. Then: Handle empty dates2
  27. Then: Add project ID
  28. Check: If Todoist ID exists
  29. If yes: Set tries
  30. Then: Get Todoist Task
  31. Check: If not deleted
  32. If yes: Mark as Incomplete in Todoist
  33. Then: Update task in Todoist
  34. Then: Get mapped item
  35. Check: Merge
  36. Check: Loop Over Items1
  37. Then: Generate UUID
  38. Then: Prepare Batching Items
  39. Then: Aggregate
  40. Then: Update section (Sync API)
  41. Check: Merge summary
  42. Check: Filter out status changes
  43. Then: Map Todoist to Notion
  44. Then: Map summary fields
  45. Then: Convert to HTML Table
  46. Then: Generate email body
  47. Then: Gmail
  48. Then: Lock Todoist ID
  49. If no: Create task in Todoist
  50. Then: Store Todoist ID
  51. Then: Get mapped item2
  52. Check: Catch known error
  53. If no: Wait
  54. Then: Update tries
  55. Check: If tries left
  56. If no: Retry limit reached
  57. Then: Handle empty dates
  58. Then: Update Task in Todoist
  59. Check: Status changed
  60. Then: Get mapped item1
  61. Then: Lock Todoist ID2
  62. Then: Prepare summary data
  63. Check: Loop Over Items
  64. Check: Exists/Completed in Notion
  65. If yes: Map Notion to Todoist1
  66. Then: Handle empty dates1
  67. Then: Update task in Todoist before closing
  68. Check: Status is Done
  69. If yes: Mark as Completed in Todoist
  70. Then: Prepare summary data1
  71. If no: Delete Task in Todoist
  72. Then: Prepare summary data2
  73. Then: Lock Todoist ID1
  74. Then: Get Notion Task
  75. Then: Pick Todoist Fields
  76. Starts when: Schedule Trigger
  77. Then: Globals
  78. Then: Todoist
  79. Starts when: Execute Workflow Trigger
  80. Check: Differences exist1
  81. Then: Update task in Notion
  82. Then: Lock Notion ID
  83. Check: Due date empty
  84. Then: Mark as Focussed in Notion
  85. Check: Requires completion change1
  86. Check: Has not been completed?
  87. If yes: Mark as In Progress in Notion
  88. If yes: Neither focussed nor planned1
  89. If no: Mark as Done in Notion
  90. Then: Create task in Notion
  91. Then: Execution Data2
  92. Then: Update Description in Todoist
  93. Then: Turn Markdown into Notion Blocks
  94. Then: Handle each block separately
  95. Then: Append Notion Block
  96. Then: Mark as Obsolete in Notion
  97. Check: Only continue if not locked
  98. Check: If event is not :deleted
  99. If yes: Set tries2
  100. Then: Get Todoist Task1
  101. Then: Map Todoist to Notion1
  102. Then: Execution Data1
  103. Then: Get Notion Task1
  104. Check: Notion Task not found
  105. If yes: Check if creating flag exists1
  106. Check: Only continue if flag does not exist1
  107. Then: Set creating flag1
  108. Then: Get Backlog Section ID
  109. Then: Generate UUID1
  110. Then: Update section (Sync API)1
  111. If no: Execution Data3
  112. Check: Switch by Event
  113. If yes: Description has changed in Todoist
  114. Then: Update Description in Todoist1
  115. Check: Catch known error2
  116. If no: Wait2
  117. Then: Update tries2
  118. Check: If tries left2
  119. If no: Retry limit reached2
  120. If no: Get Notion Task2
  121. Check: Notion Task found1
  122. Then: Execution Data4
  123. Then: Check if Todoist ID is locked
  124. Then: Execution Data
  125. Then: Globals1
  126. Check: Requires completion change
  127. Check: Has been completed?
  128. If yes: Mark as Completed in Todoist1
  129. Then: Get todoist ID
  130. Then: Lock Todoist ID4
  131. If no: Mark as Incomplete in Todoist1
  132. Check: Differences exist
  133. Then: Update task in Todoist1
  134. Check: Only continue if not locked1
  135. Then: Get Notion task
  136. Then: Map Notion to Todoist2
  137. Then: Execution Data6
  138. Check: Status is Obsolete?
  139. If yes: Todoist ID exists
  140. Then: Delete Task in Todoist2
  141. Then: Get todoist ID1
  142. If no: Neither focussed nor planned
  143. If no: Todoist ID exists?
  144. If yes: Set tries1
  145. Then: Get Todoist Task2
  146. Check: If not deleted1
  147. If yes: Status changed but not empty
  148. Then: Generate UUID2
  149. Then: Update section (Sync API)2
  150. If no: Status is not Done
  151. Then: Check if creating flag exists
  152. Check: Only continue if flag does not exist
  153. Then: Set creating flag
  154. Then: Create task in Todoist1
  155. Then: Store Todoist ID1
  156. Check: Catch known error1
  157. If no: Wait1
  158. Then: Update tries1
  159. Check: If tries left1
  160. If no: Retry limit reached1
  161. Then: Check if Notion ID is locked
  162. Starts when: Notion Webhook
  163. Check: Body is array?
  164. If yes: Split out Notion changes
  165. Then: Extract IDs
  166. Then: Globals2
  167. Then: Execution Data5
  168. Starts when: Todoist Webhook
  169. Check: Switch by project
  170. Then: Execute Workflow
  171. Starts when: Webhook
  172. Check: Switch
  173. If no: Execute Workflow1

You can launch this Gmail + Notion integration in Scriptera: describe the task in plain words — the scenario is built, launched and monitored for you.