Beginner~8 min setupCommunication & Project ManagementVerified April 2026
Slack logo
Todoist logo

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

scheduled

Use case type

reporting

Real-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.

/mo
505005K50K

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.

Todoist account with at least one project containing completed tasks from the past 7 days (so test data exists during setup)
Todoist API access enabled — available on Free and Pro plans. No special scopes needed for read access via Zapier OAuth.
Slack account with permission to add apps to your workspace. If your workspace has app restrictions, ask your Slack admin to approve Zapier before starting.
Permission to post in the target Slack channel. If the channel is private, the connected Slack user must be a member of that channel.

Optional

Zapier Professional plan or higher if you want to use the Code by Zapier step. The Starter plan ($19.99/month) does not include Code steps.

Field Mapping

Map these fields between your apps.

FieldAPI 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

1

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.

  1. 1Click 'Create Zap' in the left sidebar
  2. 2Click the untitled Zap name at the top and type 'Weekly Todoist Report → Slack'
  3. 3Press Enter to save the name
What you should see: You should see the Zap editor open with a single grey trigger block labeled 'Trigger' and your new Zap name displayed at the top of the page.
2

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.

  1. 1Click the grey Trigger block
  2. 2Search for 'Schedule by Zapier' and select it
  3. 3Choose 'Every Week' from the interval dropdown
  4. 4Set Day of Week to 'Monday' (or your preferred day)
  5. 5Set Time of Day to '08:00 AM' and confirm the timezone
What you should see: You should see a summary showing 'Trigger: Every Monday at 8:00 AM [Your Timezone]' displayed in the trigger block. There is no test sample to pull — Schedule triggers use a static test event.
Common mistake — Schedule by Zapier fires based on UTC internally. If you pick 8:00 AM in the UI, double-check that the timezone dropdown reflects your actual city — the default is often UTC, which means your report could post at 3am local time.
Zapier
▶ Turn on & test
executed
Slack
Todoist
Todoist
🔔 notification
received
3

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.

  1. 1Click the '+' icon below the Schedule trigger
  2. 2Search 'Todoist' and select the Todoist app
  3. 3Choose 'Get Completed Tasks' as the action event
  4. 4Click 'Sign in to Todoist' and complete the OAuth login
  5. 5Click 'Continue' after the account connects
What you should see: You should see a green checkmark next to your Todoist account name, and the action configuration panel should expand to show filter fields like Project and Since.
Common mistake — Todoist's 'Get Completed Tasks' action in Zapier returns a maximum of 30 tasks per run. If your team closes more than 30 tasks in a week, the count in your report will be wrong. For teams completing 30+ tasks/week, use the Todoist REST API via a Code by Zapier step instead.
4

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.

  1. 1In the 'Since' field, type '7 days ago'
  2. 2Optionally select a specific project from the Project dropdown
  3. 3Leave the 'Until' field blank to default to now
  4. 4Click 'Continue'
What you should see: After clicking 'Test step', Zapier should return a list of completed tasks from the past week. Each task entry will show fields including content, completed_at, and project_id.
Common mistake — The 'Since' field does not accept dynamic date math pulled from prior steps. It only reads static text or mapped values. '7 days ago' works. Trying to calculate a date from the Schedule trigger's timestamp will not work in this field.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Todoist
TO
notified
5

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.

  1. 1Click '+' to add a new action step
  2. 2Search 'Code by Zapier' and select it
  3. 3Choose 'Run JavaScript' as the action
  4. 4In the 'Input Data' section, add a key called 'tasks' and map it to the Todoist step's output
  5. 5Paste the JavaScript code into the Code editor
  6. 6Click 'Test step' to verify the output
What you should see: The test output should show fields like 'task_count', 'task_list', and 'report_date' populated with real values from your Todoist data.
Common mistake — Code by Zapier requires a paid Zapier plan (Professional or higher). If you're on the free tier, you cannot use this step. As an alternative, use Zapier's Formatter step with the 'Utilities > Count' function, though it gives you less control over the output format.

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'
}];
6

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'.

  1. 1Click '+' to add a new action step
  2. 2Search 'Formatter by Zapier' and select it
  3. 3Choose 'Date / Time' then 'Format'
  4. 4In the 'Input' field, click the data picker and select 'Current Time' from the Schedule trigger
  5. 5Set 'To Format' to 'MMMM D, YYYY'
  6. 6Click 'Continue'
What you should see: The test output should show a formatted date string like 'January 6, 2025' that you can reference in your Slack message.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
7

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.

  1. 1Click '+' to add a new action step
  2. 2Search 'Slack' and select the Slack app
  3. 3Choose 'Send Channel Message' as the action
  4. 4Click 'Sign in to Slack' and authorize Zapier in the Slack OAuth screen
  5. 5Select your target channel from the Channel dropdown (e.g., #leadership-updates)
What you should see: You should see a green checkmark next to your Slack workspace name and the selected channel name displayed in the Channel field.
Common mistake — Zapier posts messages as the connected user's bot by default, not as the individual. Leadership may see messages from 'Zapier' rather than a named team member. To post as a custom bot name, enable 'Bot Name' and 'Bot Icon' fields in the Slack action configuration.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
8

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.

  1. 1Click into the 'Message Text' field
  2. 2Type '*📋 Weekly Progress Report – Week of [date]*' and map the Formatter date output to [date]
  3. 3Add a line break and type '*Tasks Completed:* ' then map 'task_count' from the Code step
  4. 4Add another line break and type '*Completed Tasks:*' then map 'task_list' from the Code step
  5. 5Optionally add a static footer line like '_Automated via Todoist – Reply to discuss_'
What you should see: The Message Text preview should show a formatted multi-line message with real task count numbers and a readable date pulled from your test data.
Common mistake — Slack's mrkdwn does not render in the Zapier preview — the asterisks and underscores will look like raw symbols inside Zapier's editor. They will render correctly as bold and italic text once the message actually posts to Slack.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
9

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.

  1. 1Set 'Bot Name' to 'Progress Bot'
  2. 2Set 'Bot Icon' to ':bar_chart:'
  3. 3Set 'Link Names' to 'Yes'
  4. 4Confirm 'Thread Reply' is set to 'No' or left blank
What you should see: You should see the Bot Name and Bot Icon fields populated. These will appear as the sender identity when the message posts to Slack.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
10

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.

  1. 1Click 'Test step' in the Slack action panel
  2. 2Open Slack and navigate to your target channel
  3. 3Verify the message shows the correct task count and formatted date
  4. 4Check that mrkdwn formatting rendered correctly (bold headers, bullet list)
  5. 5Return to Zapier and click 'Publish Zap' if everything looks correct
What you should see: A real Slack message should appear in your channel within 30 seconds, showing the formatted weekly report with your actual Todoist data from the past 7 days.
Common mistake — If you test on a Friday or Saturday and your team completed zero tasks in the past 7 days, the Code step may return an empty array and the Zap may error. Add a 'Filter by Zapier' step after the Todoist step to handle zero-task weeks gracefully — either skip the run or post a 'No tasks completed this week' message.
11

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.

  1. 1Click the blue 'Publish Zap' button
  2. 2Note the 'Next run' timestamp shown on the Zap dashboard
  3. 3Click into the Zap and navigate to 'Task History'
  4. 4Go to Settings > Notifications and enable error email alerts
What you should see: The Zap status should show a green 'On' toggle. The Zap dashboard should display the next scheduled run date and time, confirming the weekly cadence is active.
Common mistake — Confirm your workflow timezone matches your business timezone — n8n uses the instance timezone by default. Also verify the workflow is saved and set to Active, since Schedule Triggers won't fire on inactive workflows.

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

VerdictWhy Zapier for this workflow

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.

Cost

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.

Tradeoffs

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 sectionsExtend 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 SheetAdd 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 postBuild 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

Was this guide helpful?
Slack + Todoist overviewZapier profile →