{ "id": "VLRbAr4OrtnHUU2l", "name": "Todoist Weekly Review Template", "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "nodes": [ { "id": "45351dbb-6c0c-4442-a350-35d966a26fa1", "name": "When clicking ‘Test workflow’", "type": "n8n-nodes-base.manualTrigger", "position": [ 0, 180 ], "parameters": {}, "typeVersion": 1, "notes": "This manualTrigger node performs automated tasks as part of the workflow." }, { "id": "9644a07e-0b97-4b48-846c-821f620128cc", "name": "Get completed tasks via Todoist API", "type": "n8n-nodes-base.httpRequest", "position": [ 220, 0 ], "parameters": { "url": "{{ $env.API_BASE_URL }}", "method": "POST", "options": {}, "sendBody": true, "authentication": "{{ $credentials.predefinedCredentialType }}", "bodyParameters": { "parameters": [ { "name": "since", "value": "={{ $now.minus(7, 'days') }}" }, { "name": "until", "value": "={{ $now }}" } ] }, "nodeCredentialType": "YOUR_CREDENTIAL_HERE" }, "credentials": { "todoistApi": {} }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "94f40824-43ff-45ae-adfd-b18a5903cba1", "name": "Optional: Ignore specific projects", "type": "n8n-nodes-base.code", "position": [ 440, 0 ], "parameters": { "jsCode": "// maintain this array with ignored Todoist project_id's\n// empty \"[]\" it when you don't want to ignore any\nconst ignoredProjects = ['2335544024'];\n\n// Remove ignored projects\nconst items = $input.all()[0].json.items;\nvar newItems = [];\nfor(j = 0; j < items.length; j++) {\n if(!ignoredProjects.includes(items[j].project_id)) {\n newItems.push(items[j]);\n }\n}\n\nreturn newItems;" }, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow." }, { "id": "c50b00d6-4e9c-43e5-b6b8-ee0caac78c68", "name": "Format the email body", "type": "n8n-nodes-base.code", "position": [ 660, 0 ], "parameters": { "jsCode": "const items = $input.all();\n\n// Group items by day\nconst grouped = items.reduce((acc, item) => {\n const date = new Date(item.json.completed_at).toISOString().split('T')[0];\n acc[date] = acc[date] || [];\n acc[date].push(item.json.content);\n return acc;\n}, {});\n\n// Format the grouped data into an HTML string for the email\nlet emailBody = \"

Completed Items

\";\nfor (const [date, contents] of Object.entries(grouped)) {\n emailBody += `

${date}

`;\n}\n\nreturn [{ json: { emailBody } }];\n" }, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow." }, { "id": "42b38a9b-2dbc-46f5-895c-f8597eb48bf1", "name": "Every Friday afternoon", "type": "n8n-nodes-base.scheduleTrigger", "position": [ 0, 0 ], "parameters": { "rule": { "interval": [ { "field": "weeks", "triggerAtDay": [ 5 ], "triggerAtHour": 15 } ] } }, "typeVersion": 1.2, "notes": "This scheduleTrigger node performs automated tasks as part of the workflow." }, { "id": "adece42d-d84a-41c8-8269-35ba08879e52", "name": "Send Email", "type": "n8n-nodes-base.emailSend", "position": [ 860, 0 ], "parameters": { "options": {}, "subject": "Todoist Weekly Review", "emailFormat": "={{ $('Format the email body').item.json.emailBody }}" }, "typeVersion": 2.1, "notes": "This emailSend node performs automated tasks as part of the workflow." } ], "active": false, "pinData": {}, "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "versionId": "fcf19ca1-c2bc-4832-8cfe-184424484f60", "connections": { "9644a07e-0b97-4b48-846c-821f620128cc": { "main": [ [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-fe0efe6b", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-7ed1cfa3", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-2fa2290e", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-253c3f80", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-48dab3ce", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-f6ea80b2", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-84bace8c", "type": "main", "index": 0 } ], [ { "node": "error-handler-9644a07e-0b97-4b48-846c-821f620128cc-ea9672fc", "type": "main", "index": 0 } ] ] }, "adece42d-d84a-41c8-8269-35ba08879e52": { "main": [ [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-02308f8d", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-d1b77c95", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-cd25e91b", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-ceefcf75", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-95aa7064", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-6c120159", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-2c934178", "type": "main", "index": 0 } ], [ { "node": "error-handler-adece42d-d84a-41c8-8269-35ba08879e52-7c0b4044", "type": "main", "index": 0 } ] ] } }, "description": "Automated workflow: Todoist Weekly Review Template. This workflow processes data and performs automated tasks.", "meta": { "instanceId": "workflow-25bc2f0b", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:43.584725", "updatedAt": "2025-09-29T07:07:43.584747", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "notes": "Excellent quality workflow: Todoist Weekly Review Template. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }