

How to Send Weekly Todoist Reports to Slack with Zapier
Every week, Zapier pulls completed task counts and project summaries from Todoist and posts a formatted progress report to a designated Slack channel for leadership review.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Small teams (5–30 people) who track work in Todoist and need a consistent weekly summary posted to Slack without anyone manually compiling it.
Not ideal for
Teams needing task-level drill-downs or charts in their reports — use a dedicated reporting tool like Databox or Notion instead.
Sync type
scheduledUse case type
reportingReal-World Example
A 12-person product team at a SaaS startup uses this to post every Monday at 9am to #leadership-updates, showing how many Todoist tasks were completed the prior week across each project. Before this, the engineering lead spent 20–30 minutes every Monday manually counting tasks and pasting numbers into Slack. Now that time is zero, and the message lands before standup.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Before You Start
Make sure you have everything ready.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Report Date | ||
| Task Count | ||
| Task Content | ||
| Completed At | ||
| Slack Channel | ||
| Message Text | ||
2 optional fields▸ show
| Project Name | |
| Bot Name |
Step-by-Step Setup
zapier.com > Dashboard > Create Zap
Create a new Zap and name it
Log into Zapier at zapier.com and click the orange 'Create Zap' button in the top left sidebar. Give the Zap a clear name at the top of the editor — something like 'Weekly Todoist Report → Slack'. Naming it now saves confusion later when you have multiple Zaps. You'll land in the visual Zap editor with a trigger block waiting to be configured.
- 1Click 'Create Zap' in the left sidebar
- 2Click the untitled Zap name at the top and type 'Weekly Todoist Report → Slack'
- 3Press Enter to save the name
Zap Editor > Trigger > Schedule by Zapier > Every Week
Set a Schedule trigger for weekly runs
Click the trigger block and search for 'Schedule by Zapier' — this is Zapier's built-in time-based trigger and does not require any external app connection. Select 'Every Week' as the interval. Choose the day (Monday works well for leadership reviews) and a time before your team's first meeting, such as 8:00 AM. Set the timezone to match your team's location — this is easy to miss and will cause the report to fire at the wrong time.
- 1Click the grey Trigger block
- 2Search for 'Schedule by Zapier' and select it
- 3Choose 'Every Week' from the interval dropdown
- 4Set Day of Week to 'Monday' (or your preferred day)
- 5Set Time of Day to '08:00 AM' and confirm the timezone
Zap Editor > Action > Todoist > Get Completed Tasks
Connect Todoist and fetch completed tasks
Click the '+' button below the trigger to add the first action step. Search for 'Todoist' and select it. Choose the action event 'Get Completed Tasks' — this pulls tasks marked done within a date range you define. Connect your Todoist account by clicking 'Sign in to Todoist' and completing OAuth. Zapier will request read access to your Todoist data.
- 1Click the '+' icon below the Schedule trigger
- 2Search 'Todoist' and select the Todoist app
- 3Choose 'Get Completed Tasks' as the action event
- 4Click 'Sign in to Todoist' and complete the OAuth login
- 5Click 'Continue' after the account connects
Zap Editor > Action > Todoist > Get Completed Tasks > Configure
Configure the task filter and date range
In the 'Get Completed Tasks' configuration panel, set the 'Since' field to pull tasks from the past 7 days. Type '7 days ago' directly into the field — Zapier accepts natural language date expressions here. If you want to filter by a specific project (e.g., only report on the 'Product' project), select it from the Project dropdown. Leave Project empty to pull completions across all projects.
- 1In the 'Since' field, type '7 days ago'
- 2Optionally select a specific project from the Project dropdown
- 3Leave the 'Until' field blank to default to now
- 4Click 'Continue'
Zap Editor > Action > Code by Zapier > Run JavaScript
Count completed tasks with Code by Zapier
The Todoist step returns individual task records, but your Slack message needs a summary count — not a list of every task. Add a new action step and search for 'Code by Zapier', then select 'Run JavaScript'. This step will count the tasks returned and extract key details for the report. Paste the code from the Pro Tip section below into the code editor. Map the Todoist output to the input data as described.
- 1Click '+' to add a new action step
- 2Search 'Code by Zapier' and select it
- 3Choose 'Run JavaScript' as the action
- 4In the 'Input Data' section, add a key called 'tasks' and map it to the Todoist step's output
- 5Paste the JavaScript code into the Code editor
- 6Click 'Test step' to verify the output
This JavaScript runs in the Code by Zapier step (Step 5). It receives the raw array of completed Todoist tasks from the previous step, counts them, formats a bullet-point list with project names, and returns structured output fields that the Slack message step can map directly. Paste this into the Code editor under 'Run JavaScript' after adding your input data key 'tasks'.
JavaScript — Code Step// Input: inputData.tasks — a JSON string of completed Todoist tasks▸ Show code
// Input: inputData.tasks — a JSON string of completed Todoist tasks // from the previous Todoist 'Get Completed Tasks' step let tasks = [];
... expand to see full code
// Input: inputData.tasks — a JSON string of completed Todoist tasks
// from the previous Todoist 'Get Completed Tasks' step
let tasks = [];
try {
// Zapier passes input data as strings; parse if needed
tasks = typeof inputData.tasks === 'string'
? JSON.parse(inputData.tasks)
: inputData.tasks;
} catch (e) {
// If parsing fails, treat as empty
tasks = [];
}
// Guard: handle null or non-array input
if (!Array.isArray(tasks)) {
tasks = [];
}
const taskCount = tasks.length;
// Build a formatted bullet list with project name if available
const taskLines = tasks.map(task => {
const name = task.content || task.text || 'Unnamed task';
const project = task.project_name || task.project_id || 'No project';
return `- ${name} _(${project})_`;
});
const taskList = taskLines.length > 0
? taskLines.join('\n')
: '_No tasks completed this week._';
// Format a readable date range for the report header
const now = new Date();
const weekStart = new Date(now);
weekStart.setDate(now.getDate() - 7);
const formatDate = (d) =>
d.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });
const reportDate = formatDate(now);
const rangeStart = formatDate(weekStart);
output = [{
task_count: taskCount,
task_list: taskList,
report_date: reportDate,
date_range: `${rangeStart} – ${reportDate}`,
has_tasks: taskCount > 0 ? 'yes' : 'no'
}];Zap Editor > Action > Formatter by Zapier > Date/Time > Format
Add a Formatter step to build the report date range
Add another action step and select 'Formatter by Zapier', then choose 'Date / Time' as the transform type and 'Format' as the action. This generates a human-readable date string like 'Dec 30 – Jan 5' for the report header. Map the input to today's date using Zapier's built-in 'Current Time' variable found in the Insert Data dropdown. Set the output format to 'MMMM D, YYYY'.
- 1Click '+' to add a new action step
- 2Search 'Formatter by Zapier' and select it
- 3Choose 'Date / Time' then 'Format'
- 4In the 'Input' field, click the data picker and select 'Current Time' from the Schedule trigger
- 5Set 'To Format' to 'MMMM D, YYYY'
- 6Click 'Continue'
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Zap Editor > Action > Slack > Send Channel Message
Connect Slack and select your channel
Add a new action step, search for 'Slack', and choose the 'Send Channel Message' action. Connect your Slack workspace by clicking 'Sign in to Slack' and completing OAuth — Zapier will request permission to post messages. Once connected, use the Channel dropdown to select the Slack channel where the weekly report should post (e.g., #leadership-updates). Do not type the channel name manually; always select from the dropdown to avoid typos.
- 1Click '+' to add a new action step
- 2Search 'Slack' and select the Slack app
- 3Choose 'Send Channel Message' as the action
- 4Click 'Sign in to Slack' and authorize Zapier in the Slack OAuth screen
- 5Select your target channel from the Channel dropdown (e.g., #leadership-updates)
channel: {{channel}}
ts: {{ts}}
Zap Editor > Action > Slack > Send Channel Message > Message Text
Build the Slack message body
In the Message Text field, compose the report using a combination of static text and dynamic data mapped from earlier steps. Use Slack's mrkdwn formatting: *bold* for headers, bullet points with dashes. Map 'task_count' from the Code step, 'task_list' for the bullet breakdown, and the formatted date from the Formatter step. Keep the message under 3,000 characters — Slack truncates longer messages in some clients.
- 1Click into the 'Message Text' field
- 2Type '*📋 Weekly Progress Report – Week of [date]*' and map the Formatter date output to [date]
- 3Add a line break and type '*Tasks Completed:* ' then map 'task_count' from the Code step
- 4Add another line break and type '*Completed Tasks:*' then map 'task_list' from the Code step
- 5Optionally add a static footer line like '_Automated via Todoist – Reply to discuss_'
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Zap Editor > Action > Slack > Send Channel Message > Bot Name / Bot Icon
Configure message options for leadership readability
Scroll down in the Slack action to find optional fields. Set 'Bot Name' to something like 'Progress Bot' so leadership knows these are automated reports. Upload a small icon or use an emoji code in the 'Bot Icon' field (e.g., ':bar_chart:'). Turn on 'Link Names' so any @mentions in task content resolve to real Slack users. Leave 'Thread Reply' off — reports should post to the main channel, not as replies.
- 1Set 'Bot Name' to 'Progress Bot'
- 2Set 'Bot Icon' to ':bar_chart:'
- 3Set 'Link Names' to 'Yes'
- 4Confirm 'Thread Reply' is set to 'No' or left blank
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Zap Editor > Slack Action > Test Step
Test the full Zap end-to-end
Click 'Test step' on the Slack action to send a real message to your chosen channel. Open Slack immediately and confirm the message landed in the correct channel with proper formatting. Check that the task count is accurate, the date is correct, and the bot name shows as 'Progress Bot'. If anything looks wrong, go back to the relevant step and adjust the field mappings before publishing.
- 1Click 'Test step' in the Slack action panel
- 2Open Slack and navigate to your target channel
- 3Verify the message shows the correct task count and formatted date
- 4Check that mrkdwn formatting rendered correctly (bold headers, bullet list)
- 5Return to Zapier and click 'Publish Zap' if everything looks correct
Zap Editor > Publish Zap > Task History
Publish and confirm the schedule
Click 'Publish Zap' to turn the Zap on. Zapier will show the next scheduled run time — verify it matches your intended day and time. Navigate to the Zap's 'Task History' tab and bookmark it so you can check each Monday that the Zap ran successfully. Set up Zapier's built-in error notifications under Settings so you receive an email if the Zap ever fails silently.
- 1Click the blue 'Publish Zap' button
- 2Note the 'Next run' timestamp shown on the Zap dashboard
- 3Click into the Zap and navigate to 'Task History'
- 4Go to Settings > Notifications and enable error email alerts
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use Zapier for this if your team doesn't write code and wants the report running within an hour of starting setup. The Schedule trigger plus Slack action combination is one of Zapier's strongest use cases — no webhooks to configure, no servers to manage, and the UI is clear enough that a non-technical team lead can own it. The one scenario where you'd skip Zapier: if your team closes more than 30 Todoist tasks per week. That 30-task cap on the 'Get Completed Tasks' action will silently undercount your output, and fixing it requires Code by Zapier — at which point Make's more flexible HTTP module starts looking like the better call.
The math on cost is straightforward. This Zap consumes roughly 4 tasks per run: one for the Schedule trigger, one for Todoist, one for Code by Zapier, one for Slack. At one run per week, that's 16–20 tasks per month. Zapier's free tier gives you 100 tasks/month, so the report itself fits for free — but the Code by Zapier step requires a Professional plan at $49/month. If you skip the code step and use Formatter instead, you can run this on the $19.99 Starter plan. Make would handle the equivalent workflow for $9/month with no task cap concerns.
Make handles the task aggregation problem better than Zapier out of the box. Its Array Aggregator module collapses multi-record Todoist results into a single bundle without any custom code — no paid plan upgrade required. n8n lets you write the full aggregation logic in a Function node with complete control, and it's free if self-hosted. Power Automate has a native 'Apply to each' loop that can count and format task lists, which is useful if your team is already in the Microsoft 365 ecosystem. Pipedream gives you the most flexibility with direct API access and async JavaScript, but requires comfort with code. Zapier is still the right call here if setup speed and zero maintenance matter more than cost or flexibility — most teams who need this report need it working today, not configured perfectly.
Three things you'll hit after setup. First, the 30-task cap. It's not documented prominently in Zapier's UI and you won't notice it's a problem until the task count in your Slack message looks low. Second, Todoist's completion timestamps are in UTC. If your team works across timezones, tasks completed late Friday local time may appear in the next week's report depending on your UTC offset — the 'Since: 7 days ago' filter doesn't know your timezone. Third, if the Todoist account used to connect Zapier ever has its password changed or loses API authorization, the Zap will fail silently on Monday morning and no report will post. Task History in Zapier is where you catch this — check it the first Monday after any Todoist account changes.
Ideas for what to build next
- →Add per-project breakdown sections — Extend the Code by Zapier step to group completed tasks by project name and generate a separate bullet section per project in the Slack message. This gives leadership a clearer view of which teams are shipping rather than one flat list.
- →Log each weekly report to a Google Sheet — Add a second action step after the Slack post to append a row to a Google Sheet with the date, task count, and task list. After 12 weeks you'll have trend data showing whether completion rates are going up or down.
- →Add a Slack reminder if the report fails to post — Build a second Zap that uses Zapier's 'Zapier Manager – New Error' trigger to DM the team lead whenever this Zap encounters an error. That way a failed Monday report never goes unnoticed until Tuesday's standup.
Related guides
How to Send Weekly Todoist Reports to Slack with Pipedream
~15 min setup
How to Send Weekly Todoist Reports to Slack with Power Automate
~15 min setup
How to Send Weekly Todoist Reports to Slack with n8n
~20 min setup
How to Send Weekly Todoist Reports to Slack with Make
~12 min setup
How to Assign Todoist Tasks from Slack Mentions with Pipedream
~15 min setup
How to Assign Todoist Tasks from Slack Mentions with Power Automate
~15 min setup