Systems Library / Operations & Admin / How to Automate End-of-Day Summary Reports
Operations & Admin communication

How to Automate End-of-Day Summary Reports

Generate and send daily summary reports of what each team accomplished.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

End-of-day reports give managers visibility without micromanaging. I built a system to automate end of day summary reports that pulls activity from your tools, compiles what each person accomplished, and delivers a clean summary at 5pm. No manual tracking. No forgotten updates.

The day's work, summarized automatically.

What You Need Before Starting

Step 1: Gather Activity from Multiple Sources

import requests
from datetime import datetime, timedelta

def gather_daily_activity(team_config):
    today = datetime.now().strftime("%Y-%m-%d")
    activity = {}

    for member in team_config["members"]:
        activity[member["name"]] = {
            "tasks_completed": fetch_completed_tasks(member, today),
            "commits": fetch_git_commits(member, today),
            "meetings_attended": fetch_calendar_events(member, today),
            "messages_sent": 0
        }

    return activity

def fetch_completed_tasks(member, date):
    # Replace with your PM tool API
    return [{"title": "Example task", "project": "Client A"}]

def fetch_git_commits(member, date):
    return [{"message": "Fix login bug", "repo": "main-app"}]

def fetch_calendar_events(member, date):
    return [{"title": "Client sync", "duration": 30}]

Step 2: Generate the Summary with AI

import anthropic
import json

client = anthropic.Anthropic()

def generate_eod_summary(activity, team_name):
    prompt = f"""Create a concise end-of-day summary for the {team_name} team.

Activity data:
{json.dumps(activity, indent=2)}

Format:
## Team Summary
One paragraph overview of the team's day.

## Individual Updates
For each person, 2-3 bullet points of what they accomplished.
Focus on outcomes, not activity. "Shipped login fix" not "wrote code."

## Tomorrow's Focus
Based on what was in progress, suggest 2-3 priorities for tomorrow.

Keep it under 300 words total."""

    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )
    return message.content[0].text

Step 3: Format and Deliver

def deliver_eod_report(summary, channel, slack_token, team_name):
    date_str = datetime.now().strftime("%A, %B %d")

    requests.post(
        "https://slack.com/api/chat.postMessage",
        headers={"Authorization": f"Bearer {slack_token}"},
        json={
            "channel": channel,
            "blocks": [
                {"type": "header", "text": {"type": "plain_text", "text": f"EOD Report: {team_name} - {date_str}"}},
                {"type": "section", "text": {"type": "mrkdwn", "text": summary}},
                {"type": "divider"},
                {"type": "context", "elements": [
                    {"type": "mrkdwn", "text": "Generated from project activity, Git commits, and calendar data."}
                ]}
            ]
        }
    )

Step 4: Track Productivity Trends

import sqlite3

def init_eod_db(db_path="eod_reports.db"):
    conn = sqlite3.connect(db_path)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS daily_metrics (
            date TEXT,
            team_member TEXT,
            tasks_completed INTEGER,
            commits INTEGER,
            meetings INTEGER
        )
    """)
    conn.commit()
    return conn

def store_daily_metrics(conn, activity):
    date = datetime.now().strftime("%Y-%m-%d")
    for member, data in activity.items():
        conn.execute(
            "INSERT INTO daily_metrics VALUES (?,?,?,?,?)",
            (date, member, len(data["tasks_completed"]),
             len(data["commits"]), len(data["meetings_attended"]))
        )
    conn.commit()

def weekly_trend(conn, member):
    rows = conn.execute("""
        SELECT date, tasks_completed, commits
        FROM daily_metrics WHERE team_member=?
        ORDER BY date DESC LIMIT 5
    """, (member,)).fetchall()
    return rows

Step 5: Schedule the Report

def run_eod_report(config):
    activity = gather_daily_activity(config)
    summary = generate_eod_summary(activity, config["team_name"])
    deliver_eod_report(summary, config["channel"], config["slack_token"], config["team_name"])

    conn = init_eod_db()
    store_daily_metrics(conn, activity)
    print(f"EOD report sent for {config['team_name']}")

# Schedule: weekdays at 5pm
# 0 17 * * 1-5 python3 /path/to/eod_report.py

What to Build Next

Add a weekly rollup that compiles the five daily reports into a single weekly summary. Managers get the daily view. Executives get the weekly rollup. Different audiences, same data source.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems