Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted

Синхронизация Notion и Todoist в реальном времени

Двусторонняя синхронизация между Notion и Todoist сохраняет актуальность ваших задач в обоих приложениях.

Показать оригинал (англ.)
Realtime Notion Todoist 2-way Sync Template

Automated workflow: Realtime Notion Todoist 2-way Sync Template. This workflow integrates 29 different services: stickyNote, scheduleTrigger, merge, switch, redis. It contains 264 nodes and follows best practices for error handling and security.

Комбинированный (Complex)Продвинутый · 246 нодHtmlHttprequestExecutiondataSplitout
Как это работает

Схема сценария, как в редакторе n8n: ноды и связи между ними. Кликните, чтобы рассмотреть.

клик - увеличить ⤢🌐Get projectshttpRequest🌐Get sectionshttpRequest◈Get NotionDatabasesnotion{}Prep Dropdowncode{}Prep Dropdown1code{}Generate configcode◆Choose NotionDatabaseform◆Choose TodoistProjectform⑂Verify securitytokenif◆Generate securitytokencrypto{}Store variablescode{}Get variablescode◆Redirect to AuthPageform⇥OAuth redirectwebhook🌐Exchange TokenshttpRequest⇥Respond withsuccessrespondToWebhook⇥Respond with errorrespondToWebhook{}Get NotionDatabase IDcode{}Get TodoistProject IDcode◆Notion-TodoistSync Setup HelperformTrigger◆Todoist WebhookSetup HelperformTrigger◆Return config JSONform◆Todoisttodoist◈Notionnotion≡Compare DatasetscompareDatasets⑂Exists/Completedin Notionif◆Get Todoist Tasktodoist⑂If Todoist IDexistsif◈Store Todoist IDnotion◆Mark as Incompletein Todoisttodoist◆Mark as Completedin Todoisttodoist◆Delete Task inTodoisttodoist◆Loop Over ItemssplitInBatches◈Get Notion Tasknotion🌐Update Task inTodoisthttpRequest≡Pick TodoistFieldsset{}Map Notion toTodoistcode🌐Update task inTodoist before…httpRequest{}Map Notion toTodoist1code{}Handle empty datescode{}Handle emptydates1code{}Handle emptydates2code🌐Create task inTodoisthttpRequest≡Add project IDset◆Lock Todoist IDredis◆Generate UUIDcrypto🌐Update section(Sync API)httpRequest⑂Status changedfilter◆Aggregateaggregate≡Prepare BatchingItemsset◆Loop Over Items1splitInBatches⑂Status is Doneif◆Lock Todoist ID1redis◆Lock Todoist ID2redis🌐Update task inTodoisthttpRequest≡Get mapped itemset≡Get mapped item1set⏱Schedule TriggerscheduleTrigger≡Prepare summarydataset≡Prepare summarydata1set◆Mergemerge≡Prepare summarydata2set⑂Filter out statuschangesfilter{}Map Todoist toNotioncode≡Map summary fieldsset◆Convert to HTMLTablehtml◆Generate emailbodyhtml≡Get mapped item2set✉Gmailgmail◆Merge summarymerge≡Globalsset◆Execute WorkflowTriggerexecuteWorkflowTrigger⑂Differences exist1filter⑂Requirescompletion change1filter◈Create task inNotionnotion◈Update task inNotionnotion◈Mark as Done inNotionnotion◈Mark as Obsoletein Notionnotion◈Mark as InProgress in Notionnotion⑂Only continue ifnot lockedfilter◆Lock Notion IDredis◆Check if TodoistID is lockedredis◆Update Descriptionin Todoisttodoist⑂Description haschanged in Todoistfilter◆Update Descriptionin Todoist1todoist◆Generate UUID1crypto🌐Update section(Sync API)1httpRequest{}Get BacklogSection IDcode⑂Notion Task notfoundif◆Check if creatingflag exists1redis⑂Only continue ifflag does not…filter◆Set creating flag1redis⑂Neither focussednor planned1filter◈Mark as Focussedin Notionnotion◆Todoist triggerreferencenoOp◈Get Notion Task2notion⑂Notion Task found1filter⑂Switch by Eventswitch⑂If event is not:deletedif◆Execution DataexecutionData◆Execution Data1executionData◆Execution Data2executionData◆Execution Data3executionData◆Execution Data4executionData≡Globals1set{}Map Todoist toNotion1code◆Get Todoist Task1todoist◈Get Notion Task1notion⑂Requirescompletion changefilter⑂Has beencompleted?if⑂Differences existfilter⑂Only continue ifnot locked1filter◆Check if Notion IDis lockedredis◈Get Notion tasknotion◆Check if creatingflag existsredis⑂Only continue ifflag does not…filter◆Set creating flagredis⑂Todoist ID exists?if≡Get todoist IDset⑂Todoist ID existsfilter≡Get todoist ID1set⑂Status changed butnot emptyfilter⑂Status isObsolete?if⑂Status is not Donefilter⑂Neither focussednor plannedif◆Notion triggerreferencenoOp⇥Notion Webhookwebhook◈Store Todoist ID1notion◆Mark as Completedin Todoist1todoist🌐Update task inTodoist1httpRequest≡Globals2set◆Mark as Incompletein Todoist1todoist◆Generate UUID2crypto🌐Update section(Sync API)2httpRequest◆Lock Todoist ID4redis◆Delete Task inTodoist2todoist{}Map Notion toTodoist2code◆Get Todoist Task2todoist🌐Create task inTodoist1httpRequest◆Execution Data5executionData◆Execution Data6executionData⇥Todoist Webhookwebhook◆Execute WorkflowexecuteWorkflow≡Extract IDsset◆Split out NotionchangessplitOut⑂Body is array?if⑂Switch by projectswitch⇥Webhookwebhook⑂Switchswitch◆Execute Workflow1executeWorkflow⑂Due date emptyfilter⑂Has not beencompleted?if◆End herenoOp⚠Retry limitreachedstopAndError≡Set triesset≡Update triesset◆Waitwait⑂Catch known errorif⑂If tries leftif⚠Retry limitreached1stopAndError≡Set tries1set≡Update tries1set◆Wait1wait⑂Catch known error1if⑂If tries left1if≡Set tries2set≡Update tries2set◆Wait2wait⑂Catch known error2if⑂If tries left2if⚠Retry limitreached2stopAndError{}Turn Markdown intoNotion Blockscode◆Handle each blockseparatelysplitOut◈Append NotionBlocknotion
  1. ТриггерNotion WebhookWebhook
  2. ДействиеBody is array?If
  3. ДействиеSplit out Notion changesSplit Out
  4. ДействиеExtract IDsSet
  5. ДействиеNotion trigger referenceNo Op
  6. ДействиеGlobals2Set
  7. ДействиеExecution Data5Execution Data
  8. ДействиеCheck if Notion ID is lockedRedis
  9. ТриггерNotion-Todoist Sync Setup HelperForm
  10. ДействиеOnly continue if not locked1Filter
  11. ДействиеGet Notion DatabasesNotion
  12. ДействиеGet Notion taskNotion
  13. ДействиеPrep DropdownCode
  14. ДействиеMap Notion to Todoist2Code
  15. ДействиеChoose Notion DatabaseForm
  16. ТриггерTodoist Webhook Setup HelperForm
  17. ТриггерOAuth redirectWebhook
  18. ДействиеExecution Data6Execution Data
  19. ДействиеGet Notion Database IDCode
  20. ДействиеGenerate security tokenCrypto
  21. ДействиеGet variablesCode
  22. ДействиеStatus is Obsolete?If
  23. ДействиеGet projectsHttp Request
  24. ДействиеStore variablesCode
  25. ДействиеVerify security tokenIf
  26. ДействиеNeither focussed nor plannedIf
  27. ДействиеPrep Dropdown1Code
  28. ДействиеRedirect to Auth PageForm
  29. ДействиеExchange TokensHttp Request
  30. ДействиеTodoist ID exists?If
  31. ДействиеChoose Todoist ProjectForm
  32. ТриггерRespond with successRespond To Webhook
  33. ТриггерRespond with errorRespond To Webhook
  34. ДействиеIf tries left1If
  35. ДействиеGet Todoist Project IDCode
  36. ДействиеSet tries1Set
  37. Обработка ошибокRetry limit reached1Stop And Error
  38. ДействиеGet sectionsHttp Request
  39. ДействиеGet Todoist Task2Todoist
  40. ДействиеGenerate configCode
  41. ДействиеCatch known error1If
  42. ДействиеReturn config JSONForm
  43. ДействиеWait1Wait
  44. ДействиеUpdate tries1Set
  45. ДействиеTodoist ID existsFilter
  46. ДействиеDifferences existFilter
  47. ДействиеRequires completion changeFilter
  48. ДействиеStatus changed but not emptyFilter
  49. ДействиеStatus is not DoneFilter
  50. ДействиеHas been completed?If
  51. ДействиеGenerate UUID2Crypto
  52. ДействиеCheck if creating flag existsRedis
  53. ДействиеDelete Task in Todoist2Todoist
  54. ДействиеUpdate task in Todoist1Http Request
  55. ДействиеMark as Completed in Todoist1Todoist
  56. ДействиеMark as Incomplete in Todoist1Todoist
  57. ДействиеUpdate section (Sync API)2Http Request
  58. ДействиеOnly continue if flag does not existFilter
  59. ДействиеGet todoist ID1Set
  60. ДействиеGet todoist IDSet
  61. ДействиеSet creating flagRedis
  62. ДействиеCreate task in Todoist1Http Request
  63. ДействиеLock Todoist ID4Redis
  64. ДействиеStore Todoist ID1Notion
  65. ТриггерSchedule TriggerSchedule
  66. ТриггерTodoist WebhookWebhook
  67. ТриггерExecute Workflow TriggerExecute Workflow
  68. ДействиеGlobalsSet
  69. ДействиеNotionNotion
  70. ДействиеTodoistTodoist
  71. ДействиеSwitch by projectSwitch
  72. ТриггерWebhookWebhook
  73. ДействиеMap Notion to TodoistCode
  74. ДействиеPick Todoist FieldsSet
  75. ДействиеTodoist trigger referenceNo Op
  76. ДействиеSwitchSwitch
  77. ДействиеCompare DatasetsCompare Datasets
  78. ДействиеGlobals1Set
  79. ДействиеExecution DataExecution Data
  80. ДействиеExecute WorkflowExecute Workflow
  81. ДействиеExecute Workflow1Execute Workflow
  82. ДействиеCheck if Todoist ID is lockedRedis
  83. ДействиеHandle empty dates2Code
  84. ДействиеHandle empty datesCode
  85. ДействиеLoop Over ItemsSplit In Batches
  86. ДействиеOnly continue if not lockedFilter
  87. ДействиеAdd project IDSet
  88. ДействиеUpdate Task in TodoistHttp Request
  89. ДействиеExists/Completed in NotionIf
  90. ДействиеGet Notion TaskNotion
  91. ДействиеIf event is not :deletedIf
  92. ДействиеIf Todoist ID existsIf
  93. ДействиеIf tries leftIf
  94. ДействиеLock Todoist ID2Redis
  95. ДействиеStatus changedFilter
  96. ДействиеPrepare summary dataSet
  97. ДействиеMap Notion to Todoist1Code
  98. ДействиеIf tries left2If
  99. ДействиеSet triesSet
  100. Обработка ошибокRetry limit reachedStop And Error
  101. ДействиеHandle empty dates1Code
  102. ДействиеSet tries2Set
  103. Обработка ошибокRetry limit reached2Stop And Error
  104. ДействиеGet Todoist TaskTodoist
  105. ДействиеUpdate task in Todoist before closingHttp Request
  106. ДействиеGet Todoist Task1Todoist
  107. ДействиеCatch known errorIf
  108. ДействиеLock Todoist ID1Redis
  109. ДействиеStatus is DoneIf
  110. ДействиеCatch known error2If
  111. ДействиеMark as Incomplete in TodoistTodoist
  112. ДействиеCreate task in TodoistHttp Request
  113. ДействиеWaitWait
  114. ДействиеMark as Completed in TodoistTodoist
  115. ДействиеDelete Task in TodoistTodoist
  116. ДействиеGet mapped item1Set
  117. ДействиеEnd hereNo Op
  118. ДействиеWait2Wait
  119. ДействиеUpdate task in TodoistHttp Request
  120. ДействиеLock Todoist IDRedis
  121. ДействиеStore Todoist IDNotion
  122. ДействиеUpdate triesSet
  123. ДействиеPrepare summary data1Set
  124. ДействиеPrepare summary data2Set
  125. ДействиеUpdate tries2Set
  126. ДействиеGet mapped itemSet
  127. ДействиеGet mapped item2Set
  128. ДействиеMap Todoist to Notion1Code
  129. ДействиеMergeMerge
  130. ДействиеExecution Data1Execution Data
  131. ДействиеLoop Over Items1Split In Batches
  132. ДействиеMerge summaryMerge
  133. ДействиеGet Notion Task1Notion
  134. ДействиеGenerate UUIDCrypto
  135. ДействиеFilter out status changesFilter
  136. ДействиеNotion Task not foundIf
  137. ДействиеPrepare Batching ItemsSet
  138. ДействиеMap Todoist to NotionCode
  139. ДействиеAggregateAggregate
  140. ДействиеMap summary fieldsSet
  141. ДействиеCheck if creating flag exists1Redis
  142. ДействиеExecution Data3Execution Data
  143. ДействиеUpdate section (Sync API)Http Request
  144. ДействиеConvert to HTML TableHtml
  145. ДействиеOnly continue if flag does not exist1Filter
  146. ДействиеSwitch by EventSwitch
  147. ДействиеGet Notion Task2Notion
  148. ДействиеGenerate email bodyHtml
  149. ДействиеSet creating flag1Redis
  150. ДействиеDifferences exist1Filter
  151. ДействиеDescription has changed in TodoistFilter
  152. ДействиеRequires completion change1Filter
  153. ДействиеNotion Task found1Filter
  154. ДействиеGmailGmail
  155. ДействиеGet Backlog Section IDCode
  156. ДействиеUpdate Description in Todoist1Todoist
  157. ДействиеHas not been completed?If
  158. ДействиеExecution Data4Execution Data
  159. ДействиеCreate task in NotionNotion
  160. ДействиеGenerate UUID1Crypto
  161. ДействиеDue date emptyFilter
  162. ДействиеNeither focussed nor planned1Filter
  163. ДействиеTurn Markdown into Notion BlocksCode
  164. ДействиеExecution Data2Execution Data
  165. ДействиеUpdate section (Sync API)1Http Request
  166. ДействиеUpdate task in NotionNotion
  167. ДействиеMark as Focussed in NotionNotion
  168. ДействиеMark as In Progress in NotionNotion
  169. ДействиеMark as Done in NotionNotion
  170. ДействиеMark as Obsolete in NotionNotion
  171. ДействиеHandle each block separatelySplit Out
  172. ДействиеUpdate Description in TodoistTodoist
  173. ДействиеAppend Notion BlockNotion
  174. ДействиеLock Notion IDRedis

Сценарий «Синхронизация Notion и Todoist в реальном времени» состоит из 174 ноды: Notion Webhook, Body is array?, Split out Notion changes, Extract IDs, Notion trigger reference, Globals2, Execution Data5, Check if Notion ID is locked и других. Интеграции: Html, Httprequest, Executiondata, Splitout, Gmail, Comparedatasets, Todoist, Splitinbatches, Executeworkflow, Redis, Server-Sent Events, Respondtowebhook, Notion, Crypto, Webhook, Form Trigger.

Что понадобится
ПараметрЗначениеОписание
Учётные данныеHtml · Httprequest · Executiondata · Splitout · Gmail · Comparedatasets · Todoist · Splitinbatches · Executeworkflow · Redis · Server-Sent Events · Respondtowebhook · Notion · Crypto · Webhook · Form TriggerДля каждого сервиса нужен свой ключ/токен - впишете их в n8n после установки.
Объём сценария246 нод · продвинутыйЧисло нод и уровень сложности логики. Больше нод - тоньше настройка.
Форматn8n workflow JSONГотовый воркфлоу. При развороте через кнопку импортируется автоматически.
Установка в один клик

Развернуть n8n с этим сценарием

Готовый сервер с n8n из маркетплейса Fatmetal - воркфлоу уже загружен. Рекомендованная конфигурация уже подставлена в заказ: 2 CPU · 4 ГБ · 50 ГБ. Останется вписать свои ключи, и автоматизация заработает. Нужна помощь с настройкой под нагрузку или сетью? Напишите инженеру.

