---
title: "Slack Weekly Report Bot — n8n weekly outreach report | Harshith Nayaka L"
description: "n8n Slack bot that posts weekly outreach numbers to a private channel every Monday, and refuses to post stale, incomplete or public-channel reports."
canonical: "https://harshith-nayaka-l-portfolio.vercel.app/work/slack-weekly-report-bot"
last-updated: "2026-10-04T17:07:29Z"
published: "2026-10-04T16:45:37Z"
author: "Harshith Nayaka L"
author-role: "AI Engineer - Full Stack"
author-title: "AI Engineer - Full Stack"
author-location: "Bengaluru, India"
author-availability: "Available for freelance work"
author-email: "harshith28124@gmail.com"
content-type: "text/markdown"
html-version: "https://harshith-nayaka-l-portfolio.vercel.app/work/slack-weekly-report-bot"
---
# Slack Weekly Report Bot — n8n Slack bot + error alerts

> Posts the week's outreach numbers to a private Slack channel every Monday at 9:00 AM, and refuses to post anything it can't stand behind: stale weeks, half-filled rows or a public channel.

Case study by Harshith Nayaka L, AI Engineer - Full Stack, Bengaluru, India.
Canonical page: https://harshith-nayaka-l-portfolio.vercel.app/work/slack-weekly-report-bot

- **Type:** n8n workflow + Slack bot
- **Flow:** Google Sheets → Slack
- **Role:** Solo build
- **Status:** Live run on n8n 2.8.4

## The problem

A weekly numbers post looks trivial until it goes wrong in front of the team: last week's figures reposted as this week's, a half-filled row reported as zero, or the report landing in a public channel it was never meant for.

Those mistakes are worse than a missing report, because people act on the numbers they see.

## What I built

A 14-node n8n workflow plus a Slack app manifest that creates the bot in about a minute. Every Monday at 9:00 AM, or on demand, it takes the week's leads contacted, replies, meetings booked and positive replies, either from a Weekly Metrics tab in Google Sheets with one row per week or from CONFIG, and posts them in exactly the requested plain-text format so notifications read correctly. The Slack view adds reply, positive and meeting rates and week-over-week change.

Before posting, a preflight call to Slack checks that the channel exists, isn't archived, is private and has the bot as a member, and each failure says exactly what to do. If the Weekly Metrics tab is missing, the workflow creates it with headers and stops so the numbers can be filled in.

A separate four-node error workflow posts any failed run to Slack with the failing node, the error and a link, and is shared by the other workflows.

## Pipeline

- **Trigger:** Monday 9:00 AM (Or Send Now, by hand)
- **Preflight:** Channel check (Exists, private, not archived, bot in)
- **Read:** Weekly Metrics (Sheet tab, or numbers from CONFIG)
- **Check:** Data checks (Complete, numeric, not stale)
- **Deliver:** Post to Slack (Exact text + Block Kit) → Verify delivery (Fails loudly if rejected)

## The judgment calls

**Private is enforced, not assumed**

With requirePrivate on, the default, the report refuses to post to a public channel. The preflight runs before any numbers are read, so a wrong channel ID fails early with the fix spelled out.

**No bad numbers get posted**

Nothing is posted if the latest week has an empty or non-numeric cell, if the newest data is older than 14 days, or if the tab holds only headers. A report that can't be trusted is held back rather than sent.

**Forgiving about input, strict about output**

It accepts real date cells, ISO dates, day-first dates such as 05/10/2026 and numbers written with commas, and it flags impossible data such as more replies than leads contacted, while the posted text always matches the exact format.

**Failures reach a person**

Any failed run, from this workflow or the others that use it, is posted to Slack with the node that failed, the error and a link to the execution, so a broken schedule doesn't fail silently for weeks.

## What it changed

**Live run:** On n8n 2.8.4 with real accounts, the report was posted to a private channel. The error-alert workflow was verified in production mode: a forced failure in a scheduled run posted an alert to Slack.

**Tested:** Validated inside a real n8n instance against strict mocks of the Slack and Sheets APIs: the exact text output, week-over-week deltas, the manual source, a missing tab, stale data, an incomplete row, a public channel, the bot not being a member, a channel that doesn't exist and a rejected post.

## Questions this answers

**How do you post an automated weekly report to Slack with n8n?**

Schedule an n8n workflow to read the week's numbers, check them, and post with the Slack API. Harshith Nayaka L's version runs every Monday at 9:00 AM, reads leads contacted, replies, meetings booked and positive replies from Google Sheets, and posts them to a private channel. Before posting it confirms the channel is private and the bot is in it, and it refuses to post a week with missing, non-numeric or stale numbers.

## Built with

n8n, Slack Web API (Block Kit), Google Sheets API, Slack app manifest, JavaScript (Code nodes)

## Links

- [View on GitHub](https://github.com/HarshithNayakaL/slack-weekly-report-bot-n8n)