Защищённый инстанс

n8n отдаём закрытым, а не голым

n8n часто атакуют - поэтому инстанс приезжает уже защищённым, без ручной настройки.

Владелец создан заранее

Аккаунт администратора настроен автоматически при развёртывании. Окно самостоятельной регистрации закрыто - никто не перехватит ваш инстанс в первые минуты после запуска (частый вектор атаки на self-hosted n8n).

Единый пароль с сервером

Логин в n8n - тот же пароль, что у вашей машины. Не нужно искать отдельные креды в файлах, меньше шансов оставить дефолт.

fail2ban против перебора

Автоматически банит IP после серии неудачных попыток входа по SSH. Защита от брутфорса из коробки.

HTTPS и security-заголовки

Трафик шифруется (Let's Encrypt, авто-обновление), выставлены HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy - защита от кликджекинга, MIME-снифинга и downgrade-атак.

Что дальше

После оплаты - сервер с готовым сценарием

Сервер создаётся автоматически за несколько минут. Ничего настраивать вручную не нужно - n8n поднимется сам, а этот сценарий уже будет внутри.

1

Сервер создаётся

После оплаты сервер разворачивается автоматически за несколько минут: ставится n8n, база данных и HTTPS. Дождитесь готовности в личном кабинете.

2

Открываете адрес

Адрес формируется из IP сервера: замените точки на дефисы и добавьте .fatmetal.net. Например IP 45.15.159.10 → https://45-15-159-10.fatmetal.net/. HTTPS уже настроен. Готовый адрес также есть в личном кабинете - можно просто скопировать его оттуда.

3

Входите готовыми данными

Аккаунт владельца уже создан - регистрировать ничего не нужно. Логин: admin@<адрес вашего сервера> (тот же адрес, что открыли на шаге 2 - например admin@45-15-159-10.fatmetal.net). Пароль - тот же, что у вашего сервера: он в личном кабинете и в /root/n8n-credentials.txt на сервере. Войдите и при желании сразу смените пароль в настройках. Интерфейс английский - у n8n нет русской локализации.

4

Сценарий уже внутри

Этот сценарий уже импортирован - найдёте его в разделе Workflows. Останется вписать свои ключи для интеграций (Html, Httprequest, Executiondata) в Credentials и включить сценарий.

Важно: сохраните ключ шифрования. Ключ (N8N_ENCRYPTION_KEY) и пароль базы лежат на сервере в /root/n8n-credentials.txt. Этим ключом зашифрованы учётные данные интеграций - берегите его и сделайте резервную копию: без ключа их не восстановить даже из бэкапа базы.
Оригинал сценария (англ.): «Realtime Notion Todoist 2-way Sync Template». Источник: коллекция Zie619/n8n-workflows (лицензия MIT).
Спросить инженера в TelegramМы на связи